AnsweredAssumed Answered

Unable to start custom workflow

Question asked by osu on Nov 27, 2006
Latest reply on Dec 1, 2006 by davidc
Hi Community,

I was trying to setup an advanced workflow on 1.4 Community Edition.

Deploying the workflow works fine using the jPBM Plugin for eclipse. In the web client, the advanced workflow shows up in the list of available workflows and the workflow can be selected.

But after trying to start the workflow in the advanced workflow wizard, there is no way to proceed since the finish button never gets activated in the workflow options.

When comparing with the predefined workflows, the property "Identifier" seems to be mandatory (see screenshot). This is not the case for the predefined workflow.

[img]http://www.sookie.de/temp/workflow-options.jpg[/img]


Commenting out the property in the web client configuration enables the finish button. When assigning the task to admin, the task does not show up in the admin's task list.

Could anybody advise please? I am sure I missed something, but I don't know what.

Some comment on the advanced workflow integration: I appreciate its flexibility - but setup and customization is pretty error prone and time consuming due to manual synchronization between process definition, task model and web client configuration. This basically also applies to adding a custom content model in general.

What are the plans for administrative GUIs taking care of that automatically?

Regards,
Oliver.








Process Definition:

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1"
   name="lwf:PostkorbEingangRechnungenLS">

   <swimlane name="initiator" />

   <start-state name="start">
      <task name="lwf:startPostkorbEingangRechnungenLS"
         swimlane="initiator" />
      <transition name="PostkorbEingang" to="PostkorbEingangRechnungenLS"></transition>
   </start-state>

   <swimlane name="Sachbearbeiter">
      <assignment
         actor-id="#{bpm_assignee.properties['cm:userName']}" />
   </swimlane>


   <task-node name="PostkorbEingangRechnungenLS">
      <task name="lwf:PostkorbEingangRechnungenLS" />
      <transition name="Postenkontrolle" to="Postenkontrolle"></transition>
   </task-node>

   <task-node name="Postenkontrolle">
      <task name="lwf:Postenkontrolle" />
      <transition name="Rechnungsfreigabe" to="Rechnungsfreigabe"></transition>
      <transition name="LSgeprueft" to="LSgeprueft"></transition>
   </task-node>

   <task-node name="Rechnungsfreigabe">
      <task name="lwf:Rechnungsfreigabe" />
      <transition name="" to="FiBuErfassung"></transition>
      <transition name="UnbezahlteLastschriften" to="UnbezahlteLastschriften"></transition>
   </task-node>

   <task-node name="LSgeprueft">
      <task name="lwf:LSgeprueft" />
      <transition name="" to="end"></transition>
   </task-node>

   <task-node name="FiBuErfassung">
      <task name="lwf:FiBuErfassung" />
      <transition name="ZuzahlendeUeberweisung" to="ZuzahlendeUeberweisung"></transition>
   </task-node>

   <task-node name="ZuzahlendeUeberweisung">
      <task name="lwf:ZuzahlendeUeberweisung" />
      <transition name="UnbezahlteUeberweisung" to="UnbezahlteUeberweisung"></transition>
   </task-node>

   <task-node name="UnbezahlteUeberweisung">
      <task name="lwf:UnbezahlteUeberweisung" />
      <transition name="UeberweisungenBezahlteRechnungen" to="BezahlteRechnungen"></transition>
   </task-node>

   <task-node name="BezahlteRechnungen">
      <task name="lwf:BezahlteRechnungen" />
      <transition name="" to="end"></transition>
   </task-node>

   <task-node name="UnbezahlteLastschriften">
      <task name="lwf:UnbezahlteLastschriften" />
      <transition name="LastschriftenBezahlteRechnungen" to="BezahlteRechnungen"></transition>
   </task-node>

   <end-state name="end"></end-state>
</process-definition>




customWorkflowModel.xml:



<?xml version="1.0" encoding="UTF-8"?>

