From a8023d20a2dc4f07c245c4267c9fbac00e2e521e Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Mon, 10 Sep 2007 21:50:49 +0000 Subject: [PATCH] Merged V2.1 to HEAD 6418: Allow getLayeringInfo on deleted nodes. 6419: fixes for submitting of deleted directories and regenerate renditions related fixes. 6420: Added installs to build 6421: Build fix for sdk 6423: WCM-710 - Submit All feature reintroducted to WCM My Modified Files views 6424: OpenOffice connection is now tested on bootstrap. 6425: AWC-1446 - Space Selector would show spaces you do not have access to 6426: WCM-699 - Staging area user assets 6427: Rollback exceptions now explicitly handled by RetryingTransactionHelper to extract the cause of the exception. 6428: Fix for AWC-1340 6429: Fixed transaction boundaries for full index recovery components 6433: AR-1660 - SMB and SMB2 signature check git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6732 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/web-client-config-actions.xml | 1 + .../action/evaluator/WCMLockEvaluator.java | 30 ++++++++----- .../org/alfresco/web/bean/CategoriesBean.java | 4 +- .../org/alfresco/web/bean/wcm/AVMUtil.java | 12 +++++ .../web/bean/wcm/AVMWorkflowUtil.java | 45 +++++++++++-------- .../bean/wcm/RegenerateRenditionsWizard.java | 13 ++++-- .../alfresco/web/bean/wcm/SubmitDialog.java | 11 +++-- .../web/bean/workflow/ManageTaskDialog.java | 2 +- source/java/org/alfresco/web/data/Sort.java | 7 +++ .../repo/component/AbstractItemSelector.java | 18 ++++++++ .../ui/repo/component/UICategorySelector.java | 2 +- .../ui/repo/component/UISpaceSelector.java | 6 +-- .../component/UIWebProjectFolderSelector.java | 6 +-- .../web/ui/wcm/component/UIUserSandboxes.java | 5 +-- 14 files changed, 111 insertions(+), 51 deletions(-) diff --git a/config/alfresco/web-client-config-actions.xml b/config/alfresco/web-client-config-actions.xml index 92220b40e9..255afed809 100644 --- a/config/alfresco/web-client-config-actions.xml +++ b/config/alfresco/web-client-config-actions.xml @@ -723,6 +723,7 @@ + diff --git a/source/java/org/alfresco/web/action/evaluator/WCMLockEvaluator.java b/source/java/org/alfresco/web/action/evaluator/WCMLockEvaluator.java index 60470cf705..2f6c67d1ae 100644 --- a/source/java/org/alfresco/web/action/evaluator/WCMLockEvaluator.java +++ b/source/java/org/alfresco/web/action/evaluator/WCMLockEvaluator.java @@ -34,6 +34,7 @@ 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.AVMUtil; import org.alfresco.web.bean.wcm.WebProject; /** @@ -48,20 +49,25 @@ public class WCMLockEvaluator implements ActionEvaluator */ public boolean evaluate(final Node node) { - final FacesContext fc = FacesContext.getCurrentInstance(); - final AVMLockingService avmLockService = Repository.getServiceRegistry(fc).getAVMLockingService(); - final AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(fc, AVMBrowseBean.BEAN_NAME); - + boolean result = false; final String path = AVMNodeConverter.ToAVMVersionPath(node.getNodeRef()).getSecond(); - final String username = Application.getCurrentUser(fc).getUserName(); - - WebProject webProject = avmBrowseBean.getWebProject(); - if (webProject == null) + if (!AVMUtil.isMainStore(AVMUtil.getStoreName(path))) { - // when in a workflow context, the WebProject may not be accurate on the browsebean - // so get the web project associated with the path - webProject = new WebProject(path); + final FacesContext fc = FacesContext.getCurrentInstance(); + final AVMLockingService avmLockService = Repository.getServiceRegistry(fc).getAVMLockingService(); + final AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(fc, AVMBrowseBean.BEAN_NAME); + + final String username = Application.getCurrentUser(fc).getUserName(); + + WebProject webProject = avmBrowseBean.getWebProject(); + if (webProject == null) + { + // when in a workflow context, the WebProject may not be accurate on the browsebean + // so get the web project associated with the path + webProject = new WebProject(path); + } + result = avmLockService.hasAccess(webProject.getNodeRef(), path, username); } - return avmLockService.hasAccess(webProject.getNodeRef(), path, username); + return result; } } diff --git a/source/java/org/alfresco/web/bean/CategoriesBean.java b/source/java/org/alfresco/web/bean/CategoriesBean.java index 22ab8e4367..187a15001b 100644 --- a/source/java/org/alfresco/web/bean/CategoriesBean.java +++ b/source/java/org/alfresco/web/bean/CategoriesBean.java @@ -461,11 +461,11 @@ public class CategoriesBean implements IContextListener NodeRef ref; if (categoryRef == null) { - ref = categoryService.createRootCategory(Repository.getStoreRef(), ContentModel.ASPECT_GEN_CLASSIFIABLE, name); + ref = categoryService.createRootCategory(Repository.getStoreRef(), ContentModel.ASPECT_GEN_CLASSIFIABLE, name.trim()); } else { - ref = categoryService.createCategory(categoryRef, name); + ref = categoryService.createCategory(categoryRef, name.trim()); } // apply the titled aspect - for description diff --git a/source/java/org/alfresco/web/bean/wcm/AVMUtil.java b/source/java/org/alfresco/web/bean/wcm/AVMUtil.java index c72f89f309..a73a0b62b4 100644 --- a/source/java/org/alfresco/web/bean/wcm/AVMUtil.java +++ b/source/java/org/alfresco/web/bean/wcm/AVMUtil.java @@ -154,6 +154,18 @@ public final class AVMUtil } return storeName.indexOf(AVMUtil.STORE_SEPARATOR) != -1; } + + /** + * Indicates whether the store name describes a main store. + * + * @param storeName the store name + * + * @return true if the store is a main store, false otherwise. + */ + public static boolean isMainStore(String storeName) + { + return (storeName.indexOf(AVMUtil.STORE_SEPARATOR) == -1); + } /** * Extracts the username from the store name. diff --git a/source/java/org/alfresco/web/bean/wcm/AVMWorkflowUtil.java b/source/java/org/alfresco/web/bean/wcm/AVMWorkflowUtil.java index ade27b49b1..1469f325e5 100644 --- a/source/java/org/alfresco/web/bean/wcm/AVMWorkflowUtil.java +++ b/source/java/org/alfresco/web/bean/wcm/AVMWorkflowUtil.java @@ -71,7 +71,7 @@ import org.apache.commons.logging.LogFactory; */ public class AVMWorkflowUtil extends WorkflowUtil { - private static final Log LOGGER = LogFactory.getLog(AVMWorkflowUtil.class); + private static final Log logger = LogFactory.getLog(AVMWorkflowUtil.class); // cached configured lists private static List configuredWorkflowDefs = null; @@ -133,6 +133,7 @@ public class AVMWorkflowUtil extends WorkflowUtil final ServiceRegistry services = Repository.getServiceRegistry(FacesContext.getCurrentInstance()); final PermissionService permissionService = services.getPermissionService(); permissionService.setPermission(packageNodeRef, PermissionService.ALL_AUTHORITIES, PermissionService.ALL_PERMISSIONS, true); + return packageNodeRef; } @@ -209,14 +210,14 @@ public class AVMWorkflowUtil extends WorkflowUtil ConfigElement config = Application.getConfigService(fc).getGlobalConfig().getConfigElement("wcm"); if (config == null) { - LOGGER.warn("WARNING: Unable to find 'wcm' config element definition."); + logger.warn("WARNING: Unable to find 'wcm' config element definition."); } else { ConfigElement workflowConfig = config.getChild("workflows"); if (workflowConfig == null) { - LOGGER.warn("WARNING: Unable to find WCM 'workflows' config element definition."); + logger.warn("WARNING: Unable to find WCM 'workflows' config element definition."); } else { @@ -233,7 +234,7 @@ public class AVMWorkflowUtil extends WorkflowUtil } else { - LOGGER.warn("WARNING: Cannot find WCM workflow def for configured definition name: " + wfName); + logger.warn("WARNING: Cannot find WCM workflow def for configured definition name: " + wfName); } } } @@ -249,48 +250,54 @@ public class AVMWorkflowUtil extends WorkflowUtil final FacesContext fc = FacesContext.getCurrentInstance(); final WorkflowService workflowService = Repository.getServiceRegistry(fc).getWorkflowService(); final WorkflowTaskQuery query = new WorkflowTaskQuery(); + final HashMap props = new HashMap(1, 1.0f); props.put(WCMWorkflowModel.PROP_FROM_PATH, fromPath); query.setProcessCustomProps(props); final List tasks = workflowService.queryTasks(query); - LOGGER.debug("found " + tasks.size() + " tasks originating user sandbox " + fromPath); + + if (logger.isDebugEnabled()) + logger.debug("found " + tasks.size() + " tasks originating user sandbox " + fromPath); + return tasks; } - - public static List getAssociatedTasksForNode(final AVMNodeDescriptor node) + + public static List getAssociatedTasksForNode(AVMNodeDescriptor node, List tasks) { - final List tasks = AVMWorkflowUtil.getAssociatedTasksForSandbox(AVMUtil.getStoreName(node.getPath())); final List result = new LinkedList(); final FacesContext fc = FacesContext.getCurrentInstance(); final AVMService avmService = Repository.getServiceRegistry(fc).getAVMService(); + for (final WorkflowTask task : tasks) { final NodeRef ref = task.path.instance.workflowPackage; final String path = AVMUtil.getCorrespondingPath(node.getPath(), ref.getStoreRef().getIdentifier()); - if (LOGGER.isDebugEnabled()) - { - LOGGER.debug("checking store " + ref.getStoreRef().getIdentifier() + + if (logger.isDebugEnabled()) + logger.debug("checking store " + ref.getStoreRef().getIdentifier() + " for " + node.getPath() + " (" + path + ")"); - } try { final LayeringDescriptor ld = avmService.getLayeringInfo(-1, path); if (!ld.isBackground()) { - LOGGER.debug(path + " is in the foreground. workflow active"); + if (logger.isDebugEnabled()) + logger.debug(path + " is in the foreground. workflow active"); result.add(task); } - else - { -// LOGGER.debug(path + " is in the background"); - } } catch (final AVMNotFoundException avmnfe) { - LOGGER.debug(path + " not found"); + if (logger.isDebugEnabled()) + logger.debug(path + " not found"); } } - + return result; } + + public static List getAssociatedTasksForNode(AVMNodeDescriptor node) + { + final List tasks = AVMWorkflowUtil.getAssociatedTasksForSandbox(AVMUtil.getStoreName(node.getPath())); + return getAssociatedTasksForNode(node, tasks); + } } diff --git a/source/java/org/alfresco/web/bean/wcm/RegenerateRenditionsWizard.java b/source/java/org/alfresco/web/bean/wcm/RegenerateRenditionsWizard.java index 5fd2c6a8f5..7293c613a9 100644 --- a/source/java/org/alfresco/web/bean/wcm/RegenerateRenditionsWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/RegenerateRenditionsWizard.java @@ -201,7 +201,12 @@ public class RegenerateRenditionsWizard @Override public boolean getNextButtonDisabled() { - return false; + boolean disabled = false; + if ("select_renditions".equals(Application.getWizardManager().getCurrentStepName())) + { + disabled = this.selectedWebProject == null; + } + return disabled; } @Override @@ -413,7 +418,7 @@ public class RegenerateRenditionsWizard final StoreRef storeRef = AVMNodeConverter.ToStoreRef(webProject.getStagingStore()); sp.addStore(storeRef); sp.setLanguage(SearchService.LANGUAGE_LUCENE); - StringBuilder query = new StringBuilder(); + final StringBuilder query = new StringBuilder(); query.append("+ASPECT:\"" + WCMAppModel.ASPECT_FORM_INSTANCE_DATA + "\""); query.append("-ASPECT:\"" + WCMAppModel.ASPECT_RENDITION + "\""); query.append(" +@" + Repository.escapeQName(WCMAppModel.PROP_PARENT_FORM_NAME) + @@ -438,9 +443,9 @@ public class RegenerateRenditionsWizard final StoreRef storeRef = AVMNodeConverter.ToStoreRef(webProject.getStagingStore()); sp.addStore(storeRef); sp.setLanguage(SearchService.LANGUAGE_LUCENE); - StringBuilder query = new StringBuilder(); + final StringBuilder query = new StringBuilder(); query.append("+ASPECT:\"" + WCMAppModel.ASPECT_RENDITION + "\""); - query.append("+@" + Repository.escapeQName(WCMAppModel.PROP_PARENT_RENDERING_ENGINE_TEMPLATE) + + query.append(" +@" + Repository.escapeQName(WCMAppModel.PROP_PARENT_RENDERING_ENGINE_TEMPLATE) + ":\"" + ((RenderingEngineTemplateImpl)ret).getNodeRef() + "\""); LOGGER.debug("running query " + query); diff --git a/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java b/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java index 9eb43dabd0..e755369279 100644 --- a/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java +++ b/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java @@ -946,7 +946,7 @@ public class SubmitDialog extends BaseDialogBean selected = new ArrayList(1); selected.add(this.avmService.lookup(-1, this.avmBrowseBean.getAvmActionNode().getPath(), true)); } - + if (selected == null) { this.submitItems = Collections.emptyList(); @@ -957,9 +957,14 @@ public class SubmitDialog extends BaseDialogBean Set submittedPaths = new HashSet(selected.size()); this.submitItems = new ArrayList(selected.size()); this.warningItems = new ArrayList(selected.size() >> 1); + List tasks = null; for (AVMNodeDescriptor node : selected) { - if (AVMWorkflowUtil.getAssociatedTasksForNode(node).size() != 0) + if (tasks == null) + { + tasks = AVMWorkflowUtil.getAssociatedTasksForSandbox(AVMUtil.getStoreName(node.getPath())); + } + if (AVMWorkflowUtil.getAssociatedTasksForNode(node, tasks).size() != 0) { this.warningItems.add(new ItemWrapper(node)); continue; @@ -977,7 +982,7 @@ public class SubmitDialog extends BaseDialogBean } // lookup if this item was created via a form - then lookup the workflow defaults // for that form and store into the list of available workflows - else if (! this.nodeService.hasAspect(ref, WCMAppModel.ASPECT_FORM_INSTANCE_DATA)) + else if (!this.nodeService.hasAspect(ref, WCMAppModel.ASPECT_FORM_INSTANCE_DATA)) { this.submitItems.add(new ItemWrapper(node)); submittedPaths.add(node.getPath()); diff --git a/source/java/org/alfresco/web/bean/workflow/ManageTaskDialog.java b/source/java/org/alfresco/web/bean/workflow/ManageTaskDialog.java index 1427f798fe..3ecc74acfc 100644 --- a/source/java/org/alfresco/web/bean/workflow/ManageTaskDialog.java +++ b/source/java/org/alfresco/web/bean/workflow/ManageTaskDialog.java @@ -819,7 +819,7 @@ public class ManageTaskDialog extends BaseDialogBean node.addPropertyResolver("url", this.browseBean.resolverUrl); } this.resources.add(node); - if (node.isDirectory()) + if (node.isDirectory() && !node.getDescriptor().isDeleted()) { for (final AVMNodeDescriptor d : this.avmService.getDirectoryListingArray(node.getDescriptor(), true)) diff --git a/source/java/org/alfresco/web/data/Sort.java b/source/java/org/alfresco/web/data/Sort.java index f4190b4bee..d2792c6286 100644 --- a/source/java/org/alfresco/web/data/Sort.java +++ b/source/java/org/alfresco/web/data/Sort.java @@ -202,6 +202,13 @@ public abstract class Sort if (getter != null) { // if we have a bean getter method impl use that + try + { + getter.setAccessible(true); + } + catch (SecurityException se) + { + } obj = getter.invoke(data.get(iIndex), (Object [])null); } else diff --git a/source/java/org/alfresco/web/ui/repo/component/AbstractItemSelector.java b/source/java/org/alfresco/web/ui/repo/component/AbstractItemSelector.java index 6f18c48454..6a1a4fdaf6 100644 --- a/source/java/org/alfresco/web/ui/repo/component/AbstractItemSelector.java +++ b/source/java/org/alfresco/web/ui/repo/component/AbstractItemSelector.java @@ -790,6 +790,24 @@ public abstract class AbstractItemSelector extends UIInput * @return Node Service bean instance or throws exception if not found */ protected static NodeService getNodeService(FacesContext context) + { + NodeService service = Repository.getServiceRegistry(context).getNodeService(); + if (service == null) + { + throw new IllegalStateException("Unable to obtain NodeService bean reference."); + } + + return service; + } + + /** + * Use Spring JSF integration to return the node Service bean instance + * + * @param context FacesContext + * + * @return Node Service bean instance or throws exception if not found + */ + protected static NodeService getFastNodeService(FacesContext context) { NodeService service = (NodeService)FacesContextUtils.getRequiredWebApplicationContext( context).getBean("nodeService"); diff --git a/source/java/org/alfresco/web/ui/repo/component/UICategorySelector.java b/source/java/org/alfresco/web/ui/repo/component/UICategorySelector.java index ee8d44c024..b441c53046 100644 --- a/source/java/org/alfresco/web/ui/repo/component/UICategorySelector.java +++ b/source/java/org/alfresco/web/ui/repo/component/UICategorySelector.java @@ -91,7 +91,7 @@ public class UICategorySelector extends AbstractItemSelector if (this.navigationId != null) { - ChildAssociationRef parentRef = getNodeService(context).getPrimaryParent( + ChildAssociationRef parentRef = getFastNodeService(context).getPrimaryParent( new NodeRef(Repository.getStoreRef(), this.navigationId)); Node parentNode = new Node(parentRef.getParentRef()); diff --git a/source/java/org/alfresco/web/ui/repo/component/UISpaceSelector.java b/source/java/org/alfresco/web/ui/repo/component/UISpaceSelector.java index c61368bd75..254f61129e 100644 --- a/source/java/org/alfresco/web/ui/repo/component/UISpaceSelector.java +++ b/source/java/org/alfresco/web/ui/repo/component/UISpaceSelector.java @@ -70,7 +70,7 @@ public class UISpaceSelector extends AbstractItemSelector { try { - ChildAssociationRef parentRef = getNodeService(context).getPrimaryParent( + ChildAssociationRef parentRef = getFastNodeService(context).getPrimaryParent( new NodeRef(Repository.getStoreRef(), this.navigationId)); id = parentRef.getParentRef().getId(); } @@ -89,7 +89,7 @@ public class UISpaceSelector extends AbstractItemSelector List allKids = getNodeService(context).getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); DictionaryService dd = getDictionaryService(context); - NodeService service = getNodeService(context); + NodeService service = getFastNodeService(context); // filter out those children that are not spaces List spaceKids = new ArrayList(); @@ -126,7 +126,7 @@ public class UISpaceSelector extends AbstractItemSelector public String getItemIcon(FacesContext context, NodeRef ref) { - String icon = (String)getNodeService(context).getProperty(ref, ApplicationModel.PROP_ICON); + String icon = (String)getFastNodeService(context).getProperty(ref, ApplicationModel.PROP_ICON); if (icon != null) { icon = "/images/icons/" + icon + "-16.gif"; diff --git a/source/java/org/alfresco/web/ui/repo/component/UIWebProjectFolderSelector.java b/source/java/org/alfresco/web/ui/repo/component/UIWebProjectFolderSelector.java index 40e12dcdd9..a0c04e02a4 100644 --- a/source/java/org/alfresco/web/ui/repo/component/UIWebProjectFolderSelector.java +++ b/source/java/org/alfresco/web/ui/repo/component/UIWebProjectFolderSelector.java @@ -142,10 +142,10 @@ public class UIWebProjectFolderSelector extends AbstractItemSelector public Collection getRootChildren(FacesContext context) { - // query for all nodes under the "Web Projects" foler in company home. + // query for all nodes under the "Web Projects" folder in company home. FacesContext fc = FacesContext.getCurrentInstance(); String xpath = Application.getRootPath(fc) + "/" + Application.getWebsitesFolderName(fc) + "/*"; - NodeRef rootNodeRef = getNodeService(fc).getRootNode(Repository.getStoreRef()); + NodeRef rootNodeRef = getFastNodeService(fc).getRootNode(Repository.getStoreRef()); NamespaceService resolver = Repository.getServiceRegistry(fc).getNamespaceService(); SearchService searchService = Repository.getServiceRegistry(fc).getSearchService(); List nodes = searchService.selectNodes(rootNodeRef, xpath, null, resolver, false); @@ -179,7 +179,7 @@ public class UIWebProjectFolderSelector extends AbstractItemSelector public String getItemIcon(FacesContext context, NodeRef ref) { - String icon = (String)getNodeService(context).getProperty(ref, ApplicationModel.PROP_ICON); + String icon = (String)getFastNodeService(context).getProperty(ref, ApplicationModel.PROP_ICON); if (icon != null) { icon = "/images/icons/" + icon + "-16.gif"; diff --git a/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java b/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java index 1e0ffb77a3..f14b184357 100644 --- a/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java +++ b/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java @@ -409,11 +409,10 @@ public class UIUserSandboxes extends SelfRenderingComponent out.write("  "); // Submit All Items - // NOTE: removed for 2.0 final - /*Utils.encodeRecursive(context, aquireAction( + Utils.encodeRecursive(context, aquireAction( context, mainStore, username, ACT_SANDBOX_SUBMITALL, "/images/icons/submit_all.gif", "#{AVMBrowseBean.setupAllItemsAction}", "dialog:submitSandboxItems")); - out.write("  ");*/ + out.write("  "); // Revert All Items Utils.encodeRecursive(context, aquireAction(