From 8c2c15c5c9ae8294cb825a26d0b18a600aa9b0fc Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Mon, 8 Feb 2010 04:37:45 +0000 Subject: [PATCH] Support for action parameter constraints added to action service An action parameter constraint provides a way to list the valid values that an action or action constraint parameter can take. This means more information about the action or action condition is available to the user of the action. Currently there is only an implementation for enum parameter values, but this will be extended as the existing action implementations are reviewed and value constraints are added as required. The REST API can now be extended to provide this additional information. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@18489 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/action-services-context.xml | 10 ++ .../messages/action-config.properties | 10 ++ .../repo/action/ActionServiceImpl.java | 48 ++++-- .../repo/action/ActionServiceRemote.java | 19 ++- .../action/ActionServiceTransportImpl.java | 19 +++ .../repo/action/ParameterDefinitionImpl.java | 34 ++++ .../repo/action/RuntimeActionService.java | 44 +++-- .../ActionParameterConstraintTest.java | 87 ++++++++++ .../constraint/BaseParameterConstraint.java | 79 +++++++++ .../constraint/EnumParameterConstraint.java | 156 ++++++++++++++++++ .../ComparePropertyValueEvaluator.java | 2 +- .../ComparePropertyValueEvaluatorTest.java | 21 +++ .../service/cmr/action/ActionService.java | 17 ++ .../cmr/action/ActionServiceTransport.java | 18 +- .../cmr/action/ParameterConstraint.java | 63 +++++++ .../cmr/action/ParameterDefinition.java | 7 + 16 files changed, 599 insertions(+), 35 deletions(-) create mode 100644 source/java/org/alfresco/repo/action/constraint/ActionParameterConstraintTest.java create mode 100644 source/java/org/alfresco/repo/action/constraint/BaseParameterConstraint.java create mode 100644 source/java/org/alfresco/repo/action/constraint/EnumParameterConstraint.java create mode 100644 source/java/org/alfresco/service/cmr/action/ParameterConstraint.java diff --git a/config/alfresco/action-services-context.xml b/config/alfresco/action-services-context.xml index 1ad56c09aa..7895119e3e 100644 --- a/config/alfresco/action-services-context.xml +++ b/config/alfresco/action-services-context.xml @@ -141,6 +141,16 @@ + + + + + + + + + + diff --git a/config/alfresco/messages/action-config.properties b/config/alfresco/messages/action-config.properties index a5147e41b8..b9b828cfa1 100644 --- a/config/alfresco/messages/action-config.properties +++ b/config/alfresco/messages/action-config.properties @@ -1,3 +1,13 @@ +# Action constraints +compare-operations.equals=Equals +compare-operations.contains=Contains +compare-operations.begins=Begins With +compare-operations.ends=Ends With +compare-operations.greater_than=Greater Than +compare-operations.greater_than_equal=Greater Than Or Equal To +compare-operations.less_than=Less Than +compare-operations.less_than_equal=Less Than Or Equal To + # Action conditions no-condition.title=All Items diff --git a/source/java/org/alfresco/repo/action/ActionServiceImpl.java b/source/java/org/alfresco/repo/action/ActionServiceImpl.java index cfb8166acc..8d22240479 100644 --- a/source/java/org/alfresco/repo/action/ActionServiceImpl.java +++ b/source/java/org/alfresco/repo/action/ActionServiceImpl.java @@ -52,6 +52,7 @@ import org.alfresco.service.cmr.action.ActionService; import org.alfresco.service.cmr.action.ActionServiceException; import org.alfresco.service.cmr.action.CompositeAction; import org.alfresco.service.cmr.action.CompositeActionCondition; +import org.alfresco.service.cmr.action.ParameterConstraint; import org.alfresco.service.cmr.action.ParameterizedItem; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.repository.ChildAssociationRef; @@ -63,12 +64,12 @@ import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.GUID; -import org.springframework.extensions.surf.util.PropertyCheck; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.extensions.surf.util.PropertyCheck; /** * Action service implementation @@ -131,6 +132,11 @@ public class ActionServiceImpl implements */ private Map actionDefinitions = new HashMap(); + /** + * All the parameter constraints + */ + private Map parameterConstraints = new HashMap(); + /** * Set the application context * @@ -199,18 +205,7 @@ public class ActionServiceImpl implements Map asynchronousActionExecutionQueues) { this.asynchronousActionExecutionQueues = asynchronousActionExecutionQueues; - } - -// /** -// * Get the asynchronous action execution queue -// * -// * @return the asynchronous action execution queue -// */ -// public AsynchronousActionExecutionQueue getAsynchronousActionExecutionQueue() -// { -// return asynchronousActionExecutionQueue; -// } -// + } public void init() { @@ -323,7 +318,23 @@ public class ActionServiceImpl implements { return new ArrayList(this.conditionDefinitions.values()); } - + + /** + * @see org.alfresco.service.cmr.action.ActionService#getParameterConstraint(java.lang.String) + */ + public ParameterConstraint getParameterConstraint(String name) + { + return this.parameterConstraints.get(name); + } + + /** + * @see org.alfresco.service.cmr.action.ActionService#getParameterConstraints() + */ + public List getParameterConstraints() + { + return new ArrayList(this.parameterConstraints.values()); + } + /** * @see org.alfresco.service.cmr.action.ActionService#createActionCondition(java.lang.String) */ @@ -737,6 +748,14 @@ public class ActionServiceImpl implements this.actionDefinitions.put(action.getName(), action); } + /** + * @see org.alfresco.repo.action.RuntimeActionService#registerParameterConstraint(org.alfresco.service.cmr.action.ParameterConstraint) + */ + public void registerParameterConstraint(ParameterConstraint parameterConstraint) + { + this.parameterConstraints.put(parameterConstraint.getName(), parameterConstraint); + } + /** * Gets the action node ref from the action id * @@ -1654,7 +1673,6 @@ public class ActionServiceImpl implements * Ensures that d:noderef properties are repointed if the target was also copied as part of the * hierarchy. */ - @SuppressWarnings("unchecked") public void onCopyComplete( QName classRef, NodeRef sourceNodeRef, diff --git a/source/java/org/alfresco/repo/action/ActionServiceRemote.java b/source/java/org/alfresco/repo/action/ActionServiceRemote.java index d9a392df65..520e29b662 100644 --- a/source/java/org/alfresco/repo/action/ActionServiceRemote.java +++ b/source/java/org/alfresco/repo/action/ActionServiceRemote.java @@ -37,7 +37,8 @@ import org.alfresco.service.cmr.action.ActionDefinition; import org.alfresco.service.cmr.action.ActionService; import org.alfresco.service.cmr.action.ActionServiceTransport; import org.alfresco.service.cmr.action.CompositeAction; -import org.alfresco.service.cmr.action.CompositeActionCondition; +import org.alfresco.service.cmr.action.CompositeActionCondition; +import org.alfresco.service.cmr.action.ParameterConstraint; import org.alfresco.service.cmr.repository.NodeRef; /** @@ -192,6 +193,22 @@ public class ActionServiceRemote implements ActionService return fTransport.getActionDefinitions(fHolder.getTicket(), nodeRef); } + /** + * @see org.alfresco.service.cmr.action.ActionService#getParameterConstraint(java.lang.String) + */ + public ParameterConstraint getParameterConstraint(String name) + { + return fTransport.getParameterConstraint(fHolder.getTicket(), name); + } + + /** + * @see org.alfresco.service.cmr.action.ActionService#getParameterConstraints() + */ + public List getParameterConstraints() + { + return fTransport.getParameterConstraints(fHolder.getTicket()); + } + /* (non-Javadoc) * @see org.alfresco.service.cmr.action.ActionService#getActions(org.alfresco.service.cmr.repository.NodeRef) */ diff --git a/source/java/org/alfresco/repo/action/ActionServiceTransportImpl.java b/source/java/org/alfresco/repo/action/ActionServiceTransportImpl.java index 9fa8e0cfd0..a445e6415b 100644 --- a/source/java/org/alfresco/repo/action/ActionServiceTransportImpl.java +++ b/source/java/org/alfresco/repo/action/ActionServiceTransportImpl.java @@ -36,6 +36,7 @@ import org.alfresco.service.cmr.action.ActionDefinition; import org.alfresco.service.cmr.action.ActionService; import org.alfresco.service.cmr.action.ActionServiceTransport; import org.alfresco.service.cmr.action.CompositeAction; +import org.alfresco.service.cmr.action.ParameterConstraint; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.AuthenticationService; @@ -213,6 +214,24 @@ public class ActionServiceTransportImpl implements ActionServiceTransport fAuthenticationService.validate(ticket, null); return fActionService.getActionDefinitions(nodeRef); } + + /** + * @see org.alfresco.service.cmr.action.ActionServiceTransport#getParameterConstraint(java.lang.String, java.lang.String) + */ + public ParameterConstraint getParameterConstraint(String ticket, String name) + { + fAuthenticationService.validate(ticket, null); + return fActionService.getParameterConstraint(name); + } + + /** + * @see org.alfresco.service.cmr.action.ActionServiceTransport#getParameterConstraints(java.lang.String) + */ + public List getParameterConstraints(String ticket) + { + fAuthenticationService.validate(ticket, null); + return fActionService.getParameterConstraints(); + } /* (non-Javadoc) * @see org.alfresco.service.cmr.action.ActionServiceTransport#getActions(java.lang.String, org.alfresco.service.cmr.repository.NodeRef) diff --git a/source/java/org/alfresco/repo/action/ParameterDefinitionImpl.java b/source/java/org/alfresco/repo/action/ParameterDefinitionImpl.java index 6466a2df3c..57072e547d 100644 --- a/source/java/org/alfresco/repo/action/ParameterDefinitionImpl.java +++ b/source/java/org/alfresco/repo/action/ParameterDefinitionImpl.java @@ -26,6 +26,7 @@ package org.alfresco.repo.action; import java.io.Serializable; +import org.alfresco.service.cmr.action.ParameterConstraint; import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.namespace.QName; @@ -61,6 +62,9 @@ public class ParameterDefinitionImpl implements ParameterDefinition, Serializabl */ private String displayLabel; + /** Parameter constraint name */ + private String parameterConstraintName; + /** * Indicates whether it is mandatory for the parameter to be set */ @@ -106,6 +110,28 @@ public class ParameterDefinitionImpl implements ParameterDefinition, Serializabl this.isMandatory = isMandatory; this.isMultiValued = isMultiValued; } + + /** + * Constructor + * + * @param name + * @param type + * @param isMandatory + * @param displayLabel + * @param isMultiValued + * @param parameterConstraintName + */ + public ParameterDefinitionImpl( + String name, + QName type, + boolean isMandatory, + String displayLabel, + boolean isMultiValued, + String parameterConstraintName) + { + this(name, type, isMandatory, displayLabel, isMultiValued); + this.parameterConstraintName = parameterConstraintName; + } /** * @see org.alfresco.service.cmr.action.ParameterDefinition#getName() @@ -146,4 +172,12 @@ public class ParameterDefinitionImpl implements ParameterDefinition, Serializabl { return this.displayLabel; } + + /** + * @see org.alfresco.service.cmr.action.ParameterDefinition#getParameterConstraintName() + */ + public String getParameterConstraintName() + { + return this.parameterConstraintName; + } } diff --git a/source/java/org/alfresco/repo/action/RuntimeActionService.java b/source/java/org/alfresco/repo/action/RuntimeActionService.java index c79c81c7b2..5a0f4cc1c0 100644 --- a/source/java/org/alfresco/repo/action/RuntimeActionService.java +++ b/source/java/org/alfresco/repo/action/RuntimeActionService.java @@ -29,26 +29,23 @@ import java.util.Set; import org.alfresco.repo.action.evaluator.ActionConditionEvaluator; import org.alfresco.repo.action.executer.ActionExecuter; import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.action.ParameterConstraint; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; /** + * Runtime action service. This interface contains methods useful for integration with the action + * service at a lower level. + * * @author Roy Wetherall */ public interface RuntimeActionService { /** - * + * Post commit method */ void postCommit(); - /** - * Get the asynchronous action queue. - * - * @return the asynchronous action queue - */ - //AsynchronousActionExecutionQueue getAsynchronousActionExecutionQueue(); - /** * Register an action condition evaluator * @@ -62,9 +59,31 @@ public interface RuntimeActionService * @param actionExecuter action executer */ void registerActionExecuter(ActionExecuter actionExecuter); - + + /** + * Register parameter constraint + * + * @param parameterConstraint parameter constraint + */ + void registerParameterConstraint(ParameterConstraint parameterConstraint); + + /** + * Create a new action based on an action node reference + * + * @param actionNodeRef action node reference + * @return Action action object + */ Action createAction(NodeRef actionNodeRef); + /** + * Create a action node reference + * + * @param action action object + * @param parentNodeRef parent node reference + * @param assocTypeName association type name + * @param assocName association name + * @return NodeRef created node reference + */ NodeRef createActionNodeRef(Action action, NodeRef parentNodeRef, QName assocTypeName, QName assocName); /** @@ -95,11 +114,4 @@ public interface RuntimeActionService * @param actionedUponNodeRef the actioned upon node reference */ public void directActionExecution(Action action, NodeRef actionedUponNodeRef); - -// /** -// * Gets a list of the actions that are pending post transaction -// * -// * @return list of pending actions -// */ -// public List getPostTransactionPendingActions(); } diff --git a/source/java/org/alfresco/repo/action/constraint/ActionParameterConstraintTest.java b/source/java/org/alfresco/repo/action/constraint/ActionParameterConstraintTest.java new file mode 100644 index 0000000000..2ab396363a --- /dev/null +++ b/source/java/org/alfresco/repo/action/constraint/ActionParameterConstraintTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2005-2007 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ +package org.alfresco.repo.action.constraint; + +import java.util.List; +import java.util.Map; + +import org.alfresco.repo.action.evaluator.compare.ComparePropertyValueOperation; +import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.action.ParameterConstraint; +import org.alfresco.util.BaseSpringTest; + +/** + * Action parameter constraint unit test + * + * @author Roy Wetherall + */ +public class ActionParameterConstraintTest extends BaseSpringTest +{ + private static final String COMPARE_OP = "compare-operations"; + + private ActionService actionService; + + /** + * @see org.springframework.test.AbstractTransactionalSpringContextTests#onSetUpInTransaction() + */ + @SuppressWarnings("deprecation") + @Override + protected void onSetUpInTransaction() throws Exception + { + actionService = (ActionService)applicationContext.getBean("ActionService"); + } + + public void testGetConstraints() + { + List constraints = actionService.getParameterConstraints(); + + assertNotNull(constraints); + assertFalse(constraints.isEmpty()); + } + + public void testGetConstraint() + { + ParameterConstraint constraint = actionService.getParameterConstraint("junk"); + assertNull(constraint); + + constraint = actionService.getParameterConstraint(COMPARE_OP); + assertNotNull(constraint); + } + + public void testCompareOperationsConstraint() + { + ParameterConstraint constraint = actionService.getParameterConstraint(COMPARE_OP); + assertNotNull(constraint); + assertEquals(COMPARE_OP, constraint.getName()); + + assertEquals("Ends With", constraint.getValueDisplayLabel(ComparePropertyValueOperation.ENDS.toString())); + + Map values = constraint.getAllowableValues(); + for (Map.Entry entry : values.entrySet()) + { + System.out.println(entry.getKey() + " - " + entry.getValue()); + } + } +} diff --git a/source/java/org/alfresco/repo/action/constraint/BaseParameterConstraint.java b/source/java/org/alfresco/repo/action/constraint/BaseParameterConstraint.java new file mode 100644 index 0000000000..dca7e26416 --- /dev/null +++ b/source/java/org/alfresco/repo/action/constraint/BaseParameterConstraint.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2009-2009 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ + +package org.alfresco.repo.action.constraint; + +import org.alfresco.repo.action.RuntimeActionService; +import org.alfresco.service.cmr.action.ParameterConstraint; +import org.springframework.beans.factory.BeanNameAware; + +/** + * Base implementation of a parameter constraint + * + * @author Roy Wetherall + */ +public abstract class BaseParameterConstraint implements ParameterConstraint, + BeanNameAware +{ + /** Constraint name */ + protected String name; + + /** Runtime action service */ + protected RuntimeActionService actionService; + + /** + * Init method + */ + public void init() + { + actionService.registerParameterConstraint(this); + } + + /** + * Set the action service + * + * @param actionService action service + */ + public void setActionService(RuntimeActionService actionService) + { + this.actionService = actionService; + } + + /** + * @see org.alfresco.service.cmr.action.ParameterConstraint#getName() + */ + public String getName() + { + return this.name; + } + + /** + * @see org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang.String) + */ + public void setBeanName(String name) + { + this.name = name; + } +} diff --git a/source/java/org/alfresco/repo/action/constraint/EnumParameterConstraint.java b/source/java/org/alfresco/repo/action/constraint/EnumParameterConstraint.java new file mode 100644 index 0000000000..f0a3b3abf9 --- /dev/null +++ b/source/java/org/alfresco/repo/action/constraint/EnumParameterConstraint.java @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2009-2009 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ + +package org.alfresco.repo.action.constraint; + +import java.util.HashMap; +import java.util.Map; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.springframework.extensions.surf.util.I18NUtil; + +/** + * Enumerated type parameter constraint + * + * @author Roy Wetherall + */ +public class EnumParameterConstraint extends BaseParameterConstraint +{ + /** Enum class name */ + private String enumClassName; + + /** Enum clss */ + private Class enumClass; + + /** Map of allowable values */ + private Map allowableValues; + + /** + * Set the enum class name + * + * @param enumClassName enum class name + */ + public void setEnumClassName(String enumClassName) + { + this.enumClassName = enumClassName; + } + + /** + * @see org.alfresco.service.cmr.action.ParameterConstraint#getAllowableValues() + */ + public Map getAllowableValues() + { + if (this.allowableValues == null) + { + // Get the enum class + Class enumClass = getEnumClass(); + + Object[] enumValues = enumClass.getEnumConstants(); + this.allowableValues = new HashMap(enumValues.length); + + for (Object enumValue : enumValues) + { + // Look up the I18N value + String displayLabel = getI18NLabel(enumClass.getName(), enumValue); + + // Add to the map of allowed values + this.allowableValues.put(enumValue.toString(), displayLabel); + } + } + + return this.allowableValues; + } + + /** + * Get the enum class + * + * @return + */ + private Class getEnumClass() + { + if (this.enumClass == null) + { + try + { + // Check that a enum class name has specified + if (enumClassName == null || enumClassName.length() == 0) + { + throw new AlfrescoRuntimeException("No enum class has been defined"); + } + + // Get the enum class + Class enumClass = Class.forName(enumClassName); + + // Check that the class is an enum class + if (enumClass.isEnum() == true) + { + this.enumClass = enumClass; + } + } + catch (ClassNotFoundException e) + { + throw new AlfrescoRuntimeException("Unable to find enum class " + this.enumClassName, e); + } + } + return this.enumClass; + } + + /** + * Get the I18N display label for a particular enum value + * + * @param enumClassName + * @param enumValue + * @return + */ + private String getI18NLabel(String enumClassName, Object enumValue) + { + String result = enumValue.toString(); + StringBuffer key = new StringBuffer(name). + append("."). + append(enumValue.toString().toLowerCase()); + String i18n = I18NUtil.getMessage(key.toString()); + if (i18n != null) + { + result = i18n; + } + return result; + } + + /** + * @see org.alfresco.service.cmr.action.ParameterConstraint#getValueDisplayLabel(java.io.Serializable) + */ + public String getValueDisplayLabel(String value) + { + return getAllowableValues().get(value); + } + + /** + * @see org.alfresco.service.cmr.action.ParameterConstraint#isValidValue(java.io.Serializable) + */ + public boolean isValidValue(String value) + { + return getAllowableValues().containsKey(value); + } +} diff --git a/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluator.java b/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluator.java index b0f5cb9498..cc5cd67f6e 100644 --- a/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluator.java +++ b/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluator.java @@ -164,7 +164,7 @@ public class ComparePropertyValueEvaluator extends ActionConditionEvaluatorAbstr paramList.add(new ParameterDefinitionImpl(PARAM_PROPERTY, DataTypeDefinition.QNAME, false, getParamDisplayLabel(PARAM_PROPERTY))); paramList.add(new ParameterDefinitionImpl(PARAM_CONTENT_PROPERTY, DataTypeDefinition.TEXT, false, getParamDisplayLabel(PARAM_CONTENT_PROPERTY))); paramList.add(new ParameterDefinitionImpl(PARAM_VALUE, DataTypeDefinition.ANY, true, getParamDisplayLabel(PARAM_VALUE))); - paramList.add(new ParameterDefinitionImpl(PARAM_OPERATION, DataTypeDefinition.TEXT, false, getParamDisplayLabel(PARAM_OPERATION))); + paramList.add(new ParameterDefinitionImpl(PARAM_OPERATION, DataTypeDefinition.TEXT, false, getParamDisplayLabel(PARAM_OPERATION), false, "compare-operations")); } /** diff --git a/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluatorTest.java b/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluatorTest.java index d01d1dcdae..6c5f9ab147 100644 --- a/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluatorTest.java +++ b/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluatorTest.java @@ -38,7 +38,11 @@ import org.alfresco.repo.dictionary.DictionaryDAO; import org.alfresco.repo.dictionary.M2Model; import org.alfresco.repo.dictionary.M2Property; import org.alfresco.repo.dictionary.M2Type; +import org.alfresco.service.cmr.action.ActionConditionDefinition; +import org.alfresco.service.cmr.action.ActionService; import org.alfresco.service.cmr.action.ActionServiceException; +import org.alfresco.service.cmr.action.ParameterConstraint; +import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; @@ -75,6 +79,7 @@ public class ComparePropertyValueEvaluatorTest extends BaseSpringTest private DictionaryDAO dictionaryDAO; private NodeService nodeService; private ContentService contentService; + private ActionService actionService; private StoreRef testStoreRef; private NodeRef rootNodeRef; private NodeRef nodeRef; @@ -93,6 +98,7 @@ public class ComparePropertyValueEvaluatorTest extends BaseSpringTest /** * @see org.springframework.test.AbstractTransactionalSpringContextTests#onSetUpInTransaction() */ + @SuppressWarnings("deprecation") @Override protected void onSetUpInTransaction() throws Exception { @@ -101,6 +107,7 @@ public class ComparePropertyValueEvaluatorTest extends BaseSpringTest this.nodeService = (NodeService)this.applicationContext.getBean("nodeService"); this.contentService = (ContentService)this.applicationContext.getBean("contentService"); + actionService = (ActionService)applicationContext.getBean("actionService"); // Create the store and get the root node this.testStoreRef = this.nodeService.createStore( @@ -133,6 +140,20 @@ public class ComparePropertyValueEvaluatorTest extends BaseSpringTest this.evaluator = (ComparePropertyValueEvaluator)this.applicationContext.getBean(ComparePropertyValueEvaluator.NAME); } + public void testCheckParamDefintionWithConstraint() + { + ActionConditionDefinition def = evaluator.getActionConditionDefintion(); + assertEquals(ComparePropertyValueEvaluator.NAME, def.getName()); + ParameterDefinition paramDef = def.getParameterDefintion(ComparePropertyValueEvaluator.PARAM_OPERATION); + assertNotNull(paramDef); + assertEquals(ComparePropertyValueEvaluator.PARAM_OPERATION, paramDef.getName()); + String constraintName = paramDef.getParameterConstraintName(); + assertNotNull(constraintName); + ParameterConstraint paramConstraint = actionService.getParameterConstraint(constraintName); + assertNotNull(paramConstraint); + assertEquals("compare-operations", paramConstraint.getName()); + } + /** * Test numeric comparisions */ diff --git a/source/java/org/alfresco/service/cmr/action/ActionService.java b/source/java/org/alfresco/service/cmr/action/ActionService.java index 941d9ca27c..4af505cda8 100644 --- a/source/java/org/alfresco/service/cmr/action/ActionService.java +++ b/source/java/org/alfresco/service/cmr/action/ActionService.java @@ -84,6 +84,23 @@ public interface ActionService @Auditable(parameters = {}) List getActionConditionDefinitions(); + /** + * Get a named parameter constraint + * + * @param name the name of the parameter constraint + * @return this parameter condition + */ + @Auditable(parameters = {"name"}) + ParameterConstraint getParameterConstraint(String name); + + /** + * Get all the parameter constraints + * + * @return the list of all parameter constraints + */ + @Auditable(parameters = {}) + List getParameterConstraints(); + /** * Create a new action * diff --git a/source/java/org/alfresco/service/cmr/action/ActionServiceTransport.java b/source/java/org/alfresco/service/cmr/action/ActionServiceTransport.java index 26103e004d..4802b95d68 100644 --- a/source/java/org/alfresco/service/cmr/action/ActionServiceTransport.java +++ b/source/java/org/alfresco/service/cmr/action/ActionServiceTransport.java @@ -29,7 +29,6 @@ import java.io.Serializable; import java.util.List; import java.util.Map; -import org.alfresco.service.Auditable; import org.alfresco.service.cmr.repository.NodeRef; /** @@ -74,10 +73,25 @@ public interface ActionServiceTransport /** * Get all the action condition definitions * - * @return the list of aciton condition definitions + * @return the list of action condition definitions */ List getActionConditionDefinitions(String ticket); + /** + * Get a named parameter constraint + * + * @param name the name of the parameter constraint + * @return this parameter condition + */ + ParameterConstraint getParameterConstraint(String ticket, String name); + + /** + * Get all the parameter constraints + * + * @return the list of all parameter constraints + */ + List getParameterConstraints(String ticket); + /** * Create a new action * diff --git a/source/java/org/alfresco/service/cmr/action/ParameterConstraint.java b/source/java/org/alfresco/service/cmr/action/ParameterConstraint.java new file mode 100644 index 0000000000..d999e001d7 --- /dev/null +++ b/source/java/org/alfresco/service/cmr/action/ParameterConstraint.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2009-2009 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ + +package org.alfresco.service.cmr.action; + +import java.io.Serializable; +import java.util.Map; + +/** + * Parameter constraint. Helps to constraint the list of allowable values for a + * + * @author Roy Wetherall + */ +public interface ParameterConstraint +{ + /** + * Gets the unique name of the constraint + * + * @return String constraint name + */ + String getName(); + + /** + * Indicates whether the provided value satisfies the constraint. True if it does, false otherwise. + * + * @return boolean true if valid, false otherwise + */ + boolean isValidValue(String value); + + /** + * + * @param value + * @return + */ + String getValueDisplayLabel(String value); + + /** + * + */ + Map getAllowableValues(); +} diff --git a/source/java/org/alfresco/service/cmr/action/ParameterDefinition.java b/source/java/org/alfresco/service/cmr/action/ParameterDefinition.java index 74f751847b..a7bb83d22e 100644 --- a/source/java/org/alfresco/service/cmr/action/ParameterDefinition.java +++ b/source/java/org/alfresco/service/cmr/action/ParameterDefinition.java @@ -70,4 +70,11 @@ public interface ParameterDefinition */ public String getDisplayLabel(); + /** + * Gets the parameter constraint name, null if none set. + * + * @return the parameter constraint name + */ + public String getParameterConstraintName(); + }