<model name="lwf:levigoworkflowmodel" xmlns="http://www.alfresco.org/model/dictionary/1.0">

   <imports>
      <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
      <import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm"/>
      <import uri="http://www.alfresco.org/model/workflow/1.0" prefix="wf"/>
   </imports>

   <namespaces>
      <namespace uri="http://www.levigo.de/model/workflow/1.0" prefix="lwf"/>
   </namespaces>

   <types>



      <type name="lwf:startPostkorbEingangRechnungenLS">
         <parent>bpm:startTask</parent>
         <mandatory-aspects>
            <aspect>bpm:assignee</aspect>
         </mandatory-aspects>
      </type>

      <type name="lwf:PostkorbEingangRechnungenLS">
         <parent>bpm:workflowTask</parent>
         <overrides>
            <property name="bpm:packageActionGroup">
               <default>add_package_item_actions</default>
            </property>
            <property name="bpm:packageItemActionGroup">
               <default>edit_package_item_actions</default>
            </property>
         </overrides>
      </type>

      <type name="lwf:Postenkontrolle">
         <parent>bpm:workflowTask</parent>
      </type>

      <type name="lwf:Rechnungsfreigabe">
         <parent>bpm:workflowTask</parent>
      </type>

      <type name="lwf:LSgeprueft">
         <parent>bpm:workflowTask</parent>
      </type>

      <type name="lwf:FiBuErfassung">
         <parent>bpm:workflowTask</parent>
      </type>

      <type name="lwf:ZuzahlendeUeberweisung">
         <parent>bpm:workflowTask</parent>
      </type>

      <type name="lwf:UnbezahlteUeberweisung">
         <parent>bpm:workflowTask</parent>
      </type>

      <type name="lwf:BezahlteRechnungen">
         <parent>bpm:workflowTask</parent>
      </type>

      <type name="lwf:UnbezahlteLastschriften">
         <parent>bpm:workflowTask</parent>
      </type>

   </types>

</model>



web-client-config-custom.xml



<alfresco-config>



   <!– Example of adding languages to the list in the login page –>
   <config evaluator="string-compare" condition="Languages">
      <languages>
         <language locale="ca_ES">Catalan</language>
         <language locale="da_DK">Danish</language>
         <language locale="de_DE">German</language>
         <language locale="es_ES">Spanish</language>
         <language locale="el_GR">Greek</language>
         <language locale="fr_FR">French</language>
         <language locale="it_IT">Italian</language>
         <language locale="ja_JP">Japanese</language>
         <language locale="du_NL">Dutch</language>
         <language locale="pt_BR">Portuguese (Brazilian)</language>
         <language locale="ru_RU">Russian</language>
         <language locale="fi_FI">Finnish</language>
         <language locale="tr_TR">Turkish</language>
         <language locale="zh_CN">Simplified Chinese</language>
      </languages>
   </config>





   <config evaluator="node-type" condition="lwf:startPostkorbEingangRechnungenLS" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <!– <show-property name="bpm:taskId" /> –>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="false"/>
         <show-property name="bpm:dueDate" read-only="false" />
         <show-property name="bpm:priority" read-only="false" />
         <show-property name="bpm:status" />
         <show-association name="bpm:assignee" display-label-id="lwf_Sachbearbeiter" />
      </property-sheet>
   </config>
  
      <config evaluator="node-type" condition="lwf:Postenkontrolle" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <!– <show-property name="bpm:taskId" /> –>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true" />
         <show-property name="bpm:priority" read-only="true" />
         <show-property name="bpm:status" />

      </property-sheet>
   </config>
  
   <config evaluator="node-type" condition="lwf:Rechnungsfreigabe" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <!– <show-property name="bpm:taskId" /> –>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true" />
         <show-property name="bpm:priority" read-only="true" />
         <show-property name="bpm:status" />
      </property-sheet>
   </config>
  
      <config evaluator="node-type" condition="lwf:LSgeprueft" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <!– <show-property name="bpm:taskId" /> –>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true" />
         <show-property name="bpm:priority" read-only="true" />
         <show-property name="bpm:status" />
      </property-sheet>
   </config>
  
      <config evaluator="node-type" condition="lwf:FiBuErfassung" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <!– <show-property name="bpm:taskId" /> –>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true" />
         <show-property name="bpm:priority" read-only="true" />
         <show-property name="bpm:status" />
      </property-sheet>
   </config>
  
   <config evaluator="node-type" condition="lwf:ZuzahlendeUeberweisung" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <!– <show-property name="bpm:taskId" /> –>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true" />
         <show-property name="bpm:priority" read-only="true" />
         <show-property name="bpm:status" />
      </property-sheet>
   </config>
  
      <config evaluator="node-type" condition="lwf:UnbezahlteUeberweisung" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <!– <show-property name="bpm:taskId" /> –>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true" />
         <show-property name="bpm:priority" read-only="true" />
         <show-property name="bpm:status" />
      </property-sheet>
   </config>
  

    <config evaluator="node-type" condition="lwf:BezahlteRechnungen" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <!– <show-property name="bpm:taskId" /> –>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true" />
         <show-property name="bpm:priority" read-only="true" />
         <show-property name="bpm:status" />
      </property-sheet>
   </config>
  
    <config evaluator="node-type" condition="lwf:UnbezahlteLastschriften" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <!– <show-property name="bpm:taskId" /> –>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true" />
         <show-property name="bpm:priority" read-only="true" />
         <show-property name="bpm:status" />
      </property-sheet>
   </config>




