Big honkin' merge from head. Sheesh!

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3617 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2006-08-27 01:01:30 +00:00
parent e2c66899cc
commit 8031cc6574
322 changed files with 20776 additions and 6550 deletions

View File

@@ -38,6 +38,7 @@ import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.version.VersionService;
import org.alfresco.service.cmr.view.ExporterService;
import org.alfresco.service.cmr.view.ImporterService;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.descriptor.DescriptorService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
@@ -81,6 +82,7 @@ public interface ServiceRegistry
static final QName TEMPLATE_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "TemplateService");
static final QName FILE_FOLDER_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "FileFolderService");
static final QName SCRIPT_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "ScriptService");
static final QName WORKFLOW_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "WorkflowService");
/**
* Get the list of services provided by the Repository
@@ -254,4 +256,10 @@ public interface ServiceRegistry
*/
@NotAuditable
ScriptService getScriptService();
/**
* @return the workflow service (or null if one is not provided)
*/
@NotAuditable
WorkflowService getWorkflowService();
}

View File

@@ -29,6 +29,14 @@ import org.alfresco.service.cmr.repository.NodeRef;
*/
public interface Action extends ParameterizedItem
{
/**
* Gets the node ref that represents the saved action node.
* Returns null id unsaved.
*
* @return the action node reference
*/
NodeRef getNodeRef();
/**
* Get the name of the action definition that relates to this action
*
@@ -63,16 +71,6 @@ public interface Action extends ParameterizedItem
* @param description the description of the action
*/
void setDescription(String description);
/**
* Get the node reference of the node that 'owns' this action.
* <p>
* The node that 'owns' the action is th one that stores it via its
* actionable aspect association.
*
* @return node reference
*/
NodeRef getOwningNodeRef();
/**
* Gets a value indicating whether the action should be executed asychronously or not.

View File

@@ -41,6 +41,11 @@ public interface ParameterDefinition
*/
public QName getType();
/**
* Is multi-valued?
*/
public boolean isMultiValued();
/**
* Indicates whether the parameter is mandatory or not.
* <p>

View File

@@ -16,29 +16,37 @@
*/
package org.alfresco.service.cmr.model;
import org.alfresco.service.cmr.repository.NodeRef;
/**
* Common, checked exception thrown when an operation fails because
* of a name clash.
*
* @author Derek Hulley
*/
public class FileExistsException extends Exception
public class FileExistsException extends RuntimeException
{
private static final long serialVersionUID = -4133713912784624118L;
private FileInfo existing;
private NodeRef parentNodeRef;
private String name;
public FileExistsException(FileInfo existing)
public FileExistsException(NodeRef parentNodeRef, String name)
{
super("" +
(existing.isFolder() ? "Folder " : "File ") +
existing.getName() +
super("Existing file or folder " +
name +
" already exists");
this.existing = existing;
this.parentNodeRef = parentNodeRef;
this.name = name;
}
public FileInfo getExisting()
public NodeRef getParentNodeRef()
{
return existing;
return parentNodeRef;
}
public String getName()
{
return name;
}
}

View File

@@ -61,6 +61,16 @@ public interface FileFolderService
@Auditable(key = Auditable.Key.ARG_0, parameters = {"contextNodeRef"})
public List<FileInfo> listFolders(NodeRef contextNodeRef);
/**
* Get a simple list of nodes that have the given name within the parent node
*
* @param contextNodeRef the parent node
* @param name the name of the node to search for
* @return Returns the node that has the given name - or null if not found
*/
@Auditable(key = Auditable.Key.ARG_0, parameters = {"contextNodeRef", "name"})
public NodeRef searchSimple(NodeRef contextNodeRef, String name);
/**
* Searches for all files and folders with the matching name pattern,
* using wildcard characters <b>*</b> and <b>?</b>.

View File

@@ -33,9 +33,7 @@ public class AssociationExistsException extends RuntimeException
private QName qname;
/**
* @param sourceRef the source of the association
* @param targetRef the target of the association
* @param qname the qualified name of the association
* @see #AssociationExistsException(NodeRef, NodeRef, QName, Throwable)
*/
public AssociationExistsException(NodeRef sourceRef, NodeRef targetRef, QName qname)
{
@@ -45,6 +43,20 @@ public class AssociationExistsException extends RuntimeException
this.qname = qname;
}
/**
* @param sourceRef the source of the association
* @param targetRef the target of the association
* @param qname the qualified name of the association
* @param cause a causal exception
*/
public AssociationExistsException(NodeRef sourceRef, NodeRef targetRef, QName qname, Throwable cause)
{
super(cause);
this.sourceRef = sourceRef;
this.targetRef = targetRef;
this.qname = qname;
}
public NodeRef getSourceRef()
{
return sourceRef;

View File

@@ -25,6 +25,13 @@ import org.alfresco.service.transaction.TransactionService;
*/
public interface ContentAccessor
{
/**
* Gets the open/close state of the underlying IO Channel.
*
* @return Returns true if the underlying IO Channel is open
*/
public boolean isChannelOpen();
/**
* Use this method to register any interest in events against underlying
* content streams.

View File

@@ -126,6 +126,14 @@ public interface ContentService
@Auditable(parameters = {"sourceMimetype", "targetMimetype"})
public ContentTransformer getTransformer(String sourceMimetype, String targetMimetype);
/**
* Fetch the transformer that is capable of transforming image content.
*
* @return Returns a transformer that can be used, or null if one was not available
*/
@Auditable
public ContentTransformer getImageTransformer();
/**
* Returns whether a transformer exists that can read the content from
* the reader and write the content back out to the writer.

View File

@@ -0,0 +1,61 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.repository;
import org.alfresco.i18n.I18NUtil;
import org.alfresco.service.namespace.QName;
/**
* Thrown when a child node <b>cm:name</b> property violates the data dictionary
* <b>duplicate</b> child association constraint.
*
* @author Derek Hulley
*/
public class DuplicateChildNodeNameException extends RuntimeException
{
private static final long serialVersionUID = 5143099335847200453L;
private static final String ERR_DUPLICATE_NAME = "system.err.duplicate_name";
private NodeRef parentNodeRef;
private QName assocTypeQName;
private String name;
public DuplicateChildNodeNameException(NodeRef parentNodeRef, QName assocTypeQName, String name)
{
super(I18NUtil.getMessage(ERR_DUPLICATE_NAME, name));
this.parentNodeRef = parentNodeRef;
this.assocTypeQName = assocTypeQName;
this.name = name;
}
public NodeRef getParentNodeRef()
{
return parentNodeRef;
}
public QName getAssocTypeQName()
{
return assocTypeQName;
}
public String getName()
{
return name;
}
}

View File

@@ -417,6 +417,21 @@ public interface NodeService
QNamePattern qnamePattern)
throws InvalidNodeRefException;
/**
* Get the node with the given name within the context of the parent node. The name
* is case-insensitive as Alfresco has to support case-insensitive clients as standard.
*
* @param nodeRef the parent node - usuall a <b>container</b>
* @param assocTypeQName the type of the association
* @param childName the name of the node as per the property <b>cm:name</b>
* @return Returns the child node or null if not found
*/
@Auditable(key = Auditable.Key.ARG_0 ,parameters = {"nodeRef", "assocTypeQName", "childName"})
public NodeRef getChildByName(
NodeRef nodeRef,
QName assocTypeQName,
String childName);
/**
* Fetches the primary parent-child relationship.
* <p>

View File

@@ -30,6 +30,7 @@ import org.alfresco.model.ContentModel;
import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.template.LuceneSearchResultsMap;
import org.alfresco.repo.template.NamePathResultsMap;
import org.alfresco.repo.template.NodeSearchResultsMap;
import org.alfresco.repo.template.SavedSearchResultsMap;
import org.alfresco.repo.template.XPathResultsMap;
import org.alfresco.service.ServiceRegistry;
@@ -96,6 +97,9 @@ public final class TemplateNode implements Serializable
private ChildAssociationRef primaryParentAssoc = null;
// ------------------------------------------------------------------------------
// Construction
/**
* Constructor
*
@@ -123,6 +127,10 @@ public final class TemplateNode implements Serializable
this.properties = new QNameMap<String, Object>(this.services.getNamespaceService());
}
// ------------------------------------------------------------------------------
// Node API
/**
* @return The GUID for the node
*/
@@ -200,41 +208,6 @@ public final class TemplateNode implements Serializable
return this.children;
}
/**
* @return A map capable of returning the TemplateNode at the specified Path as a child of this node.
*/
public Map getChildByNamePath()
{
return new NamePathResultsMap(this, this.services);
}
/**
* @return A map capable of returning a List of TemplateNode objects from an XPath query
* as children of this node.
*/
public Map getChildrenByXPath()
{
return new XPathResultsMap(this, this.services);
}
/**
* @return A map capable of returning a List of TemplateNode objects from an NodeRef to a Saved Search
* object. The Saved Search is executed and the resulting nodes supplied as a sequence.
*/
public Map getChildrenBySavedSearch()
{
return new SavedSearchResultsMap(this, this.services);
}
/**
* @return A map capable of returning a List of TemplateNode objects from an NodeRef to a Lucene search
* string. The Saved Search is executed and the resulting nodes supplied as a sequence.
*/
public Map getChildrenByLuceneSearch()
{
return new LuceneSearchResultsMap(this, this.services);
}
/**
* @return The associations for this Node. As a Map of assoc name to a List of TemplateNodes.
*/
@@ -367,6 +340,142 @@ public final class TemplateNode implements Serializable
}
}
/**
* @return true if the node is currently locked
*/
public boolean getIsLocked()
{
boolean locked = false;
if (getAspects().contains(ContentModel.ASPECT_LOCKABLE))
{
LockStatus lockStatus = this.services.getLockService().getLockStatus(this.nodeRef);
if (lockStatus == LockStatus.LOCKED || lockStatus == LockStatus.LOCK_OWNER)
{
locked = true;
}
}
return locked;
}
/**
* @return the parent node
*/
public TemplateNode getParent()
{
if (parent == null)
{
NodeRef parentRef = this.services.getNodeService().getPrimaryParent(nodeRef).getParentRef();
// handle root node (no parent!)
if (parentRef != null)
{
parent = new TemplateNode(parentRef, this.services, this.imageResolver);
}
}
return parent;
}
/**
* @return the primary parent association so we can access the association QName and association type QName.
*/
public ChildAssociationRef getPrimaryParentAssoc()
{
if (primaryParentAssoc == null)
{
primaryParentAssoc = this.services.getNodeService().getPrimaryParent(nodeRef);
}
return primaryParentAssoc;
}
// ------------------------------------------------------------------------------
// Content API
/**
* @return the content String for this node from the default content property
* (@see ContentModel.PROP_CONTENT)
*/
public String getContent()
{
ContentService contentService = this.services.getContentService();
ContentReader reader = contentService.getReader(this.nodeRef, ContentModel.PROP_CONTENT);
return (reader != null && reader.exists()) ? reader.getContentString() : "";
}
/**
* @return For a content document, this method returns the URL to the content stream for
* the default content property (@see ContentModel.PROP_CONTENT)
* <p>
* For a container node, this method return the URL to browse to the folder in the web-client
*/
public String getUrl()
{
if (getIsDocument() == true)
{
try
{
return MessageFormat.format(CONTENT_DEFAULT_URL, new Object[] {
nodeRef.getStoreRef().getProtocol(),
nodeRef.getStoreRef().getIdentifier(),
nodeRef.getId(),
StringUtils.replace(URLEncoder.encode(getName(), "UTF-8"), "+", "%20") } );
}
catch (UnsupportedEncodingException err)
{
throw new TemplateException("Failed to encode content URL for node: " + nodeRef, err);
}
}
else
{
return MessageFormat.format(FOLDER_BROWSE_URL, new Object[] {
nodeRef.getStoreRef().getProtocol(),
nodeRef.getStoreRef().getIdentifier(),
nodeRef.getId() } );
}
}
/**
* @return The mimetype encoding for content attached to the node from the default content property
* (@see ContentModel.PROP_CONTENT)
*/
public String getMimetype()
{
if (mimetype == null)
{
TemplateContentData content = (TemplateContentData)this.getProperties().get(ContentModel.PROP_CONTENT);
if (content != null)
{
mimetype = content.getMimetype();
}
}
return mimetype;
}
/**
* @return The size in bytes of the content attached to the node from the default content property
* (@see ContentModel.PROP_CONTENT)
*/
public long getSize()
{
if (size == null)
{
TemplateContentData content = (TemplateContentData)this.getProperties().get(ContentModel.PROP_CONTENT);
if (content != null)
{
size = content.getSize();
}
}
return size != null ? size.longValue() : 0L;
}
// ------------------------------------------------------------------------------
// Node Helper API
/**
* @return FreeMarker NodeModel for the XML content of this node, or null if no parsable XML found
*/
@@ -457,24 +566,9 @@ public final class TemplateNode implements Serializable
}
}
/**
* @return true if the node is currently locked
*/
public boolean getIsLocked()
{
boolean locked = false;
if (getAspects().contains(ContentModel.ASPECT_LOCKABLE))
{
LockStatus lockStatus = this.services.getLockService().getLockStatus(this.nodeRef);
if (lockStatus == LockStatus.LOCKED || lockStatus == LockStatus.LOCK_OWNER)
{
locked = true;
}
}
return locked;
}
// ------------------------------------------------------------------------------
// Security API
/**
* @return List of permissions applied to this Node.
@@ -510,114 +604,56 @@ public final class TemplateNode implements Serializable
return this.services.getPermissionService().getInheritParentPermissions(this.nodeRef);
}
/**
* @return the parent node
*/
public TemplateNode getParent()
{
if (parent == null)
{
NodeRef parentRef = this.services.getNodeService().getPrimaryParent(nodeRef).getParentRef();
// handle root node (no parent!)
if (parentRef != null)
{
parent = new TemplateNode(parentRef, this.services, this.imageResolver);
}
}
return parent;
// ------------------------------------------------------------------------------
// Search API
/**
* @return A map capable of returning the TemplateNode at the specified Path as a child of this node.
*/
public Map getChildByNamePath()
{
return new NamePathResultsMap(this, this.services);
}
/**
* @return the primary parent association so we can access the association QName and association type QName.
* @return A map capable of returning a List of TemplateNode objects from an XPath query
* as children of this node.
*/
public ChildAssociationRef getPrimaryParentAssoc()
public Map getChildrenByXPath()
{
if (primaryParentAssoc == null)
{
primaryParentAssoc = this.services.getNodeService().getPrimaryParent(nodeRef);
}
return primaryParentAssoc;
return new XPathResultsMap(this, this.services);
}
/**
* @return the content String for this node from the default content property
* (@see ContentModel.PROP_CONTENT)
* @return A map capable of returning a List of TemplateNode objects from an NodeRef to a Saved Search
* object. The Saved Search is executed and the resulting nodes supplied as a sequence.
*/
public String getContent()
public Map getChildrenBySavedSearch()
{
ContentService contentService = this.services.getContentService();
ContentReader reader = contentService.getReader(this.nodeRef, ContentModel.PROP_CONTENT);
return (reader != null && reader.exists()) ? reader.getContentString() : "";
return new SavedSearchResultsMap(this, this.services);
}
/**
* @return For a content document, this method returns the URL to the content stream for
* the default content property (@see ContentModel.PROP_CONTENT)
* <p>
* For a container node, this method return the URL to browse to the folder in the web-client
* @return A map capable of returning a List of TemplateNode objects from an NodeRef to a Lucene search
* string. The Saved Search is executed and the resulting nodes supplied as a sequence.
*/
public String getUrl()
public Map getChildrenByLuceneSearch()
{
if (getIsDocument() == true)
{
try
{
return MessageFormat.format(CONTENT_DEFAULT_URL, new Object[] {
nodeRef.getStoreRef().getProtocol(),
nodeRef.getStoreRef().getIdentifier(),
nodeRef.getId(),
StringUtils.replace(URLEncoder.encode(getName(), "UTF-8"), "+", "%20") } );
}
catch (UnsupportedEncodingException err)
{
throw new TemplateException("Failed to encode content URL for node: " + nodeRef, err);
}
}
else
{
return MessageFormat.format(FOLDER_BROWSE_URL, new Object[] {
nodeRef.getStoreRef().getProtocol(),
nodeRef.getStoreRef().getIdentifier(),
nodeRef.getId() } );
}
return new LuceneSearchResultsMap(this, this.services);
}
/**
* @return The mimetype encoding for content attached to the node from the default content property
* (@see ContentModel.PROP_CONTENT)
* @return A map capable of returning a TemplateNode for a single specified NodeRef reference.
*/
public String getMimetype()
public Map getNodeByReference()
{
if (mimetype == null)
{
TemplateContentData content = (TemplateContentData)this.getProperties().get(ContentModel.PROP_CONTENT);
if (content != null)
{
mimetype = content.getMimetype();
}
}
return mimetype;
return new NodeSearchResultsMap(this, this.services);
}
/**
* @return The size in bytes of the content attached to the node from the default content property
* (@see ContentModel.PROP_CONTENT)
*/
public long getSize()
{
if (size == null)
{
TemplateContentData content = (TemplateContentData)this.getProperties().get(ContentModel.PROP_CONTENT);
if (content != null)
{
size = content.getSize();
}
}
return size != null ? size.longValue() : 0L;
}
// ------------------------------------------------------------------------------
// Misc helpers
/**
* @return the image resolver instance used by this node
@@ -645,6 +681,9 @@ public final class TemplateNode implements Serializable
}
// ------------------------------------------------------------------------------
// Inner classes
/**
* Inner class wrapping and providing access to a ContentData property
*/

View File

@@ -14,43 +14,290 @@
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.rule;
import org.alfresco.service.cmr.action.CompositeAction;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.repository.NodeRef;
/**
* Rule Interface
* Rule class.
* <p>
* Encapsulates all the information about a rule. Can be creted or editied and
* then passed to the rule service to create/update a rule instance.
*
* @author Roy Wetherall
*/
public interface Rule extends CompositeAction
public class Rule implements Serializable
{
/**
* Indicates that the rule is applied to the children of the associated
* node, not just the node itself.
* <p>
* By default this will be set to false.
*
* @return true if the rule is applied to the children of the associated node,
* false otherwise
*/
boolean isAppliedToChildren();
/**
* Set whether the rule is applied to all children of the associated node
* rather than just the node itself.
*
* @param isAppliedToChildren true if the rule should be applied to the children, false
* otherwise
*/
void applyToChildren(boolean isAppliedToChildren);
/**
* Serial version UID
*/
private static final long serialVersionUID = 3544385898889097524L;
/**
* Get the rule type name
*
* @return the rule type name
* The rule node reference
*/
String getRuleTypeName();
}
private NodeRef nodeRef;
/**
* The title of the rule
*/
private String title;
/**
* The description of the rule
*/
private String description;
/**
* The rule types
*/
private List<String> ruleTypes;
/**
* The associated action
*/
private Action action;
/**
* Indicates whether the rule should execute the action asynchronously or not
*/
private boolean executeAsynchronously = false;
/** Indicates wehther the rule is marked as disabled or not */
private boolean ruleDisabled = false;
/**
* Indicates whether the rule is applied to all the children of the associated node
* rather than just the node itself.
*/
private boolean isAppliedToChildren = false;
/**
* Constructor
*/
public Rule()
{
}
/**
* Constructor.
*
* @param nodeRef the rule node reference
*/
public Rule(NodeRef nodeRef)
{
this.nodeRef = nodeRef;
}
/**
* Set the action
*
* @param action the action
*/
public void setAction(Action action)
{
this.action = action;
}
/**
* Gets the action associatied with the rule
*
* @return the action
*/
public Action getAction()
{
return action;
}
/**
* Set the node reference of the rule
*
* @param nodeRef the rule node reference
*/
public void setNodeRef(NodeRef nodeRef)
{
this.nodeRef = nodeRef;
}
/**
* Get the node reference of the rule
*
* @return the rule node reference
*/
public NodeRef getNodeRef()
{
return nodeRef;
}
/**
* Set the title of the rule
*
* @param title the title
*/
public void setTitle(String title)
{
this.title = title;
}
/**
* Get the title of the rule
*
* @return the title
*/
public String getTitle()
{
return title;
}
/**
* Set the description of the rule
*
* @param description the description
*/
public void setDescription(String description)
{
this.description = description;
}
/**
* Get the description of the rule
*
* @return the description
*/
public String getDescription()
{
return description;
}
/**
* Indicates wehther this rule should be applied to the children of
* the owning space.
*
* @return true if the rule is to be applied to children, false otherwise
*/
public boolean isAppliedToChildren()
{
return this.isAppliedToChildren;
}
/**
* Sets the values that indicates whether this rule should be applied to the children
* of the owning space.
*
* @param isAppliedToChildren true if the rule is to be applied to children, false otherwise
*/
public void applyToChildren(boolean isAppliedToChildren)
{
this.isAppliedToChildren = isAppliedToChildren;
}
/**
* Helper method to set one rule type on the rule.
*
* @param ruleType the rule type
*/
public void setRuleType(String ruleType)
{
List<String> ruleTypes = new ArrayList<String>(1);
ruleTypes.add(ruleType);
this.ruleTypes = ruleTypes;
}
/**
* Set the rules rule types.
*
* @param ruleTypes list of rule types
*/
public void setRuleTypes(List<String> ruleTypes)
{
this.ruleTypes = ruleTypes;
}
/**
* Get the rules rule types.
*
* @return a list of rule types
*/
public List<String> getRuleTypes()
{
return ruleTypes;
}
/**
* Sets the value that indicates whether this associated action should be executed
* asynchrously or not
*
* @param executeAsynchronously true to execute action async, false otherwise
*/
public void setExecuteAsynchronously(boolean executeAsynchronously)
{
this.executeAsynchronously = executeAsynchronously;
}
/**
* Indicates whether the associated action should be executed async or not
*
* @return true to execute async, false otherwise
*/
public boolean getExecuteAsynchronously()
{
return this.executeAsynchronously;
}
/**
* Indicates wehther this rule has been disabled or not
*
* @return true if the rule has been disabled, false otherwise
*/
public boolean getRuleDisabled()
{
return this.ruleDisabled;
}
/**
* Set the value that indicates wehther this rule has been disabled or not
*
* @param ruleDisabled true id the rule has been disabled, false otherwise
*/
public void setRuleDisabled(boolean ruleDisabled)
{
this.ruleDisabled = ruleDisabled;
}
/**
* Hash code implementation
*/
@Override
public int hashCode()
{
return this.nodeRef.hashCode();
}
/**
* Equals implementation
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj instanceof Rule)
{
Rule that = (Rule) obj;
return (this.nodeRef.equals(that.nodeRef));
}
else
{
return false;
}
}
}

View File

@@ -19,6 +19,7 @@ package org.alfresco.service.cmr.rule;
import java.util.List;
import org.alfresco.service.Auditable;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.repository.NodeRef;
/**
@@ -45,6 +46,26 @@ public interface RuleService
@Auditable(parameters = {"name"})
public RuleType getRuleType(String name);
/**
* Enable rules for the current thread
*/
@Auditable
public void enableRules();
/**
* Diable rules for the current thread
*/
@Auditable
public void disableRules();
/**
* Indicates whether rules are currently enabled or not
*
* @return true if rules are enabled, false otherwise
*/
@Auditable
public boolean isEnabled();
/**
* Indicates wether the rules for a given node are enabled or not. If the
* rules are not enabled then they will not be executed.
@@ -150,26 +171,13 @@ public interface RuleService
public int countRules(NodeRef nodeRef);
/**
* Get the rule given its id.
* Get the rule given its node reference
*
* @param nodeRef the node reference
* @param ruleId the rule id
* @return the rule corresponding ot the id
* @return the rule corresponding to the node reference
*/
@Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "ruleId"})
public Rule getRule(NodeRef nodeRef, String ruleId);
/**
* Helper method to create a new rule.
* <p>
* Call add rule once the details of the rule have been specified in order
* to associate the rule with a node reference.
*
* @param ruleTypeName the name of the rule type
* @return the created rule
*/
@Auditable(parameters = {"ruleTypeName"})
public Rule createRule(String ruleTypeName);
@Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef"})
public Rule getRule(NodeRef nodeRef);
/**
* Saves the details of the rule to the specified node reference.
@@ -198,4 +206,25 @@ public interface RuleService
*/
@Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef"})
public void removeAllRules(NodeRef nodeRef);
/**
* Returns the owning node reference for a rule.
*
* @param rule the rule
* @return the owning node reference
*/
@Auditable(key = Auditable.Key.ARG_0, parameters = {"rule"})
public NodeRef getOwningNodeRef(Rule rule);
/**
* Returns the owning node reference for an action. Returns null for an unsaved action or one that is not
* parented by a rule.
*
* NOTE: this method is temporary and will be removed in future versions. It should only be used with good reason.
*
* @param action the action
* @return the owning node reference
*/
@Auditable(key = Auditable.Key.ARG_0, parameters = {"action"})
public NodeRef getOwningNodeRef(Action action);
}

