diff --git a/config/alfresco/web-client-config-workflow-actions.xml b/config/alfresco/web-client-config-workflow-actions.xml index fba4dd9352..7f67e016bd 100644 --- a/config/alfresco/web-client-config-workflow-actions.xml +++ b/config/alfresco/web-client-config-workflow-actions.xml @@ -179,9 +179,11 @@ - + + + @@ -211,9 +213,11 @@ - + + + diff --git a/source/java/org/alfresco/web/bean/wcm/AVMConstants.java b/source/java/org/alfresco/web/bean/wcm/AVMConstants.java index 3f669924e7..93e05f48b2 100644 --- a/source/java/org/alfresco/web/bean/wcm/AVMConstants.java +++ b/source/java/org/alfresco/web/bean/wcm/AVMConstants.java @@ -740,6 +740,7 @@ public final class AVMConstants public final static String PROP_SANDBOXID = ".sandbox-id."; public final static String PROP_DNS = ".dns."; public final static String PROP_SANDBOX_STORE_PREFIX = ".sandbox.store."; + public final static QName PROP_WEB_PROJECT_NODE_REF = QName.createQName(null, ".web_project.noderef"); public final static QName PROP_SANDBOX_STAGING_MAIN = QName.createQName(null, ".sandbox.staging.main"); public final static QName PROP_SANDBOX_STAGING_PREVIEW = QName.createQName(null, ".sandbox.staging.preview"); public final static QName PROP_SANDBOX_AUTHOR_MAIN = QName.createQName(null, ".sandbox.author.main"); diff --git a/source/java/org/alfresco/web/bean/wcm/AVMEditBean.java b/source/java/org/alfresco/web/bean/wcm/AVMEditBean.java index 8b5e62e9d2..efff6f9c35 100644 --- a/source/java/org/alfresco/web/bean/wcm/AVMEditBean.java +++ b/source/java/org/alfresco/web/bean/wcm/AVMEditBean.java @@ -17,6 +17,7 @@ package org.alfresco.web.bean.wcm; import java.io.File; +import java.io.FileNotFoundException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; @@ -29,9 +30,11 @@ import org.alfresco.model.ContentModel; import org.alfresco.model.WCMAppModel; import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.domain.PropertyValue; import org.alfresco.service.cmr.avm.AVMService; import org.alfresco.service.cmr.avmsync.AVMDifference; import org.alfresco.service.cmr.avmsync.AVMSyncService; +import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; @@ -75,7 +78,8 @@ public class AVMEditBean private File file = null; private String fileName = null; protected FormProcessor.Session formProcessorSession = null; - + private Form form = null; + /** AVM service bean reference */ protected AVMService avmService; @@ -233,10 +237,15 @@ public class AVMEditBean */ public Form getForm() { - final String formName = (String) - this.nodeService.getProperty(this.getAvmNode().getNodeRef(), - WCMAppModel.PROP_PARENT_FORM_NAME); - return this.avmBrowseBean.getWebProject().getForm(formName); + if (this.form == null) + { + final String formName = (String) + this.nodeService.getProperty(this.getAvmNode().getNodeRef(), + WCMAppModel.PROP_PARENT_FORM_NAME); + final WebProject wp = new WebProject(this.getAvmNode().getPath()); + this.form = wp.getForm(formName); + } + return this.form; } /** @@ -296,17 +305,27 @@ public class AVMEditBean { if (LOGGER.isDebugEnabled()) LOGGER.debug(avmPath + " is a rendition, editing primary rendition instead"); - avmPath = new RenditionImpl(AVMNodeConverter.ToNodeRef(-1, avmPath)).getPrimaryFormInstanceData().getPath(); - - if (LOGGER.isDebugEnabled()) - LOGGER.debug("Editing primary form instance data " + avmPath); - this.avmBrowseBean.setAvmActionNode(new AVMNode(this.avmService.lookup(-1, avmPath))); + try + { + final FormInstanceData fid = + new RenditionImpl(AVMNodeConverter.ToNodeRef(-1, avmPath)).getPrimaryFormInstanceData(); + avmPath = fid.getPath(); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Editing primary form instance data " + avmPath); + this.avmBrowseBean.setAvmActionNode(new AVMNode(this.avmService.lookup(-1, avmPath))); + } + catch (FileNotFoundException fnfe) + { + this.avmService.removeAspect(avmPath, WCMAppModel.ASPECT_RENDITION); + this.avmService.removeAspect(avmPath, WCMAppModel.ASPECT_FORM_INSTANCE_DATA); + Utils.addErrorMessage(fnfe.getMessage(), fnfe); + } } if (this.avmService.hasAspect(-1, avmPath, WCMAppModel.ASPECT_FORM_INSTANCE_DATA)) { // reset the preview layer - String storeName = AVMConstants.getStoreName(this.avmBrowseBean.getCurrentPath()); + String storeName = AVMConstants.getStoreName(avmPath); storeName = AVMConstants.getCorrespondingPreviewStoreName(storeName); final String path = AVMConstants.buildStoreRootPath(storeName); if (LOGGER.isDebugEnabled()) diff --git a/source/java/org/alfresco/web/bean/wcm/CreateFormWizard.java b/source/java/org/alfresco/web/bean/wcm/CreateFormWizard.java index 61b2de966d..a8d322ce05 100644 --- a/source/java/org/alfresco/web/bean/wcm/CreateFormWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/CreateFormWizard.java @@ -588,7 +588,8 @@ public class CreateFormWizard { if (LOGGER.isDebugEnabled()) { - LOGGER.debug("schemaFileValueChanged(" + this.getSchemaFile() + ")"); + LOGGER.debug("schemaFileValueChanged(" + this.getFileName(FILE_SCHEMA) + "[" + + this.getSchemaFile() + "])"); } if (this.getSchemaFile() != null) { @@ -599,9 +600,9 @@ public class CreateFormWizard } catch (Exception e) { - final String msg = "unable to parse " + this.getSchemaFileName(); + final String msg = "unable to parse " + this.getFileName(FILE_SCHEMA); this.removeUploadedSchemaFile(); - Utils.addErrorMessage(msg, e); + Utils.addErrorMessage(msg + ": " + e.getMessage(), e); } } return null; @@ -822,8 +823,7 @@ public class CreateFormWizard } if (LOGGER.isDebugEnabled()) { - LOGGER.debug("getSchemaRootElementNameChoices(" + this.schema + - ") = " + result.size()); + LOGGER.debug("getSchemaRootElementNameChoices(" + this.schema + ") = " + result.size()); } return result; } diff --git a/source/java/org/alfresco/web/bean/wcm/CreateWebContentWizard.java b/source/java/org/alfresco/web/bean/wcm/CreateWebContentWizard.java index caff23f41a..3a66a79c94 100644 --- a/source/java/org/alfresco/web/bean/wcm/CreateWebContentWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/CreateWebContentWizard.java @@ -317,6 +317,12 @@ public class CreateWebContentWizard extends BaseContentWizard if (LOGGER.isDebugEnabled()) LOGGER.debug("starting workflow " + wd + " with parameters " + parameters); + + if (parameters == null) + { + Utils.addErrorMessage(Application.getMessage(context, "submit_workflow_config_error")); + return null; + } // start the workflow to get access to the start task WorkflowPath path = this.workflowService.startWorkflow(wd.id, null); diff --git a/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java b/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java index b6c467edeb..d004b8dc4e 100644 --- a/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java @@ -184,7 +184,7 @@ public class CreateWebsiteWizard extends BaseWizardBean if (outcome != null) { // create the AVM staging store to represent the newly created location website - SandboxFactory.createStagingSandbox(avmStore, wiz.getManagers()); + SandboxFactory.createStagingSandbox(avmStore, nodeRef, wiz.getManagers()); // create the default webapp folder under the hidden system folders final String stagingStore = AVMConstants.buildStagingStoreName(avmStore); diff --git a/source/java/org/alfresco/web/bean/wcm/SandboxFactory.java b/source/java/org/alfresco/web/bean/wcm/SandboxFactory.java index 38961629c0..165ade73db 100644 --- a/source/java/org/alfresco/web/bean/wcm/SandboxFactory.java +++ b/source/java/org/alfresco/web/bean/wcm/SandboxFactory.java @@ -65,9 +65,12 @@ public final class SandboxFactory * Website Name: .website.name = website name * * @param storeId The store name to create the sandbox for + * @param webProjectNodeRef The noderef for the webproject. * @param managers The list of authorities who have ContentManager role in the website */ - public static SandboxInfo createStagingSandbox(final String storeId, final List managers) + public static SandboxInfo createStagingSandbox(final String storeId, + final NodeRef webProjectNodeRef, + final List managers) { final ServiceRegistry services = Repository.getServiceRegistry(FacesContext.getCurrentInstance()); final AVMService avmService = services.getAVMService(); @@ -93,6 +96,9 @@ public final class SandboxFactory avmService.setStoreProperty(stagingStoreName, AVMConstants.PROP_SANDBOX_STAGING_MAIN, new PropertyValue(DataTypeDefinition.TEXT, null)); + avmService.setStoreProperty(stagingStoreName, + AVMConstants.PROP_WEB_PROJECT_NODE_REF, + new PropertyValue(DataTypeDefinition.NODE_REF, webProjectNodeRef)); // tag the store with the DNS name property tagStoreDNSPath(avmService, stagingStoreName, storeId); diff --git a/source/java/org/alfresco/web/bean/wcm/WebProject.java b/source/java/org/alfresco/web/bean/wcm/WebProject.java index 9462e23da7..d4e1251450 100644 --- a/source/java/org/alfresco/web/bean/wcm/WebProject.java +++ b/source/java/org/alfresco/web/bean/wcm/WebProject.java @@ -16,38 +16,40 @@ */ package org.alfresco.web.bean.wcm; -import org.alfresco.web.bean.repository.User; -import java.io.Serializable; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.workflow.WorkflowDefinition; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; import java.io.IOException; import java.io.Serializable; -import java.util.List; +import java.io.Serializable; import java.util.*; +import java.util.List; import javax.faces.context.FacesContext; import org.alfresco.model.ContentModel; import org.alfresco.model.WCMAppModel; import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.avm.AVMService; +import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.TemplateService; import org.alfresco.service.cmr.workflow.WorkflowDefinition; +import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; +import org.alfresco.web.app.servlet.DownloadContentServlet; import org.alfresco.web.bean.repository.Repository; +import org.alfresco.web.bean.repository.User; import org.alfresco.web.bean.wcm.AVMConstants; import org.alfresco.web.forms.*; import org.alfresco.web.forms.xforms.XFormsProcessor; -import org.alfresco.web.app.servlet.DownloadContentServlet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.*; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; /** * Provides configured data for a web project. @@ -165,13 +167,21 @@ public class WebProject private static final String ROLE_CONTENT_MANAGER = "ContentManager"; private final NodeRef nodeRef; - private Map forms; public WebProject(final NodeRef nodeRef) { this.nodeRef = nodeRef; } + public WebProject(final String avmPath) + { + String stagingStore = AVMConstants.buildStagingStoreName(AVMConstants.getStoreId(AVMConstants.getStoreName(avmPath))); + final AVMService avmService = this.getServiceRegistry().getAVMService(); + this.nodeRef = (NodeRef) + avmService.getStoreProperty(stagingStore, + AVMConstants.PROP_WEB_PROJECT_NODE_REF).getValue(DataTypeDefinition.NODE_REF); + } + /** * Returns the name of the web project. * @@ -281,24 +291,21 @@ public class WebProject private Map getFormsImpl() { - if (this.forms == null) + final ServiceRegistry serviceRegistry = this.getServiceRegistry(); + final NodeService nodeService = serviceRegistry.getNodeService(); + final List formRefs = + nodeService.getChildAssocs(this.nodeRef, + WCMAppModel.ASSOC_WEBFORM, + RegexQNamePattern.MATCH_ALL); + Map result = new HashMap(formRefs.size(), 1.0f); + for (final ChildAssociationRef ref : formRefs) { - final ServiceRegistry serviceRegistry = this.getServiceRegistry(); - final NodeService nodeService = serviceRegistry.getNodeService(); - final List formRefs = - nodeService.getChildAssocs(this.nodeRef, - WCMAppModel.ASSOC_WEBFORM, - RegexQNamePattern.MATCH_ALL); - this.forms = new HashMap(formRefs.size(), 1.0f); - for (final ChildAssociationRef ref : formRefs) - { - final String formName = (String) - nodeService.getProperty(ref.getChildRef(), WCMAppModel.PROP_FORMNAME); - final Form baseForm = FormsService.getInstance().getForm(formName); - this.forms.put(formName, new FormWrapper(baseForm, ref.getChildRef())); - } + final String formName = (String) + nodeService.getProperty(ref.getChildRef(), WCMAppModel.PROP_FORMNAME); + final Form baseForm = FormsService.getInstance().getForm(formName); + result.put(formName, new FormWrapper(baseForm, ref.getChildRef())); } - return this.forms; + return result; } private ServiceRegistry getServiceRegistry() diff --git a/source/java/org/alfresco/web/bean/workflow/ManageTaskDialog.java b/source/java/org/alfresco/web/bean/workflow/ManageTaskDialog.java index 892d4ab010..9e5cffe08b 100644 --- a/source/java/org/alfresco/web/bean/workflow/ManageTaskDialog.java +++ b/source/java/org/alfresco/web/bean/workflow/ManageTaskDialog.java @@ -36,6 +36,7 @@ import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.bean.repository.TransientNode; import org.alfresco.web.bean.wcm.AVMConstants; import org.alfresco.web.bean.wcm.AVMNode; +import org.alfresco.web.config.ClientConfigElement; import org.alfresco.web.config.DialogsConfigElement.DialogButtonConfig; import org.alfresco.web.ui.common.Utils; import org.alfresco.web.ui.common.component.UIActionLink; @@ -544,8 +545,7 @@ public class ManageTaskDialog extends BaseDialogBean WCMModel.PROP_AVM_DIR_INDIRECTION); final String stagingAvmPath = AVMNodeConverter.ToAVMVersionPath(stagingNodeRef).getSecond(); final String packageAvmPath = AVMNodeConverter.ToAVMVersionPath(this.workflowPackage).getSecond(); - LOGGER.debug("comparing " + packageAvmPath + - " with " + stagingAvmPath); + LOGGER.debug("comparing " + packageAvmPath + " with " + stagingAvmPath); for (AVMDifference d : this.avmSyncService.compare(-1, packageAvmPath, -1, stagingAvmPath, null)) @@ -685,10 +685,18 @@ public class ManageTaskDialog extends BaseDialogBean // ------------------------------------------------------------------------------ // Helper methods - protected void addAVMNode(AVMNode node) + protected void addAVMNode(final AVMNode node) { LOGGER.debug("adding node " + node); node.getProperties().put("taskId", this.task.id); + final ClientConfigElement config = Application.getClientConfig(FacesContext.getCurrentInstance()); + final String dns = AVMConstants.lookupStoreDNS(AVMConstants.getStoreName(node.getPath())); + node.getProperties().put("previewUrl", + AVMConstants.buildAssetUrl(AVMConstants.getSandboxRelativePath(node.getPath()), + config.getWCMDomain(), + config.getWCMPort(), + dns)); + this.browseBean.setupCommonBindingProperties(node); final String packagePath = AVMNodeConverter.ToAVMVersionPath(this.workflowPackage).getSecond(); NodePropertyResolver resolverPath = new NodePropertyResolver() @@ -714,9 +722,6 @@ public class ManageTaskDialog extends BaseDialogBean // node.remove("path"); // node.addPropertyResolver("path", resolverPath); // node.addPropertyResolver("displayPath", resolverPath); - - LOGGER.debug("created mapnode " + node); - this.resources.add(node); } diff --git a/source/java/org/alfresco/web/forms/FormImpl.java b/source/java/org/alfresco/web/forms/FormImpl.java index d251c50992..124e91f7c4 100644 --- a/source/java/org/alfresco/web/forms/FormImpl.java +++ b/source/java/org/alfresco/web/forms/FormImpl.java @@ -108,9 +108,6 @@ public class FormImpl ? (String)nodeService.getProperty(workflowRef, WCMAppModel.PROP_WORKFLOW_NAME) : null); - if (LOGGER.isDebugEnabled()) - LOGGER.debug("using workflow " + workflowName + " for form " + this.getName()); - return workflowName != null ? workflowService.getDefinitionByName(workflowName) : null; } diff --git a/source/java/org/alfresco/web/forms/Rendition.java b/source/java/org/alfresco/web/forms/Rendition.java index 1cee03617a..296c69c485 100644 --- a/source/java/org/alfresco/web/forms/Rendition.java +++ b/source/java/org/alfresco/web/forms/Rendition.java @@ -16,10 +16,10 @@ */ package org.alfresco.web.forms; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.io.Serializable; -import org.alfresco.service.cmr.repository.NodeRef; import org.xml.sax.SAXException; /** @@ -43,7 +43,8 @@ public interface Rendition public String getSandboxRelativePath(); /** the primary form instance data used to generate this rendition */ - public FormInstanceData getPrimaryFormInstanceData(); + public FormInstanceData getPrimaryFormInstanceData() + throws FileNotFoundException; /** the rendering engine template that generated this rendition */ public RenderingEngineTemplate getRenderingEngineTemplate(); diff --git a/source/java/org/alfresco/web/forms/RenditionImpl.java b/source/java/org/alfresco/web/forms/RenditionImpl.java index 1d64bb2773..aafe4c4208 100644 --- a/source/java/org/alfresco/web/forms/RenditionImpl.java +++ b/source/java/org/alfresco/web/forms/RenditionImpl.java @@ -16,6 +16,7 @@ */ package org.alfresco.web.forms; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import javax.faces.context.FacesContext; @@ -23,7 +24,10 @@ import org.alfresco.model.ContentModel; import org.alfresco.model.WCMAppModel; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.repo.avm.AVMNodeConverter; +import org.alfresco.repo.domain.PropertyValue; import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.avm.AVMService; +import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.MimetypeService; @@ -89,17 +93,21 @@ public class RenditionImpl } public FormInstanceData getPrimaryFormInstanceData() + throws FileNotFoundException { + final AVMService avmService = this.getServiceRegistry().getAVMService(); final NodeService nodeService = this.getServiceRegistry().getNodeService(); final String fidAVMStoreRelativePath = (String) nodeService.getProperty(this.nodeRef, WCMAppModel.PROP_PRIMARY_FORM_INSTANCE_DATA); String avmStore = AVMNodeConverter.ToAVMVersionPath(this.nodeRef).getSecond(); avmStore = avmStore.substring(0, avmStore.indexOf(':')); - - final NodeRef fidNodeRef = - AVMNodeConverter.ToNodeRef(-1, avmStore + ':' + fidAVMStoreRelativePath); - return new FormInstanceDataImpl(fidNodeRef); + final String path = avmStore + ':' + fidAVMStoreRelativePath; + if (avmService.lookup(-1, path) == null) + { + throw new FileNotFoundException("unable to find primary form instance data " + path); + } + return new FormInstanceDataImpl(AVMNodeConverter.ToNodeRef(-1, path)); } /** the rendering engine template that generated this rendition */ diff --git a/source/test-resources/xforms/customer-tests/eyestreet-ist-topic.xsd b/source/test-resources/xforms/customer-tests/eyestreet-ist-topic.xsd new file mode 100644 index 0000000000..48e1f48454 --- /dev/null +++ b/source/test-resources/xforms/customer-tests/eyestreet-ist-topic.xsd @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/test-resources/xforms/customer-tests/forums-shiporder.xsd b/source/test-resources/xforms/customer-tests/forums-shiporder.xsd new file mode 100644 index 0000000000..e92073a925 --- /dev/null +++ b/source/test-resources/xforms/customer-tests/forums-shiporder.xsd @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +