UIContentPropertySelector.java
package org.exoplatform.wcm.webui.selector.content;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.nodetype.PropertyDefinition;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.services.cms.BasePath;
import org.exoplatform.services.cms.impl.DMSConfiguration;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormRadioBoxInput;
import org.exoplatform.webui.form.UIFormSelectBox;
/**
* Author : TAN DUNG DANG
* dzungdev@gmail.com
* Jan 21, 2009
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "system:/groovy/webui/form/UIForm.gtmpl",
events = {
@EventConfig(phase=Phase.DECODE, listeners = UIContentPropertySelector.CancelActionListener.class),
@EventConfig(listeners = UIContentPropertySelector.AddActionListener.class),
@EventConfig(listeners = UIContentPropertySelector.ChangeMetadataTypeActionListener.class)
}
)
public class UIContentPropertySelector extends UIForm{
public final static String WEB_CONTENT_METADATA_POPUP = "WebContentMetadataPopup";
final static public String METADATA_TYPE = "metadataType" ;
final static public String PROPERTY_SELECT = "property_select" ;
private String fieldName = null ;
private List<SelectItemOption<String>> properties = new ArrayList<SelectItemOption<String>>() ;
public UIContentPropertySelector() throws Exception {
setActions(new String[] {"Add", "Cancel"}) ;
}
public void init() throws Exception {
List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>();
NodeHierarchyCreator nodeHierarchyCreator = getApplicationComponent(NodeHierarchyCreator.class);
UIFormSelectBox uiSelect = new UIFormSelectBox(METADATA_TYPE, METADATA_TYPE, options);
uiSelect.setOnChange("ChangeMetadataType");
addUIFormInput(uiSelect);
SessionProvider sessionProvider = WCMCoreUtils.getSystemSessionProvider();
RepositoryService repoService = getApplicationComponent(RepositoryService.class);
ManageableRepository manRepository = repoService.getCurrentRepository();
//String workspaceName = manRepository.getConfiguration().getSystemWorkspaceName();
DMSConfiguration dmsConfiguration = getApplicationComponent(DMSConfiguration.class);
String workspaceName = dmsConfiguration.getConfig().getSystemWorkspace();
Session session = sessionProvider.getSession(workspaceName, manRepository);
String metadataPath = nodeHierarchyCreator.getJcrPath(BasePath.METADATA_PATH);
Node homeNode = (Node) session.getItem(metadataPath);
NodeIterator nodeIter = homeNode.getNodes();
Node meta = nodeIter.nextNode();
renderProperties(meta.getName());
options.add(new SelectItemOption<String>(meta.getName(), meta.getName()));
while(nodeIter.hasNext()) {
meta = nodeIter.nextNode();
options.add(new SelectItemOption<String>(meta.getName(), meta.getName()));
}
addUIFormInput(new UIFormRadioBoxInput(PROPERTY_SELECT, null, properties).
setAlign(UIFormRadioBoxInput.VERTICAL_ALIGN));
}
public void setFieldName(String fieldName) { this.fieldName = fieldName ; }
public void renderProperties(String metadata) throws Exception {
properties.clear() ;
SessionProvider sessionProvider = WCMCoreUtils.getSystemSessionProvider();
RepositoryService repoService = getApplicationComponent(RepositoryService.class);
ManageableRepository manRepository = repoService.getCurrentRepository();
String workspaceName = manRepository.getConfiguration().getSystemWorkspaceName();
Session session = sessionProvider.getSession(workspaceName, manRepository);
NodeTypeManager ntManager = session.getWorkspace().getNodeTypeManager();
NodeType nt = ntManager.getNodeType(metadata);
PropertyDefinition[] propertieDefs = nt.getPropertyDefinitions();
for(PropertyDefinition property : propertieDefs) {
String name = property.getName();
if(!name.equals("exo:internalUse")) {
this.properties.add(new SelectItemOption<String>(name,name));
}
}
}
static public class CancelActionListener extends EventListener<UIContentPropertySelector> {
public void execute(Event<UIContentPropertySelector> event) throws Exception {
UIContentPropertySelector contentPropertySelector = event.getSource();
UIPopupWindow uiPopupWindow = contentPropertySelector.getParent();
uiPopupWindow.setRendered(false);
uiPopupWindow.setShow(false);
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupWindow);
}
}
static public class AddActionListener extends EventListener<UIContentPropertySelector> {
public void execute(Event<UIContentPropertySelector> event) throws Exception {
UIContentPropertySelector contentPropertySelector = event.getSource();
String property = contentPropertySelector.<UIFormRadioBoxInput>getUIInput(PROPERTY_SELECT).getValue();
UIPopupWindow uiPopupWindow = contentPropertySelector.getParent();
UIContainer uiContainer = uiPopupWindow.getAncestorOfType(UIContainer.class);
UIContentSelector contentSelector = (UIContentSelector) uiContainer.findFirstComponentOfType(UIContentSelector.class);
UIContentSearchForm contentSearchForm = contentSelector.findFirstComponentOfType(UIContentSearchForm.class);
contentSearchForm.getUIStringInput(contentPropertySelector.getFieldName()).setValue(property);
uiPopupWindow.setRendered(false);
uiPopupWindow.setShow(false);
contentSelector.setSelectedTab(contentSearchForm.getId());
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupWindow);
event.getRequestContext().addUIComponentToUpdateByAjax(contentSearchForm);
}
}
static public class ChangeMetadataTypeActionListener extends EventListener<UIContentPropertySelector> {
public void execute(Event<UIContentPropertySelector> event) throws Exception {
UIContentPropertySelector contentPropertySelector = event.getSource();
contentPropertySelector.renderProperties(contentPropertySelector.getUIFormSelectBox(METADATA_TYPE).getValue());
event.getRequestContext().addUIComponentToUpdateByAjax(contentPropertySelector);
}
}
public String getFieldName() {
return fieldName;
}
}