diff --git a/config/alfresco/messages/webclient.properties b/config/alfresco/messages/webclient.properties index beb4b8baf7..b3ef6c7375 100644 --- a/config/alfresco/messages/webclient.properties +++ b/config/alfresco/messages/webclient.properties @@ -650,6 +650,8 @@ create_form_form_details_step2_desc=Specify details for new form. create_form_form_details_no_schema_selected= create_form_configure_rendering_engine_templates_title=Step Two - Configure Rendering Engine Templates create_form_configure_rendering_engine_templates_desc=Enter information about the rendering engine templates you want to use for this form. +create_form_configure_rendering_engine_templates_step1_desc=Select the rendering engine template to use +create_form_configure_rendering_engine_templates_step2_desc=Specify details for the new rendering engine template create_form_select_default_workflow_title=Stop Three - Select default workflow create_form_select_default_workflow_desc=Select the workflow you want to be used by default for this form. create_web_content_summary_desc=The wizard has successfully created the content and all renditions. @@ -664,7 +666,6 @@ rendering_engine_template_file=Rendering Engine Template File rendering_engine=Rendering Engine output_path_pattern=Output path pattern mimetype_for_renditions=Mimetype for renditions -file_extension=Extension schema=Schema schema_root_element_name=Root element form=Form diff --git a/source/java/org/alfresco/web/bean/wcm/CreateWebContentWizard.java b/source/java/org/alfresco/web/bean/wcm/CreateWebContentWizard.java index 532f36e067..f555ab5f5f 100644 --- a/source/java/org/alfresco/web/bean/wcm/CreateWebContentWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/CreateWebContentWizard.java @@ -16,11 +16,7 @@ */ package org.alfresco.web.bean.wcm; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.Serializable; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -37,11 +33,13 @@ import org.alfresco.config.ConfigService; import org.alfresco.model.ContentModel; import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.workflow.WorkflowModel; 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.repository.ChildAssociationRef; -import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.*; +import org.alfresco.service.cmr.workflow.*; +import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.web.app.Application; @@ -56,6 +54,7 @@ import org.alfresco.web.forms.FormInstanceDataImpl; import org.alfresco.web.forms.FormProcessor; import org.alfresco.web.forms.FormsService; import org.alfresco.web.forms.Rendition; +import org.alfresco.web.forms.RenditionImpl; import org.alfresco.web.ui.wcm.component.UIUserSandboxes; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -85,7 +84,9 @@ public class CreateWebContentWizard extends BaseContentWizard /** AVM Browse Bean reference */ protected AVMBrowseBean avmBrowseBean; - + + /** Workflow service bean reference */ + protected WorkflowService workflowService; /** * @param avmService The AVMService to set. @@ -103,6 +104,15 @@ public class CreateWebContentWizard extends BaseContentWizard this.avmSyncService = avmSyncService; } + /** + * @param workflowService The WorkflowService to set. + */ + public void setWorkflowService(WorkflowService workflowService) + { + this.workflowService = workflowService; + } + + /** * @param avmBrowseBean The AVMBrowseBean to set. */ @@ -164,7 +174,92 @@ public class CreateWebContentWizard extends BaseContentWizard if (this.startWorkflow) { - System.err.println("************* starting workflow"); + WorkflowDefinition wd = null; + Map parameters = null; + + // get the workflow definition and parameters + { + final Node website = this.avmBrowseBean.getWebsite(); + final List webFormRefs = this.nodeService.getChildAssocs( + website.getNodeRef(), ContentModel.ASSOC_WEBFORM, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef ref : webFormRefs) + { + final String formName = (String) + this.nodeService.getProperty(ref.getChildRef(), ContentModel.PROP_FORMNAME); + if (formName.equals(this.getForm().getName())) + { + System.err.println("loading workflowRefs for " + formName); + final List workflowRefs = + this.nodeService.getChildAssocs(ref.getChildRef(), + ContentModel.ASSOC_WORKFLOWDEFAULTS, + RegexQNamePattern.MATCH_ALL); + if (workflowRefs.size() == 0) + { + throw new RuntimeException("no workflow parameters found for form " + formName); + } + if (workflowRefs.size() > 1) + { + throw new RuntimeException("found more than one workflow parameters node for " + formName); + } + + final NodeRef workflowRef = workflowRefs.get(0).getChildRef(); + final String workflowId = (String) + this.nodeService.getProperty(workflowRef, ContentModel.PROP_WORKFLOW_ID); + if (workflowId == null) + { + throw new RuntimeException("no workflow found for form " + formName); + } + System.err.println("using workflow " + workflowId + " for form " + formName); + wd = this.workflowService.getDefinitionById(workflowId); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final ContentReader cr = this.contentService.getReader(workflowRef, ContentModel.PROP_WORKFLOWDEFAULTS); + if (cr == null) + { + parameters = new HashMap(); + } + else + { + cr.getContent(baos); + + final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + final ObjectInputStream ois = new ObjectInputStream(bais); + parameters = (Map)ois.readObject(); + } + break; + } + } + } + + System.err.println("creating workflow package"); + final NodeRef workflowPackageNodeRef = this.workflowService.createPackage(null); +// doesn't work yet. need to use ASPECT_REFERENCES_NODE to get it to deal with avm nodes +// and we need some fixes from dave before we can enable. +// QName qn = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, +// QName.createValidLocalName(this.formInstanceData.getName())); +// String s = AVMNodeConverter.ToAVMVersionPath(this.formInstanceData.getNodeRef()).getSecond(); +// s = s.replaceFirst(AVMConstants.STORE_PREVIEW, AVMConstants.STORE_MAIN); +// System.err.println("adding " + s + " to workflow package with qname" + qn); +// this.nodeService.addChild(workflowPackageNodeRef, +// AVMNodeConverter.ToNodeRef(-1, s), +// ContentModel.ASSOC_CONTAINS, +// qn); +// for (Rendition rendition : this.getRenditions()) +// { +// qn = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, +// QName.createValidLocalName(rendition.getName())); +// s = AVMNodeConverter.ToAVMVersionPath(rendition.getNodeRef()).getSecond(); +// s = s.replaceFirst(AVMConstants.STORE_PREVIEW, AVMConstants.STORE_MAIN); +// System.err.println("adding " + s + " to workflow package with qname " + qn); +// +// this.nodeService.addChild(workflowPackageNodeRef, +// AVMNodeConverter.ToNodeRef(-1, s), +// ContentModel.ASSOC_CONTAINS, +// qn); +// } + parameters.put(WorkflowModel.ASSOC_PACKAGE, workflowPackageNodeRef); + System.err.println("starting workflow " + wd + " with parameters " + parameters); + final WorkflowPath wp = this.workflowService.startWorkflow(wd.getId(), parameters); } else { @@ -226,6 +321,9 @@ public class CreateWebContentWizard extends BaseContentWizard if (logger.isDebugEnabled()) logger.debug("creating file " + this.fileName + " in " + path); + + this.avmSyncService.resetLayer(path.split(":")[0] + ":/" + AVMConstants.DIR_APPBASE); + // put the content of the file into the AVM store if (fileContent != null) { @@ -248,8 +346,7 @@ public class CreateWebContentWizard extends BaseContentWizard if (MimetypeMap.MIMETYPE_XML.equals(this.mimeType) && this.formName != null) { - final Form form = this.getForm(); - form.registerFormInstanceData(formInstanceDataNodeRef); + this.getForm().registerFormInstanceData(formInstanceDataNodeRef); this.renditions = FormsService.getInstance().generateRenditions(formInstanceDataNodeRef); } } @@ -279,18 +376,19 @@ public class CreateWebContentWizard extends BaseContentWizard */ public List getFormChoices() { - Node website = this.avmBrowseBean.getWebsite(); + final Node website = this.avmBrowseBean.getWebsite(); if (website == null) { throw new IllegalStateException("CreateWebContentWizard must be called within a Web Project context!"); } - List webFormRefs = this.nodeService.getChildAssocs( + final List webFormRefs = this.nodeService.getChildAssocs( website.getNodeRef(), ContentModel.ASSOC_WEBFORM, RegexQNamePattern.MATCH_ALL); - List items = new ArrayList(webFormRefs.size()); + final List items = new ArrayList(webFormRefs.size()); for (ChildAssociationRef ref : webFormRefs) { - String formName = (String)this.nodeService.getProperty(ref.getChildRef(), ContentModel.PROP_FORMNAME); - Form form = FormsService.getInstance().getForm(formName); + final String formName = (String) + this.nodeService.getProperty(ref.getChildRef(), ContentModel.PROP_FORMNAME); + final Form form = FormsService.getInstance().getForm(formName); if (form != null) { items.add(new SelectItem(formName, form.getTitle())); diff --git a/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java b/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java index 6f7055f831..f0978125ee 100644 --- a/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java @@ -283,7 +283,7 @@ public class CreateWebsiteWizard extends BaseWizardBean { WorkflowWrapper workflow = form.getWorkflow(); props.clear(); - props.put(ContentModel.PROP_WORKFLOWNAME, workflow.getName()); + props.put(ContentModel.PROP_WORKFLOW_ID, workflow.getId()); NodeRef workflowRef = this.nodeService.createNode(formRef, ContentModel.ASSOC_WORKFLOWDEFAULTS, ContentModel.ASSOC_WORKFLOWDEFAULTS, @@ -322,7 +322,7 @@ public class CreateWebsiteWizard extends BaseWizardBean for (WorkflowWrapper workflow : this.workflows) { props.clear(); - props.put(ContentModel.PROP_NAME, workflow.getName()); + props.put(ContentModel.PROP_NAME, workflow.getId()); NodeRef workflowRef = this.nodeService.createNode(nodeRef, ContentModel.ASSOC_WEBWORKFLOWDEFAULTS, ContentModel.ASSOC_WEBWORKFLOWDEFAULTS, @@ -575,7 +575,7 @@ public class CreateWebsiteWizard extends BaseWizardBean if (index != -1) { Form form = (Form)this.formsList.get(index).getValue(); - this.forms.add(new FormWrapper(form)); + this.forms.add(this.new FormWrapper(form)); } } @@ -686,7 +686,7 @@ public class CreateWebsiteWizard extends BaseWizardBean for (WorkflowDefinition workflowDef : workflowDefs) { UIListItem item = new UIListItem(); - item.setValue(workflowDef.name); + item.setValue(workflowDef.id); item.setLabel(workflowDef.title); item.setDescription(workflowDef.description); item.setImage(WebResources.IMAGE_WORKFLOW_32); @@ -706,7 +706,7 @@ public class CreateWebsiteWizard extends BaseWizardBean if (index != -1) { String workflow = (String)this.workflowsList.get(index).getValue(); - this.workflows.add(new WorkflowWrapper(workflow)); + this.workflows.add(this.new WorkflowWrapper(workflow)); } } @@ -1008,7 +1008,7 @@ public class CreateWebsiteWizard extends BaseWizardBean /** * Wrapper class for a configurable template Form instance */ - public static class FormWrapper + public class FormWrapper { private Form form; private String title; @@ -1061,7 +1061,7 @@ public class CreateWebsiteWizard extends BaseWizardBean WorkflowDefinition wf = this.form.getDefaultWorkflow(); if (this.workflow == null && wf != null) { - this.workflow = new WorkflowWrapper(wf.name); + this.workflow = CreateWebsiteWizard.this.new WorkflowWrapper(wf.getId()); } return this.workflow; } @@ -1126,9 +1126,9 @@ public class CreateWebsiteWizard extends BaseWizardBean { String none = '<' + Application.getMessage(FacesContext.getCurrentInstance(), MSG_NONE) + '>'; return MessageFormat.format(Application.getMessage(FacesContext.getCurrentInstance(), MSG_FORM_SUMMARY), - getWorkflow() != null ? this.workflow.name : none, - getFilenamePattern() != null ? this.filenamePattern : none, - getTemplates() != null ? this.templates.size() : 0); + getWorkflow() != null ? this.workflow.getName() : none, + getFilenamePattern() != null ? this.filenamePattern : none, + getTemplates() != null ? this.templates.size() : 0); } } @@ -1197,28 +1197,41 @@ public class CreateWebsiteWizard extends BaseWizardBean } } + public WorkflowWrapper getWorkflowWrapper(String id) + { + return this.new WorkflowWrapper(id); + } + /** * Class to represent a single configured Workflow instance */ - public static class WorkflowWrapper + public class WorkflowWrapper { - private String name; + private String id; private String filenamePattern; private QName type; private Map params; - public WorkflowWrapper(String name) + public WorkflowWrapper(String id) { - this.name = name; + this.id = id; this.filenamePattern = filenamePattern; } + /** + * @return Returns the id of the workflow. + */ + public String getId() + { + return this.id; + } + /** * @return Returns the name of the workflow. */ public String getName() { - return this.name; + return workflowService.getDefinitionById(this.getId()).getName(); } /** diff --git a/source/java/org/alfresco/web/bean/wcm/FormDetailsDialog.java b/source/java/org/alfresco/web/bean/wcm/FormDetailsDialog.java index dfeae4401c..ed4c290204 100644 --- a/source/java/org/alfresco/web/bean/wcm/FormDetailsDialog.java +++ b/source/java/org/alfresco/web/bean/wcm/FormDetailsDialog.java @@ -169,7 +169,7 @@ public class FormDetailsDialog extends BaseDialogBean WorkflowWrapper workflow = getActionForm().getWorkflow(); if (workflow != null) { - this.workflowSelectedValue = new String[] {workflow.getName()}; + this.workflowSelectedValue = new String[] {workflow.getId()}; } } return this.workflowSelectedValue; @@ -195,9 +195,9 @@ public class FormDetailsDialog extends BaseDialogBean for (WorkflowDefinition workflowDef : workflowDefs) { UIListItem item = new UIListItem(); - item.setValue(workflowDef.name); - item.setLabel(workflowDef.title); - item.setDescription(workflowDef.description); + item.setValue(workflowDef.getId()); + item.setLabel(workflowDef.getTitle()); + item.setDescription(workflowDef.getDescription()); item.setImage(WebResources.IMAGE_WORKFLOW_32); items.add(item); } @@ -231,7 +231,7 @@ public class FormDetailsDialog extends BaseDialogBean } if (this.workflowSelectedValue != null && this.workflowSelectedValue.length != 0) { - form.setWorkflow(new CreateWebsiteWizard.WorkflowWrapper(this.workflowSelectedValue[0])); + form.setWorkflow(websiteWizard.getWorkflowWrapper(this.workflowSelectedValue[0])); } return outcome; } diff --git a/source/java/org/alfresco/web/bean/wcm/FormWorkflowDialog.java b/source/java/org/alfresco/web/bean/wcm/FormWorkflowDialog.java index def255cd38..e934edd9e8 100644 --- a/source/java/org/alfresco/web/bean/wcm/FormWorkflowDialog.java +++ b/source/java/org/alfresco/web/bean/wcm/FormWorkflowDialog.java @@ -122,7 +122,7 @@ public class FormWorkflowDialog extends BaseDialogBean if (this.workflowNode == null) { // TODO: remove the 'jbpm$' prefix once bug fix to WorkflowService has been merged across! - WorkflowDefinition flowDef = this.workflowService.getDefinitionByName("jbpm$" + getActionWorkflow().getName()); + WorkflowDefinition flowDef = this.workflowService.getDefinitionById(getActionWorkflow().getId()); if (logger.isDebugEnabled()) logger.debug("Selected workflow: "+ flowDef); diff --git a/source/java/org/alfresco/web/forms/FormInstanceData.java b/source/java/org/alfresco/web/forms/FormInstanceData.java index b974332e7c..e26e36dc6a 100644 --- a/source/java/org/alfresco/web/forms/FormInstanceData.java +++ b/source/java/org/alfresco/web/forms/FormInstanceData.java @@ -17,6 +17,7 @@ package org.alfresco.web.forms; import java.io.Serializable; +import org.alfresco.service.cmr.repository.NodeRef; /** * Encapsulation of form instance data. @@ -38,4 +39,7 @@ public interface FormInstanceData /** the url to the asset */ public String getUrl(); + + /** the noderef containing the form instance data */ + public NodeRef getNodeRef(); } diff --git a/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java b/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java index 740760c8e1..a541c7122e 100644 --- a/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java +++ b/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java @@ -16,6 +16,8 @@ */ package org.alfresco.web.forms; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.faces.context.FacesContext; import org.alfresco.model.ContentModel; import org.alfresco.model.WCMModel; @@ -50,6 +52,7 @@ public class FormInstanceDataImpl { this.nodeRef = nodeRef; } + /** the name of this rendition */ public String getName() { @@ -61,7 +64,12 @@ public class FormInstanceDataImpl /** the path relative to the containing webapp */ public String getWebappRelativePath() { - return AVMNodeConverter.ToAVMVersionPath(this.nodeRef).getSecond(); + final String path = AVMNodeConverter.ToAVMVersionPath(this.nodeRef).getSecond(); + final String p = ("[^:]+:/" + AVMConstants.DIR_APPBASE + + "/" + AVMConstants.DIR_WEBAPPS + + "/[^/]+(.*)/" + this.getName()); + final Matcher m = Pattern.compile(p).matcher(path); + return m.matches() && m.group(1).length() != 0 ? m.group(1) : "/"; } public Form getForm() diff --git a/source/java/org/alfresco/web/forms/RenditionImpl.java b/source/java/org/alfresco/web/forms/RenditionImpl.java index 2e86ced186..a717a559a1 100644 --- a/source/java/org/alfresco/web/forms/RenditionImpl.java +++ b/source/java/org/alfresco/web/forms/RenditionImpl.java @@ -16,6 +16,8 @@ */ package org.alfresco.web.forms; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.faces.context.FacesContext; import org.alfresco.model.ContentModel; import org.alfresco.model.WCMModel; @@ -62,7 +64,12 @@ public class RenditionImpl /** the path relative to the containing webapp */ public String getWebappRelativePath() { - return AVMNodeConverter.ToAVMVersionPath(this.nodeRef).getSecond(); + final String path = AVMNodeConverter.ToAVMVersionPath(this.nodeRef).getSecond(); + final String p = ("[^:]+:/" + AVMConstants.DIR_APPBASE + + "/" + AVMConstants.DIR_WEBAPPS + + "/[^/]+(.*)/" + this.getName()); + final Matcher m = Pattern.compile(p).matcher(path); + return m.matches() && m.group(1).length() != 0 ? m.group(1) : "/"; } public FormInstanceData getPrimaryFormInstanceData() 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 9281510f01..840a96ee08 100644 --- a/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java +++ b/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java @@ -18,6 +18,7 @@ package org.alfresco.web.ui.wcm.component; import java.io.IOException; import java.text.DateFormat; +import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -181,7 +182,12 @@ public class UISandboxSnapshots extends SelfRenderingComponent Date fromDate; if (FILTER_DATE_TODAY.equals(dateFilter)) { - fromDate = new Date(toDate.getYear(), toDate.getMonth(), toDate.getDate(), 0, 0, 0); + final Calendar c = Calendar.getInstance(); + c.setTime(toDate); + c.set(Calendar.HOUR, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + fromDate = c.getTime(); } else if (FILTER_DATE_WEEK.equals(dateFilter)) { diff --git a/source/web/WEB-INF/faces-config-beans.xml b/source/web/WEB-INF/faces-config-beans.xml index 9ecf442ee2..2a75c28b26 100644 --- a/source/web/WEB-INF/faces-config-beans.xml +++ b/source/web/WEB-INF/faces-config-beans.xml @@ -2111,6 +2111,10 @@ dictionaryService #{DictionaryService} + + workflowService + #{WorkflowService} + avmService #{AVMService} diff --git a/source/web/WEB-INF/faces-config-wcm.xml b/source/web/WEB-INF/faces-config-wcm.xml index 7d6e5b18f7..ae4905b2d8 100644 --- a/source/web/WEB-INF/faces-config-wcm.xml +++ b/source/web/WEB-INF/faces-config-wcm.xml @@ -18,6 +18,11 @@ org.alfresco.faces.SandboxSnapshots org.alfresco.web.ui.wcm.component.UISandboxSnapshots + + + org.alfresco.faces.FormProcessor + org.alfresco.web.ui.wcm.component.UIFormProcessor + diff --git a/source/web/jsp/wcm/create-form-wizard/configure-rendering-engines.jsp b/source/web/jsp/wcm/create-form-wizard/configure-rendering-engines.jsp index 4d2d992c2a..614b894474 100644 --- a/source/web/jsp/wcm/create-form-wizard/configure-rendering-engines.jsp +++ b/source/web/jsp/wcm/create-form-wizard/configure-rendering-engines.jsp @@ -43,14 +43,16 @@ - + - + <% final FileUploadBean upload = (FileUploadBean) @@ -69,7 +71,7 @@ if (upload == null || upload.getFile() == null) else { %> - + - + + + - - + - @@ -106,17 +116,17 @@ else value="#{WizardManager.bean.mimeTypeChoices}" /> - - - + - - + + + value="#{msg.selected_rendering_engine_templates}" /> - +