cancel
Showing results for 
Search instead for 
Did you mean: 

FileUpload generator

jzulu2000
Champ in-the-making
Champ in-the-making
Alfresco doesn't have file upload generator; with this component, we could configurate, for example, associations to work with files not currently added to alfresco, but added when the completion of a type creation is made;

For example, in workflows, people could confirm the start task creation with documents selected from local computer, and alfresco adds all this files to the current workflow package when the user ends the task.

I think this is very necessary functionality for usability because allows users to add content and associate it to the workflow in just one step; without this, users have to add several content an then enter into the start task creation to find them.
8 REPLIES 8

jzulu2000
Champ in-the-making
Champ in-the-making
I'm developing a component called fileuploadgenerator that allows render model properties as a file upload component; Using the file upload generator, users can choose a file and associate it to a type in the model, for example, a task in the workflow. It can be used in workflows, whether in start task or even in another task. At this time, renderer only can be used in properties of type d:text, even multiple or not; when the user ends or saves the task, the files are attached to the workflow package as workflow documents and the property contains the name of the added file.

The next step, if this generator is accepted in comunity, is to make alfresco to usit for rendering an association; currently associations are shown as a content search component, but with this component there´ll be another posibility.. as a file upload component..

For this to work, I had to override the StartWorkflowWizard and ManageTaskDialog managed beans and make my own implementation of such objects that inherits functionality, but finally adds documents to the workflow package.

Maybe alfresco want this component added to the project; let me know.
I'm gonna create a jira with this.

jzulu2000
Champ in-the-making
Champ in-the-making

jzulu2000
Champ in-the-making
Champ in-the-making
Component that allows render a d:text (multivalue or single value) property of a jbpm task as a file upload, an then, when the user saves or ends the task, saves the attached files in the workflow package. Currently, it only works with properties, not with associations;

This component is based on tomahauk file upload.

The following components have to be created.

1. FileUploadGenerator that generates the file upload input and configures alfresco converter for the correct displaying of te file name.
2. FileUploadRenderer that renders the input file and changes the form's encoding type to be multipart/form-data.
3. Custom implementation of StartWorkflowWizard that overrides funcionallity of the StartWorkflowWizard but finally saves the attached files into the workflow package when the user finish the creation of the task.
4. Custom implementation of ManageTaskDialog that overrides funcionallity of the ManageTaskDialog but finally saves the attached files into the workflow package when the user saves of finish a task.
5. WorkflowFileUploader component that helps CustomStartWorkflowWizard and CustomManageTaskDialog to save file in the workflow package.


FileUploadGenerator:

package co.com.arkimia.alfresco.web.bean.generator;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
import org.alfresco.service.cmr.repository.datatype.TypeConverter;
import org.alfresco.web.app.servlet.FacesHelper;
import org.alfresco.web.bean.generator.TextFieldGenerator;
import org.apache.myfaces.custom.fileupload.UploadedFile;

/**
* Generates an input file component and configures the alfresco converter to
* show the file name.
* @author Juan David Zuluaga Arboleda. Arkimia S.A.
*
*/
public class FileUploadGenerator extends TextFieldGenerator {

   /**
    * Generates an html input file upload and creates a converter from UploadedFile
    * to string;
    */
   public UIComponent generate(FacesContext context, String id) {
      UIComponent component = context.getApplication().createComponent(
            "org.apache.myfaces.HtmlInputFileUpload");
      component.setRendererType("co.com.arkimia.FileUpload");
      FacesHelper.setupComponentId(context, component, id);
      DefaultTypeConverter.INSTANCE.addConverter(UploadedFile.class, String.class,
            new TypeConverter.Converter<UploadedFile, String >()
              {
                  public String convert(UploadedFile source)
                  {
                     int index = Math.max(source.getName().lastIndexOf("\\"),
                           source.getName().lastIndexOf("/"));
                      return source.getName().substring(index + 1);
                  }
              });
      return component;
   }
}

FileUploadRenderer:

package co.com.arkimia.alfresco.web.ui.repo.renderer;

import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.component.UIForm;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.servlet.http.HttpServletRequest;

