From babaa0b65c96088fcf20795712b129619dd1a08b Mon Sep 17 00:00:00 2001 From: Dave Ward Date: Mon, 26 Sep 2011 18:24:09 +0000 Subject: [PATCH] Merged V3.4-BUG-FIX to HEAD 30270: ALF-9492 Can now update task properties through the Workflow JavaScript API. ALF-10087 Fixed failing Multi-tenancy tests. 30306: Fixed ALF-7384: Xam: XamArchiveCleaner can delete files before retention period has passed - Keep the NOW upper limit to the query - Add a double-check using Java code to precisely check (down to the ms) that the retention time has passed 30308: Merged V3.4 to V3.4-BUG-FIX 30307: ALF-10186: Fix up all code that expects it can cast a WebScriptRequest directly into a WebScriptServletRequest 30310: ALF-5830 show_audit.ftl template doesn't work any more - Changes to support new audit api - Works with high level content auditing 30337: Merge DEV to V3.4-BUG-FIX 30160 : ALF-9257 - Renaming web project cause no trigger of the autodeploy process 30362: ALF-10227 Add space after ''{0}'' in text 30395: Removed deep svn:mergeinfo 30433: Merged DEV/TEMPORARY to V3.4-BUG-FIX 30424: ALF-8941: WCM: Virtual server setting lazyDeployExperimentalOnly ="true" (as per si3 fix) fails to load library under WEB-INF/lib directory (for HTTP filter). Walk up by hierarchy to the root and deploys a context if it wasn't deployed yet, through invocation of updateAllVirtualWebapps recursively. 30454: Fixed ALF-9158: Assignment of workflow task is not proper - out-of-the-box WCM workflow 30466: Merged DEV/TEMPORARY to V3.4-BUG-FIX 30460: ALF-9424 : Webform(XSD): xf:switch switch group does not work based on "complexContent with Base" element. Schema2XForms and SchemaUtil were modified to allow correctly process elements with namespace that differ from "http://www.w3.org/2001/XMLSchema" 30476: Merged DEV to V3.4-BUG-FIX 30474: ALF-10021: Get the last node in the resultset outside the timing loop to force prefetch. 30483: Fixed ALF-9417: (pdf2swf) Share preview is blank with some pdf files. 30514: ALF-240: Unfriendly error appears when trying to view details for created discussion for multilingual content Webdav URLs were not valid for non-ML or ML discussion items, but were only stopping the details page for the ML items from being shown. Utils.generateURL now returns null for such items. 30517: Fixed ALF-5526: Component-Generator for d:noteref and other "system" types always disabled => breaks extensibility 30519: FileFolderService moveFrom method was not supported by MLTranslationInterceptor 30527: ALF-240: added missing exception message. 30531: Fixed ALF-9599: Share forms do not allow edit of non-cm:content nodes 30541: ALF-9424: Missed change, causing compilation error 30552: Tests to accompany fix for ALF-240, ALF-10298: discussion topic webdav URLs causing error page in explorer. 30565: Fixed ALF-10336 "Drag and Drop item in Customize Site Dashboard - text of item reverts to default font style and size during drag operation" 30568: Fixed ALF-10342: ClassCastException on org.alfresco.repo.copy.AbstractCopyBehaviourCallback 30570: ALF-3332: (circa 2008) Pagination inks rewritten incorrectly by opensearch proxy 30574: ALF-9470: OwnableService cache not being updated for archived nodes - modified fix by Pavel 30579: ALF-5607: Cancelling of install. Some directories are not deleted from disk. - Fixed provided by Bitrock for Mac and Windows 30583: Merged HEAD to V3.4-BUG-FIX (Back ported 2 fixes for included resource handling when running unit tests) 28711: Avoid a NPE on certain kinds missing included resources, and instead give a helpful error along the lines of other include issues 28716: When loading JS includes with a full classpath reference, handle the Eclipse classloader behaving slightly differently on absolute paths compared to the JVM one 30648: Fixed ALF-10401: No simple way to disable auto-versioning behaviour - Added property: version.store.enableAutoVersioning=true - When set to 'false', the VersionableAspect will not respond to any events; even if the aspect is present, it will not create versions. 30657: Merged DEV/TEMPORARY to V3.4-BUG-FIX 30590: ALF-7105: pdfbox returns errors in the logs but one cannot understand what file is affected (PDFBox) Level log4j.logger.org.apache.pdfbox.pdmodel.font.PDCIDFont=fatal was introduced in log4j.properties. 30669: Fixes: ALF-6470 (Updates FR translation) 30686: ALF-1017: Fixed compilation error in backport 30696: Fix for ALF-8176 30708: ALF-10040: Added missing ReferenceCountingReadOnlyIndexReaderFactory wrapper to IndexInfo.getMainIndexReferenceCountingReadOnlyIndexReader() to make it consistent with IndexInfo.getMainIndexReferenceCountingReadOnlyIndexReader(String, Set, boolean) and allow SingleFieldSelectors to make it through from LeafScorer to the path caches! Affects ALL Lucene queries that run OUTSIDE of a transaction. 30722: Fixed ALF-9465: Share: We can add category in Share, but the selected value will not be shown in U.I. 30724: Merged BRANCHES/DEV/BELARUS/V3.4-BUG-FIX-2011_09_05 to BRANCHES/DEV/V3.4-BUG-FIX: 30603: ALF-10165: Unexpected behaviour when title duplicated between web forms 30754: Fix for ALF-9899 Huge share site migration, add group to site and user access site related performance issue. - generic performance improvements for PATH queries ending "..../*" - specifically to improve listing calendar items for users in many share sites 30765: Fix for ALF-760 - import loses category association data 30779: Merged V3.4 to V3.4-BUG-FIX 30716: ALF-10452 It's impossible to edit existing user details - Change for ALF-371 did not handle the simplest case - no change of home folder location 30549: Fixes ALF-9534 - Location API git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@30780 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../generator/BaseComponentGenerator.java | 18 +++ .../bean/generator/IComponentGenerator.java | 11 ++ .../web/bean/users/CreateUserWizard.java | 16 ++- .../web/bean/users/EditUserWizard.java | 8 +- .../web/bean/wcm/CreateWebsiteWizard.java | 5 +- .../alfresco/web/bean/wcm/DeploymentUtil.java | 108 ------------------ .../web/bean/wcm/FormWorkflowDialog.java | 5 + .../web/bean/wcm/ManageReviewTaskDialog.java | 17 ++- .../web/forms/xforms/Schema2XForms.java | 30 ++++- .../alfresco/web/forms/xforms/SchemaUtil.java | 63 ++++++---- .../org/alfresco/web/ui/common/Utils.java | 18 ++- .../repo/component/property/UIProperty.java | 4 +- .../web/ui/wcm/component/UIDeployWebsite.java | 4 +- .../ui/wcm/component/UISandboxSnapshots.java | 2 +- .../web/ui/wcm/component/UIUserSandboxes.java | 12 +- .../jsp/wcm/create-website-wizard/forms.jsp | 4 +- 16 files changed, 173 insertions(+), 152 deletions(-) diff --git a/source/java/org/alfresco/web/bean/generator/BaseComponentGenerator.java b/source/java/org/alfresco/web/bean/generator/BaseComponentGenerator.java index 989df2df83..e63a1f0b12 100644 --- a/source/java/org/alfresco/web/bean/generator/BaseComponentGenerator.java +++ b/source/java/org/alfresco/web/bean/generator/BaseComponentGenerator.java @@ -41,6 +41,7 @@ import org.alfresco.service.cmr.dictionary.Constraint; import org.alfresco.service.cmr.dictionary.ConstraintDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.PropertyDefinition; +import org.alfresco.service.namespace.QName; import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.FacesHelper; import org.alfresco.web.bean.repository.DataDictionary; @@ -752,4 +753,21 @@ public abstract class BaseComponentGenerator implements IComponentGenerator return this.dataDictionary; } + + public boolean isEnabledInEditMode (FacesContext context, UIComponent control, PropertyDefinition propDef) + { + // get type info for the property + DataTypeDefinition dataTypeDef = propDef.getDataType(); + QName typeName = dataTypeDef.getName(); + if (typeName.equals(DataTypeDefinition.NODE_REF) || typeName.equals(DataTypeDefinition.PATH) || + typeName.equals(DataTypeDefinition.CONTENT) || typeName.equals(DataTypeDefinition.QNAME) || + typeName.equals(DataTypeDefinition.CHILD_ASSOC_REF) || typeName.equals(DataTypeDefinition.ASSOC_REF)) + { + return false; + } + else + { + return true; + } + } } diff --git a/source/java/org/alfresco/web/bean/generator/IComponentGenerator.java b/source/java/org/alfresco/web/bean/generator/IComponentGenerator.java index f4bad1cf60..85fdf1fc3f 100644 --- a/source/java/org/alfresco/web/bean/generator/IComponentGenerator.java +++ b/source/java/org/alfresco/web/bean/generator/IComponentGenerator.java @@ -21,6 +21,7 @@ package org.alfresco.web.bean.generator; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; +import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.web.ui.repo.component.property.PropertySheetItem; import org.alfresco.web.ui.repo.component.property.UIPropertySheet; @@ -54,4 +55,14 @@ public interface IComponentGenerator */ UIComponent generateAndAdd(FacesContext context, UIPropertySheet propertySheet, PropertySheetItem item); + + /** + * Determines whether the component will be enabled when rendered. + * + * @param context FacesContext + * @param control The control being rendered + * @param propDef The definition of the property + * @return true if the component should be enabled + */ + boolean isEnabledInEditMode (FacesContext context, UIComponent control, PropertyDefinition propDef); } diff --git a/source/java/org/alfresco/web/bean/users/CreateUserWizard.java b/source/java/org/alfresco/web/bean/users/CreateUserWizard.java index edfe58cca5..cfd30ad20c 100644 --- a/source/java/org/alfresco/web/bean/users/CreateUserWizard.java +++ b/source/java/org/alfresco/web/bean/users/CreateUserWizard.java @@ -683,21 +683,27 @@ public class CreateUserWizard extends BaseWizardBean * * @param locationId Parent location * @param spaceName Home space to create, can be null to simply return the parent + * @param oldHomeFolderRef the previous home space, for the case where the the user is being updated. + * It may not have changed. * @param error True to throw an error if the space already exists, else ignore and return * @return ID of the home space */ - protected NodeRef createHomeSpace(String locationId, String spaceName, boolean error) + protected NodeRef createHomeSpace(String locationId, String spaceName, NodeRef oldHomeFolderRef, boolean error) { NodeRef homeSpaceNodeRef = null; if (spaceName != null && spaceName.length() != 0) { NodeRef parentRef = new NodeRef(Repository.getStoreRef(), locationId); - // check for existance of home space with same name - return immediately + // check for existence of home space with same name - return immediately // if it exists or throw an exception an give user chance to enter another name NodeRef childRef = this.getNodeService().getChildByName(parentRef, ContentModel.ASSOC_CONTAINS, spaceName); if (childRef != null) { + if (childRef.equals(oldHomeFolderRef)) + { + return oldHomeFolderRef; + } if (error) { throw new AlfrescoRuntimeException("A Home Space with the same name already exists."); @@ -799,7 +805,7 @@ public class CreateUserWizard extends BaseWizardBean { // create properties for Person type from submitted Form data Map props = new HashMap(7, 1.0f); - setPersonPropertiesAndCreateHomeSpaceIfNeeded(props, context); + setPersonPropertiesAndCreateHomeSpaceIfNeeded(props, null, context); // create the node to represent the Person getPersonService().createPerson(props); @@ -846,7 +852,7 @@ public class CreateUserWizard extends BaseWizardBean } protected void setPersonPropertiesAndCreateHomeSpaceIfNeeded( - Map props, FacesContext context) + Map props, NodeRef oldHomeFolderRef, FacesContext context) { props.put(ContentModel.PROP_USERNAME, this.userName); props.put(ContentModel.PROP_FIRSTNAME, this.firstName); @@ -856,7 +862,7 @@ public class CreateUserWizard extends BaseWizardBean { // create new props.put(ContentModel.PROP_HOME_FOLDER_PROVIDER, "userHomesHomeFolderProvider"); - homeSpaceNodeRef = createHomeSpace(this.homeSpaceLocation.getId(), this.homeSpaceName, true); + homeSpaceNodeRef = createHomeSpace(this.homeSpaceLocation.getId(), this.homeSpaceName, oldHomeFolderRef, true); } else if (this.homeSpaceLocation != null) { diff --git a/source/java/org/alfresco/web/bean/users/EditUserWizard.java b/source/java/org/alfresco/web/bean/users/EditUserWizard.java index 603041526f..bb650b139e 100644 --- a/source/java/org/alfresco/web/bean/users/EditUserWizard.java +++ b/source/java/org/alfresco/web/bean/users/EditUserWizard.java @@ -24,6 +24,7 @@ import java.util.Map; import javax.faces.context.FacesContext; +import org.alfresco.model.ContentModel; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; @@ -124,7 +125,12 @@ public class EditUserWizard extends CreateUserWizard // creation in CreateUserWizard. It is always possible to move the contents // of the old home folder by hand later. Map props = this.getNodeService().getProperties(nodeRef); - setPersonPropertiesAndCreateHomeSpaceIfNeeded(props, context); + NodeRef oldHomeFolderRef = (NodeRef) this.getNodeService().getProperty(nodeRef, ContentModel.PROP_HOMEFOLDER); + if (oldHomeFolderRef != null && getNodeService().exists(oldHomeFolderRef) == false) + { + oldHomeFolderRef = null; + } + setPersonPropertiesAndCreateHomeSpaceIfNeeded(props, oldHomeFolderRef, context); // update the node that represents the Person this.getNodeService().setProperties(nodeRef, props); diff --git a/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java b/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java index 2b64ad7d66..54c65ac966 100644 --- a/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java @@ -1246,13 +1246,14 @@ public class CreateWebsiteWizard extends BaseWizardBean { UIListItem item = new UIListItem(); item.setValue(form); - item.setLabel(form.getTitle()); + String forItemName = new StringBuilder().append(form.getTitle()).append(" (").append(form.getName()).append(")").toString(); + item.setLabel(forItemName); item.setDescription(form.getDescription()); item.setImage(WebResources.IMAGE_WEBFORM_32); boolean skip = false; for (FormWrapper formWrapper : this.forms) { - if (formWrapper.getTitle().equals(form.getTitle())) + if (formWrapper.getName().equals(form.getName())) { skip = true; break; diff --git a/source/java/org/alfresco/web/bean/wcm/DeploymentUtil.java b/source/java/org/alfresco/web/bean/wcm/DeploymentUtil.java index d5139aedc3..8fcf8345ea 100644 --- a/source/java/org/alfresco/web/bean/wcm/DeploymentUtil.java +++ b/source/java/org/alfresco/web/bean/wcm/DeploymentUtil.java @@ -28,13 +28,10 @@ import javax.faces.context.FacesContext; import org.alfresco.model.WCMAppModel; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.namespace.NamespaceService; -import org.alfresco.service.namespace.NamespacePrefixResolver; import org.alfresco.web.bean.repository.Repository; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -246,7 +243,6 @@ public final class DeploymentUtil query.append("\""); ResultSet results = null; - NodeRef testServer = null; try { // execute the query @@ -272,110 +268,6 @@ public final class DeploymentUtil return serverList; } - /** - * Returns a list of NodeRefs representing the 'live' servers configured - * for the given web project. - * - * @param webProject Web project to get live servers for - * @return List of live servers - */ - public static List findLiveServers(NodeRef webProject) - { - return findServers(webProject, true, false); - } - - /** - * Returns a list of NodeRefs representing the 'test' servers configured - * for the given web project. - * - * @param webProject Web project to get test servers for - * @param availableOnly if true only returns those servers still available for deployment - * @return List of test servers - */ - public static List findTestServers(NodeRef webProject, boolean availableOnly) - { - return findServers(webProject, false, availableOnly); - } - - - /** - * Returns a list of NodeRefs representing the deployment servers configured - * for the given web project. - * - * @param webProject Web project to get test servers for - * @param live - * @param availableOnly if true only returns those servers still available for deployment - * @return List of test servers - */ - private static List findServers(NodeRef webProject, boolean live, boolean availableOnly) - { - FacesContext context = FacesContext.getCurrentInstance(); - NodeService nodeService = Repository.getServiceRegistry(context).getNodeService(); - SearchService searchService = Repository.getServiceRegistry(context).getSearchService(); - - NamespacePrefixResolver namespacePrefixResolver = Repository.getServiceRegistry(context).getNamespaceService(); - - Path projectPath = nodeService.getPath(webProject); - - String stringPath = projectPath.toPrefixString(namespacePrefixResolver); - - StringBuilder query = new StringBuilder("PATH:\""); - - query.append(stringPath); - query.append("/*\" "); - query.append(" AND @"); - query.append(NamespaceService.WCMAPP_MODEL_PREFIX); - query.append("\\:"); - query.append(WCMAppModel.PROP_DEPLOYSERVERTYPE.getLocalName()); - query.append(":\""); - if (live) - { - query.append(WCMAppModel.CONSTRAINT_LIVESERVER); - } - else - { - query.append(WCMAppModel.CONSTRAINT_TESTSERVER); - } - query.append("\""); - - // if required filter the test servers - if (live == false && availableOnly) - { - query.append(" AND ISNULL:\""); - query.append(WCMAppModel.PROP_DEPLOYSERVERALLOCATEDTO.toString()); - query.append("\""); - } - - if (logger.isDebugEnabled()) - logger.debug("Finding deployment servers using query: " + query.toString()); - - // execute the query - ResultSet results = null; - List servers = new ArrayList(); - try - { - results = searchService.query(Repository.getStoreRef(), - SearchService.LANGUAGE_LUCENE, query.toString()); - - if (logger.isDebugEnabled()) - logger.debug("Found " + results.length() + " deployment servers"); - - for (NodeRef server : results.getNodeRefs()) - { - servers.add(server); - } - } - finally - { - if (results != null) - { - results.close(); - } - } - - return servers; - } - private static String formatLuceneQueryDate(Date date, boolean range) { Calendar cal = new GregorianCalendar(); diff --git a/source/java/org/alfresco/web/bean/wcm/FormWorkflowDialog.java b/source/java/org/alfresco/web/bean/wcm/FormWorkflowDialog.java index d17362fa13..b1b009b0a8 100644 --- a/source/java/org/alfresco/web/bean/wcm/FormWorkflowDialog.java +++ b/source/java/org/alfresco/web/bean/wcm/FormWorkflowDialog.java @@ -28,6 +28,7 @@ import java.util.regex.PatternSyntaxException; import javax.faces.context.FacesContext; import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowService; @@ -182,6 +183,10 @@ public class FormWorkflowDialog extends BaseDialogBean else { List current = (List)params.get(qname); + if (qname.equals(WorkflowModel.ASSOC_ASSIGNEES)) + { + current.clear(); + } current.addAll((List)value); } } diff --git a/source/java/org/alfresco/web/bean/wcm/ManageReviewTaskDialog.java b/source/java/org/alfresco/web/bean/wcm/ManageReviewTaskDialog.java index 8429e51954..35999d1d1e 100644 --- a/source/java/org/alfresco/web/bean/wcm/ManageReviewTaskDialog.java +++ b/source/java/org/alfresco/web/bean/wcm/ManageReviewTaskDialog.java @@ -28,10 +28,13 @@ import javax.transaction.UserTransaction; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.domain.PropertyValue; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.avm.AVMNotFoundException; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.transaction.TransactionService; import org.alfresco.wcm.sandbox.SandboxConstants; import org.alfresco.wcm.util.WCMUtil; import org.alfresco.web.app.Application; @@ -217,7 +220,19 @@ public class ManageReviewTaskDialog extends ManageTaskDialog if (this.webProjectRef != null && getPermissionService().hasPermission(webProjectRef, PermissionService.READ_PROPERTIES).equals(AccessStatus.ALLOWED)) { - List testServers = DeploymentUtil.findTestServers(this.webProjectRef, false); + final ServiceRegistry serviceRegistry = Repository.getServiceRegistry(context); + final NodeRef projectRef = this.webProjectRef; + + TransactionService transactionService = serviceRegistry.getTransactionService(); + RetryingTransactionCallback> findTestServers = new RetryingTransactionCallback>() + { + public List execute() throws Exception + { + return serviceRegistry.getDeploymentService().findTestDeploymentServers(projectRef, false); + } + }; + List testServers = transactionService.getRetryingTransactionHelper().doInTransaction(findTestServers); + if (testServers != null) { result = new Boolean(testServers != null && testServers.size() > 0); diff --git a/source/java/org/alfresco/web/forms/xforms/Schema2XForms.java b/source/java/org/alfresco/web/forms/xforms/Schema2XForms.java index 4ee997dccf..59ca5978d6 100644 --- a/source/java/org/alfresco/web/forms/xforms/Schema2XForms.java +++ b/source/java/org/alfresco/web/forms/xforms/Schema2XForms.java @@ -39,6 +39,7 @@ import java.util.regex.Pattern; import javax.faces.context.FacesContext; import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.util.EqualsHelper; import org.alfresco.util.Pair; import org.alfresco.web.app.Application; import org.alfresco.web.forms.XMLUtil; @@ -1452,8 +1453,10 @@ public class Schema2XForms implements Serializable LOGGER.debug("[addElementWithMultipleCompatibleTypes] Testing sub-bind with nodeset " + name); } - if (!SchemaUtil.isElementDeclaredIn(name, (XSComplexTypeDefinition) type, false) && - !SchemaUtil.isAttributeDeclaredIn(name, (XSComplexTypeDefinition) type, false)) + Pair parsed = parseName(name, xformsDocument); + + if (!SchemaUtil.isElementDeclaredIn(parsed.getFirst(), parsed.getSecond(), (XSComplexTypeDefinition) type, false) && + !SchemaUtil.isAttributeDeclaredIn(parsed.getFirst(), parsed.getSecond(), (XSComplexTypeDefinition) type, false)) { continue; } @@ -1588,7 +1591,10 @@ public class Schema2XForms implements Serializable { Element bind = (Element)binds.item(i); String nodeset = bind.getAttributeNS(NamespaceConstants.XFORMS_NS, "nodeset"); - if (nodeset != null && nodeset.equals(element.getName())) + + Pair parsed = parseName(nodeset, xformsDocument); + + if (nodeset != null && EqualsHelper.nullSafeEquals(parsed.getSecond(), element.getNamespace()) && parsed.getFirst().equals(element.getName())) { bindId = bind.getAttributeNS(null, "id"); } @@ -3329,4 +3335,22 @@ public class Schema2XForms implements Serializable return repeated; } + + /* + * split the name of element in two parts (localname, namespaceURI) + */ + private Pair parseName(String name, Document resolver) + { + int pos = name.indexOf(':'); + String localName = name; + String namespace = null; + + if (pos != -1) + { + localName = name.substring(pos + 1); + namespace = resolver.lookupNamespaceURI(name.substring(0, pos)); + } + + return new Pair(localName, namespace); + } } diff --git a/source/java/org/alfresco/web/forms/xforms/SchemaUtil.java b/source/java/org/alfresco/web/forms/xforms/SchemaUtil.java index 5d5b53f6fb..9d48fcc8a6 100644 --- a/source/java/org/alfresco/web/forms/xforms/SchemaUtil.java +++ b/source/java/org/alfresco/web/forms/xforms/SchemaUtil.java @@ -17,17 +17,40 @@ * along with Alfresco. If not, see . */ package org.alfresco.web.forms.xforms; -import java.util.*; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.TreeMap; +import java.util.TreeSet; + +import org.alfresco.util.EqualsHelper; import org.alfresco.web.forms.XMLUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.xerces.xs.*; +import org.apache.xerces.xs.XSAttributeUse; +import org.apache.xerces.xs.XSComplexTypeDefinition; +import org.apache.xerces.xs.XSConstants; +import org.apache.xerces.xs.XSElementDeclaration; +import org.apache.xerces.xs.XSImplementation; +import org.apache.xerces.xs.XSLoader; +import org.apache.xerces.xs.XSModel; +import org.apache.xerces.xs.XSModelGroup; +import org.apache.xerces.xs.XSNamedMap; +import org.apache.xerces.xs.XSObjectList; +import org.apache.xerces.xs.XSParticle; +import org.apache.xerces.xs.XSSimpleTypeDefinition; +import org.apache.xerces.xs.XSTerm; +import org.apache.xerces.xs.XSTypeDefinition; +import org.w3c.dom.DOMConfiguration; +import org.w3c.dom.DOMError; +import org.w3c.dom.DOMErrorHandler; +import org.w3c.dom.DOMLocator; +import org.w3c.dom.Document; import org.w3c.dom.bootstrap.DOMImplementationRegistry; -import org.w3c.dom.ls.*; -import org.w3c.dom.*; +import org.w3c.dom.ls.DOMImplementationLS; +import org.w3c.dom.ls.LSInput; /** * Provides utility functions for xml schema parsing. @@ -392,12 +415,12 @@ public class SchemaUtil { for (String typeName : result.keySet()) { - TreeSet descendents = result.get(typeName); + TreeSet descendents = result.get(typeName); LOGGER.debug(">>>> for " + typeName + " Descendants=\n "); - Iterator it = descendents.iterator(); + Iterator it = descendents.iterator(); while (it.hasNext()) { - XSTypeDefinition desc = (XSTypeDefinition) it.next(); + XSTypeDefinition desc = it.next(); LOGGER.debug(" " + desc.getName()); } } @@ -488,7 +511,7 @@ public class SchemaUtil /** * check that the element defined by this name is declared directly in the type */ - public static boolean isElementDeclaredIn(String name, + public static boolean isElementDeclaredIn(String name, String namespace, XSComplexTypeDefinition type, boolean recursive) { @@ -503,7 +526,7 @@ public class SchemaUtil XSComplexTypeDefinition parent = (XSComplexTypeDefinition) type.getBaseType(); if (LOGGER.isDebugEnabled()) LOGGER.debug("testing if it is not on parent " + parent.getName()); - if (SchemaUtil.isElementDeclaredIn(name, parent, true)) + if (SchemaUtil.isElementDeclaredIn(name, namespace, parent, true)) return false; } @@ -515,7 +538,7 @@ public class SchemaUtil if (term instanceof XSModelGroup) { XSModelGroup group = (XSModelGroup) term; - found = SchemaUtil.isElementDeclaredIn(name, group); + found = SchemaUtil.isElementDeclaredIn(name, namespace, group); } } @@ -529,7 +552,7 @@ public class SchemaUtil /** * private recursive method called by isElementDeclaredIn(String name, XSComplexTypeDefinition type) */ - public static boolean isElementDeclaredIn(String name, XSModelGroup group) + public static boolean isElementDeclaredIn(String name, String namespace, XSModelGroup group) { if (LOGGER.isDebugEnabled()) LOGGER.debug("isElement " + name + " declared in group " + group.getName()); @@ -543,12 +566,12 @@ public class SchemaUtil if (subTerm instanceof XSElementDeclaration) { XSElementDeclaration elDecl = (XSElementDeclaration) subTerm; - if (name.equals(elDecl.getName())) + if (EqualsHelper.nullSafeEquals(namespace, elDecl.getNamespace()) && name.equals(elDecl.getName())) found = true; } else if (subTerm instanceof XSModelGroup) { - found = SchemaUtil.isElementDeclaredIn(name, (XSModelGroup) subTerm); + found = SchemaUtil.isElementDeclaredIn(name, namespace, (XSModelGroup) subTerm); } } @@ -573,7 +596,7 @@ public class SchemaUtil if (baseType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) { final XSComplexTypeDefinition complexType = (XSComplexTypeDefinition) baseType; - if (SchemaUtil.isElementDeclaredIn(element.getName(), complexType, true)) + if (SchemaUtil.isElementDeclaredIn(element.getName(), element.getNamespace(), complexType, true)) { if (LOGGER.isDebugEnabled()) { @@ -642,7 +665,7 @@ public class SchemaUtil * check that the element defined by this name is declared directly in the type * -> idem with string */ - public static boolean isAttributeDeclaredIn(String attrName, XSComplexTypeDefinition type, boolean recursive) + public static boolean isAttributeDeclaredIn(String attrName, String namespace, XSComplexTypeDefinition type, boolean recursive) { boolean found = false; @@ -658,7 +681,7 @@ public class SchemaUtil XSComplexTypeDefinition parent = (XSComplexTypeDefinition) type.getBaseType(); if (LOGGER.isDebugEnabled()) LOGGER.debug("testing if it is not on parent " + parent.getName()); - if (SchemaUtil.isAttributeDeclaredIn(attrName, parent, true)) + if (SchemaUtil.isAttributeDeclaredIn(attrName, namespace, parent, true)) return false; } @@ -672,7 +695,7 @@ public class SchemaUtil String name = anAttr.getName(); if (name == null || name.length() == 0) name = anAttr.getAttrDeclaration().getName(); - if (attrName.equals(name)) + if (EqualsHelper.nullSafeEquals(namespace, anAttr.getAttrDeclaration().getNamespace()) && attrName.equals(name)) found = true; } } diff --git a/source/java/org/alfresco/web/ui/common/Utils.java b/source/java/org/alfresco/web/ui/common/Utils.java index 6c8f74368e..ba8aeb0b75 100644 --- a/source/java/org/alfresco/web/ui/common/Utils.java +++ b/source/java/org/alfresco/web/ui/common/Utils.java @@ -50,6 +50,7 @@ import org.alfresco.jlan.server.filesys.DiskSharedDevice; import org.alfresco.jlan.server.filesys.FilesystemsConfigSection; import org.alfresco.model.ApplicationModel; import org.alfresco.model.ContentModel; +import org.alfresco.repo.model.filefolder.FileFolderServiceImpl.InvalidTypeException; import org.alfresco.repo.search.impl.lucene.AbstractLuceneQueryParser; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.webdav.WebDAVHelper; @@ -336,7 +337,8 @@ public final class Utils extends StringUtils public enum URLMode {HTTP_DOWNLOAD, HTTP_INLINE, WEBDAV, CIFS, SHOW_DETAILS, BROWSE, FTP} /** - * Generates a URL for the given usage for the given node. + * Generates a URL for the given usage for the given node. If the URL cannot be generated + * then null is returned. * * The supported values for the usage parameter are of URLMode enum type * @see URLMode @@ -381,6 +383,10 @@ public final class Utils extends StringUtils { // cannot build path if file no longer exists } + catch (InvalidTypeException e) + { + // primary path does not translate to a file/folder path. + } break; } @@ -437,7 +443,15 @@ public final class Utils extends StringUtils } // There is no such node on this SharedDevice, continue continue; - } + } + catch (InvalidTypeException e) + { + if (logger.isDebugEnabled()) + { + logger.debug(" Node " + node.getName() + " HAS NOT been found on " + contentContext.getDeviceName()); + } + // primary path does not translate to a file/folder path. + } } } diff --git a/source/java/org/alfresco/web/ui/repo/component/property/UIProperty.java b/source/java/org/alfresco/web/ui/repo/component/property/UIProperty.java index 327e6b2766..1e26a119a2 100644 --- a/source/java/org/alfresco/web/ui/repo/component/property/UIProperty.java +++ b/source/java/org/alfresco/web/ui/repo/component/property/UIProperty.java @@ -184,9 +184,7 @@ public class UIProperty extends PropertySheetItem { // if we are trying to edit a system property type set it to read-only as these are internal // properties that shouldn't be edited. - if (typeName.equals(DataTypeDefinition.NODE_REF) || typeName.equals(DataTypeDefinition.PATH) || - typeName.equals(DataTypeDefinition.CONTENT) || typeName.equals(DataTypeDefinition.QNAME) || - typeName.equals(DataTypeDefinition.CHILD_ASSOC_REF) || typeName.equals(DataTypeDefinition.ASSOC_REF)) + if (!FacesHelper.getComponentGenerator(context, componentGeneratorName).isEnabledInEditMode(context, control, propDef)) { logger.warn("Setting property " + propDef.getName().toString() + " to read-only as it can not be edited"); control.getAttributes().put("disabled", Boolean.TRUE); diff --git a/source/java/org/alfresco/web/ui/wcm/component/UIDeployWebsite.java b/source/java/org/alfresco/web/ui/wcm/component/UIDeployWebsite.java index 385015c898..98dfd4bde8 100644 --- a/source/java/org/alfresco/web/ui/wcm/component/UIDeployWebsite.java +++ b/source/java/org/alfresco/web/ui/wcm/component/UIDeployWebsite.java @@ -250,7 +250,7 @@ public class UIDeployWebsite extends UIInput else { // a test server(s) needs to be selected - display the list of test servers - List refs = DeploymentUtil.findTestServers(webProject, true); + List refs = Repository.getServiceRegistry(context).getDeploymentService().findTestDeploymentServers(webProject, true); // Resolve the unsorted list of NodeRef to a sorted list of DeploymentServerConfig. List servers = toSortedDeploymentServerConfig(nodeService, refs); @@ -317,7 +317,7 @@ public class UIDeployWebsite extends UIInput // TODO: get a list of the servers that have been successfully deployed to - List refs = DeploymentUtil.findLiveServers(webProject); + List refs = Repository.getServiceRegistry(context).getDeploymentService().findLiveDeploymentServers(webProject); // Resolve the unsorted list of NodeRef to a sorted list of DeploymentServerConfig. List servers = toSortedDeploymentServerConfig(nodeService, refs); diff --git a/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java b/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java index a4fa11dafc..2363982486 100644 --- a/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java +++ b/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java @@ -230,7 +230,7 @@ public class UISandboxSnapshots extends SelfRenderingComponent // determine whether the deploy action should be shown boolean showDeployAction = false; NodeRef webProjectRef = Repository.getServiceRegistry(context).getWebProjectService().getWebProjectNodeFromStore(WCMUtil.getWebProjectStoreId(sandbox)); - List deployToServers = DeploymentUtil.findLiveServers(webProjectRef); + List deployToServers = Repository.getServiceRegistry(context).getDeploymentService().findLiveDeploymentServers(webProjectRef); if (deployToServers != null && deployToServers.size() > 0) { showDeployAction = true; 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 0195fc4443..21ff4f548a 100644 --- a/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java +++ b/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java @@ -135,6 +135,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa private static final String MSG_CREATED = "created_date"; private static final String MSG_USERNAME = "sandbox_user"; private static final String MSG_NAME = "name"; + private static final String MSG_TITLE = "title"; private static final String MSG_DESCRIPTION = "description"; private static final String MSG_MODIFIED = "modified_date"; private static final String MSG_ACTIONS = "actions"; @@ -362,7 +363,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa // determine whether the deploy action should be shown boolean deployServersConfigured = false; - List deployToServers = DeploymentUtil.findTestServers(websiteRef, false); + List deployToServers = Repository.getServiceRegistry(context).getDeploymentService().findTestDeploymentServers(websiteRef, false); if (deployToServers != null && deployToServers.size() > 0) { deployServersConfigured = true; @@ -1021,6 +1022,8 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa out.write(""); out.write(bundle.getString(MSG_NAME)); out.write(""); + out.write(bundle.getString(MSG_TITLE)); + out.write(""); out.write(bundle.getString(MSG_DESCRIPTION)); out.write(""); out.write(bundle.getString(MSG_ACTIONS)); @@ -1029,10 +1032,13 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa for (Form f : this.forms) { out.write(""); - String title = (String)f.getTitle(); + String name = f.getName(); + out.write(name != null ? Utils.encode(name) : ""); + out.write(""); + String title= f.getTitle(); out.write(title != null ? Utils.encode(title) : ""); out.write(""); - String desc = (String)f.getDescription(); + String desc = f.getDescription(); out.write(desc != null ? Utils.encode(desc) : ""); out.write(""); diff --git a/source/web/jsp/wcm/create-website-wizard/forms.jsp b/source/web/jsp/wcm/create-website-wizard/forms.jsp index 63ff34d8c1..e68fb4d34b 100644 --- a/source/web/jsp/wcm/create-website-wizard/forms.jsp +++ b/source/web/jsp/wcm/create-website-wizard/forms.jsp @@ -53,7 +53,9 @@ - + + +