Merged V3.1 to HEAD

12943: Port of support for ADB-47 from V2.1-A to 3.1
   12948: Port of tests from CHK-2235 for ADB-20 from V2.1-A to 3.1
   12965: Activated index tracker Quartz job by default
   12974: Port for lazy creation of home folders with configuration from V2.1-A to V3.1: original CHK-2619, CHK-2716
   12976: Merged V2.1A to V3.1
      8562: (record-only) Fix to lazily create home folders - DO NOT MERGE
      8694: (record-only) Added configuration for lazy or eager creation of home folders
   12978: Merged V3.0 to V3.1
      12920: Merged V2.2 to V3.0
         12456: Wire up AVM locking service by interface to allow for potential over-ride
         12457: Make AVM ChildKey case insensitive
         12470: Merged V2.2.1-NBC-FIXES to V2.2
            12156: Optimizations to WCMWorkflowEvaluator and WCMWorkflowDeletedEvaluator    
            12605: Hide annoying "Virtualisation Server not started" warnings (by making them debug)
         12707: AVM console - "snap" also allows tag and description to be specified
   12979: Build/test fix
   ___________________________________________________________________
   Modified: svn:mergeinfo
      Merged /alfresco/BRANCHES/DEV/V2.2.1-NBC-FIXES:r12156
      Merged /alfresco/BRANCHES/V2.1-A:r8562,8694
      Merged /alfresco/BRANCHES/V3.0:r12920
      Merged /alfresco/BRANCHES/V2.2:r12456-12457,12470,12605,12707
      Merged /alfresco/BRANCHES/V3.1:r12943,12948,12965,12974,12976,12978-12979


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13544 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2009-03-11 01:06:49 +00:00
parent 6773e2f1ce
commit 5c7525fc4a
5 changed files with 71 additions and 47 deletions

View File