View File

@@ -52,8 +52,9 @@ public interface RuleType
/**
* Trigger the rules of the rule type for the node on the actioned upon node.
*
* @param nodeRef the node ref whos rule of rule type are to be triggered
* @param actionedUponNodeRef the node ref that the triggered rule will action upon
* @param nodeRef the node ref whos rule of rule type are to be triggered
* @param actionedUponNodeRef the node ref that the triggered rule will action upon
* @prarm executeRuleImmediately indicates whether the rule should be executed immediately or not
*/
public void triggerRuleType(NodeRef nodeRef, NodeRef actionedUponNodeRef);
public void triggerRuleType(NodeRef nodeRef, NodeRef actionedUponNodeRef, boolean executeRuleImmediately);
}

View File

@@ -40,12 +40,16 @@ public interface PersonService
{
/**
* Get a person by userName. The person is store in the repository. The
* person may be created as a side effect of this call, depending on
* the setting to {@link #setCreateMissingPeople(boolean) create missing people or not}.
* person may be created as a side effect of this call, depending on the
* setting to
* {@link #setCreateMissingPeople(boolean) create missing people or not}.
*
* @param userName - the userName key to find the person
* @param userName -
* the userName key to find the person
* @return Returns the person node, either existing or new
* @throws NoSuchPersonException if the user doesn't exist and could not be created automatically
* @throws NoSuchPersonException
* if the user doesn't exist and could not be created
* automatically
*
* @see #setCreateMissingPeople(boolean)
* @see #createMissingPeople()
@@ -56,12 +60,13 @@ public interface PersonService
/**
* Check if a person exists.
*
* @param userName the user name
* @param userName
* the user name
* @return Returns true if the user exists, otherwise false
*/
@Auditable(parameters = {"userName"})
public boolean personExists(String userName);
/**
* Does this service create people on demand if they are missing. If this is
* true, a call to getPerson() will create a person if they are missing.
@@ -74,13 +79,14 @@ public interface PersonService
/**
* Set if missing people should be created.
*
* @param createMissing set to true to create people
* @param createMissing
* set to true to create people
*
* @see #getPerson(String)
*/
@Auditable(parameters = {"createMissing"})
public void setCreateMissingPeople(boolean createMissing);
/**
* Get the list of properties that are mutable. Some service may only allow
* a limited list of properties to be changed. This may be those persisted
@@ -96,8 +102,10 @@ public interface PersonService
* Set the properties on a person - some of these may be persisted in
* different locations.
*
* @param userName - the user for which the properties should be set.
* @param properties - the map of properties to set (as the NodeService)
* @param userName -
* the user for which the properties should be set.
* @param properties -
* the map of properties to set (as the NodeService)
*/
@Auditable(parameters = {"userName", "properties"})
public void setPersonProperties(String userName, Map<QName, Serializable> properties);
@@ -111,9 +119,8 @@ public interface PersonService
public boolean isMutable();
/**
* Create a new person with the given properties.
* The userName is one of the properties.
* Users with duplicate userNames are not allowed.
* Create a new person with the given properties. The userName is one of the
* properties. Users with duplicate userNames are not allowed.
*
* @param properties
* @return
@@ -128,15 +135,15 @@ public interface PersonService
*/
@Auditable(parameters = {"userName"})
public void deletePerson(String userName);
/**
* Get all the people we know about.
*
* @return a set of people in no specific order.
* @return a set of people in no specific order.
*/
@Auditable
public Set<NodeRef> getAllPeople();
/**
* Return the container that stores people.
*
@@ -152,4 +159,17 @@ public interface PersonService
*/
@Auditable
public boolean getUserNamesAreCaseSensitive();
/**
* Given the case sensitive user name find the approriate identifier from the person service.
* If the system is case sensitive it will return the same string.
* If case insentive it will return the common object.
* If the user does not exist it will return null;
*
* @param caseSensitiveUserName
* @return
*/
public String getUserIdentifier(String caseSensitiveUserName);
}

