workflow.js
来自「Hippo CMS是一个以信息为中心的开源内容管理系统。Hippo CMS目标是」· JavaScript 代码 · 共 577 行 · 第 1/2 页
JS
577 行
/*
* Copyright 2001-2007 Hippo (www.hippo.nl)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
importClass(Packages.java.text.SimpleDateFormat);
importClass(Packages.java.util.Vector);
importClass(Packages.java.util.HashMap);
importClass(Packages.java.util.HashSet);
importClass(Packages.java.util.ArrayList);
importClass(Packages.javax.xml.parsers.DocumentBuilder);
importClass(Packages.javax.xml.parsers.DocumentBuilderFactory);
importClass(Packages.nl.hippo.cms.Constants);
importClass(Packages.nl.hippo.cms.repositorylocation.CommonRepositoryLocationRoles);
importClass(Packages.nl.hippo.cms.workflow.WorkflowHelper);
importClass(Packages.nl.hippo.cms.workflow.WorkflowHelper);
importClass(Packages.nl.hippo.cms.workflow.WorkflowActionAuthorizerContext);
importClass(Packages.nl.hippo.cms.workflow.WorkflowQueryBulkAuthorizer);
importClass(Packages.nl.hippo.cocoon.webdav.WebDAVHelper);
importClass(Packages.nl.hippo.cocoon.webdav.Property);
importClass(Packages.org.apache.excalibur.source.SourceResolver);
importClass(Packages.java.lang.Throwable);
cocoon.load("site:/generic/generic.js");
cocoon.load("site:/avalon/avalon.js");
cocoon.load("site:/logging/logging.js");
cocoon.load("site:/config/config.js");
cocoon.load("site:/login/login.js");
cocoon.load("site:/spring/spring.js");
var workflow = {}
var PROPERTIES_NEEDED_BY_WORKFLOW = new Vector();
var WORKFLOW_ID_PROPERTY_NAME = new Packages.org.apache.webdav.lib.PropertyName("http://hippo.nl/cms/1.0", "workflowId");
PROPERTIES_NEEDED_BY_WORKFLOW.add(WORKFLOW_ID_PROPERTY_NAME);
var CUPS_PROPERTY_NAME = new Packages.org.apache.webdav.lib.PropertyName("DAV:", "current-user-privilege-set");
PROPERTIES_NEEDED_BY_WORKFLOW.add(CUPS_PROPERTY_NAME);
// - Public functions -------------------------------------------------
workflow.createWorkflow = function (uri, workflowName, repositoryRoot) {
return workflow.createWorkflowUsingAbsoluteUri(repositoryRoot + uri, workflowName);
}
workflow.createWorkflowUsingAbsoluteUri = function (location, workflowName) {
location = removeParameters(location);
location = new Packages.java.net.URI(location).normalize().toString();
var workflowId = null;
usingWorkflowDo(function(workflowComp) {
var propertiesToSet = new ArrayList();
propertiesToSet.add(new Property("H", Constants.CMS_1_0_NAMESPACE, Constants.LAST_WORKFLOW_USER_PROPERTY_NAME, cocoon.session.getAttribute("username")));
var lockToken = WebDAVHelper.getLockToken(location, authentication.getHttpState());
WebDAVHelper.proppatch(location, propertiesToSet, null, lockToken, authentication.getHttpState());
var initialActions = WorkflowHelper.getInitialActions(workflowComp, workflowName);
var initialAction = initialActions[0].getId();
var parameters = new HashMap();
addRequiredDocumentParametersIfMissing(parameters, location);
workflowId = workflowComp.initialize(workflowName, initialAction, parameters);
});
return workflowId;
}
workflow.invokeStandardUIAction = function (uri, uiActionId, parameters, repositoryRoot) {
return workflow.invokeNamedAction(uri, "standardUIAction", uiActionId, parameters, repositoryRoot);
}
/**
* @param uris
* A java.util.List containing the URIs of the document to which the
* workflow belongs.
* @param parameters
* A java.util.List containing the parameters for the workflow action. If
* it contains a key 'workflowId', then its value will be used as the
* workflow ID instead of the workflow ID stored in the workflow ID
* property of the document. This List must have the same size as
* 'uris'.
*/
workflow.invokeGroupAction = function (uris, groupActionId, parameters, repositoryRoot) {
var result = true;
for (var i = 0; i < uris.size(); i++) {
var uri = uris.get(i);
var parametersCopy = new HashMap();
var entryParameters = parameters.get(i);
var iter = entryParameters.keySet().iterator();
while (iter.hasNext()) {
var pkey = iter.next();
parametersCopy.put(pkey, entryParameters.get(pkey));
}
result &= workflow.invokeNamedAction(uri, "groupAction", groupActionId, parametersCopy, repositoryRoot);
}
return result;
}
workflow.invokeNamedAction = function (uri, attributeName, actionName, parameters, repositoryRoot) {
uri = removeParameters(uri);
var result = false;
var location = repositoryRoot + uri;
usingWorkflowDo(function(workflowComp) {
var httpState = authentication.getHttpState();
var workflowId = parameters.get("workflowId");
if (workflowId == null || workflowId == "") {
workflowId = WebDAVHelper.propfindAsString(location, "http://hippo.nl/cms/1.0", "workflowId", httpState);
}
if (parameters == null) {
parameters = new HashMap();
}
addRequiredDocumentParametersIfMissing(parameters, location);
var actions;
if (workflowId != null && workflowId != "") {
var workflowDescriptor = workflowComp.getWorkflowDescriptor(workflowComp.getWorkflowName(workflowId));
actions = workflowComp.getAvailableActions(workflowId, parameters);
var hasNamedActionBeenFound = false;
for (var i = 0; i < actions.length && !hasNamedActionBeenFound; i++) {
var actionDescriptor = workflowDescriptor.getAction(actions[i]);
var namedAction = actionDescriptor.getMetaAttributes().get(attributeName);
if (namedAction != null && namedAction == actionName) {
hasNamedActionBeenFound = true;
result = workflow.invokeAction(uri, actions[i], parameters, repositoryRoot);
var standardUIAction = actionDescriptor.getMetaAttributes().get("standardUIAction");
if (standardUIAction != null) {
workflow.invokeStandardUIActionFunctionality(standardUIAction, location, repositoryRoot);
}
}
}
}
});
return result;
}
workflow.invokeStandardUIActionFunctionality = function(standardUIAction, uri, repositoryRoot) {
if (standardUIAction == "hippo.cms.delete") {
deleteResource(repositoryRoot, uri.substr(repositoryRoot.length), new HashMap());
}
}
workflow.invokeAction = function (uri, actionId, parameters, repositoryRoot) {
return workflow.invokeActionUsingAbsoluteUri(repositoryRoot + uri, actionId, parameters);
}
workflow.invokeActionUsingAbsoluteUri = function (location, actionId, parameters) {
location = removeParameters(location);
var result = false;
var propertyValues = WebDAVHelper.propfind(location, PROPERTIES_NEEDED_BY_WORKFLOW.elements(), authentication.getHttpState());
var workflowId = parameters.get("workflowId");
if (workflowId == null || workflowId == "") {
var workflowIdAsProperty = propertyValues.get(WORKFLOW_ID_PROPERTY_NAME);
if (workflowIdAsProperty == null) {
workflowId = null;
}
else {
workflowId = workflowIdAsProperty.getPropertyAsString();
}
}
usingWorkflowDo(function(workflowComp) {
var workflowDescriptor = workflowComp.getWorkflowDescriptor(workflowComp.getWorkflowName(workflowId));
var actionDescriptor = workflowDescriptor.getAction(actionId);
var currentUserPrivileges = propertyValues.get(CUPS_PROPERTY_NAME).getElement();
var name = actionDescriptor.name;
var namespace = actionDescriptor.getMetaAttributes().get("namespaceUri");
if (namespace == null) {
var namespacePrefix = actionDescriptor.getMetaAttributes().get("namespaceUriPrefix");
var namespaceUriComposerClass = workflowDescriptor.getMetaAttributes().get("namespaceUriComposerClass");
var namespaceUriComposer = workflowComp.loadComponent(workflowId, namespaceUriComposerClass);
var namespace = namespaceUriComposer.composeNamespaceUri(namespacePrefix, workflowComp.getPropertySet(workflowId));
}
var privilegeElements = currentUserPrivileges.getElementsByTagNameNS(namespace, name);
if (privilegeElements != null && privilegeElements.getLength() > 0) {
var propertiesToSet = new ArrayList();
propertiesToSet.add(new Property("H", Constants.CMS_1_0_NAMESPACE, Constants.LAST_WORKFLOW_USER_PROPERTY_NAME, cocoon.session.getAttribute("username")));
var lockToken = WebDAVHelper.getLockToken(location, authentication.getHttpState());
WebDAVHelper.proppatch(location, propertiesToSet, null, lockToken, authentication.getHttpState());
if (parameters == null) {
parameters = new HashMap();
}
addRequiredDocumentParametersIfMissing(parameters, location);
try {
workflowComp.doAction(workflowId, actionId, parameters);
result = true;
}
catch (e) {
logging.error(function() {
return "Execution of workflow action " + actionId + " on workflow " + workflowId + " failed with " + e;
}, function() {
return e instanceof Throwable ? e : null;
});
}
}
});
return result;
}
workflow.invokeActionUnchecked = function (workflowId, actionId, parameters) {
var result = false;
usingWorkflowDo(function(workflowComp) {
if (parameters == null) {
parameters = new HashMap();
}
addRequiredParametersIfMissing(parameters);
try {
workflowComp.doAction(workflowId, actionId, parameters);
result = true;
}
catch (e) {
logging.error(function() {
return "Execution of workflow action " + actionId + " on workflow " + workflowId + " failed with " + e;
},
function() {
return e instanceof Throwable ? e : null;
});
}
});
return result;
}
// - Sitemap functions ------------------------------------------------
function query() {
var workflowName = cocoon.parameters["workflowName"];
var queryName = cocoon.parameters["queryName"];
var repositoryRoot = cocoon.parameters["repositoryRoot"];
usingWorkflowDo(function(workflowComp) {
var descriptor = workflowComp.getWorkflowDescriptor(workflowName);
if (descriptor == null) {
cocoon.sendStatus(404);
}
else {
var queryDefinitionsLocation = descriptor.getMetaAttributes().get("queryDefinitions");
if (queryDefinitionsLocation == null) {
cocoon.sendStatus(404);
}
else {
var queryDefinitionsStream = workflowComp.getResourceAsStream(workflowName, queryDefinitionsLocation);
if (queryDefinitionsStream != null) {
var queries = WorkflowHelper.readQueries(queryDefinitionsStream);
var queryDefinition = generic.detect(queries, function(query) {
return query.getId() == queryName;
});
if (queryDefinition == null) {
cocoon.sendStatus(404);
}
else {
var osWorkflowQuery = queryDefinition.toOSWorkflowQuery(workflowName);
// List<Long>
var matchingInstances = workflowComp.query(osWorkflowQuery);
var authorizer = WorkflowHelper.getQueryAuthorizer(workflowComp, workflowName);
var project = getCurrentProject();
var authorizerContext = new WorkflowActionAuthorizerContext(project, authentication.getHttpState(), avalon.serviceManager);
// List<JSMap<String, Object>>
var authorizedLocations = new ArrayList();
if (authorizer instanceof WorkflowQueryBulkAuthorizer) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?