</alfresco-config>


customWorkflow-messages.properties



# Postkorb Eingang: Rechnungen, LS Workflow

lwf_PostkorbEingangRechnungenLS.workflow.title = Postkorb Eingang: Rechnungen, LS
lwf_PostkorbEingangRechnungenLS.workflow.description = Rechnungen und Lieferscheine im Posteingang bearbeiten


# Task Definitions

lwf_levigoworkflowmodel.type.lwf_startPostkorbEingangRechnungenLS.title = Postkorb Eingang: Rechnungen und Lieferscheine
lwf_levigoworkflowmodel.type.lwf_startPostkorbEingangRechnungenLS.description = Rechnungen und Lieferscheine im Posteingang bearbeiten

lwf_levigoworkflowmodel.type.lwf_PostkorbEingangRechnungenLS.title = Postkorb Eingang: Rechnungen und Lieferscheine
lwf_levigoworkflowmodel.type.lwf_PostkorbEingangRechnungenLS.description = Rechnungen und Lieferscheine im Posteingang bearbeiten

lwf_levigoworkflowmodel.type.lwf_Postenkontrolle.title = Postenkontrolle
lwf_levigoworkflowmodel.type.lwf_Postenkontrolle.description = Postenkontrolle durchführen

lwf_levigoworkflowmodel.type.lwf_Rechnungsfreigabe.title = Rechnungsfreigabe
lwf_levigoworkflowmodel.type.lwf_Rechnungsfreigabe.description = Rechnungsfreigabe durchführen

lwf_levigoworkflowmodel.type.lwf_LSgeprueft.title = Lieferschein geprüft
lwf_levigoworkflowmodel.type.lwf_LSgeprueft.description = Lieferschein geprüft

lwf_levigoworkflowmodel.type.lwf_FiBuErfassung.title = FiBu Erfassung
lwf_levigoworkflowmodel.type.lwf_FiBuErfassung.description = Erfassung in Finanzbuchhaltung

lwf_levigoworkflowmodel.type.lwf_ZuzahlendeUeberweisung.title = Zu zahlende Ãœberweisung
lwf_levigoworkflowmodel.type.lwf_ZuzahlendeUeberweisung.description = Zu zahlende Ãœberweisung