View File

@@ -0,0 +1,53 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
/**
* Workflow Definition Data Object
*
* @author davidc
*/
public class WorkflowDefinition
{
/** Workflow Definition unique id */
public String id;
/** Workflow Definition name */
public String name;
/** Workflow Definition version */
public String version;
/** Workflow Definition Title (Localised) */
public String title;
/** Workflow Definition Description (Localised) */
public String description;
/** Task Definition for Workflow Start Task (Optional) */
public WorkflowTaskDefinition startTaskDefinition;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
return "WorkflowDefinition[id=" + id + ",version=" + version + ",title=" + title + ",startTask=" + startTaskDefinition.toString() + "]";
}
}

View File

@@ -0,0 +1,40 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
/**
* Workflow Definition Deployment
*
* @author davidc
*/
public class WorkflowDeployment
{
/** Workflow Definition */
public WorkflowDefinition definition;
/** Workflow Status */
public String[] problems;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
return "WorkflowDeployment[def=" + definition + ",problems=" + ((problems == null) ? 0 : problems.length) + "]";
}
}

View File

@@ -0,0 +1,49 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
import org.alfresco.error.AlfrescoRuntimeException;
/**
* Base Exception of Workflow Exceptions.
*
* @author David Caruana
*/
public class WorkflowException extends AlfrescoRuntimeException
{
private static final long serialVersionUID = -7338963365877285084L;
public WorkflowException(String msgId)
{
super(msgId);
}
public WorkflowException(String msgId, Throwable cause)
{
super(msgId, cause);
}
public WorkflowException(String msgId, Object ... args)
{
super(msgId, args);
}
public WorkflowException(String msgId, Throwable cause, Object ... args)
{
super(msgId, args, cause);
}
}

