diff --git a/source/java/org/alfresco/web/action/evaluator/WCMWorkflowDeletedEvaluator.java b/source/java/org/alfresco/web/action/evaluator/WCMWorkflowDeletedEvaluator.java index e27e695b40..1926bde92e 100644 --- a/source/java/org/alfresco/web/action/evaluator/WCMWorkflowDeletedEvaluator.java +++ b/source/java/org/alfresco/web/action/evaluator/WCMWorkflowDeletedEvaluator.java @@ -24,16 +24,19 @@ */ package org.alfresco.web.action.evaluator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import javax.faces.context.FacesContext; -import org.alfresco.repo.avm.AVMNodeConverter; -import org.alfresco.service.cmr.avm.AVMService; +import org.alfresco.service.cmr.workflow.WorkflowTask; import org.alfresco.web.app.servlet.FacesHelper; import org.alfresco.web.bean.repository.Node; -import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.bean.wcm.AVMBrowseBean; import org.alfresco.web.bean.wcm.AVMNode; import org.alfresco.web.bean.wcm.AVMUtil; +import org.alfresco.web.bean.wcm.AVMWorkflowUtil; import org.alfresco.web.bean.wcm.WebProject; /** @@ -45,7 +48,9 @@ import org.alfresco.web.bean.wcm.WebProject; public class WCMWorkflowDeletedEvaluator extends WCMLockEvaluator { private static final long serialVersionUID = -4341942166433855200L; - + + private static final String TASK_CACHE = "_alf_sandbox_task_cache"; + /** * @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node) */ @@ -55,17 +60,29 @@ public class WCMWorkflowDeletedEvaluator extends WCMLockEvaluator if (super.evaluate(node)) { final FacesContext fc = FacesContext.getCurrentInstance(); - final AVMService avmService = Repository.getServiceRegistry(fc).getAVMService(); final AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(fc, AVMBrowseBean.BEAN_NAME); WebProject webProject = avmBrowseBean.getWebProject(); if (webProject == null || webProject.hasWorkflow()) { - final String path = AVMNodeConverter.ToAVMVersionPath(node.getNodeRef()).getSecond(); + Map> cachedSandboxTasks = (Map>)fc.getExternalContext().getRequestMap().get(TASK_CACHE); + if (cachedSandboxTasks == null) + { + cachedSandboxTasks = new HashMap>(64, 1.0f); + fc.getExternalContext().getRequestMap().put(TASK_CACHE, cachedSandboxTasks); + } + + String sandbox = AVMUtil.getStoreName(node.getPath()); + List cachedTasks = cachedSandboxTasks.get(sandbox); + if (cachedTasks == null) + { + cachedTasks = AVMWorkflowUtil.getAssociatedTasksForSandbox(sandbox); + cachedSandboxTasks.put(sandbox, cachedTasks); + } // evaluate to true if we are within a workflow store (i.e. list of resources in the task // dialog) or not part of an already in-progress workflow - proceed = (AVMUtil.isWorkflowStore(AVMUtil.getStoreName(path)) || - !((AVMNode)node).isWorkflowInFlight()); + proceed = (AVMUtil.isWorkflowStore(sandbox) || + !((AVMNode)node).isWorkflowInFlight(cachedTasks)); } else { diff --git a/source/java/org/alfresco/web/action/evaluator/WCMWorkflowEvaluator.java b/source/java/org/alfresco/web/action/evaluator/WCMWorkflowEvaluator.java index 413bc8058d..149b5c7a3b 100644 --- a/source/java/org/alfresco/web/action/evaluator/WCMWorkflowEvaluator.java +++ b/source/java/org/alfresco/web/action/evaluator/WCMWorkflowEvaluator.java @@ -24,17 +24,19 @@ */ package org.alfresco.web.action.evaluator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import javax.faces.context.FacesContext; -import org.alfresco.repo.avm.AVMNodeConverter; -import org.alfresco.service.cmr.avm.AVMService; -import org.alfresco.util.Pair; +import org.alfresco.service.cmr.workflow.WorkflowTask; import org.alfresco.web.app.servlet.FacesHelper; import org.alfresco.web.bean.repository.Node; -import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.bean.wcm.AVMBrowseBean; import org.alfresco.web.bean.wcm.AVMNode; import org.alfresco.web.bean.wcm.AVMUtil; +import org.alfresco.web.bean.wcm.AVMWorkflowUtil; import org.alfresco.web.bean.wcm.WebProject; /** @@ -45,6 +47,8 @@ import org.alfresco.web.bean.wcm.WebProject; public class WCMWorkflowEvaluator extends WCMLockEvaluator { private static final long serialVersionUID = -5847066921917855781L; + + private static final String TASK_CACHE = "_alf_sandbox_task_cache"; /** * @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node) @@ -55,19 +59,28 @@ public class WCMWorkflowEvaluator extends WCMLockEvaluator if (super.evaluate(node)) { final FacesContext fc = FacesContext.getCurrentInstance(); - final AVMService avmService = Repository.getServiceRegistry(fc).getAVMService(); final AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(fc, AVMBrowseBean.BEAN_NAME); WebProject webProject = avmBrowseBean.getWebProject(); if (webProject == null || webProject.hasWorkflow()) { - final Pair p = AVMNodeConverter.ToAVMVersionPath(node.getNodeRef()); - final String path = p.getSecond(); + Map> cachedSandboxTasks = (Map>)fc.getExternalContext().getRequestMap().get(TASK_CACHE); + if (cachedSandboxTasks == null) + { + cachedSandboxTasks = new HashMap>(64, 1.0f); + fc.getExternalContext().getRequestMap().put(TASK_CACHE, cachedSandboxTasks); + } - // evaluate to true if we are not deleted and within a workflow store (i.e. list of resources - // in the task dialog) or not part of an already in-progress workflow - proceed = ((AVMUtil.isWorkflowStore(AVMUtil.getStoreName(path)) || - !((AVMNode)node).isWorkflowInFlight()) && - avmService.lookup(p.getFirst(), path) != null); + String sandbox = AVMUtil.getStoreName(node.getPath()); + List cachedTasks = cachedSandboxTasks.get(sandbox); + if (cachedTasks == null) + { + cachedTasks = AVMWorkflowUtil.getAssociatedTasksForSandbox(sandbox); + cachedSandboxTasks.put(sandbox, cachedTasks); + } + + proceed = ((AVMUtil.isWorkflowStore(sandbox) || + !((AVMNode)node).isWorkflowInFlight(cachedTasks)) && + !((AVMNode)node).isDeleted()); } else { diff --git a/source/java/org/alfresco/web/bean/wcm/AVMNode.java b/source/java/org/alfresco/web/bean/wcm/AVMNode.java index 08098f8bfd..132d55093c 100644 --- a/source/java/org/alfresco/web/bean/wcm/AVMNode.java +++ b/source/java/org/alfresco/web/bean/wcm/AVMNode.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2008 Alfresco Software Limited. + * Copyright (C) 2005-2009 Alfresco Software Limited. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -37,8 +37,8 @@ import org.alfresco.service.cmr.avm.AVMNodeDescriptor; import org.alfresco.service.cmr.avm.LayeringDescriptor; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.Path; +import org.alfresco.service.cmr.workflow.WorkflowTask; import org.alfresco.service.namespace.QName; -import org.alfresco.util.Pair; import org.alfresco.wcm.asset.AssetInfo; import org.alfresco.wcm.asset.AssetInfoImpl; import org.alfresco.web.bean.BrowseBean; @@ -164,7 +164,6 @@ public class AVMNode extends Node implements Map private LayeringDescriptor layeringDesc; private final int version; private final boolean deleted; - private WebProject webProject; private Boolean workflowInFlight; public AVMNode(final AssetInfo asset) @@ -243,6 +242,11 @@ public class AVMNode extends Node implements Map return this.avmRef.isFile() || this.avmRef.isDeletedFile(); } + public final boolean isDeleted() + { + return this.avmRef.isDeleted(); + } + public final boolean isModified() { if (this.layeringDesc == null) @@ -252,7 +256,7 @@ public class AVMNode extends Node implements Map return !this.layeringDesc.isBackground(); } - public final boolean isWorkflowInFlight() + public final boolean isWorkflowInFlight(List tasks) { if (this.workflowInFlight == null) { @@ -262,30 +266,12 @@ public class AVMNode extends Node implements Map } else { - // optimization to avoid having to perform a workflow query and multiple lookups - // per workflow sandbox. only accurate for files, not new directories - if (!this.isDirectory()) - { - this.workflowInFlight = false; - final List> headPaths = this.getServiceRegistry().getAVMService().getHeadPaths(this.getDescriptor()); - for (final Pair headPath : headPaths) - { - if (AVMUtil.isWorkflowStore(AVMUtil.getStoreName(headPath.getSecond()))) - { - this.workflowInFlight = true; - break; - } - } - } - else - { - this.workflowInFlight = AVMWorkflowUtil.getAssociatedTasksForNode(this.getDescriptor()).size() != 0; - } + this.workflowInFlight = AVMWorkflowUtil.getAssociatedTasksForNode(this.avmRef, tasks).size() != 0; } } return this.workflowInFlight; } - + /** * @return All the properties known about this node. */ diff --git a/source/java/org/alfresco/web/config/ClientConfigElement.java b/source/java/org/alfresco/web/config/ClientConfigElement.java index 8901bfc8f4..0445d81305 100644 --- a/source/java/org/alfresco/web/config/ClientConfigElement.java +++ b/source/java/org/alfresco/web/config/ClientConfigElement.java @@ -584,7 +584,10 @@ public class ClientConfigElement extends ConfigElementAdapter if (value == null) { value = JNDIConstants.DEFAULT_VSERVER_IP; - logger.warn("Virtualisation Server not started - reverting to default IP: " + value); + if (logger.isDebugEnabled()) + { + logger.debug("Virtualisation Server not started - reverting to default IP: " + value); + } } this.wcmDomain.put(value); } @@ -605,7 +608,10 @@ public class ClientConfigElement extends ConfigElementAdapter if (iValue == null) { iValue = JNDIConstants.DEFAULT_VSERVER_PORT; - logger.warn("Virtualisation Server not started - reverting to default port: " + iValue); + if (logger.isDebugEnabled()) + { + logger.debug("Virtualisation Server not started - reverting to default port: " + iValue); + } } value = iValue.toString(); this.wcmPort.put(value); diff --git a/source/web/jsp/admin/avm-console-help.txt b/source/web/jsp/admin/avm-console-help.txt index 2f7dfa8f70..428cc71c1b 100644 --- a/source/web/jsp/admin/avm-console-help.txt +++ b/source/web/jsp/admin/avm-console-help.txt @@ -159,9 +159,11 @@ name is the name of the copy. snap - Creates a snapshot (a new version of an avmstore). -snap, storename +snap, storename, tag, description storename is the name of the store to snapshot. +tag is the short label - note: cannot contain ',' using this interface +description is the longer description - note: cannot contain ',' using this interface ------