View Javadoc
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   * Author : TAN DUNG DANG
35   *          dzungdev@gmail.com
36   * Jan 21, 2009
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      //String workspaceName = manRepository.getConfiguration().getSystemWorkspaceName();
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 }