import org.apache.myfaces.custom.fileupload.HtmlFileUploadRenderer;

/**
* Renders the input file and renders a script to change the encoding type of
* the container form
* @author Juan David Zuluaga Arboleda. Arkimia S.A.
*
*/
public class FileUploadRenderer extends HtmlFileUploadRenderer {
   private static final String SCRIPT_GENERATED =
      FileUploadRenderer.class.getName()+ ".SCRIPT_GENERATED";

   @Override
   public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)
         throws IOException {
      super.encodeEnd(facesContext, uiComponent);
      HttpServletRequest req = (HttpServletRequest)facesContext
         .getExternalContext().getRequest();
      Boolean scriptGenerated = (Boolean)req.getAttribute(SCRIPT_GENERATED);
      if(scriptGenerated != null && scriptGenerated.booleanValue()) {
         return;
      }
      
      UIForm form = getForm(uiComponent);
      if(form == null) {
         return;
      }
      req.setAttribute(SCRIPT_GENERATED, Boolean.TRUE);
      
      ResponseWriter writer = facesContext.getResponseWriter();
      writer.write("<script>");
      writer.write("window.addEvent('domready', function () {");
      writer.write("var form = document.forms['");
      writer.write(form.getId());
      writer.write("'];");
      writer.write("form.encoding='multipart/form-data';");
      writer.write("});");
      writer.write("</script>");
   }
   
   private UIForm getForm(UIComponent component) {
      while(component != null) {
         if (component instanceof UIForm) {
            return (UIForm) component;
         }
         component = component.getParent();
      }
      return null;
   }

}

CustomStartWorkflowWizard
package co.com.arkimia.alfresco.repo.workflow;

import javax.faces.context.FacesContext;

import org.alfresco.web.bean.workflow.StartWorkflowWizard;

/**
* Associates uploaded files to a workflow.
*
* TODO cambiar implementacion cuando se realice parche propuesto en
* http://issues.alfresco.com/browse/AR-1685. Borrar el metodo finishImpl
* @author jzuluaga
*
*/
public class CustomStartWorkflowWizard extends StartWorkflowWizard {

   private WorkflowFileUploader fileUploader;
   @Override
   protected String finishImpl(FacesContext context, String outcome)
         throws Exception {
      // TODO: Deal with workflows that don't require any data

      if (logger.isDebugEnabled())
         logger.debug("Starting workflow: " + this.selectedWorkflow);

      // prepare the parameters from the current state of the property sheet
      Map<QName, Serializable> params = WorkflowUtil
            .prepareTaskParams(this.startTaskNode);

      if (logger.isDebugEnabled())
         logger.debug("Starting workflow with parameters: " + params);

      // create a workflow package for the attached items and add them
      NodeRef workflowPackage = this.workflowService.createPackage(null);

        for (String addedItem : this.packageItemsToAdd)
        {
            NodeRef addedNodeRef = new NodeRef(addedItem);
            this.nodeService.addChild(workflowPackage, addedNodeRef,
                ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
                QName.createValidLocalName((String)this.nodeService.getProperty(
                        addedNodeRef, ContentModel.PROP_NAME))));
        }

      params.put(WorkflowModel.ASSOC_PACKAGE, workflowPackage);

      // setup the context for the workflow (this is the space the workflow
      // was launched from)
      Node workflowContext = this.navigator.getCurrentNode();
      if (workflowContext != null) {
         params.put(WorkflowModel.PROP_CONTEXT,
               (Serializable) workflowContext.getNodeRef());
      }

      // start the workflow to get access to the start task
      WorkflowPath path = this.workflowService.startWorkflow(
            this.selectedWorkflow, params);
      if (path != null) {
         // extract the start task
         List<WorkflowTask> tasks = this.workflowService
               .getTasksForWorkflowPath(path.id);
         if (tasks.size() == 1) {
            WorkflowTask startTask = tasks.get(0);

            if (logger.isDebugEnabled())
               logger.debug("Found start task:" + startTask);

            if (startTask.state == WorkflowTaskState.IN_PROGRESS) {
               // end the start task to trigger the first 'proper'
               // task in the workflow
               this.workflowService.endTask(startTask.id, null);
            }
         }

         if (logger.isDebugEnabled())
            logger.debug("Started workflow: " + this.selectedWorkflow);
      }

