mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
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:
@@ -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();
|
||||
}
|
||||
|
@@ -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.
|
||||
|
@@ -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>
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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>.
|
||||
|
@@ -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;
|
||||
|
@@ -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.
|
||||
|
@@ -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.
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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>
|
||||
|
@@ -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
|
||||
*/
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
@@ -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);
|
||||
|
||||
}
|
||||
|
@@ -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() + "]";
|
||||
}
|
||||
}
|
@@ -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) + "]";
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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() + "]";
|
||||
}
|
||||
}
|
@@ -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 + "]";
|
||||
}
|
||||
}
|
@@ -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()+ "]";
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
||||
}
|
@@ -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() + "]";
|
||||
}
|
||||
}
|
@@ -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 + "]";
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -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 + "]";
|
||||
}
|
||||
}
|
@@ -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
|
||||
*
|
||||
|
@@ -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";
|
||||
|
||||
|
Reference in New Issue
Block a user