From 09c1c23776b1e15959af7f5d3f7622797d32b98f Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Mon, 6 Oct 2008 11:22:26 +0000 Subject: [PATCH] Merged V2.2 to HEAD 10982: Merged V2.1 to V2.2 10273: Fix for ETWOONE-317: Error from regenerate renditions wizard when templates are updated 10985: Merged V2.1 to V2.2 10717: Fix for ETWOONE-14: System Error message appears while clicking 'Manage Task' icon in ... 10742: Fix for ETWOONE-119: A user created with space characters at the begin and at the end can't login 10758: Fix for ETWOONE-183: URL addressability of forum spaces and topics 10760: Fix for ETWOONE-339: URL Addressability to discussions causes display issue 10761: Fix for ETWOONE-196: Attempt to post to the same forum by two or more users simultaneously leads to error appearance and impossibility to post for some of them 10772: Fix for ETWOONE-225: Validation.js does not properly handle trailing whitespace 10986: Added Hibernate src to Eclipse project 11004: Remove annoying exceptions on shutdown 11005: Minor javadoc fix 11012: Fixed ETWOTWO-423: Optionally inject the Open Office document converter instance to the transformer git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@11202 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/messages/webclient.properties | 1 + .../alfresco/web/bean/forums/ForumsBean.java | 14 ++ .../alfresco/web/bean/wcm/EditFormWizard.java | 159 +++++++++++++++++- .../org/alfresco/web/bean/wcm/WebProject.java | 6 +- .../web/bean/wizard/NewUserWizard.java | 5 + .../web/forms/FormInstanceDataImpl.java | 18 +- .../forms/RenderingEngineTemplateImpl.java | 6 + .../ui/repo/component/UIWorkflowSummary.java | 20 ++- source/web/scripts/validation.js | 102 ++++++++++- 9 files changed, 317 insertions(+), 14 deletions(-) diff --git a/config/alfresco/messages/webclient.properties b/config/alfresco/messages/webclient.properties index 15f0d25b8e..ff05789701 100644 --- a/config/alfresco/messages/webclient.properties +++ b/config/alfresco/messages/webclient.properties @@ -304,6 +304,7 @@ edit_doc_online=Edit online upload_new_version=Upload new version checkin_this_file=Check in this file cannot_delete_node_has_working_copy=Cannot delete file \"{0}\" as it has an associated working copy. +unknown=Unknown # Properties username=User Name diff --git a/source/java/org/alfresco/web/bean/forums/ForumsBean.java b/source/java/org/alfresco/web/bean/forums/ForumsBean.java index 26da9b2e78..f54b62b3c8 100644 --- a/source/java/org/alfresco/web/bean/forums/ForumsBean.java +++ b/source/java/org/alfresco/web/bean/forums/ForumsBean.java @@ -35,6 +35,7 @@ import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.UUID; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; @@ -280,6 +281,9 @@ public class ForumsBean implements IContextListener this.viewsConfig.getDefaultSortColumn(PAGE_NAME_FORUMS)); this.forumsRichList.setInitialSortDescending( this.viewsConfig.hasDescendingSort(PAGE_NAME_FORUMS)); + + // ETWOONE-183 & ETWOONE-339. For URL addressability of forums spaces + this.forumsRichList.setRefreshOnBind(true); } } @@ -337,6 +341,9 @@ public class ForumsBean implements IContextListener this.viewsConfig.getDefaultSortColumn(PAGE_NAME_TOPIC)); this.topicRichList.setInitialSortDescending( this.viewsConfig.hasDescendingSort(PAGE_NAME_TOPIC)); + + // ETWOONE-183. For URL addressability of topics: + this.topicRichList.setRefreshOnBind(true); } } @@ -394,6 +401,9 @@ public class ForumsBean implements IContextListener this.viewsConfig.getDefaultSortColumn(PAGE_NAME_FORUM)); this.forumRichList.setInitialSortDescending( this.viewsConfig.hasDescendingSort(PAGE_NAME_FORUM)); + + // ETWOONE-183 & ETWOONE-339. For URL addressability of forum spaces + this.forumRichList.setRefreshOnBind(true); } } @@ -928,6 +938,10 @@ public class ForumsBean implements IContextListener SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss"); name.append(dateFormat.format(new Date())); + // add Universal Unique Identifier + // fix bugs ETWOONE-196 and ETWOONE-203 + name.append("-" + UUID.randomUUID()); + // add the HTML file extension name.append(".html"); diff --git a/source/java/org/alfresco/web/bean/wcm/EditFormWizard.java b/source/java/org/alfresco/web/bean/wcm/EditFormWizard.java index fc2e788e55..3521da094d 100644 --- a/source/java/org/alfresco/web/bean/wcm/EditFormWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/EditFormWizard.java @@ -39,9 +39,13 @@ import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.search.ResultSet; +import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; +import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.forms.Form; import org.alfresco.web.forms.RenderingEngineTemplate; import org.alfresco.web.forms.xforms.SchemaUtil; @@ -53,6 +57,11 @@ import org.apache.commons.logging.LogFactory; * Backing bean for the Edit Form wizard. * * @author Ariel Backenroth + * @author Arseny Kovalchuk (Bug Fixer) + * + * Methods removeRenderingEngineTemplateFromWebProjects, addRenderingEngineTemplateToWebProjects, searchRenderingEngineTemplateInWebProject + * are added to fix an issue reported in https://issues.alfresco.com/jira/browse/ETWOONE-317 + * */ public class EditFormWizard extends CreateFormWizard @@ -91,8 +100,10 @@ public class EditFormWizard this.getNodeService().getProperty(formNodeRef, WCMAppModel.PROP_XML_SCHEMA); if (schemaNodeRef == null) { - LOGGER.debug(WCMAppModel.PROP_XML_SCHEMA + " not set on " + formNodeRef + - ", checking " + WCMAppModel.PROP_XML_SCHEMA_OLD); + if (LOGGER.isDebugEnabled()) + LOGGER.debug(WCMAppModel.PROP_XML_SCHEMA + " not set on " + formNodeRef + + ", checking " + WCMAppModel.PROP_XML_SCHEMA_OLD); + schemaNodeRef = (NodeRef) getNodeService().getProperty(formNodeRef, WCMAppModel.PROP_XML_SCHEMA_OLD); if (schemaNodeRef != null) @@ -175,8 +186,10 @@ public class EditFormWizard if (wd != null && workflowRefs.size() == 0) { - LOGGER.debug("adding workflow definition " + wd.getName() + - " to form " + this.getFormName()); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("adding workflow definition " + wd.getName() + + " to form " + this.getFormName()); + final Map props = new HashMap(1, 1.0f); props.put(WCMAppModel.PROP_WORKFLOW_NAME, wd.getName()); this.getNodeService().createNode(formNodeRef, @@ -187,15 +200,19 @@ public class EditFormWizard } else if (wd != null && workflowRefs.size() == 1) { - LOGGER.debug("setting workflow definition " + wd.getName() + - " to form " + this.getFormName()); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("setting workflow definition " + wd.getName() + + " to form " + this.getFormName()); + this.getNodeService().setProperty(workflowRefs.get(0).getChildRef(), WCMAppModel.PROP_WORKFLOW_NAME, wd.getName()); } else if (wd == null && workflowRefs.size() == 1) { - LOGGER.debug("removing workflow definitions from form " + this.getFormName()); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("removing workflow definitions from form " + this.getFormName()); + this.getNodeService().removeChild(formNodeRef, workflowRefs.get(0).getChildRef()); } @@ -222,24 +239,148 @@ public class EditFormWizard { for (final RenderingEngineTemplateData retd : this.removedRenderingEngineTemplates) { - LOGGER.debug("removing rendering engine template " + retd); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("removing rendering engine template " + retd); + assert retd != null; assert retd.getNodeRef() != null; this.getNodeService().removeChild(formNodeRef, retd.getNodeRef()); + this.removeRenderingEngineTemplateFromWebProjects(formNodeRef, retd); + } } - for (final RenderingEngineTemplateData retd : this.renderingEngineTemplates) { if (retd.getFile() != null) { this.saveRenderingEngineTemplate(retd, formNodeRef); + this.addRenderingEngineTemplateToWebProjects(formNodeRef, retd); } } return outcome; } + + /** + * Removes an associated Rendering Engine Template from all web forms in all web projects. + * + * @param formNodeRef Form nodeRef + * @param retd Rendering engine template to remove from web projects + */ + private void removeRenderingEngineTemplateFromWebProjects(NodeRef formNodeRef, RenderingEngineTemplateData retd) + { + List webProjects = getFormsService().getAssociatedWebProjects(getFormsService().getForm(formNodeRef)); + for (WebProject wp: webProjects) + { + ResultSet results = searchRenderingEngineTemplateInWebProject(wp, retd.getName()); + for (int i=0; i webProjects = getFormsService().getAssociatedWebProjects(form); + Map props = new HashMap(4, 1.0f); + for (WebProject wp: webProjects) + { + ResultSet results = searchRenderingEngineTemplateInWebProject(wp, retd.getName()); + int resultsCount = results.length(); + if (resultsCount>0) + { + //update + for (int i=0; i>>Web Project: " + wp); + LOGGER.debug(">>>StoreRef: " + storeRef); + LOGGER.debug(">>>Search query: " + query.toString()); + LOGGER.debug(">>>Search results: " + result.length()); + } + return result; + } + +/** * Action handler called when the Remove button is pressed to remove a * rendering engine */ diff --git a/source/java/org/alfresco/web/bean/wcm/WebProject.java b/source/java/org/alfresco/web/bean/wcm/WebProject.java index f1a1975560..946911d95e 100644 --- a/source/java/org/alfresco/web/bean/wcm/WebProject.java +++ b/source/java/org/alfresco/web/bean/wcm/WebProject.java @@ -161,7 +161,10 @@ public class WebProject implements Serializable nodeService.getProperty(car.getChildRef(), WCMAppModel.PROP_OUTPUT_PATH_PATTERN); final RenderingEngineTemplateImpl ret = (RenderingEngineTemplateImpl) allRets.get(renderingEngineTemplateName); - result.put(ret.getName(), + if (ret != null) + { + + result.put(ret.getName(), new RenderingEngineTemplateImpl(ret.getNodeRef(), ret.getRenditionPropertiesNodeRef(), this.getFormsService()) @@ -174,6 +177,7 @@ public class WebProject implements Serializable return outputPathPattern; } }); + } } return result; diff --git a/source/java/org/alfresco/web/bean/wizard/NewUserWizard.java b/source/java/org/alfresco/web/bean/wizard/NewUserWizard.java index 0271599741..91553e8884 100644 --- a/source/java/org/alfresco/web/bean/wizard/NewUserWizard.java +++ b/source/java/org/alfresco/web/bean/wizard/NewUserWizard.java @@ -814,6 +814,11 @@ public class NewUserWizard extends AbstractWizardBean */ public void setUserName(String userName) { + if (userName != null) + { + userName = userName.trim(); + } + this.userName = userName; } diff --git a/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java b/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java index 0bd8277ff0..301c3aa1fe 100644 --- a/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java +++ b/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java @@ -196,8 +196,24 @@ import org.xml.sax.SAXException; // regenerate existing renditions boolean renditionLockedBefore = false; String path = null; + for (final Rendition r : this.getRenditions()) { + // Try to skip renditions without rendering engine template. + if (r instanceof RenditionImpl) + { + RenditionImpl rImpl = (RenditionImpl)r; + RenderingEngineTemplate ret = rImpl.getRenderingEngineTemplate(); + if ((ret != null) && (ret instanceof RenderingEngineTemplateImpl)) + { + RenderingEngineTemplateImpl retImpl = (RenderingEngineTemplateImpl) ret; + if (!retImpl.isExists()) + { + continue; + } + } + + } final RenderingEngineTemplate ret = r.getRenderingEngineTemplate(); if (ret == null || !allRets.contains(ret)) { @@ -237,7 +253,7 @@ import org.xml.sax.SAXException; } } } - + // render all renditions for newly added templates for (final RenderingEngineTemplate ret : allRets) { diff --git a/source/java/org/alfresco/web/forms/RenderingEngineTemplateImpl.java b/source/java/org/alfresco/web/forms/RenderingEngineTemplateImpl.java index c8bdd5ed68..455ec4bf88 100644 --- a/source/java/org/alfresco/web/forms/RenderingEngineTemplateImpl.java +++ b/source/java/org/alfresco/web/forms/RenderingEngineTemplateImpl.java @@ -599,6 +599,12 @@ public class RenderingEngineTemplateImpl { return this.getClass().getName() + "{name : " + this.getName() + "}"; } + + public boolean isExists() + { + final NodeService nodeService = this.getServiceRegistry().getNodeService(); + return nodeService.exists(this.nodeRef); + } } diff --git a/source/java/org/alfresco/web/ui/repo/component/UIWorkflowSummary.java b/source/java/org/alfresco/web/ui/repo/component/UIWorkflowSummary.java index 8a0f955ff8..60b3f74766 100644 --- a/source/java/org/alfresco/web/ui/repo/component/UIWorkflowSummary.java +++ b/source/java/org/alfresco/web/ui/repo/component/UIWorkflowSummary.java @@ -32,6 +32,7 @@ import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.el.ValueBinding; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.workflow.WorkflowInstance; import org.alfresco.web.app.Application; import org.alfresco.web.bean.repository.Repository; @@ -120,10 +121,20 @@ public class UIWorkflowSummary extends SelfRenderingComponent out.write(""); out.write(bundle.getString("initiated_by")); out.write(":"); + NodeService nodeService = getNodeService(context); if (wi.initiator != null) { - out.write(Utils.encode(User.getFullName(Repository.getServiceRegistry( - context).getNodeService(), wi.initiator))); + if (nodeService.exists(wi.initiator)) + { + out.write(Utils.encode(User.getFullName(Repository.getServiceRegistry( + context).getNodeService(), wi.initiator))); + } + else + { + out.write("<"); + out.write(bundle.getString("unknown")); + out.write(">"); + } } out.write(""); out.write(bundle.getString("started_on")); @@ -189,4 +200,9 @@ public class UIWorkflowSummary extends SelfRenderingComponent { this.value = value; } + + private NodeService getNodeService(FacesContext fc) + { + return Repository.getServiceRegistry(fc).getNodeService(); + } } diff --git a/source/web/scripts/validation.js b/source/web/scripts/validation.js index d7a4c54cdb..ece849dd08 100644 --- a/source/web/scripts/validation.js +++ b/source/web/scripts/validation.js @@ -98,7 +98,7 @@ function validateRegex(control, expression, requiresMatch, matchMessage, noMatch { var result = true; - var pattern = new RegExp(unescape(expression)); + var pattern = new RegExp(decode(expression)); var matches = pattern.test(control.value); if (matches != requiresMatch) @@ -135,4 +135,104 @@ function validateName(control, message, showMessage) } return result; +} + +/** + * Decodes the given string + * + * @param str The string to decode + * @return The decoded string + */ +function decode(str) +{ + var s0, i, j, s, ss, u, n, f; + + s0 = ""; // decoded str + + for (i = 0; i < str.length; i++) + { + // scan the source str + s = str.charAt(i); + + if (s == "+") + { + // "+" should be changed to SP + s0 += " "; + } + else + { + if (s != "%") + { + // add an unescaped char + s0 += s; + } + else + { + // escape sequence decoding + u = 0; // unicode of the character + + f = 1; // escape flag, zero means end of this sequence + + while (true) + { + ss = ""; // local str to parse as int + for (j = 0; j < 2; j++ ) + { + // get two maximum hex characters for parse + sss = str.charAt(++i); + + if (((sss >= "0") && (sss <= "9")) || ((sss >= "a") && (sss <= "f")) || ((sss >= "A") && (sss <= "F"))) + { + ss += sss; // if hex, add the hex character + } + else + { + // not a hex char., exit the loop + --i; + break; + } + } + + // parse the hex str as byte + n = parseInt(ss, 16); + + // single byte format + if (n <= 0x7f) { u = n; f = 1; } + + // double byte format + if ((n >= 0xc0) && (n <= 0xdf)) { u = n & 0x1f; f = 2; } + + // triple byte format + if ((n >= 0xe0) && (n <= 0xef)) { u = n & 0x0f; f = 3; } + + // quaternary byte format (extended) + if ((n >= 0xf0) && (n <= 0xf7)) { u = n & 0x07; f = 4; } + + // not a first, shift and add 6 lower bits + if ((n >= 0x80) && (n <= 0xbf)) { u = (u << 6) + (n & 0x3f); --f; } + + // end of the utf byte sequence + if (f <= 1) { break; } + + if (str.charAt(i + 1) == "%") + { + // test for the next shift byte + i++ ; + } + else + { + // abnormal, format error + break; + } + } + + // add the escaped character + s0 += String.fromCharCode(u); + + } + } + } + + return s0; + } \ No newline at end of file