        //////////////////////////////////
      fileUploader.processUploadedFiles(this.startTaskNode, workflowPackage);
        /////////////////////////////////

      return outcome;
   }


   public WorkflowFileUploader getFileUploader() {
      return fileUploader;
   }

   public void setFileUploader(WorkflowFileUploader fileUploader) {
      this.fileUploader = fileUploader;
   }

}

CustomManageTaskDialog:

package co.com.arkimia.alfresco.repo.workflow;

import java.io.IOException;

/**
* Custom implementation of the Manage task dialog; it has the same functionality of
* its parent class, but tries to attach any uploaded files to the workflow package
*
* @author Juan David Zuluaga Arboleda.
*/
public class CustomManageTaskDialog extends
      org.alfresco.web.bean.workflow.ManageTaskDialog {
   private WorkflowFileUploader fileUploader;

   /**
    * Perfors the uploaded files saving after the calling of
    * ManageTaskDialog.updateResources
    */
   protected void updateResources() {
      super.updateResources();

      try {
         fileUploader.processUploadedFiles(this.taskNode, workflowPackage);
      } catch (IOException e) {
         throw new RuntimeException(e);
      }
   }

   public WorkflowFileUploader getFileUploader() {
      return fileUploader;
   }

   public void setFileUploader(WorkflowFileUploader fileUploader) {
      this.fileUploader = fileUploader;
   }

}

WorkflowFileUploader:

package co.com.arkimia.alfresco.repo.workflow;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository;
import org.apache.myfaces.custom.fileupload.UploadedFile;

/**
* Bean that saves content in the repository, whether it comes in the node properties
* as an uploaded file or it comes from an input stream.
* the file.
*
* @author Juan David Zuluaga Arboleda. Arkimia S.A.
*
*/
public class WorkflowFileUploader {
   private ContentService contentService;
   private FileFolderService fileFolderService;

   public ContentService getContentService() {
      return contentService;
   }

   public void setContentService(ContentService contentService) {
      this.contentService = contentService;
   }

   public FileFolderService getFileFolderService() {
      return fileFolderService;
   }

   public void setFileFolderService(FileFolderService fileFolderService) {
      this.fileFolderService = fileFolderService;
   }

   /**
    * Process uploaded files sent in the node properties, whether they comes as an
    * uploadedFile or a list of uploadedFile's
    * @param node the node in which the properties are inspected to find uploadedFiles.
    * @param nodePackage the package in which the content's gonna be saved.
    * @throws IOException if some problems occur trying to save content
    */
   public void processUploadedFiles(Node node, NodeRef nodePackage)
         throws IOException {
      Map<String, Object> props = node.getProperties();
      for (String propName : props.keySet()) {
         QName propQName = Repository.resolveToQName(propName);
         Object value = props.get(propName);
         if (value instanceof UploadedFile) {
            UploadedFile file = (UploadedFile) value;
            addUploadedFile(nodePackage, file);
         } else if (value instanceof ArrayList) {
            List lista = (List) value;
            for (Object uploadedFile : lista) {
               if (uploadedFile instanceof UploadedFile) {
                  addUploadedFile(nodePackage,
                        (UploadedFile) uploadedFile);
               }
            }
         }
      }
   }

   /**
    * Saves the uploadedFile into the repository in the nodePackage sent.
    * @param nodePackage the node in which the conten's gonna be saved
    * @param file the file to be saved; file name, content type and input stream
    * data is taken from this object.
    * @throws IOException
    */
   private void addUploadedFile(NodeRef nodePackage, UploadedFile file)
         throws IOException {
      String fileName = file.getName().substring(
            file.getName().lastIndexOf("\\") + 1);
      createContent(nodePackage, fileName, file.getContentType(),
            file.getInputStream());
   }