View File

@@ -0,0 +1,58 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
import java.util.Date;
import org.alfresco.service.cmr.repository.NodeRef;
/**
* Workflow Instance Data Object
*
* Represents an "in-flight" workflow.
*
* @author davidc
*/
public class WorkflowInstance
{
/** Workflow Instance unique id */
public String id;
/** Is this Workflow instance still "in-flight" or has it completed? */
public boolean active;
/** Initiator (cm:person) - null if System initiated */
public NodeRef initiator;
/** Workflow Start Date */
public Date startDate;
/** Workflow End Date */
public Date endDate;
/** Workflow Definition */
public WorkflowDefinition definition;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
return "WorkflowInstance[id=" + id + ",active=" + active + ",def=" + definition.toString() + "]";
}
}

View File

@@ -0,0 +1,61 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
/**
* Workflow Node Data Object
*
* Represents a Node within the Workflow Definition.
*
* @author davidc
*/
public class WorkflowNode
{
/** Workflow Node Name */
public String name;
/** Workflow Node Title (Localised) */
public String title;
/** Workflow Node Description (Localised) */
public String description;
/** Type of the Workflow Node (typically this is BPM engine specific - informational only */
public String type;
/** Does this Workflow Node represent human interaction? */
public boolean isTaskNode;
/** The transitions leaving this node (or null, if none) */
public WorkflowTransition[] transitions;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
String transitionsArray = "{";
for (int i = 0; i < transitions.length; i++)
{
transitionsArray += ((i == 0) ? "" : ",") + "'" + transitions[i] + "'";
}
transitionsArray += "}";
return "WorkflowNode[title=" + title + ",type=" + type + ",transitions=" + transitionsArray + "]";
}
}

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
/**
* Workflow Path Data Object
*
* Represents a path within an "in-flight" workflow instance.
*
* Simple workflows consists of a single "root" path. Multiple paths occur when a workflow
* instance branches, therefore more than one concurrent path is taken.
*
* @author davidc
*/
public class WorkflowPath
{
/** Unique id of Workflow Path */
public String id;
/** Workflow Instance this path is part of */
public WorkflowInstance instance;
/** The Workflow Node the path is at */
public WorkflowNode node;
/** Is the path still active? */
public boolean active;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
return "WorkflowPath[id=" + id + ",instance=" + instance.toString() + ",active=" + active + ",node=" + node.toString()+ "]";
}
}

