/*
* 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.actions;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.ecm.utils.lock.LockUtil;
import org.exoplatform.ecm.webui.component.explorer.UIDocumentWorkspace;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.ecm.webui.component.explorer.UIWorkingArea;
import org.exoplatform.ecm.webui.component.explorer.control.action.EditDocumentActionComponent;
import org.exoplatform.ecm.webui.form.DialogFormActionListeners;
import org.exoplatform.ecm.webui.form.UIDialogForm;
import org.exoplatform.ecm.webui.selector.ComponentSelector;
import org.exoplatform.ecm.webui.selector.UISelectable;
import org.exoplatform.ecm.webui.tree.selectone.UIOneNodePathSelector;
import org.exoplatform.ecm.webui.tree.selectone.UIOneTaxonomySelector;
import org.exoplatform.ecm.webui.utils.DialogFormUtil;
import org.exoplatform.ecm.webui.utils.JCRExceptionManager;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.resolver.ResourceResolver;
import org.exoplatform.services.cms.BasePath;
import org.exoplatform.services.cms.CmsService;
import org.exoplatform.services.cms.impl.DMSConfiguration;
import org.exoplatform.services.cms.jcrext.activity.ActivityCommonService;
import org.exoplatform.services.cms.taxonomy.TaxonomyService;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
import org.exoplatform.services.listener.ListenerService;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.core.NodetypeConstant;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.wcm.webui.reader.ContentReader;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIPopupComponent;
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.UIFormInput;
import org.exoplatform.webui.form.UIFormInputBase;
import org.exoplatform.webui.form.UIFormMultiValueInputSet;
import javax.jcr.AccessDeniedException;
import javax.jcr.ItemExistsException;
import javax.jcr.ItemNotFoundException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.version.VersionException;
import java.io.Writer;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
/**
* Created by The eXo Platform SARL
* Author : nqhungvn
* nguyenkequanghung@yahoo.com
* July 3, 2006
* 10:07:15 AM
* Editor : Pham Tuan
* phamtuanchip@yahoo.de
* Nov 08, 2006
*/
@ComponentConfigs( {
@ComponentConfig(type = UIFormMultiValueInputSet.class, id = "WYSIWYGRichTextMultipleInputset", events = {
@EventConfig(listeners = UIDialogForm.AddActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIFormMultiValueInputSet.RemoveActionListener.class, phase = Phase.DECODE) }),
@ComponentConfig(lifecycle = UIFormLifecycle.class, events = {
@EventConfig(listeners = UIDocumentForm.SaveActionListener.class),
@EventConfig(listeners = UIDocumentForm.SaveAndCloseActionListener.class),
@EventConfig(listeners = UIDocumentForm.CloseActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIDocumentForm.ChangeTypeActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIDocumentForm.AddActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIDocumentForm.RemoveActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIDocumentForm.ShowComponentActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIDocumentForm.RemoveReferenceActionListener.class,
confirm = "DialogFormField.msg.confirm-delete", phase = Phase.DECODE),
@EventConfig(listeners = DialogFormActionListeners.RemoveDataActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = DialogFormActionListeners.ChangeTabActionListener.class, phase = Phase.DECODE) }) })
public class UIDocumentForm extends UIDialogForm implements UIPopupComponent, UISelectable {
final static public String FIELD_TAXONOMY = "categories";
final static public String POPUP_TAXONOMY = "PopupComponent";
private List<String> listTaxonomyName = new ArrayList<String>();
private boolean canChangeType = true;
private static final Log LOG = ExoLogger.getLogger(UIDocumentForm.class.getName());
public boolean isCanChangeType() {
return canChangeType;
}
public void setCanChangeType(boolean canChangeType) {
this.canChangeType = canChangeType;
}
public UIDocumentForm() throws Exception {
setActions(new String[]{"Save", "SaveAndClose", "Close"});
}
private String getChangeTypeActionLink () throws Exception {
if (!isAddNew || !canChangeType) return "";
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
String action = "ChangeType";
String strChangeTypeLabel = res.getString(getName() + ".action." + action);
StringBuilder link = new StringBuilder();
link.append("<a onclick=\"")
.append(event(action))
.append("\" class=\"changeTypeLink\">(")
.append(strChangeTypeLabel)
.append(")</a>");
return link.toString();
}
public List<String> getlistTaxonomyName() {
return listTaxonomyName;
}
public void setListTaxonomyName(List<String> listTaxonomyNameNew) {
listTaxonomyName = listTaxonomyNameNew;
}
public void releaseLock() throws Exception {
if (isEditing()) {
super.releaseLock();
}
}
public String getDMSWorkspace() throws Exception {
DMSConfiguration dmsConfig = getApplicationComponent(DMSConfiguration.class);
return dmsConfig.getConfig().getSystemWorkspace();
}
public Node getRootPathTaxonomy(Node node) throws Exception {
try {
TaxonomyService taxonomyService = getApplicationComponent(TaxonomyService.class);
List<Node> allTaxonomyTrees = taxonomyService.getAllTaxonomyTrees();
for (Node taxonomyTree : allTaxonomyTrees) {
if (node.getPath().startsWith(taxonomyTree.getPath())) return taxonomyTree;
}
return null;
} catch (AccessDeniedException accessDeniedException) {
return null;
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error", e);
}
UIApplication uiApp = getAncestorOfType(UIApplication.class);
Object[] arg = { contentType };
uiApp.addMessage(new ApplicationMessage("UIDocumentForm.msg.not-support", arg,
ApplicationMessage.ERROR));
return null;
}
}
@SuppressWarnings("unchecked")
public void doSelect(String selectField, Object value) throws Exception {
isUpdateSelect = true;
UIFormInput formInput = getUIInput(selectField);
if(formInput instanceof UIFormInputBase) {
((UIFormInputBase)formInput).setValue(value.toString());
}else if(formInput instanceof UIFormMultiValueInputSet) {
UIFormMultiValueInputSet inputSet = (UIFormMultiValueInputSet) formInput;
String valueTaxonomy = String.valueOf(value).trim();
List<String> values = (List<String>) inputSet.getValue();
if (!getListTaxonomy().contains(valueTaxonomy)) {
getListTaxonomy().add(valueTaxonomy);
values.add(getCategoryLabel(valueTaxonomy));
}
inputSet.setValue(values);
}
UIDocumentFormController uiContainer = getParent();
uiContainer.removeChildById(POPUP_TAXONOMY);
}
public String getTemplate() {
TemplateService templateService = getApplicationComponent(TemplateService.class);
String userName = Util.getPortalRequestContext().getRemoteUser();
try {
if (contentType != null && contentType.length() > 0 && userName != null & userName.length() > 0) {
return templateService.getTemplatePathByUser(true, contentType, userName);
}
return null;
} catch (AccessControlException e) {
if (LOG.isErrorEnabled()) {
LOG.error("AccessControlException: user [" + userName
+ "] does not have access to the template for content type [" + contentType
+ "] in repository + [" + repositoryName + "]");
}
return null;
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error", e);
}
UIApplication uiApp = getAncestorOfType(UIApplication.class);
Object[] arg = { contentType };
uiApp.addMessage(new ApplicationMessage("UIDocumentForm.msg.not-support", arg,
ApplicationMessage.ERROR));
return null;
}
}
private String getTemplateLabel() throws Exception {
TemplateService templateService = getApplicationComponent(TemplateService.class);
return templateService.getTemplateLabel(contentType);
}
@Override
public void processRender(WebuiRequestContext context) throws Exception {
context.getJavascriptManager().
require("SHARED/uiDocumentForm", "uiDocumentForm").
addScripts("uiDocumentForm.UIDocForm.UpdateGUI();").
addScripts("uiDocumentForm.UIDocForm.AutoFocus();");
context.getJavascriptManager().loadScriptResource("wcm-webui-ext");
context.getJavascriptManager().addCustomizedOnLoadScript("changeWarning();");
super.processRender(context);
}
public void processRenderAction() throws Exception {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
Writer writer = context.getWriter();
writer.append("<h5 class=\"title uiDialogAction clearfix\" >");
writer.append("<div class=\"dialogAction pull-right\">");
String[] listAction = getActions();
String contextID = "UIDocumentForm_" + System.currentTimeMillis();
String actionLabel;
String link;
int count = 0;
for (String action : listAction) {
String btn = (count++ == 0) ? "btn btn-primary" : "btn";
try {
actionLabel = res.getString(getName() + ".action." + action);
} catch (MissingResourceException e) {
actionLabel = action;
}
link = event(action);
writer.append("<button type=\"button\" ")
.append("onclick=\"")
.append(link)
.append("\" class=\"" + btn +"\">")
.append(actionLabel)
.append("</button>");
}
String fullscreen = res.getString(getName() + ".tooltip.FullScreen");
writer.append("<a class=\"actionIcon\" onclick='eXo.webui.UIDocForm.FullScreenToggle(this); return false;'><i ")
.append("title=\"").append(fullscreen)
.append("\" id=\"")
.append(contextID)
.append("\" class=\"uiIconEcmsExpand uiIconEcmsLightGray\"></i></a>");
writer.append("</div>");
writer.append("<span class='uiDialogTitle'>" + ContentReader.getXSSCompatibilityContent(getTemplateLabel()) + " " + getChangeTypeActionLink () + "</span>");
writer.append("</h5>");
context.getJavascriptManager().loadScriptResource("uiDocumentForm");
context.getJavascriptManager().addCustomizedOnLoadScript("eXo.webui.UIDocForm.initFullScreenStatus(\"" + contextID + "\");");
}
@SuppressWarnings("unused")
public ResourceResolver getTemplateResourceResolver(WebuiRequestContext context, String template) {
return getAncestorOfType(UIJCRExplorer.class).getJCRTemplateResourceResolver();
}
public void activate() {}
public void deActivate() {}
public Node getCurrentNode() throws Exception {
return getAncestorOfType(UIJCRExplorer.class).getCurrentNode();
}
public String getLastModifiedDate() throws Exception {
return getLastModifiedDate(getCurrentNode());
}
public synchronized void renderField(String name) throws Exception {
if (FIELD_TAXONOMY.equals(name)) {
if (!isAddNew && !isUpdateSelect) {
TaxonomyService taxonomyService = getApplicationComponent(TaxonomyService.class);
List<Node> listCategories = taxonomyService.getAllCategories(getNode());
Node taxonomyTree;
for (Node itemNode : listCategories) {
taxonomyTree = getRootPathTaxonomy(itemNode);
if (taxonomyTree == null) continue;
String categoryPath = itemNode.getPath().replaceAll(taxonomyTree.getPath(), "");
if (!getListTaxonomy().contains(taxonomyTree.getName() + categoryPath)) {
if (!listTaxonomyName.contains(getCategoryLabel(taxonomyTree.getName() + categoryPath)))
listTaxonomyName.add(getCategoryLabel(taxonomyTree.getName() + categoryPath));
getListTaxonomy().add(taxonomyTree.getName() + categoryPath);
}
}
UIFormMultiValueInputSet uiSet = getChildById(FIELD_TAXONOMY);
if (uiSet != null) uiSet.setValue(listTaxonomyName);
}
}
super.renderField(name);
}
private synchronized List<String> getAddedListCategory(List<String> taxonomyList, List<String> existingList) {
List<String> addedList = new ArrayList<String>();
for(String addedCategory : taxonomyList) {
if(!existingList.contains(addedCategory)) addedList.add(addedCategory);
}
return addedList;
}
private synchronized List<String> getRemovedListCategory(List<String> taxonomyList, List<String> existingList) {
List<String> removedList = new ArrayList<String>();
for(String existedCategory : existingList) {
if(!taxonomyList.contains(existedCategory)) removedList.add(existedCategory);
}
return removedList;
}
public static Node saveDocument (Event <UIDocumentForm> event) throws Exception {
UIDocumentForm documentForm = event.getSource();
UIJCRExplorer uiExplorer = documentForm.getAncestorOfType(UIJCRExplorer.class);
List inputs = documentForm.getChildren();
UIApplication uiApp = documentForm.getAncestorOfType(UIApplication.class);
boolean hasCategories = false;
String categoriesPath = "";
TaxonomyService taxonomyService = documentForm.getApplicationComponent(TaxonomyService.class);
if (documentForm.isAddNew()) {
for (int i = 0; i < inputs.size(); i++) {
UIFormInput input = (UIFormInput) inputs.get(i);
if ((input.getName() != null) && input.getName().equals("name")) {
String valueName = input.getValue().toString();
if (!Utils.isNameValid(valueName, Utils.SPECIALCHARACTER)) {
uiApp.addMessage(new ApplicationMessage("UIFolderForm.msg.name-not-allowed", null,
ApplicationMessage.WARNING));
return null;
}
}
}
}
int index = 0;
List<String> listTaxonomy = documentForm.getListTaxonomy();
if (documentForm.isReference) {
UIFormMultiValueInputSet uiSet = documentForm.getChildById(FIELD_TAXONOMY);
if((uiSet != null) && (uiSet.getName() != null) && uiSet.getName().equals(FIELD_TAXONOMY)) {
hasCategories = true;
listTaxonomy = (List<String>) uiSet.getValue();
for (String category : listTaxonomy) {
categoriesPath = categoriesPath.concat(category).concat(",");
}
if (listTaxonomy != null && listTaxonomy.size() > 0) {
try {
for (String categoryPath : listTaxonomy) {
index = categoryPath.indexOf("/");
if (index < 0) {
taxonomyService.getTaxonomyTree(categoryPath);
} else {
taxonomyService.getTaxonomyTree(categoryPath.substring(0, index))
.getNode(categoryPath.substring(index + 1));
}
}
} catch (Exception e) {
uiApp.addMessage(new ApplicationMessage("UISelectedCategoriesGrid.msg.non-categories",
null,
ApplicationMessage.WARNING));
return null;
}
}
}
}
Map inputProperties = DialogFormUtil.prepareMap(inputs, documentForm.getInputProperties(), documentForm.getInputOptions());
Node newNode = null;
String nodeType;
Node homeNode;
Node currentNode = uiExplorer.getCurrentNode();
if(documentForm.isAddNew()) {
UIDocumentFormController uiDFController = documentForm.getParent();
homeNode = currentNode;
nodeType = uiDFController.getChild(UIDocumentForm.class).getContentType();
if(homeNode.isLocked()) {
homeNode.getSession().addLockToken(LockUtil.getLockToken(homeNode));
}
} else {
Node documentNode = documentForm.getNode();
for (String removedNode : documentForm.getRemovedNodes()) {
documentNode.getNode(removedNode).remove();
}
homeNode = currentNode;
nodeType = documentNode.getPrimaryNodeType().getName();
if(documentNode.isLocked()) {
String lockToken = LockUtil.getLockToken(documentNode);
if(lockToken != null && !lockToken.isEmpty()) {
documentNode.getSession().addLockToken(lockToken);
}
}
}
try {
CmsService cmsService = documentForm.getApplicationComponent(CmsService.class);
cmsService.getPreProperties().clear();
String addedPath = "";
if(WCMCoreUtils.canAccessParentNode(documentForm.getCurrentNode()) ||
StringUtils.equals("/", documentForm.getCurrentNode().getPath())) {
if(documentForm.isAddNew()) {
addedPath = cmsService.storeNode(nodeType, homeNode, inputProperties, documentForm.isAddNew());
}else{
addedPath = cmsService.storeNode(nodeType, homeNode.getParent(), inputProperties, documentForm.isAddNew());
}
}else{
addedPath = cmsService.storeEditedNode(nodeType, homeNode, inputProperties, documentForm.isAddNew());
}
try {
newNode = (Node)currentNode.getSession().getItem(addedPath);
//Broadcast the add file activity
if(documentForm.isAddNew()) {
ListenerService listenerService = WCMCoreUtils.getService(ListenerService.class);
ActivityCommonService activityService = WCMCoreUtils.getService(ActivityCommonService.class);
if (newNode.getPrimaryNodeType().getName().equals(NodetypeConstant.NT_FILE)
&& activityService.isBroadcastNTFileEvents(newNode)) {
listenerService.broadcast(ActivityCommonService.FILE_CREATED_ACTIVITY, null, newNode);
newNode.getSession().save();
} else if(activityService.isAcceptedNode(newNode)) {
listenerService.broadcast(ActivityCommonService.NODE_CREATED_ACTIVITY, null, newNode);
newNode.getSession().save();
}
}
if(newNode.isLocked()) {
newNode.getSession().addLockToken(LockUtil.getLockToken(newNode));
}
List<Node> listTaxonomyTrees = taxonomyService.getAllTaxonomyTrees();
List<Node> listExistedTaxonomy = taxonomyService.getAllCategories(newNode);
List<String> listExistingTaxonomy = new ArrayList<String>();
for (Node existedTaxonomy : listExistedTaxonomy) {
for (Node taxonomyTrees : listTaxonomyTrees) {
if (existedTaxonomy.getPath().contains(taxonomyTrees.getPath())) {
listExistingTaxonomy.add(taxonomyTrees.getName()
+ existedTaxonomy.getPath().substring(taxonomyTrees.getPath().length()));
break;
}
}
}
if(WCMCoreUtils.canAccessParentNode(documentForm.getCurrentNode())) {
if (hasCategories && !documentForm.getCurrentNode().getParent().isNodeType("exo:taxonomy")) {
for (String removedCate : documentForm.getRemovedListCategory(listTaxonomy, listExistingTaxonomy)) {
index = removedCate.indexOf("/");
if (index != -1) {
taxonomyService.removeCategory(newNode, removedCate.substring(0, index), removedCate.substring(index + 1));
} else {
taxonomyService.removeCategory(newNode, removedCate, "");
}
}
}
}
if (hasCategories && (newNode != null) && ((listTaxonomy != null) && (listTaxonomy.size() > 0))){
documentForm.releaseLock();
for(String categoryPath : documentForm.getAddedListCategory(listTaxonomy, listExistingTaxonomy)) {
index = categoryPath.indexOf("/");
try {
if (index != -1) {
taxonomyService.addCategory(newNode, categoryPath.substring(0, index), categoryPath.substring(index + 1));
} else {
taxonomyService.addCategory(newNode, categoryPath, "");
}
} catch(AccessDeniedException accessDeniedException) {
uiApp.addMessage(new ApplicationMessage("AccessControlException.msg", null,
ApplicationMessage.WARNING));
} catch (Exception e) {
continue;
}
}
} else {
List<Value> vals = new ArrayList<Value>();
if (newNode.hasProperty("exo:category")) newNode.setProperty("exo:category", vals.toArray(new Value[vals.size()]));
newNode.save();
}
uiExplorer.setCurrentPath(newNode.getPath());
uiExplorer.setWorkspaceName(newNode.getSession().getWorkspace().getName());
uiExplorer.refreshExplorer(newNode, true);
uiExplorer.updateAjax(event);
return newNode;
} catch(Exception e) {
uiExplorer.getSession().refresh(false);
uiExplorer.updateAjax(event);
}
uiExplorer.getSession().save();
uiExplorer.updateAjax(event);
} catch (AccessControlException ace) {
throw new AccessDeniedException(ace.getMessage());
} catch(VersionException ve) {
uiApp.addMessage(new ApplicationMessage("UIDocumentForm.msg.in-versioning", null,
ApplicationMessage.WARNING));
return null;
} catch(ItemNotFoundException item) {
uiApp.addMessage(new ApplicationMessage("UIDocumentForm.msg.item-not-found", null,
ApplicationMessage.WARNING));
return null;
} catch(AccessDeniedException accessDeniedException) {
uiApp.addMessage(new ApplicationMessage("UIDocumentForm.msg.repository-exception-permission", null,
ApplicationMessage.WARNING));
return null;
} catch(ItemExistsException existedex) {
uiApp.addMessage(new ApplicationMessage("UIDocumentForm.msg.not-allowed-same-name-sibling",
null,
ApplicationMessage.WARNING));
return null;
} catch(ConstraintViolationException constraintViolationException) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error occurrs", constraintViolationException);
}
uiApp.addMessage(new ApplicationMessage("UIDocumentForm.msg.constraintviolation-exception",
null,
ApplicationMessage.WARNING));
return null;
} catch(RepositoryException repo) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error occurrs", repo);
}
uiApp.addMessage(new ApplicationMessage("UIDocumentForm.msg.repository-exception", null, ApplicationMessage.WARNING));
return null;
} catch(NumberFormatException nume) {
String key = "UIDocumentForm.msg.numberformat-exception";
uiApp.addMessage(new ApplicationMessage(key, null, ApplicationMessage.WARNING));
return null;
} catch(Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error occurs", e);
}
String key = "UIDocumentForm.msg.cannot-save";
uiApp.addMessage(new ApplicationMessage(key, null, ApplicationMessage.WARNING));
return null;
} finally {
documentForm.releaseLock();
}
return null;
}
public static void closeForm (Event<UIDocumentForm> event) throws Exception {
UIJCRExplorer uiExplorer = event.getSource().getAncestorOfType(UIJCRExplorer.class);
if(uiExplorer != null) {
UIWorkingArea uiWorkingArea = uiExplorer.getChild(UIWorkingArea.class);
UIDocumentWorkspace uiDocumentWorkspace = uiWorkingArea.getChild(UIDocumentWorkspace.class);
event.getSource().releaseLock();
if (uiDocumentWorkspace.getChild(UIDocumentFormController.class) != null) {
uiDocumentWorkspace.removeChild(UIDocumentFormController.class);
} else
uiExplorer.cancelAction();
uiExplorer.updateAjax(event);
}
}
static public class SaveActionListener extends EventListener<UIDocumentForm> {
public void execute(Event<UIDocumentForm> event) throws Exception {
UIDocumentForm documentForm = event.getSource();
synchronized (documentForm) {
UIJCRExplorer uiExplorer = documentForm.getAncestorOfType(UIJCRExplorer.class);
UIApplication uiApp = documentForm.getAncestorOfType(UIApplication.class);
Node newNode = UIDocumentForm.saveDocument(event);
if (newNode != null) {
event.getRequestContext().setAttribute("nodePath",newNode.getPath());
UIWorkingArea uiWorkingArea = uiExplorer.getChild(UIWorkingArea.class);
UIDocumentWorkspace uiDocumentWorkspace = uiWorkingArea.getChild(UIDocumentWorkspace.class);
uiDocumentWorkspace.removeChild(UIDocumentFormController.class);
documentForm.setIsUpdateSelect(false);
EditDocumentActionComponent.editDocument(event, null, uiExplorer, uiExplorer, uiExplorer.getCurrentNode(), uiApp);
}
}
}
}
static public class ShowComponentActionListener extends EventListener<UIDocumentForm> {
public void execute(Event<UIDocumentForm> event) throws Exception {
UIDocumentForm uiForm = event.getSource();
UIDocumentFormController uiContainer = uiForm.getParent();
uiForm.isShowingComponent = true;
String fieldName = event.getRequestContext().getRequestParameter(OBJECTID);
Map fieldPropertiesMap = uiForm.componentSelectors.get(fieldName);
String classPath = (String)fieldPropertiesMap.get("selectorClass");
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = Class.forName(classPath, true, cl);
String rootPath = (String)fieldPropertiesMap.get("rootPath");
UIComponent uiComp = uiContainer.createUIComponent(clazz, null, null);
String selectorParams = (String)fieldPropertiesMap.get("selectorParams");
UIJCRExplorer explorer = uiForm.getAncestorOfType(UIJCRExplorer.class);
if (uiComp instanceof UIOneNodePathSelector) {
String repositoryName = explorer.getRepositoryName();
SessionProvider provider = explorer.getSessionProvider();
String wsFieldName = (String) fieldPropertiesMap.get("workspaceField");
String wsName = "";
if (wsFieldName != null && wsFieldName.length() > 0) {
if (uiForm.<UIFormInputBase> getUIInput(wsFieldName) != null) {
wsName = (String) uiForm.<UIFormInputBase> getUIInput(wsFieldName).getValue();
((UIOneNodePathSelector) uiComp).setIsDisable(wsName, true);
} else {
wsName = explorer.getCurrentWorkspace();
((UIOneNodePathSelector) uiComp).setIsDisable(wsName, false);
}
}
if (selectorParams != null) {
String[] arrParams = selectorParams.split(",");
if (arrParams.length == 4) {
((UIOneNodePathSelector) uiComp).setAcceptedNodeTypesInPathPanel(new String[] {
Utils.NT_FILE, Utils.NT_FOLDER, Utils.NT_UNSTRUCTURED, Utils.EXO_TAXONOMY });
wsName = arrParams[1];
rootPath = arrParams[2];
((UIOneNodePathSelector) uiComp).setIsDisable(wsName, true);
if (arrParams[3].indexOf(";") > -1) {
((UIOneNodePathSelector) uiComp).setAcceptedMimeTypes(arrParams[3].split(";"));
} else {
((UIOneNodePathSelector) uiComp).setAcceptedMimeTypes(new String[] { arrParams[3] });
}
}
}
if (rootPath == null)
rootPath = "/";
((UIOneNodePathSelector) uiComp).setRootNodeLocation(repositoryName, wsName, rootPath);
((UIOneNodePathSelector) uiComp).setShowRootPathSelect(true);
((UIOneNodePathSelector) uiComp).init(provider);
} else if (uiComp instanceof UIOneTaxonomySelector) {
NodeHierarchyCreator nodeHierarchyCreator = uiForm.getApplicationComponent(NodeHierarchyCreator.class);
String workspaceName = uiForm.getDMSWorkspace();
((UIOneTaxonomySelector) uiComp).setIsDisable(workspaceName, false);
String rootTreePath = nodeHierarchyCreator.getJcrPath(BasePath.TAXONOMIES_TREE_STORAGE_PATH);
Session session = explorer.getSessionByWorkspace(workspaceName);
Node rootTree = (Node) session.getItem(rootTreePath);
NodeIterator childrenIterator = rootTree.getNodes();
while (childrenIterator.hasNext()) {
Node childNode = childrenIterator.nextNode();
rootTreePath = childNode.getPath();
break;
}
((UIOneTaxonomySelector) uiComp).setRootNodeLocation(uiForm.repositoryName,
workspaceName,
rootTreePath);
((UIOneTaxonomySelector) uiComp).init(WCMCoreUtils.getSystemSessionProvider());
}
uiContainer.initPopup(uiComp);
String param = "returnField=" + fieldName;
String[] params = selectorParams == null ? new String[] { param } : new String[] { param,
"selectorParams=" + selectorParams };
((ComponentSelector) uiComp).setSourceComponent(uiForm, params);
event.getRequestContext().addUIComponentToUpdateByAjax(uiContainer);
}
}
static public class RemoveReferenceActionListener extends EventListener<UIDocumentForm> {
public void execute(Event<UIDocumentForm> event) throws Exception {
UIDocumentForm uiForm = event.getSource();
uiForm.isRemovePreference = true;
String fieldName = event.getRequestContext().getRequestParameter(OBJECTID);
uiForm.getUIStringInput(fieldName).setValue(null);
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent());
}
}
static public class CloseActionListener extends EventListener<UIDocumentForm> {
public void execute(Event<UIDocumentForm> event) throws Exception {
UIDocumentForm.closeForm(event);
}
}
static public class ChangeTypeActionListener extends EventListener<UIDocumentForm> {
public void execute(Event<UIDocumentForm> event) throws Exception {
UIDocumentForm uiDocumentForm = event.getSource();
UIDocumentFormController uiDCFormController = uiDocumentForm.getParent();
UISelectDocumentForm uiSelectForm = uiDCFormController.getChild(UISelectDocumentForm.class);
uiSelectForm.setRendered(true);
uiDocumentForm.setRendered(false);
event.getRequestContext().addUIComponentToUpdateByAjax(uiDCFormController);
}
}
static public class SaveAndCloseActionListener extends EventListener<UIDocumentForm> {
public void execute(Event<UIDocumentForm> event) throws Exception {
Node newNode = UIDocumentForm.saveDocument(event);
if (newNode != null) {
event.getRequestContext().setAttribute("nodePath",newNode.getPath());
}
UIDocumentForm.closeForm(event);
}
}
static public class AddActionListener extends EventListener<UIDocumentForm> {
public void execute(Event<UIDocumentForm> event) throws Exception {
UIDocumentForm uiDocumentForm = event.getSource();
UIDocumentFormController uiFormController = uiDocumentForm.getParent();
String clickedField = event.getRequestContext().getRequestParameter(OBJECTID);
if (uiDocumentForm.isReference) {
uiDocumentForm.setIsUpdateSelect(true);
UIApplication uiApp = uiDocumentForm.getAncestorOfType(UIApplication.class);
try {
UIFormMultiValueInputSet uiSet = uiDocumentForm.getChildById(FIELD_TAXONOMY);
if((uiSet != null) && (uiSet.getName() != null) && uiSet.getName().equals(FIELD_TAXONOMY)) {
if ((clickedField != null) && (clickedField.equals(FIELD_TAXONOMY))){
UIJCRExplorer uiExplorer = uiDocumentForm.getAncestorOfType(UIJCRExplorer.class);
String repository = uiExplorer.getRepositoryName();
if(uiSet.getValue().size() == 0) uiSet.setValue(new ArrayList<Value>());
UIOneTaxonomySelector uiOneTaxonomySelector =
uiFormController.createUIComponent(UIOneTaxonomySelector.class, null, null);
TaxonomyService taxonomyService = uiDocumentForm.getApplicationComponent(TaxonomyService.class);
List<Node> lstTaxonomyTree = taxonomyService.getAllTaxonomyTrees();
if (lstTaxonomyTree.size() == 0) throw new AccessDeniedException();
String workspaceName = lstTaxonomyTree.get(0).getSession().getWorkspace().getName();
uiOneTaxonomySelector.setIsDisable(workspaceName, false);
uiOneTaxonomySelector.setRootNodeLocation(repository, workspaceName, lstTaxonomyTree.get(0).getPath());
uiOneTaxonomySelector.setExceptedNodeTypesInPathPanel(new String[] {Utils.EXO_SYMLINK});
uiOneTaxonomySelector.init(uiExplorer.getSystemProvider());
String param = "returnField=" + FIELD_TAXONOMY;
uiOneTaxonomySelector.setSourceComponent(uiDocumentForm, new String[]{param});
UIPopupWindow uiPopupWindow = uiFormController.getChildById(POPUP_TAXONOMY);
if (uiPopupWindow == null) {
uiPopupWindow = uiFormController.addChild(UIPopupWindow.class, null, POPUP_TAXONOMY);
}
uiPopupWindow.setWindowSize(700, 450);
uiPopupWindow.setUIComponent(uiOneTaxonomySelector);
uiPopupWindow.setRendered(true);
uiPopupWindow.setShow(true);
}
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiFormController);
} catch (AccessDeniedException accessDeniedException) {
uiApp.addMessage(new ApplicationMessage("Taxonomy.msg.AccessDeniedException", null,
ApplicationMessage.WARNING));
return;
} catch (Exception e) {
JCRExceptionManager.process(uiApp, e);
return;
}
} else {
event.getRequestContext().addUIComponentToUpdateByAjax(uiDocumentForm.getParent());
}
}
}
static public class RemoveActionListener extends EventListener<UIDocumentForm> {
public void execute(Event<UIDocumentForm> event) throws Exception {
UIDocumentForm uiDocumentForm = event.getSource();
String objectid = event.getRequestContext().getRequestParameter(OBJECTID);
String idx = objectid.replaceAll(FIELD_TAXONOMY,"");
try {
int idxInput = Integer.parseInt(idx);
uiDocumentForm.getListTaxonomy().remove(idxInput);
uiDocumentForm.getlistTaxonomyName().remove(idxInput);
uiDocumentForm.setIsUpdateSelect(true);
} catch (NumberFormatException ne) {
if (LOG.isWarnEnabled()) {
LOG.warn(ne.getMessage());
}
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiDocumentForm);
}
}
}