   /**
    * Creates content with the fileName name in the node package sent; saves
    * the inputStream with the contentType.
    *
    * @param nodePackage
    * @param fileName
    * @param contentType
    * @param inputStream
    * @throws IOException if file already exists or if some error trying to
    *  save it.
    */
   public void createContent(NodeRef nodePackage, String fileName,
         String contentType, InputStream inputStream) throws IOException {
      FileInfo fileInfo = fileFolderService.create(nodePackage, fileName,
            ContentModel.TYPE_CONTENT);
      NodeRef fileNodeRef = fileInfo.getNodeRef();

      ContentWriter writer = contentService.getWriter(fileNodeRef,
            ContentModel.PROP_CONTENT, true);
      // set the mimetype and encoding
      writer.setMimetype(contentType);
      writer.setEncoding("ISO-8859-1");
      writer.putContent(inputStream);
   }

}

Add the WorkflowFileUploader bean; then add the CustomStartWorkflowWizard and CustomManageTaskDialog beans and make them use the WorkflowFileUploader bean. Finally, add the FileUploadGenerator managed bean and the new renderer. In the managed bean name for CustomStartWorkflowWizard and CustomManageTaskDialog clases we use the same as alfresco so they overrides the definition and alfresco now uses the new objects.

faces-config-custom.xml:


   <managed-bean>
      <description>
         The bean that puts attached files into the workflow
      </description>
      <managed-bean-name>WorkflowFileUploader</managed-bean-name>
      <managed-bean-class>co.com.arkimia.alfresco.repo.workflow.WorkflowFileUploader</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
      <managed-property>
         <property-name>contentService</property-name>
         <value>#{ContentService}</value>
      </managed-property>
      <managed-property>
         <property-name>fileFolderService</property-name>
         <value>#{FileFolderService}</value>
      </managed-property>
   </managed-bean>

    <managed-bean>
      <managed-bean-name>StartWorkflowWizard</managed-bean-name>
      <managed-bean-class>co.com.arkimia.alfresco.repo.workflow.CustomStartWorkflowWizard</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
      <managed-property>
         <property-name>fileUploader</property-name>
         <value>#{WorkflowFileUploader}</value>
      </managed-property>
      <managed-property>
         <property-name>nodeService</property-name>
         <value>#{NodeService}</value>
      </managed-property>
      <managed-property>
         <property-name>fileFolderService</property-name>
         <value>#{FileFolderService}</value>
      </managed-property>
      <managed-property>
         <property-name>searchService</property-name>
         <value>#{SearchService}</value>
      </managed-property>
      <managed-property>
         <property-name>navigator</property-name>
         <value>#{NavigationBean}</value>
      </managed-property>
      <managed-property>
         <property-name>browseBean</property-name>
         <value>#{BrowseBean}</value>
      </managed-property>
      <managed-property>
         <property-name>dictionaryService</property-name>
         <value>#{DictionaryService}</value>
      </managed-property>
      <managed-property>
         <property-name>namespaceService</property-name>
         <value>#{NamespaceService}</value>
      </managed-property>
      <managed-property>
         <property-name>workflowService</property-name>
         <value>#{WorkflowService}</value>
      </managed-property>
    </managed-bean>

   <managed-bean>
      <description>
         The bean that backs up the Manage Task Dialog
      </description>
      <managed-bean-name>ManageTaskDialog</managed-bean-name>
      <managed-bean-class>co.com.arkimia.alfresco.repo.workflow.CustomManageTaskDialog</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
      <managed-property>
         <property-name>fileUploader</property-name>
         <value>#{WorkflowFileUploader}</value>
      </managed-property>
      <managed-property>
         <property-name>nodeService</property-name>
         <value>#{NodeService}</value>
      </managed-property>
      <managed-property>
         <property-name>fileFolderService</property-name>
         <value>#{FileFolderService}</value>
      </managed-property>
      <managed-property>
         <property-name>searchService</property-name>
         <value>#{SearchService}</value>
      </managed-property>
      <managed-property>
         <property-name>navigator</property-name>
         <value>#{NavigationBean}</value>
      </managed-property>
      <managed-property>
         <property-name>browseBean</property-name>
         <value>#{BrowseBean}</value>
      </managed-property>
      <managed-property>
         <property-name>dictionaryService</property-name>
         <value>#{DictionaryService}</value>
      </managed-property>
      <managed-property>
         <property-name>namespaceService</property-name>
         <value>#{NamespaceService}</value>
      </managed-property>
      <managed-property>
         <property-name>workflowService</property-name>
         <value>#{WorkflowService}</value>
      </managed-property>
      <managed-property>
         <property-name>avmService</property-name>
         <value>#{AVMLockingAwareService}</value>
      </managed-property>
      <managed-property>
         <property-name>avmSyncService</property-name>
         <value>#{AVMSyncService}</value>
      </managed-property>
   </managed-bean>

   <managed-bean>
      <description>
         Bean that generates a file upload component
      </description>
      <managed-bean-name>FileUploadGenerator</managed-bean-name>
      <managed-bean-class>
         co.com.arkimia.alfresco.web.bean.generator.FileUploadGenerator
      </managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
   </managed-bean>

   <render-kit>
      <renderer>
         <component-family>javax.faces.Input</component-family>
         <renderer-type>co.com.arkimia.FileUpload</renderer-type>
         <renderer-class>co.com.arkimia.alfresco.web.ui.repo.renderer.FileUploadRenderer</renderer-class>
      </renderer>
   </render-kit>