@@ -24,16 +24,19 @@
*/ */
package org.alfresco.web.action.evaluator; package org.alfresco.web.action.evaluator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.web.app.servlet.FacesHelper; import org.alfresco.web.app.servlet.FacesHelper;
import org.alfresco.web.bean.repository.Node; 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.AVMBrowseBean;
import org.alfresco.web.bean.wcm.AVMNode; import org.alfresco.web.bean.wcm.AVMNode;
import org.alfresco.web.bean.wcm.AVMUtil; import org.alfresco.web.bean.wcm.AVMUtil;
import org.alfresco.web.bean.wcm.AVMWorkflowUtil;
import org.alfresco.web.bean.wcm.WebProject; import org.alfresco.web.bean.wcm.WebProject;
/** /**
@@ -45,7 +48,9 @@ import org.alfresco.web.bean.wcm.WebProject;
public class WCMWorkflowDeletedEvaluator extends WCMLockEvaluator public class WCMWorkflowDeletedEvaluator extends WCMLockEvaluator
{ {
private static final long serialVersionUID = -4341942166433855200L; 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) * @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)) if (super.evaluate(node))
{ {
final FacesContext fc = FacesContext.getCurrentInstance(); final FacesContext fc = FacesContext.getCurrentInstance();
final AVMService avmService = Repository.getServiceRegistry(fc).getAVMService();
final AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(fc, AVMBrowseBean.BEAN_NAME); final AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(fc, AVMBrowseBean.BEAN_NAME);
WebProject webProject = avmBrowseBean.getWebProject(); WebProject webProject = avmBrowseBean.getWebProject();
if (webProject == null || webProject.hasWorkflow()) if (webProject == null || webProject.hasWorkflow())
{ {
final String path = AVMNodeConverter.ToAVMVersionPath(node.getNodeRef()).getSecond(); Map<String, List<WorkflowTask>> cachedSandboxTasks = (Map<String, List<WorkflowTask>>)fc.getExternalContext().getRequestMap().get(TASK_CACHE);
if (cachedSandboxTasks == null)
{
cachedSandboxTasks = new HashMap<String, List<WorkflowTask>>(64, 1.0f);
fc.getExternalContext().getRequestMap().put(TASK_CACHE, cachedSandboxTasks);
}
String sandbox = AVMUtil.getStoreName(node.getPath());
List<WorkflowTask> 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 // 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 // dialog) or not part of an already in-progress workflow
proceed = (AVMUtil.isWorkflowStore(AVMUtil.getStoreName(path)) || proceed = (AVMUtil.isWorkflowStore(sandbox) ||
!((AVMNode)node).isWorkflowInFlight()); !((AVMNode)node).isWorkflowInFlight(cachedTasks));
} }
else else
{ {

View File

@@ -24,17 +24,19 @@
*/ */
package org.alfresco.web.action.evaluator; package org.alfresco.web.action.evaluator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.util.Pair;
import org.alfresco.web.app.servlet.FacesHelper; import org.alfresco.web.app.servlet.FacesHelper;
import org.alfresco.web.bean.repository.Node; 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.AVMBrowseBean;
import org.alfresco.web.bean.wcm.AVMNode; import org.alfresco.web.bean.wcm.AVMNode;
import org.alfresco.web.bean.wcm.AVMUtil; import org.alfresco.web.bean.wcm.AVMUtil;
import org.alfresco.web.bean.wcm.AVMWorkflowUtil;
import org.alfresco.web.bean.wcm.WebProject; import org.alfresco.web.bean.wcm.WebProject;
/** /**
@@ -45,6 +47,8 @@ import org.alfresco.web.bean.wcm.WebProject;
public class WCMWorkflowEvaluator extends WCMLockEvaluator public class WCMWorkflowEvaluator extends WCMLockEvaluator
{ {
private static final long serialVersionUID = -5847066921917855781L; 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) * @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)) if (super.evaluate(node))
{ {
final FacesContext fc = FacesContext.getCurrentInstance(); final FacesContext fc = FacesContext.getCurrentInstance();
final AVMService avmService = Repository.getServiceRegistry(fc).getAVMService();
final AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(fc, AVMBrowseBean.BEAN_NAME); final AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(fc, AVMBrowseBean.BEAN_NAME);
WebProject webProject = avmBrowseBean.getWebProject(); WebProject webProject = avmBrowseBean.getWebProject();
if (webProject == null || webProject.hasWorkflow()) if (webProject == null || webProject.hasWorkflow())
{ {
final Pair<Integer, String> p = AVMNodeConverter.ToAVMVersionPath(node.getNodeRef()); Map<String, List<WorkflowTask>> cachedSandboxTasks = (Map<String, List<WorkflowTask>>)fc.getExternalContext().getRequestMap().get(TASK_CACHE);
final String path = p.getSecond(); if (cachedSandboxTasks == null)
{
cachedSandboxTasks = new HashMap<String, List<WorkflowTask>>(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 String sandbox = AVMUtil.getStoreName(node.getPath());
// in the task dialog) or not part of an already in-progress workflow List<WorkflowTask> cachedTasks = cachedSandboxTasks.get(sandbox);
proceed = ((AVMUtil.isWorkflowStore(AVMUtil.getStoreName(path)) || if (cachedTasks == null)
!((AVMNode)node).isWorkflowInFlight()) && {
avmService.lookup(p.getFirst(), path) != null); cachedTasks = AVMWorkflowUtil.getAssociatedTasksForSandbox(sandbox);
cachedSandboxTasks.put(sandbox, cachedTasks);
}
proceed = ((AVMUtil.isWorkflowStore(sandbox) ||
!((AVMNode)node).isWorkflowInFlight(cachedTasks)) &&
!((AVMNode)node).isDeleted());
} }
else else
{ {

View File

@@ -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 * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * 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.avm.LayeringDescriptor;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
import org.alfresco.wcm.asset.AssetInfo; import org.alfresco.wcm.asset.AssetInfo;
import org.alfresco.wcm.asset.AssetInfoImpl; import org.alfresco.wcm.asset.AssetInfoImpl;
import org.alfresco.web.bean.BrowseBean; import org.alfresco.web.bean.BrowseBean;
@@ -164,7 +164,6 @@ public class AVMNode extends Node implements Map<String, Object>
private LayeringDescriptor layeringDesc; private LayeringDescriptor layeringDesc;
private final int version; private final int version;
private final boolean deleted; private final boolean deleted;
private WebProject webProject;
private Boolean workflowInFlight; private Boolean workflowInFlight;
public AVMNode(final AssetInfo asset) public AVMNode(final AssetInfo asset)
@@ -243,6 +242,11 @@ public class AVMNode extends Node implements Map<String, Object>
return this.avmRef.isFile() || this.avmRef.isDeletedFile(); return this.avmRef.isFile() || this.avmRef.isDeletedFile();
} }
public final boolean isDeleted()
{
return this.avmRef.isDeleted();
}
public final boolean isModified() public final boolean isModified()
{ {
if (this.layeringDesc == null) if (this.layeringDesc == null)
@@ -252,7 +256,7 @@ public class AVMNode extends Node implements Map<String, Object>
return !this.layeringDesc.isBackground(); return !this.layeringDesc.isBackground();
} }
public final boolean isWorkflowInFlight() public final boolean isWorkflowInFlight(List<WorkflowTask> tasks)
{ {
if (this.workflowInFlight == null) if (this.workflowInFlight == null)
{ {
@@ -262,30 +266,12 @@ public class AVMNode extends Node implements Map<String, Object>
} }
else else
{ {
// optimization to avoid having to perform a workflow query and multiple lookups this.workflowInFlight = AVMWorkflowUtil.getAssociatedTasksForNode(this.avmRef, tasks).size() != 0;
// per workflow sandbox. only accurate for files, not new directories
if (!this.isDirectory())
{
this.workflowInFlight = false;
final List<Pair<Integer, String>> headPaths = this.getServiceRegistry().getAVMService().getHeadPaths(this.getDescriptor());
for (final Pair<Integer, String> headPath : headPaths)
{
if (AVMUtil.isWorkflowStore(AVMUtil.getStoreName(headPath.getSecond())))
{
this.workflowInFlight = true;
break;
}
}
}
else
{
this.workflowInFlight = AVMWorkflowUtil.getAssociatedTasksForNode(this.getDescriptor()).size() != 0;
}
} }
} }
return this.workflowInFlight; return this.workflowInFlight;
} }
/** /**
* @return All the properties known about this node. * @return All the properties known about this node.
*/ */

View File

@@ -584,7 +584,10 @@ public class ClientConfigElement extends ConfigElementAdapter
if (value == null) if (value == null)
{ {
value = JNDIConstants.DEFAULT_VSERVER_IP; 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); this.wcmDomain.put(value);
} }
@@ -605,7 +608,10 @@ public class ClientConfigElement extends ConfigElementAdapter
if (iValue == null) if (iValue == null)
{ {
iValue = JNDIConstants.DEFAULT_VSERVER_PORT; 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(); value = iValue.toString();
this.wcmPort.put(value); this.wcmPort.put(value);

View File

@@ -159,9 +159,11 @@ name is the name of the copy.
snap - Creates a snapshot (a new version of an snap - Creates a snapshot (a new version of an
avmstore). avmstore).
snap, storename snap, storename, tag, description
storename is the name of the store to snapshot. 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
------ ------