lwf_levigoworkflowmodel.type.lwf_UnbezahlteUeberweisung.title = Unbezahlte Ãœberweisung
lwf_levigoworkflowmodel.type.lwf_UnbezahlteUeberweisung.description = Unbezahlte Ãœberweisung

lwf_levigoworkflowmodel.type.lwf_UnbezahlteUeberweisung.title = Unbezahlte Ãœberweisung
lwf_levigoworkflowmodel.type.lwf_UnbezahlteUeberweisung.description = Unbezahlte Ãœberweisung

lwf_levigoworkflowmodel.type.lwf_BezahlteRechnungen.title = Bezahlte Rechnungen
lwf_levigoworkflowmodel.type.lwf_BezahlteRechnungen.description = Bezahlte Rechnungen

lwf_levigoworkflowmodel.type.lwf_UnbezahlteLastschriften.title = Unbezahlte Lastschriften
lwf_levigoworkflowmodel.type.lwf_UnbezahlteLastschriften.description = Unbezahlte Lastschriften


# Process Definitions

lwf_PostkorbEingangRechnungenLS.workflow.node.start.title=Start
lwf_PostkorbEingangRechnungenLS.workflow.node.start.description=Start

lwf_PostkorbEingangRechnungenLS.workflow.node.PostkorbEingangRechnungenLS.title=Postkorb Eingang - Rechnungen, LS
lwf_PostkorbEingangRechnungenLS.workflow.node.PostkorbEingangRechnungenLS.description=Postkorb Eingang - Rechnungen, LS bearbeiten
lwf_PostkorbEingangRechnungenLS.workflow.node.PostkorbEingangRechnungenLS.transition.Postenkontrolle.title=Postenkontrolle
lwf_PostkorbEingangRechnungenLS.workflow.node.PostkorbEingangRechnungenLS.transition.Postenkontrolle.description=Postenkontrolle

lwf_PostkorbEingangRechnungenLS.workflow.node.Postenkontrolle.title=Postkorb Eingang - Rechnungen, LS
lwf_PostkorbEingangRechnungenLS.workflow.node.Postenkontrolle.description=Postkorb Eingang - Rechnungen, LS bearbeiten
lwf_PostkorbEingangRechnungenLS.workflow.node.Postenkontrolle.transition.Rechnungsfreigabe.title=Rechnungsfreigabe
lwf_PostkorbEingangRechnungenLS.workflow.node.Postenkontrolle.transition.Rechnungsfreigabe.description=Rechnungsfreigabe
lwf_PostkorbEingangRechnungenLS.workflow.node.Postenkontrolle.transition.LSgeprueft.title=LS geprüft
lwf_PostkorbEingangRechnungenLS.workflow.node.Postenkontrolle.transition.LSgeprueft.description=LS geprüft

lwf_PostkorbEingangRechnungenLS.workflow.node.Rechnungsfreigabe.title=Postkorb Eingang - Rechnungen, LS
lwf_PostkorbEingangRechnungenLS.workflow.node.Rechnungsfreigabe.description=Postkorb Eingang - Rechnungen, LS bearbeiten
lwf_PostkorbEingangRechnungenLS.workflow.node.Rechnungsfreigabe.transition.FiBuErfassung.title=FiBu Erfassung
lwf_PostkorbEingangRechnungenLS.workflow.node.Rechnungsfreigabe.transition.FiBuErfassung.description=FiBu Erfassung

lwf_PostkorbEingangRechnungenLS.workflow.node.LSgeprueft.title=LS geprüft
lwf_PostkorbEingangRechnungenLS.workflow.node.LSgeprueft.description=LS geprüft

