/*
* 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.upload;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.jcr.Node;
import javax.jcr.PropertyType;
import javax.jcr.Value;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.nodetype.PropertyDefinition;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.services.cms.metadata.MetadataService;
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.UIPopupWindow;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
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.input.UICheckBoxInput;
/**
* Created by The eXo Platform SARL
* Author : Dang Van Minh
* minh.dang@exoplatform.com
* May 25, 2007 3:58:09 PM
*/
@ComponentConfig(lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIForm.gtmpl", events = {
@EventConfig(listeners = UIExternalMetadataForm.AddActionListener.class),
@EventConfig(phase = Phase.DECODE, listeners = UIExternalMetadataForm.CancelActionListener.class) })
public class UIExternalMetadataForm extends UIForm {
public UIExternalMetadataForm() throws Exception {
}
public void renderExternalList() throws Exception {
MetadataService metadataService = getApplicationComponent(MetadataService.class) ;
UICheckBoxInput uiCheckBox ;
for(NodeType nodeType : metadataService.getAllMetadatasNodeType()) {
uiCheckBox = new UICheckBoxInput(nodeType.getName(), nodeType.getName(), null) ;
if(!isInternalUse(nodeType)) {
if(hasExternalMetadata(nodeType.getName())) {
uiCheckBox.setChecked(true);
uiCheckBox.setDisabled(true) ;
} else {
uiCheckBox.setChecked(false) ;
uiCheckBox.setDisabled(false);
}
addUIFormInput(uiCheckBox) ;
}
}
}
private boolean isInternalUse(NodeType nodeType) throws Exception{
for(PropertyDefinition pro : nodeType.getPropertyDefinitions()) {
if(pro.getName().equals("exo:internalUse")) {
return pro.getDefaultValues()[0].getBoolean();
}
}
return false;
}
private boolean hasExternalMetadata(String name) throws Exception {
UIUploadManager uiUploadManager = getAncestorOfType(UIUploadManager.class) ;
UIUploadContainer uiUploadContainer = uiUploadManager.getChild(UIUploadContainer.class) ;
Node uploaded = uiUploadContainer.getUploadedNode() ;
for(NodeType mixin : uploaded.getMixinNodeTypes()) {
if(mixin.getName().equals(name)) return true ;
}
if(uploaded.hasNode(Utils.JCR_CONTENT)) {
for(NodeType mixin : uploaded.getNode(Utils.JCR_CONTENT).getMixinNodeTypes()) {
if(mixin.getName().equals(name)) return true ;
}
}
return false ;
}
public String getLabel(ResourceBundle res, String id) {
try {
return res.getString("UIExternalMetadataForm.label." + id) ;
} catch (MissingResourceException ex) {
return '_' + id ;
}
}
static public class CancelActionListener extends EventListener<UIExternalMetadataForm> {
public void execute(Event<UIExternalMetadataForm> event) throws Exception {
UIUploadManager uiUploadManager = event.getSource().getAncestorOfType(UIUploadManager.class) ;
UIPopupWindow uiPopup = uiUploadManager.getChildById(UIUploadManager.EXTARNAL_METADATA_POPUP) ;
uiPopup.setShow(false) ;
uiPopup.setRendered(false) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiUploadManager) ;
}
}
static public class AddActionListener extends EventListener<UIExternalMetadataForm> {
public void execute(Event<UIExternalMetadataForm> event) throws Exception {
UIExternalMetadataForm uiExternalMetadataForm = event.getSource() ;
List<UICheckBoxInput> listCheckbox = new ArrayList<UICheckBoxInput>();
uiExternalMetadataForm.findComponentOfType(listCheckbox, UICheckBoxInput.class);
UIUploadManager uiUploadManager = event.getSource().getAncestorOfType(UIUploadManager.class) ;
UIUploadContainer uiContainer = uiUploadManager.getChild(UIUploadContainer.class) ;
String metadataName = null ;
Node uploadedNode = uiContainer.getUploadedNode() ;
for(int i = 0; i < listCheckbox.size(); i ++) {
if(listCheckbox.get(i).isChecked() && !listCheckbox.get(i).isDisabled()) {
metadataName = listCheckbox.get(i).getName() ;
if(!uploadedNode.canAddMixin(metadataName)) {
UIApplication uiApp = uiExternalMetadataForm.getAncestorOfType(UIApplication.class) ;
uiApp.addMessage(new ApplicationMessage("UIExternalMetadataForm.msg.can-not-add", null,
ApplicationMessage.WARNING)) ;
return ;
}
uploadedNode.addMixin(metadataName);
createMandatoryPropertyValue(uploadedNode, metadataName);
uploadedNode.save() ;
UIUploadContent uiUploadContent = uiContainer.getChild(UIUploadContent.class) ;
uiUploadContent.externalList_.add(metadataName) ;
}
}
uploadedNode.getSession().save() ;
UIPopupWindow uiPopup = uiUploadManager.getChildById(UIUploadManager.EXTARNAL_METADATA_POPUP) ;
uiPopup.setShow(false) ;
uiPopup.setRendered(false) ;
uiContainer.setRenderedChild(UIUploadContent.class) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiUploadManager) ;
}
private void createMandatoryPropertyValue(Node node, String nodeTypeName) throws Exception {
NodeTypeManager nodeTypeManager = node.getSession().getWorkspace().getNodeTypeManager();
NodeType nodeType = nodeTypeManager.getNodeType(nodeTypeName);
for (PropertyDefinition propertyDefinition : nodeType.getPropertyDefinitions()) {
if (propertyDefinition.isMandatory() &&
(!propertyDefinition.isAutoCreated() || !node.hasProperty(propertyDefinition.getName()))&&
!propertyDefinition.isProtected()) {
String propertyName = propertyDefinition.getName();
int requiredType = propertyDefinition.getRequiredType();
if (!propertyDefinition.isMultiple()) {
switch (requiredType) {
case PropertyType.STRING:
node.setProperty(propertyName, StringUtils.EMPTY);
break;
case PropertyType.BINARY:
node.setProperty(propertyName, "");
break;
case PropertyType.BOOLEAN:
node.setProperty(propertyName, false);
break;
case PropertyType.LONG:
node.setProperty(propertyName, 0);
break;
case PropertyType.DOUBLE:
node.setProperty(propertyName, 0);
break;
case PropertyType.DATE:
node.setProperty(propertyName, new GregorianCalendar());
break;
case PropertyType.REFERENCE:
node.setProperty(propertyName, "");
break;
}
} else {
switch (requiredType) {
case PropertyType.STRING:
node.setProperty(propertyName, new String[] { StringUtils.EMPTY });
break;
case PropertyType.BINARY:
node.setProperty(propertyName, new String[] { "" });
break;
case PropertyType.BOOLEAN:
node.setProperty(propertyName, new Value[] { node.getSession()
.getValueFactory()
.createValue(false) });
break;
case PropertyType.LONG:
node.setProperty(propertyName, new Value[] { node.getSession()
.getValueFactory()
.createValue(0L) });
break;
case PropertyType.DOUBLE:
node.setProperty(propertyName, new Value[] { node.getSession()
.getValueFactory()
.createValue(0) });
break;
case PropertyType.DATE:
node.setProperty(propertyName,
new Value[] { node.getSession()
.getValueFactory()
.createValue(new GregorianCalendar()) });
break;
case PropertyType.REFERENCE:
node.setProperty(propertyName, new String[] {});
break;
}
}
}
}
}
}
}