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 + -
显示快捷键?