ScriptActionPlugin.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.services.cms.actions.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.PropertyType;
import javax.jcr.Value;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.PropertyDefinition;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.container.component.ComponentPlugin;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.services.cms.actions.activation.ScriptActionActivationJob;
import org.exoplatform.services.cms.scripts.CmsScript;
import org.exoplatform.services.cms.scripts.ScriptService;
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.wcm.utils.WCMCoreUtils;
public class ScriptActionPlugin extends BaseActionPlugin implements ComponentPlugin {
public static final String ACTION_TYPE = "exo:scriptAction";
private ScriptService scriptService_;
private RepositoryService repositoryService_;
private ActionConfig config_;
private String desc_ = "";
public ScriptActionPlugin(ScriptService scriptService, InitParams params,
RepositoryService repositoryService) throws Exception {
scriptService_ = scriptService;
repositoryService_ = repositoryService;
config_ = params.getObjectParamValues(ActionConfig.class).get(0);
}
public Collection<String> getActionExecutables() throws Exception {
Collection<String> actionScriptNames = new ArrayList<String>();
SessionProvider provider = SessionProvider.createSystemProvider();
List<Node> actionScriptList = scriptService_.getECMActionScripts(provider) ;
String baseScriptPath = scriptService_.getBaseScriptPath() ;
for(Node script:actionScriptList) {
String actionScriptName = StringUtils.substringAfter(script.getPath(),baseScriptPath + "/") ;
actionScriptNames.add(actionScriptName) ;
}
provider.close();
return actionScriptNames;
}
public String getActionExecutableLabel() { return "exo:scriptLabel"; }
public String getExecutableDefinitionName() { return "exo:script"; }
protected String getWorkspaceName() { return config_.getWorkspace() ; }
protected ManageableRepository getRepository() throws Exception {
return repositoryService_.getCurrentRepository();
}
protected String getActionType() { return ACTION_TYPE; }
protected List getActions() { return config_.getActions(); }
protected ECMEventListener createEventListener(String actionName, String actionExecutable,
String repository, String srcWorkspace, String srcPath, Map variables, String actiontype) throws Exception {
return new ScriptActionLauncherListener(actionName, actionExecutable, repository, srcWorkspace,
srcPath, variables);
}
public String getName() { return ACTION_TYPE; }
public void setName(String s) { }
public String getDescription() { return desc_; }
public void setDescription(String desc) {
desc_ = desc;
}
@SuppressWarnings("unchecked")
public void executeAction(String userId, Node actionNode, Map variables) throws Exception {
String script = null;
if(actionNode.hasProperty("exo:script")) {
script = actionNode.getProperty("exo:script").getString();
} else {
NodeType nodeType = actionNode.getPrimaryNodeType();
for(PropertyDefinition propertyDefinition : nodeType.getPropertyDefinitions()) {
if(propertyDefinition.getName().equals("exo:script")) {
script = getDefaultValue(propertyDefinition);
}
}
}
variables.put("actionNode", actionNode);
variables.put("repository",WCMCoreUtils.getRepository().getConfiguration().getName()) ;
executeAction(userId, script, variables);
}
private String getDefaultValue(PropertyDefinition proDef) throws Exception {
StringBuilder defaultValue = new StringBuilder() ;
Value[] values = proDef.getDefaultValues() ;
if(values == null || values.length < 0) return "" ;
for(Value value : values) {
if(value == null) continue ;
if(defaultValue.length() > 0) defaultValue.append(",") ;
defaultValue.append(getPropertyValue(value)) ;
}
return defaultValue.toString() ;
}
private String getPropertyValue(Value value) throws Exception{
switch(value.getType()) {
case PropertyType.BINARY: return Integer.toString(PropertyType.BINARY) ;
case PropertyType.BOOLEAN :return Boolean.toString(value.getBoolean()) ;
case PropertyType.DATE : return value.getDate().getTime().toString() ;
case PropertyType.DOUBLE : return Double.toString(value.getDouble()) ;
case PropertyType.LONG : return Long.toString(value.getLong()) ;
case PropertyType.NAME : return value.getString() ;
case PropertyType.STRING : return value.getString() ;
}
return null ;
}
public void executeAction(String userId, String executable, Map variables) throws Exception {
if (!variables.containsKey("userId")) {
variables.put("userId", userId);
}
ScriptService scriptService = WCMCoreUtils.getService(ScriptService.class);
CmsScript cmsScript = scriptService.getScript(executable);
cmsScript.execute(variables);
}
public class ScriptActionLauncherListener extends BaseActionLauncherListener {
public ScriptActionLauncherListener(String actionName, String script, String repository, String srcWorkspace,
String srcPath, Map actionVariables) throws Exception {
super(actionName, script, repository, srcWorkspace, srcPath, actionVariables);
}
public void triggerAction(String userId, Map variables, String repository) throws Exception {
executeAction(userId, super.executable_, variables);
}
}
@SuppressWarnings("unchecked")
public void activateAction(String userId, String executable, Map variables) throws Exception {
executeAction(userId,executable,variables) ;
}
protected Class createActivationJob() throws Exception {
return ScriptActionActivationJob.class ;
}
}