/*
* 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.admin.drives;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Set;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
import org.exoplatform.ecm.webui.comparator.ItemOptionNameComparator;
import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction;
import org.exoplatform.ecm.webui.form.validator.DrivePermissionValidator;
import org.exoplatform.ecm.webui.form.validator.ECMNameValidator;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.services.cms.drives.DriveData;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeImpl;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.web.application.RequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.form.UIFormSelectBox;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.input.UICheckBoxInput;
import org.exoplatform.webui.form.validator.MandatoryValidator;
/**
* Created by The eXo Platform SARL
* Author : Tran The Trong
* trongtt@gmail.com
* Jun 28, 2006
*/
@ComponentConfig(template = "classpath:groovy/ecm/webui/form/UIFormInputSetWithAction.gtmpl")
public class UIDriveInputSet extends UIFormInputSetWithAction {
final static public String FIELD_NAME = "name";
final static public String FIELD_WORKSPACE = "workspace";
final static public String FIELD_HOMEPATH = "homePath";
final static public String FIELD_WORKSPACEICON = "icon";
final static public String FIELD_PERMISSION = "permissions";
final static public String FIELD_ALLOW_NODETYPES_ON_TREE = "allowNodeTypesOnTree";
final static public String FIELD_VIEWPREFERENCESDOC = "viewPreferences";
final static public String FIELD_VIEWNONDOC = "viewNonDocument";
final static public String FIELD_VIEWSIDEBAR = "viewSideBar";
final static public String FIELD_FOLDER_ONLY = "Folder";
final static public String FIELD_BOTH = "Both";
final static public String FIELD_UNSTRUCTURED_ONLY = "Unstructured folder";
final static public String FIELD_ALLOW_CREATE_FOLDERS = "allowCreateFolders";
final static public String SHOW_HIDDEN_NODE = "showHiddenNode";
private final static Log LOG = ExoLogger.getLogger(UIDriveInputSet.class.getName());
public String bothLabel_;
public String folderOnlyLabel_;
public String unstructuredFolderLabel_;
protected Set<String> setFoldertypes;
protected TemplateService templateService;
public UIDriveInputSet(String name) throws Exception {
super(name);
setComponentConfig(getClass(), null);
addUIFormInput(new UIFormStringInput(FIELD_NAME, FIELD_NAME, null).
addValidator(MandatoryValidator.class).addValidator(ECMNameValidator.class));
addUIFormInput(new UIFormSelectBox(FIELD_WORKSPACE, FIELD_WORKSPACE, null));
UIFormStringInput homePathField = new UIFormStringInput(FIELD_HOMEPATH, FIELD_HOMEPATH, null);
homePathField.setValue("/");
homePathField.setDisabled(true);
addUIFormInput(homePathField);
addUIFormInput(new UIFormStringInput(FIELD_WORKSPACEICON, FIELD_WORKSPACEICON, null).setDisabled(true));
UIFormStringInput permissonSelectField = new UIFormStringInput(FIELD_PERMISSION , FIELD_PERMISSION , null);
permissonSelectField.addValidator(MandatoryValidator.class);
permissonSelectField.addValidator(DrivePermissionValidator.class);
permissonSelectField.setDisabled(false);
addUIFormInput(permissonSelectField);
addUIFormInput(new UICheckBoxInput(FIELD_VIEWPREFERENCESDOC, FIELD_VIEWPREFERENCESDOC, null));
addUIFormInput(new UICheckBoxInput(FIELD_VIEWNONDOC, FIELD_VIEWNONDOC, null));
addUIFormInput(new UICheckBoxInput(FIELD_VIEWSIDEBAR, FIELD_VIEWSIDEBAR, null));
addUIFormInput(new UICheckBoxInput(SHOW_HIDDEN_NODE, SHOW_HIDDEN_NODE, null));
addUIFormInput(new UIFormSelectBox(FIELD_ALLOW_CREATE_FOLDERS, FIELD_ALLOW_CREATE_FOLDERS, null));
UIFormStringInput filterNodeTypes =
new UIFormStringInput(FIELD_ALLOW_NODETYPES_ON_TREE , FIELD_ALLOW_NODETYPES_ON_TREE , null);
addUIFormInput(filterNodeTypes);
setActionInfo(FIELD_ALLOW_NODETYPES_ON_TREE, new String[] {"ChooseNodeType", "RemoveNodeType"});
setActionInfo(FIELD_PERMISSION, new String[] {"AddPermission", "RemovePermission"});
setActionInfo(FIELD_HOMEPATH, new String[] {"AddPath"});
setActionInfo(FIELD_WORKSPACEICON, new String[] {"AddIcon"});
templateService = getApplicationComponent(TemplateService.class);
setFoldertypes = templateService.getAllowanceFolderType();
}
public void update(DriveData drive) throws Exception {
String[] wsNames = getApplicationComponent(RepositoryService.class)
.getCurrentRepository().getWorkspaceNames();
List<SelectItemOption<String>> workspace = new ArrayList<SelectItemOption<String>>();
List<SelectItemOption<String>> foldertypeOptions = new ArrayList<SelectItemOption<String>>();
for(String wsName : wsNames) {
workspace.add(new SelectItemOption<String>(wsName, wsName));
}
RequestContext context = RequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
for (String foldertype : setFoldertypes) {
try {
foldertypeOptions.add(new SelectItemOption<String>(res.getString(getId() + ".label."
+ foldertype.replace(":", "_")), foldertype));
} catch (MissingResourceException mre) {
foldertypeOptions.add(new SelectItemOption<String>(foldertype, foldertype));
}
}
getUIFormSelectBox(FIELD_WORKSPACE).setOptions(workspace);
Collections.sort(foldertypeOptions, new ItemOptionNameComparator());
getUIFormSelectBox(FIELD_ALLOW_CREATE_FOLDERS).setOptions(foldertypeOptions);
getUIFormSelectBox(FIELD_ALLOW_CREATE_FOLDERS).setMultiple(true);
if(drive != null) {
// Begin of update
UIDriveForm uiDriveForm = getAncestorOfType(UIDriveForm.class);
String selectedWorkspace = drive.getWorkspace();
String wsInitRootNodeType = uiDriveForm.getWorkspaceEntries(selectedWorkspace);
// End of update
invokeGetBindingField(drive);
//Set value for multi-value select box
String foldertypes = drive.getAllowCreateFolders();
String selectedFolderTypes[];
if (foldertypes.contains(",")) {
selectedFolderTypes = foldertypes.split(",");
} else {
selectedFolderTypes = new String[] {foldertypes};
}
List<SelectItemOption<String>> folderOptions = new ArrayList<SelectItemOption<String>>();
if(wsInitRootNodeType != null && wsInitRootNodeType.equals(Utils.NT_FOLDER)) {
folderOptions.add(new SelectItemOption<String>(UIDriveInputSet.FIELD_FOLDER_ONLY, Utils.NT_FOLDER));
} else {
folderOptions.addAll(foldertypeOptions);
}
Collections.sort(folderOptions, new ItemOptionNameComparator());
getUIFormSelectBox(FIELD_ALLOW_CREATE_FOLDERS).setOptions(folderOptions);
getUIFormSelectBox(FIELD_ALLOW_CREATE_FOLDERS).setSelectedValues(selectedFolderTypes);
getUIStringInput(FIELD_NAME).setDisabled(true);
return;
}
getUIStringInput(FIELD_NAME).setDisabled(false);
reset();
getUICheckBoxInput(FIELD_VIEWPREFERENCESDOC).setChecked(false);
getUICheckBoxInput(FIELD_VIEWNONDOC).setChecked(false);
getUICheckBoxInput(FIELD_VIEWSIDEBAR).setChecked(false);
getUICheckBoxInput(SHOW_HIDDEN_NODE).setChecked(false);
}
public void updateFolderAllowed(String path) {
UIFormSelectBox sltWorkspace = getChildById(UIDriveInputSet.FIELD_WORKSPACE);
String strWorkspace = sltWorkspace.getSelectedValues()[0];
SessionProvider sessionProvider = WCMCoreUtils.getSystemSessionProvider();
try {
Session session = sessionProvider.getSession(strWorkspace,
getApplicationComponent(RepositoryService.class).getCurrentRepository());
Node rootNode = (Node)session.getItem(path);
List<SelectItemOption<String>> foldertypeOptions = new ArrayList<SelectItemOption<String>>();
RequestContext context = RequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
for (String foldertype : setFoldertypes) {
if (isChildNodePrimaryTypeAllowed(rootNode, foldertype) ){
try {
foldertypeOptions.add(new SelectItemOption<String>(res.getString(getId() + ".label."
+ foldertype.replace(":", "_")), foldertype));
} catch (MissingResourceException mre) {
foldertypeOptions.add(new SelectItemOption<String>(foldertype, foldertype));
}
}
}
Collections.sort(foldertypeOptions, new ItemOptionNameComparator());
getUIFormSelectBox(FIELD_ALLOW_CREATE_FOLDERS).setOptions(foldertypeOptions);
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected problem occurs while updating", e);
}
}
}
private boolean isChildNodePrimaryTypeAllowed(Node parent, String childNodeTypeName) throws Exception{
NodeType childNodeType = parent.getSession().getWorkspace().getNodeTypeManager().getNodeType(childNodeTypeName);
//In some cases, the child node is mixins type of a nt:file example
if(childNodeType.isMixin()) return true;
List<NodeType> allNodeTypes = new ArrayList<NodeType>();
allNodeTypes.add(parent.getPrimaryNodeType());
for(NodeType mixin: parent.getMixinNodeTypes()) {
allNodeTypes.add(mixin);
}
for (NodeType nodetype:allNodeTypes) {
if (((NodeTypeImpl)nodetype).isChildNodePrimaryTypeAllowed(Constants.JCR_ANY_NAME,
((NodeTypeImpl)childNodeType).getQName())) {
return true;
}
}
return false;
}
}