View File

@@ -0,0 +1,232 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
import java.io.InputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
/**
* Workflow Service.
*
* Client facing API for interacting with Alfresco Workflows and Tasks.
*
* @author davidc
*/
public interface WorkflowService
{
//
// Workflow Definition Management
//
/**
* Deploy a Workflow Definition to the Alfresco Repository
*
* @param engineId the bpm engine id
* @param workflowDefinition the workflow definition
* @param mimetype the mimetype of the workflow definition
* @return workflow deployment descriptor
*/
public WorkflowDeployment deployDefinition(String engineId, InputStream workflowDefinition, String mimetype);
/**
* Deploy a Workflow Definition to the Alfresco Repository
*
* Note: The specified content object must be of type bpm:workflowdefinition.
* This type describes for which BPM engine the definition is appropriate.
*
* @param workflowDefinition the content object containing the definition
* @return workflow deployment descriptor
*/
public WorkflowDeployment deployDefinition(NodeRef workflowDefinition);
/**
* Is the specified Workflow Definition already deployed?
*
* Note: the notion of "already deployed" may differ between bpm engines. For example,
* different versions of the same process may be considered equal.
*
* @param engineId the bpm engine id
* @param workflowDefinition the definition to check
* @param mimetype the mimetype of the definition
* @return true => already deployed
*/
public boolean isDefinitionDeployed(String engineId, InputStream workflowDefinition, String mimetype);
/**
* Undeploy an exisiting Workflow Definition
*
* TODO: Determine behaviour when "in-flight" workflow instances exist
*
* @param workflowDefinitionId the id of the definition to undeploy
*/
public void undeployDefinition(String workflowDefinitionId);
/**
* Gets all deployed Workflow Definitions
*
* @return the deployed workflow definitions
*/
public List<WorkflowDefinition> getDefinitions();
/**
* Gets a Workflow Definition by unique Id
*
* @param workflowDefinitionId the workflow definition id
* @return the deployed workflow definition
*/
public WorkflowDefinition getDefinitionById(String workflowDefinitionId);
/**
* Gets a Workflow Definition by unique name
*
* @param workflowName workflow name e.g. jbpm://review
* @return the deployed workflow definition
*/
public WorkflowDefinition getDefinitionByName(String workflowName);
//
// Workflow Instance Management
//
/**
* Start a Workflow Instance
*
* @param workflowDefinitionId the workflow definition id
* @param parameters the initial set of parameters used to populate the "Start Task" properties
* @return the initial workflow path
*/
public WorkflowPath startWorkflow(String workflowDefinitionId, Map<QName, Serializable> parameters);
/**
* Start a Workflow Instance from an existing "Start Task" template node held in the
* Repository. The node must be of the Type as described in the Workflow Definition.
*
* @param templateDefinition the node representing the Start Task properties
* @return the initial workflow path
*/
public WorkflowPath startWorkflowFromTemplate(NodeRef templateDefinition);
/**
* Gets all "in-flight" workflow instances of the specified Workflow Definition
*
* @param workflowDefinitionId the workflow definition id
* @return the list of "in-fligth" workflow instances
*/
public List<WorkflowInstance> getActiveWorkflows(String workflowDefinitionId);
/**
* Gets all Paths for the specified Workflow instance
*
* @param workflowId workflow instance id
* @return the list of workflow paths
*/
public List<WorkflowPath> getWorkflowPaths(String workflowId);
/**
* Cancel an "in-fligth" Workflow instance
*
* @param workflowId the workflow instance to cancel
* @return an updated representation of the workflow instance
*/
public WorkflowInstance cancelWorkflow(String workflowId);
/**
* Signal the transition from one Workflow Node to another
*
* @param pathId the workflow path to signal on
* @param transition the transition to follow (or null, for the default transition)
* @return the updated workflow path
*/
public WorkflowPath signal(String pathId, String transitionId);
/**
* Gets all Tasks associated with the specified path
*
* @param pathId the path id
* @return the list of associated tasks
*/
public List<WorkflowTask> getTasksForWorkflowPath(String pathId);
//
// Task Management
//
/**
* Gets a Task by unique Id
*
* @param taskId the task id
* @return the task
*/
public WorkflowTask getTaskById(String taskId);
/**
* Gets all tasks assigned to the specified authority
*
* @param authority the authority
* @param state filter by specified workflow task state
* @return the list of assigned tasks
*/
public List<WorkflowTask> getAssignedTasks(String authority, WorkflowTaskState state);
/**
* Gets the pooled tasks available to the specified authority
*
* @param authority the authority
* @return the list of pooled tasks
*/
public List<WorkflowTask> getPooledTasks(String authority);
/**
* Update the Properties and Associations of a Task
*
* @param taskId the task id to update
* @param properties the map of properties to set on the task (or null, if none to set)
* @param add the map of items to associate with the task (or null, if none to add)
* @param remove the map of items to dis-associate with the task (or null, if none to remove)
* @return the update task
*/
public WorkflowTask updateTask(String taskId, Map<QName, Serializable> properties, Map<QName, List<NodeRef>> add, Map<QName, List<NodeRef>> remove);
/**
* End the Task (i.e. complete the task)
*
* @param taskId the task id to end
* @param transition the task transition to take on completion (or null, for the default transition)
* @return the updated task
*/
public WorkflowTask endTask(String taskId, String transitionId);
/**
* Create a Workflow Package (a container of content to route through the Workflow).
*
* If an existing container is supplied, it's supplemented with the workflow package aspect.
*
* @param container (optional) a pre-created container (e.g. folder, versioned folder or layered folder)
* @return the workflow package
*/
public NodeRef createPackage(NodeRef container);
}

