1 package org.exoplatform.wcm.webui.selector.content;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.jcr.Node;
7 import javax.jcr.NodeIterator;
8 import javax.jcr.Session;
9 import javax.jcr.nodetype.NodeType;
10 import javax.jcr.nodetype.NodeTypeManager;
11 import javax.jcr.nodetype.PropertyDefinition;
12
13 import org.exoplatform.webui.core.UIContainer;
14 import org.exoplatform.services.cms.BasePath;
15 import org.exoplatform.services.cms.impl.DMSConfiguration;
16 import org.exoplatform.services.jcr.RepositoryService;
17 import org.exoplatform.services.jcr.core.ManageableRepository;
18 import org.exoplatform.services.jcr.ext.common.SessionProvider;
19 import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
20 import org.exoplatform.services.wcm.utils.WCMCoreUtils;
21 import org.exoplatform.webui.core.UIPopupWindow;
22 import org.exoplatform.webui.config.annotation.ComponentConfig;
23 import org.exoplatform.webui.config.annotation.EventConfig;
24 import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
25 import org.exoplatform.webui.core.model.SelectItemOption;
26 import org.exoplatform.webui.event.Event;
27 import org.exoplatform.webui.event.Event.Phase;
28 import org.exoplatform.webui.event.EventListener;
29 import org.exoplatform.webui.form.UIForm;
30 import org.exoplatform.webui.form.UIFormRadioBoxInput;
31 import org.exoplatform.webui.form.UIFormSelectBox;
32
33
34
35
36
37
38
39 @ComponentConfig(
40 lifecycle = UIFormLifecycle.class,
41 template = "system:/groovy/webui/form/UIForm.gtmpl",
42 events = {
43 @EventConfig(phase=Phase.DECODE, listeners = UIContentPropertySelector.CancelActionListener.class),
44 @EventConfig(listeners = UIContentPropertySelector.AddActionListener.class),
45 @EventConfig(listeners = UIContentPropertySelector.ChangeMetadataTypeActionListener.class)
46 }
47 )
48 public class UIContentPropertySelector extends UIForm{
49
50 public final static String WEB_CONTENT_METADATA_POPUP = "WebContentMetadataPopup";
51
52 final static public String METADATA_TYPE = "metadataType" ;
53 final static public String PROPERTY_SELECT = "property_select" ;
54
55 private String fieldName = null ;
56
57 private List<SelectItemOption<String>> properties = new ArrayList<SelectItemOption<String>>() ;
58
59 public UIContentPropertySelector() throws Exception {
60 setActions(new String[] {"Add", "Cancel"}) ;
61 }
62
63 public void init() throws Exception {
64 List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>();
65 NodeHierarchyCreator nodeHierarchyCreator = getApplicationComponent(NodeHierarchyCreator.class);
66
67 UIFormSelectBox uiSelect = new UIFormSelectBox(METADATA_TYPE, METADATA_TYPE, options);
68 uiSelect.setOnChange("ChangeMetadataType");
69 addUIFormInput(uiSelect);
70 SessionProvider sessionProvider = WCMCoreUtils.getSystemSessionProvider();
71 RepositoryService repoService = getApplicationComponent(RepositoryService.class);
72 ManageableRepository manRepository = repoService.getCurrentRepository();
73
74 DMSConfiguration dmsConfiguration = getApplicationComponent(DMSConfiguration.class);
75 String workspaceName = dmsConfiguration.getConfig().getSystemWorkspace();
76 Session session = sessionProvider.getSession(workspaceName, manRepository);
77 String metadataPath = nodeHierarchyCreator.getJcrPath(BasePath.METADATA_PATH);
78 Node homeNode = (Node) session.getItem(metadataPath);
79 NodeIterator nodeIter = homeNode.getNodes();
80 Node meta = nodeIter.nextNode();
81 renderProperties(meta.getName());
82 options.add(new SelectItemOption<String>(meta.getName(), meta.getName()));
83 while(nodeIter.hasNext()) {
84 meta = nodeIter.nextNode();
85 options.add(new SelectItemOption<String>(meta.getName(), meta.getName()));
86 }
87 addUIFormInput(new UIFormRadioBoxInput(PROPERTY_SELECT, null, properties).
88 setAlign(UIFormRadioBoxInput.VERTICAL_ALIGN));
89 }
90
91 public void setFieldName(String fieldName) { this.fieldName = fieldName ; }
92
93 public void renderProperties(String metadata) throws Exception {
94 properties.clear() ;
95 SessionProvider sessionProvider = WCMCoreUtils.getSystemSessionProvider();
96 RepositoryService repoService = getApplicationComponent(RepositoryService.class);
97 ManageableRepository manRepository = repoService.getCurrentRepository();
98 String workspaceName = manRepository.getConfiguration().getSystemWorkspaceName();
99 Session session = sessionProvider.getSession(workspaceName, manRepository);
100 NodeTypeManager ntManager = session.getWorkspace().getNodeTypeManager();
101 NodeType nt = ntManager.getNodeType(metadata);
102 PropertyDefinition[] propertieDefs = nt.getPropertyDefinitions();
103 for(PropertyDefinition property : propertieDefs) {
104 String name = property.getName();
105 if(!name.equals("exo:internalUse")) {
106 this.properties.add(new SelectItemOption<String>(name,name));
107 }
108 }
109 }
110
111 static public class CancelActionListener extends EventListener<UIContentPropertySelector> {
112 public void execute(Event<UIContentPropertySelector> event) throws Exception {
113 UIContentPropertySelector contentPropertySelector = event.getSource();
114 UIPopupWindow uiPopupWindow = contentPropertySelector.getParent();
115 uiPopupWindow.setRendered(false);
116 uiPopupWindow.setShow(false);
117 event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupWindow);
118 }
119 }
120
121 static public class AddActionListener extends EventListener<UIContentPropertySelector> {
122 public void execute(Event<UIContentPropertySelector> event) throws Exception {
123 UIContentPropertySelector contentPropertySelector = event.getSource();
124 String property = contentPropertySelector.<UIFormRadioBoxInput>getUIInput(PROPERTY_SELECT).getValue();
125 UIPopupWindow uiPopupWindow = contentPropertySelector.getParent();
126 UIContainer uiContainer = uiPopupWindow.getAncestorOfType(UIContainer.class);
127 UIContentSelector contentSelector = (UIContentSelector) uiContainer.findFirstComponentOfType(UIContentSelector.class);
128 UIContentSearchForm contentSearchForm = contentSelector.findFirstComponentOfType(UIContentSearchForm.class);
129 contentSearchForm.getUIStringInput(contentPropertySelector.getFieldName()).setValue(property);
130 uiPopupWindow.setRendered(false);
131 uiPopupWindow.setShow(false);
132 contentSelector.setSelectedTab(contentSearchForm.getId());
133 event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupWindow);
134 event.getRequestContext().addUIComponentToUpdateByAjax(contentSearchForm);
135 }
136 }
137
138 static public class ChangeMetadataTypeActionListener extends EventListener<UIContentPropertySelector> {
139 public void execute(Event<UIContentPropertySelector> event) throws Exception {
140 UIContentPropertySelector contentPropertySelector = event.getSource();
141 contentPropertySelector.renderProperties(contentPropertySelector.getUIFormSelectBox(METADATA_TYPE).getValue());
142 event.getRequestContext().addUIComponentToUpdateByAjax(contentPropertySelector);
143 }
144 }
145
146 public String getFieldName() {
147 return fieldName;
148 }
149 }