UIPropertyTab.java
/*
* Copyright (C) 2003-2007 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.ecm.webui.component.explorer.popup.admin;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.jcr.AccessDeniedException;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.PropertyType;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFormatException;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.PropertyDefinition;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.ecm.webui.utils.PermissionUtil;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
/**
* Created by The eXo Platform SARL
* Author : pham tuan
* phamtuanchip@yahoo.de
* September 13, 2006
* 10:07:15 AM
*/
@ComponentConfig(
template = "app:/groovy/webui/component/explorer/popup/info/UIPropertyTab.gtmpl",
events = {
@EventConfig(listeners = UIPropertyTab.CloseActionListener.class),
@EventConfig(listeners = UIPropertyTab.EditActionListener.class),
@EventConfig(listeners = UIPropertyTab.DeleteActionListener.class, confirm="UIPropertyTab.confirm.remove-property")
}
)
public class UIPropertyTab extends UIContainer {
private static String[] PRO_BEAN_FIELD = {"icon", "name", "multiValue", "value", "action"} ;
private final static String PRO_KEY_BINARYTYPE = "binary" ;
private final static String PRO_KEY_CANNOTGET = "cannotget" ;
private static final Log LOG = ExoLogger.getLogger(UIPropertyTab.class.getName());
private Set<String> propertiesName_ = new HashSet<String>();
public String[] getBeanFields() { return PRO_BEAN_FIELD ;}
public String[] getActions() {return new String[] {"Close"} ;}
private Node getCurrentNode() throws Exception {
UIPropertiesManager uiManager = getParent();
return uiManager.getCurrentNode();
}
public PropertyIterator getProperties() throws Exception {
return getCurrentNode().getProperties() ;
}
private Set<String> propertiesName() throws Exception {
if(propertiesName_.size() == 0) {
Node currentNode = getCurrentNode();
NodeType nodetype = currentNode.getPrimaryNodeType() ;
Collection<NodeType> types = new ArrayList<NodeType>() ;
types.add(nodetype) ;
NodeType[] mixins = currentNode.getMixinNodeTypes() ;
if (mixins != null) types.addAll(Arrays.asList(mixins)) ;
for(NodeType nodeType : types) {
for(PropertyDefinition property : nodeType.getPropertyDefinitions()) {
propertiesName_.add(property.getName());
}
}
}
return propertiesName_;
}
public boolean addedByUser(String propertyName) throws Exception {
if(propertiesName().contains(propertyName)) return false;
return true;
}
public boolean isCanbeRemoved(String propertyName) throws Exception {
Property property = getCurrentNode().getProperty(propertyName);
if (property == null || !PermissionUtil.canSetProperty(property.getParent()) ||
property.getDefinition().isMandatory() || property.getDefinition().isProtected())
return false;
return true;
}
public boolean isCanbeEdit(Property property) throws Exception {
if(!PermissionUtil.canSetProperty(property.getParent()) ||
property.getDefinition().isProtected()) {
return false;
}
return true;
}
public String getPropertyValue(Property prop) throws Exception {
if(prop.getType() == PropertyType.BINARY) return PRO_KEY_BINARYTYPE ;
boolean flag = true;
try {
if(prop.getDefinition() != null && prop.getDefinition().isMultiple()) {
Value[] values = prop.getValues();
StringBuilder sB = new StringBuilder();
for (int i = 0; i < values.length; i++) {
if (prop.getType() == PropertyType.REFERENCE) {
String uuid = values[i].getString();
Node node = this.getNodeByUUID(uuid);
if (node == null) {
if (i == 0) flag = false;
continue;
}
}
if ((i > 0) && flag)
sB.append("; ");
sB.append(values[i].getString());
flag = true;
}
return sB.toString();
}
return prop.getString() ;
} catch(ValueFormatException ve) {
return PRO_KEY_CANNOTGET ;
} catch(Exception e) {
return PRO_KEY_CANNOTGET ;
}
}
public Node getNodeByUUID(String uuid) {
Node node = null;
try {
UIJCRExplorer uiExplorer = getAncestorOfType(UIJCRExplorer.class);
Session session = uiExplorer.getSession();
node = session.getNodeByUUID(uuid);
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
return node;
}
static public class CloseActionListener extends EventListener<UIPropertyTab> {
public void execute(Event<UIPropertyTab> event) throws Exception {
event.getSource().getAncestorOfType(UIJCRExplorer.class).cancelAction() ;
}
}
static public class EditActionListener extends EventListener<UIPropertyTab> {
public void execute(Event<UIPropertyTab> event) throws Exception {
UIPropertyTab uiPropertyTab = event.getSource();
UIPropertiesManager uiManager = uiPropertyTab.getParent();
UIApplication uiApp = uiManager.getAncestorOfType(UIApplication.class);
UIJCRExplorer uiExplorer = uiManager.getAncestorOfType(UIJCRExplorer.class);
Node currentNode = uiExplorer.getCurrentNode();
if(!PermissionUtil.canSetProperty(currentNode)) {
uiApp.addMessage(new ApplicationMessage("UIActionBar.msg.access-denied", null,
ApplicationMessage.WARNING));
return;
}
if(uiExplorer.nodeIsLocked(currentNode)) {
Object[] arg = { currentNode.getPath() };
uiApp.addMessage(new ApplicationMessage("UIPopupMenu.msg.node-locked", arg));
return;
}
if(!currentNode.isCheckedOut()) {
uiApp.addMessage(new ApplicationMessage("UIActionBar.msg.node-checkedin", null));
return;
}
String propertyName = event.getRequestContext().getRequestParameter(OBJECTID);
UIPropertyForm uiForm = uiManager.getChild(UIPropertyForm.class);
if(uiForm == null) {
uiForm = uiManager.addChild(UIPropertyForm.class, null, null);
uiForm.init(currentNode);
}
uiForm.loadForm(propertyName);
uiManager.setIsEditProperty(true);
uiManager.setSelectedTab(2);
}
}
static public class DeleteActionListener extends EventListener<UIPropertyTab> {
public void execute(Event<UIPropertyTab> event) throws Exception {
UIPropertyTab uiPropertyTab = event.getSource();
String propertyName = event.getRequestContext().getRequestParameter(OBJECTID);
Node currentNode = uiPropertyTab.getCurrentNode();
UIApplication uiApp = uiPropertyTab.getAncestorOfType(UIApplication.class);
try {
if(currentNode.hasProperty(propertyName)) currentNode.getProperty(propertyName).remove();
currentNode.save();
UIPropertiesManager uiManager = uiPropertyTab.getParent();
uiManager.setRenderedChild(UIPropertyTab.class);
event.getRequestContext().addUIComponentToUpdateByAjax(uiPropertyTab);
return;
} catch(AccessDeniedException ace) {
uiApp.addMessage(new ApplicationMessage("UIActionBar.msg.access-denied", null,
ApplicationMessage.WARNING));
return;
} catch(Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error", e);
}
return;
}
}
}
}