lwf_PostkorbEingangRechnungenLS.workflow.node.FiBuErfassung.title=FiBu Erfassung
lwf_PostkorbEingangRechnungenLS.workflow.node.FiBuErfassung.description=FiBu Erfassung
lwf_PostkorbEingangRechnungenLS.workflow.node.FiBuErfassung.transition.ZuzahlendeUeberweisung.title=Zu zahlende Ãœberweisung
lwf_PostkorbEingangRechnungenLS.workflow.node.FiBuErfassung.transition.ZuzahlendeUeberweisung.description=Zu zahlende Ãœberweisung
lwf_PostkorbEingangRechnungenLS.workflow.node.FiBuErfassung.transition.UnbezahlteLastschriften.title=Unbezahlte Lastschriften
lwf_PostkorbEingangRechnungenLS.workflow.node.FiBuErfassung.transition.UnbezahlteLastschriften.description=Unbezahlte Lastschriften

lwf_PostkorbEingangRechnungenLS.workflow.node.ZuzahlendeUeberweisung.title=Zu zahlende Ãœberweisung
lwf_PostkorbEingangRechnungenLS.workflow.node.ZuzahlendeUeberweisung.description=Zu zahlende Ãœberweisung
lwf_PostkorbEingangRechnungenLS.workflow.node.ZuzahlendeUeberweisung.transition.UnbezahlteUeberweisung.title=Unbezahlte Ãœberweisung
lwf_PostkorbEingangRechnungenLS.workflow.node.ZuzahlendeUeberweisung.transition.UnbezahlteUeberweisung.description=Unbezahlte Ãœberweisung

lwf_PostkorbEingangRechnungenLS.workflow.node.UnbezahlteUeberweisung.title=Unbezahlte Ãœberweisung
lwf_PostkorbEingangRechnungenLS.workflow.node.UnbezahlteUeberweisung.description=Unbezahlte Ãœberweisung
lwf_PostkorbEingangRechnungenLS.workflow.node.UnbezahlteUeberweisung.transition.UeberweisungenBezahlteRechnungen.title=Bezahlte Rechnungen
lwf_PostkorbEingangRechnungenLS.workflow.node.UnbezahlteUeberweisung.transition.UeberweisungenBezahlteRechnungen.description=Bezahlte Rechnungen

lwf_PostkorbEingangRechnungenLS.workflow.node.BezahlteRechnungen.title=Bezahlte Rechnungen
lwf_PostkorbEingangRechnungenLS.workflow.node.BezahlteRechnungen.description=Bezahlte Rechnungen

lwf_PostkorbEingangRechnungenLS.workflow.node.UnbezahlteLastschriften.title=Unbezahlte Lastschriften
lwf_PostkorbEingangRechnungenLS.workflow.node.UnbezahlteLastschriften.description=Unbezahlte Lastschriften
lwf_PostkorbEingangRechnungenLS.workflow.node.UnbezahlteLastschriften.transition.LastschriftenBezahlteRechnungen.title=Bezahlte Rechnungen
lwf_PostkorbEingangRechnungenLS.workflow.node.UnbezahlteLastschriften.transition.LastschriftenBezahlteRechnungen.description=Bezahlte Rechnungen

lwf_PostkorbEingangRechnungenLS.workflow.node.end.title=Ende
lwf_PostkorbEingangRechnungenLS.workflow.node.end.description=Ende



bootstrap-context.xml





<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>


<!–
    Repository Bootstrap Sequence.
   
    This file specifies the initialisation (and order of initialisation) to perform during Repository startup.
   
    The pattern for adding new initialisation to the bootstrap sequence is as follows:
   
    1) Develop a bean that implements the Spring interface ApplicationListener
    2) Place the initialisation logic in the method onApplicationEvent(ApplicationEvent event)…
   
       public void onApplicationEvent(ApplicationEvent event)
       {
          if (event instanceof ContextRefreshedEvent)
          {
             // initialisation logic here
          }
       }
      
    3) Add the bean definition to this file - Note: the beans are initialised in the order they are specified.
–>