Then, add the tomahauk jar to WEB-INF/lib and configure the ExtensionsFilter to be executed when working with jbpm tasks.
Add in the web.xml the filter.


   <filter>
      <filter-name>Extension Filter</filter-name>
      <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
   </filter>

   <filter-mapping>
      <filter-name>Extension Filter</filter-name>
      <url-pattern>/faces/jsp/wizard/container.jsp</url-pattern>
   </filter-mapping>
  
   <filter-mapping>
      <filter-name>Extension Filter</filter-name>
      <url-pattern>/faces/jsp/dialog/container.jsp</url-pattern>
   </filter-mapping>


rivarola
Champ on-the-rise
Champ on-the-rise
Great !  Smiley Very Happy

tito781
Champ in-the-making
Champ in-the-making
Hi, I used the generator in my workflow, with this settings:
1) in the model of workflow there is a property d:text
2)in web-client-config-properties there is a entry like this:
<show-property name="xxSmiley Tonguerop"  component-generator="FileUploadGenerator"/>

The file is uploaded and the content created and associated with the task. The problem is that, when I want to re-open task, dialog it give me an exception:

javax.faces.FacesException: java.lang.String
at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:425)
at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.alfresco.web.app.servlet.AuthenticationFilter.doFilter(AuthenticationFilter.java:81)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)
Caused by: org.apache.jasper.JasperException: java.lang.String
at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:476)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:389)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:594)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:505)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:965)
at org.apache.jsp.jsp.dialog.container_jsp._jspService(container_jsp.java:618)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:419)
… 21 more

I think it's due to the fact that the property associate is of type content and the property of task is String.
How can I overcome this problem?

jzulu2000
Champ in-the-making
Champ in-the-making
Hi.
The only solution that comes to me is to define the property as multiple, so alfresco generates a grid control; when you re-open the task, alfresco shows all the files in the grid and the error doesn't occurrs.
Maybe this can help.

chrisdav
Champ in-the-making
Champ in-the-making
Trying to get this to run but am getting an error when i try to start a workflow

javax.faces.el.EvaluationException: Cannot get value for expression '#{ManageTaskDialog}'
caused by:
javax.faces.el.EvaluationException: Cannot get value for expression '#{WorkflowFileUploader}'
caused by:
java.lang.IllegalArgumentException: setAttribute: Non-serializable attribute

Any ideas?

Can I check which versions of Alfresco and Tomahawk you are using.

I am on Alfresco 2.2 SP1 and Tomahawk 1.1.6

chandra_shekher
Champ in-the-making
Champ in-the-making
Hi All,

Could you suggest one thing..

In Work flow task, If user want to upload the document , he/she clicks on add resources and the click search button, after that all available resource in repository, displayed into big select box where user select the resources/asset from the list and add that…

my requirement is give the user capability to upload file directly from user machine.. just like  add content dialog/upload content..

What could be right to do…Please suggest me..
/Chandra