View File

@@ -0,0 +1,66 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
import java.io.Serializable;
import java.util.Map;
import org.alfresco.service.namespace.QName;
/**
* Workflow Task Data Object
*
* Represents a human-oriented task within an "in-flight" workflow instance
*
* @author davidc
*/
public class WorkflowTask
{
/** Unique id of Task */
public String id;
/** Task Name */
public String name;
/** Task Title (Localised) */
public String title;
/** Task Description (Localised) */
public String description;
/** Task State */
public WorkflowTaskState state;
/** Workflow path this Task is associated with */
public WorkflowPath path;
/** Task Definition */
public WorkflowTaskDefinition definition;
/** Task Properties as described by Task Definition */
public Map<QName, Serializable> properties;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
String propCount = (properties == null) ? "null" : "" + properties.size();
return "WorkflowTask[id=" + id + ",title=" + title + ",state=" + state + ",props=" + propCount + ",def=" + definition + ",path=" + path.toString() + "]";
}
}

View File

@@ -0,0 +1,49 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
import org.alfresco.service.cmr.dictionary.TypeDefinition;
/**
* Workflow Task Definition Data Object.
*
* Represents meta-data for a Workflow Task. The meta-data is described in terms
* of the Alfresco Data Dictionary.
*
* @author davidc
*/
public class WorkflowTaskDefinition
{
/** Unique id of Workflow Task Definition */
public String id;
/** Workflow Node this task created from */
public WorkflowNode node;
/** Task Metadata */
public TypeDefinition metadata;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
return "WorkflowTaskDefinition[id=" + id + ",metadata=" + metadata + "]";
}
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
/**
* Workflow Task State
*
* Represents the high-level state of Workflow Task (in relation to "in-flight"
* workflow instance).
*
* A user-defined task state may be represented as Task Property (and described
* by the Alfresco Data Dictionary).
*
* @author davidc
*/
public enum WorkflowTaskState
{
IN_PROGRESS,
COMPLETED;
}