<beans>

   <!– ensure that the schema is bootstrapped –>
   <bean id="schemaBootstrap" class="org.alfresco.repo.domain.schema.SchemaBootstrap" >
      <property name="localSessionFactory">
         <ref bean="&amp;sessionFactory"></ref>  <!– inject the actual factory, not a session –>
      </property>
      <property name="updateSchema">
         <value>${db.schema.update}</value>
      </property>
      <property name="postCreateScriptUrls">
         <list>
            <value>classpath:alfresco/dbscripts/create/1.4/${db.script.dialect}/post-create-indexes.sql</value>
         </list>
      </property>
      <property name="validateUpdateScriptPatches">
         <list>
         </list>
      </property>
      <property name="applyUpdateScriptPatches">
         <list>
            <ref bean="patch.schemaUpdateScript-V1.4-1" />
            <ref bean="patch.schemaUpdateScript-V1.4-2" />
         </list>
      </property>
   </bean>

   <!– Bootstrap Files –>

    <bean id="systemInfoBootstrap" parent="systemInfoImporter">
    </bean>

    <bean id="userBootstrap" parent="userStoreImporter">
        <property name="bootstrapViews">
            <list>
                <props>
                    <prop key="path">/</prop>
                    <prop key="location">alfresco/bootstrap/alfrescoUserStore.xml</prop>
                </props>
                <props>
                    <prop key="path">/${alfresco_user_store.system_container.childname}</prop>
                    <prop key="location">alfresco/bootstrap/alfrescoAuthorityStore.xml</prop>
                </props>
            </list>
        </property>
    </bean>

    <bean id="systemBootstrap" parent="systemStoreImporter">
        <property name="bootstrapViews">
            <list>
                <props>
                    <prop key="path">/</prop>
                    <prop key="location">alfresco/bootstrap/descriptor.xml</prop>
                </props>
            </list>
        </property>
    </bean>

    <bean id="versionBootstrap" parent="versionStoreImporter">
        <property name="bootstrapViews">
            <list>
                <props>
                    <prop key="path">/</prop>
                    <prop key="location">alfresco/bootstrap/lightWeightVersionStore.xml</prop>
                </props>
            </list>
        </property>
    </bean>

    <bean id="spacesArchiveBootstrap" parent="spacesArchiveStoreImporter">
        <property name="bootstrapViews">
            <list>
                <props>
                    <prop key="path">/</prop>
                    <prop key="location">alfresco/bootstrap/spacesArchive.xml</prop>
                </props>
            </list>
        </property>
    </bean>

    <bean id="spacesBootstrap" parent="spacesStoreImporter">
        <property name="bootstrapViews">
            <list>
                <props>
                    <prop key="path">/</prop>
                    <prop key="location">alfresco/bootstrap/spaces.xml</prop>
                    <prop key="messages">alfresco/messages/bootstrap-spaces</prop>
                </props>
                <props>
                    <prop key="path">/</prop>
                    <prop key="location">alfresco/bootstrap/system.xml</prop>
                </props>
                <props>
                    <prop key="path">/</prop>
                    <prop key="location">alfresco/bootstrap/categories.xml</prop>
                </props>
                <props>
                    <prop key="path">/${spaces.company_home.childname}/${spaces.guest_home.childname}</prop>
                    <prop key="location">alfresco/bootstrap/tutorial.xml</prop>
                    <prop key="messages">alfresco/messages/bootstrap-tutorial</prop>
                </props>
                <props>
                    <prop key="path">/${spaces.company_home.childname}/${spaces.dictionary.childname}/${spaces.templates.childname}</prop>
                    <prop key="location">alfresco/templates/software_engineering_project.xml</prop>
                    <prop key="messages">alfresco/messages/bootstrap-templates</prop>
                </props>
                <props>
                    <prop key="path">/${spaces.company_home.childname}/${spaces.dictionary.childname}/${spaces.templates.content.childname}</prop>
                    <prop key="location">alfresco/templates/content_template_examples.xml</prop>
                </props>
                <props>
                    <prop key="path">/${spaces.company_home.childname}/${spaces.dictionary.childname}/${spaces.templates.email.childname}</prop>
                    <prop key="location">alfresco/templates/email_templates.acp</prop>
                </props>
                <props>
                    <prop key="path">/${spaces.company_home.childname}/${spaces.dictionary.childname}/${spaces.templates.rss.childname}</prop>
                    <prop key="location">alfresco/templates/rss_templates.acp</prop>
                </props>
                <props>
                    <prop key="path">/${spaces.company_home.childname}/${spaces.dictionary.childname}/${spaces.scripts.childname}</prop>
                    <prop key="location">alfresco/bootstrap/example_javascripts.acp</prop>
                </props>
            </list>
        </property>
    </bean>

    <bean id="workflowBootstrap" parent="workflowDeployer">
      <property name="workflowDefinitions">
         <list>
            <props>
               <prop key="engineId">jbpm</prop>
               <prop key="location">alfresco/workflow/review_processdefinition.xml</prop>
               <prop key="mimetype">text/xml</prop>
               <prop key="redeploy">false</prop>
            </props>
            <props>
               <prop key="engineId">jbpm</prop>
               <prop key="location">alfresco/workflow/adhoc_processdefinition.xml</prop>
               <prop key="mimetype">text/xml</prop>
               <prop key="redeploy">false</prop>
            </props>
         </list>
      </property>
      <property name="models">
         <list>
            <value>alfresco/workflow/workflowModel.xml</value>
            <value>alfresco/workflow/customWorkflowModel.xml</value>
         </list>
      </property>
      <property name="labels">
         <list>
            <value>alfresco/workflow/workflow-messages</value>
                                <value>alfresco/workflow/customWorkflow-messages</value>
         </list>
      </property>
   </bean>

    <!– Bootstrap any extensions –>

    <import resource="classpath*:alfresco/extension/bootstrap/*-context.xml" />

    <!– Descriptor Service –>

    <bean id="descriptorComponent" class="org.alfresco.repo.descriptor.DescriptorServiceImpl">
       <property name="descriptor">
          <value>classpath:alfresco/version.properties</value>
       </property>
       <property name="systemBootstrap">
           <ref bean="systemBootstrap"/>
       </property>
       <property name="transactionService">
           <ref bean="transactionComponent"/>
       </property>
       <property name="namespaceService">
           <ref bean="namespaceService"/>
       </property>
       <property name="nodeService">
           <ref bean="nodeService"/>
       </property>
       <property name="searchService">
           <ref bean="searchService"/>
       </property>
    </bean>

    <!– This component ensures that patches get applied on startup –>

    <bean id="patchExecuter" class="org.alfresco.repo.admin.patch.PatchExecuter">
        <property name="patchService">
            <ref bean="PatchService" />
        </property>
    </bean>

    <!– CIFS Server –>

    <bean id="fileServerConfiguration" class="org.alfresco.filesys.server.config.ServerConfiguration" parent="fileServerConfigurationBase">
       <property name="configService">
           <ref bean="fileServersConfigService"/>
       </property>
    </bean>
   
    <bean id="cifsServer" class="org.alfresco.filesys.CIFSServer" destroy-method="stopServer">
        <constructor-arg>
           <ref local="fileServerConfiguration"/>
        </constructor-arg>
    </bean>
  
    <!– FTP Server –>
   
    <bean id="ftpServer" class="org.alfresco.filesys.FTPServer" destroy-method="stopServer">
        <constructor-arg>
           <ref local="fileServerConfiguration"/>
        </constructor-arg>
    </bean>

   <!– Startup Message –>

    <bean id="startupLog" class="org.alfresco.repo.descriptor.DescriptorStartupLog">
       <property name="descriptorService">
             <ref local="descriptorComponent"/>
       </property>
   </bean>
   
</beans>


Outcomes