View File

@@ -0,0 +1,46 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.service.cmr.workflow;
/**
* Workflow Transition.
*
* @author davidc
*/
public class WorkflowTransition
{
/** Transition Id */
public String id;
/** Transition Title (Localised) */
public String title;
/** Transition Description (Localised) */
public String description;
/** Is this the default transition */
public boolean isDefault;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
return "WorkflowTransition[id=" + id + ",title=" + title + "]";
}
}

View File

@@ -52,6 +52,13 @@ public interface Descriptor
*/
public String getVersionLabel();
/**
* Gets the build number
*
* @return the build number i.e. build-1
*/
public String getVersionBuild();
/**
* Gets the full version number
*

View File

@@ -66,6 +66,18 @@ public interface NamespaceService extends NamespacePrefixResolver
/** Application Model Prefix */
public static final String APP_MODEL_PREFIX = "app";
/** Business Process Model URI */
public static final String BPM_MODEL_1_0_URI = "http://www.alfresco.org/model/bpm/1.0";
/** Business Process Model Prefix */
public static final String BPM_MODEL_PREFIX = "bpm";
/** Workflow Model URI */
public static final String WORKFLOW_MODEL_1_0_URI = "http://www.alfresco.org/model/workflow/1.0";
/** Workflow Model Prefix */
public static final String WORKFLOW_MODEL_PREFIX = "wf";
/** Alfresco View Namespace URI */
public static final String REPOSITORY_VIEW_1_0_URI = "http://www.alfresco.org/view/repository/1.0";