Upload
alfresco-software
View
1.874
Download
3
Embed Size (px)
DESCRIPTION
In 2010, the City and County of Denver turned to Zia Consulting to implement Alfresco to store contract and financial records and used CMIS to integrate with PeopleSoft Financials. Then the city wanted to fully automate the process for requesting, writing and approving contracts. Zia augmented their Fresh Workflow Alfresco solution, adding a workflow initiation web service, connected workflows, rules-driven task assignment, digital signatures and a management dashboard. Explorer and Share user interface customizations also streamline workflow tasks. This presentation reviews in depth the tools and technologies that were used to implement the solution, covers lessons learned and previews additional features on Zia’s roadmap.
Citation preview
Automating Business Processes in DenverA Technical Case Study"
" " "Eric Harper " " " "Zia Consulting" " "[email protected]"
" " "Paul Lungu " " "City & County of Denver " " [email protected]"
Who are we?"Eric Harper
• Zia Consulting"• Architect/PM/Developer"
Paul Lungu • City & County of Denver"• Associate Developer"
Who is Zia? A firm with deep technical expertise & strategic insight, coupled with our Agile software methodology, provides numerous benefits to our customers"
Enterprise Content Management (ECM) An ECM is a cultivation of knowledge -- one of the most valuable assets to any organization. A proper ECM system ensures content has integrity through proper version control, allows producers to easily create content and publish it to a variety of mediums, and it automates processes, streamlining the review, approval and distribution of content across an organization. Zia's ECM offerings provide all of these benefits, and more, in a manner tailored to the client's business needs.
Enterprise 2.0 Solutions
Enterprise Mobile Applications
At its heart, our Agile-based methodology is centered on a close collaborative approach to maximizing value for our customers. Constant client communication is necessary to ensure that each development iteration addresses features with the highest business value, even if those features were unknown at the launch of the project.
Zia’s Agile Solution Methodology
Mobile workforce enablement is an increasing trend for Zia’s enterprise customers. Zia’s Fresh Docs ECM application is available for iPhone, iPad and Android platforms. The newly released Fresh Xpense application is a simple expense and receipt capture tool for the iPhone that integrates with Xpenser.com.
The focus of technology should always be on people. Zia enables our customers to gain tremendous competitive advantage by allowing their team to collaborate more effectively, respond more quickly to changes, and make better decisions. Adopters of Enterprise 2.0 solutions will find they have a more productive, engaged and informed team.
Our Partners
Some Facts about Denver"
The City"• Founded in 1858!• Strong Mayor form of government, consolidated City-County!• Population of 600,000!• 16th largest metro area in the United States!• 10th largest central business district in the United States!• 250,000 households!• One of the fittest and most highly educated cities in the nation!• 11,000 city employees!• $1+ billion annual budget!
Denver Technology Services"• Formed in 2005!• Previously federated organizational model!• 300 IT employees!• $48M yearly budget!
Denverʼs Many Content Management Systems"
Meager search capability
Nightly Server Reboots
14 disconnected Doc Mgmt systems
Poor audi=ng & RM capability
Memory Leaks
Manual load of metadata
One security role
Poor UI
Slow Performance
LiFle Staff Exper=se
Turned to Alfresco + Zia Consulting"Phase 1: Scanned Documents (2010)
• Contracts & Financial Records"• Migrated off Liberty IMS to Alfresco + KOFAX"
• Implemented rules-based workflow"
Phase 2: CMIS Integrations (2010) • Document Repository for PeopleSoft CRM and Financials"• iOS App for City 311 Help Center"
Phase 3: Automated Contracting Process (2011) • Customized Advanced Workflow"
• Web Service integration with PeopleSoft"• Supports full lifecycle of contracting process"
Phase 4: Human Services Case Management (2011) • Ephesoft Imaging front end"• Repository Integration with custom apps"
Contracting Workflow Process"
Lifecycle • RFP or Contract Request"• Staff Reviews"• Contract Drafting"• Vendor Negotiation & Signature"• City Council Ordinance Process"• City Signatures"
Integration • PeopleSoft Financials (Requisition/Purchase Order)"• SIRE Legislative Information System (Ordinance)"• Oracle OBIEE (Reporting)"
Contracting Workflow Process"
Customized Features • SOAP Web Service for workflow initiation"• Task Email Notification"• Delegation"• “Connected” Workflow"• Rules-driven task assignment"• Automated PDF transformation/generation"• UI Customizations"• Electronic Signature"• Management Dashboard"
Demo"
Customizations"
Web Services • Workflow Initiation"• Other apps interfacing "
with Alfresco"
Workflow Features • Action Classes"• Delegation"• Electronic Signature (PIN)"• Rules-driven Assignment"• PDF Generation"
UI Customizations • Simple (& Non-Simple)
Filtered Association Gen"• Content Upload"• Wiring webscripts with JSF"
Custom Actions on Spaces
Custom Core Services
Testing • Workflow Testing"• Unit testing actions, web
services"
Web Service example"Things you may want to do with web services (Some of this can be done using CMIS WS API)
• Search the repo for docs and meta-data"• Initiate workflow"• Put docs into repo"• Why not just use CMIS API?"
Web Service example (continued)Exposing servlet-based web services using JAX-WS"Spring Wiring <jaxws:endpoint id="fadService" address="/ccd/FadWebService" implementor="#fadWebService">
</jaxws:endpoint>
<bean name="fadWebService" class="us.co.denver.webservice.FADWebServiceImpl">
<property name="nodeService" ref="NodeService" />
<property name="searchService" ref="SearchService" />
<property name="fileFolderService" ref="FileFolderService" />
<property name="namespaceService" ref="NamespaceService" />
<property name="transactionService" ref="TransactionService" />
<property name="repositoryHelper" ref="repositoryHelper"/>
</bean>
Java Code (Annotation Driven) @WebService
public interface FADWebService{
public Object[] getDocumentInfo(Criteria [] c) throws FaultMsg;
public String removeDocument(String uuid) throws FaultMsg;
public String updateDocument(String uuid) throws FaultMsg;
Custom Workflow Wiring Example"web-client-application-custom-context.xml – define the web-client-config-custom-wf.xml
web-client-config-custom-wf.xml – defines the properties that will be displayed in your workflow
workflow_def.xml – defines the flow of your work flow
workflow_model.xml – defines the tasks in your workflow
workflow-messages.properties – defines labels in workflow
Workflow Action Example"Inserting page templates into the workflow <task-node name="signature-generation">
<event type="node-enter"> <script>
<variable name="contractStage" access="write" /> <expression><![CDATA[contractStage = "stage4";]]></expression>
</script> <action class="us.co.denver.repo.workflow.jbpm.GenerateContractAction"> <method>insertVendorSignatureTemplate</method> </action> <action class="us.co.denver.repo.workflow.jbpm.GenerateContractAction"> <method>insertCharterSignatureTemplate</method> </action>
</event> <task name="gawf:signatureGenerationTask">
<assignment class="us.co.denver.repo.workflow.jbpm.assignment.DelegatableAssignment"> <actor>#{ccdwf_attorney}</actor> </assignment>
</task> <transition name="done" to="generate-signature-draft"/>
</task-node>
Filtered Association Generator Example"
Avoid this sort of thing. It is convoluted and complicated. Every time I look at it, I think how did I do this?
This is an good example of why Share is better • Faces"
• faces-config-custom.xml - to configure the managed bean – the bean that is controlled by faces frame work"
• " web-client-config-custom-wf.xml - to configure UI property sheet"
• Workflow"• FilteredAssociationGenerator.java – sets up the Component"• UIFilteredAssociationEditor.java – does heavy lifting with alfresco API (associates groups
with UI component)"• " workflow_model.xml"
• Spring"• " web-client-application-custom-context.xml – tell spring from where to load the faces config
property sheet"
Custom Core Services Example"Extending the service registry - Wiring up JDBC service
custom-web-context.xml Create the serivce
<bean id="CCDJDBCService" class="us.co.denver.repo.service.CCDJDBCServiceImpl">
<property name="workFlowNameMappingDAO" ref="workFlowNameMappingDAO" />
<property name="ServiceRegistry" ref="CCDServiceRegistry"/>
</bean>
Create DAO to use JDBC template
<bean id="workFlowNameMappingDAO" class="us.co.denver.repo.dao.WorkFlowNameMappingDAOImpl">
<property name="simpleJdbcTemplate" ref="simpleJdbcTemplate" />
</bean>
Extend the Alfresco service registry
<bean id="CCDServiceRegistry" class="us.co.denver.repo.service.CCDServiceDescriptorRegistry" parent="ServiceRegistry">
</bean>
Wire up Spring's simple JDBC template to query the DB
<bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="defaultDataSource" />
</bean>
Workflow Testing Example"
Base Test • Initialize Spring!
new ClassPathXmlApplicationContext("classpath:alfresco/application-context.xml"); serviceRegistry = (ServiceRegistry) _context.getBean(ServiceRegistry.SERVICE_REGISTRY);
Abstract Workflow Test • Set up workflow"• EndAssignedTaskByName"
Workflow Test • Define path for workflow test"• Task Completion Methods – update properties and end task"• Start with the happy path, incorporate revision paths incrementally"
Unit Testing Example"Dependencies
• Not easy to mock dependencies"• Easy to load Spring container"
new ClassPathXmlApplicationContext("classpath:alfresco/application-context.xml");
You can also use the context config annotation "@ContextConfiguration(locations={"classpath:alfresco/application-context.xml","classpath:us/co/denver/fads/webservice/fad-service-test-context.xml"})
Don’t use @RunWith (SpringJUnit4ClassRunner.class)
Get Service Registry and then test classes serviceRegistry = (ServiceRegistry) context.getBean(ServiceRegistry.SERVICE_REGISTRY);
Setup and Create tests @Before public void setup(){
@Test public void testGetDocumentInfoWhenYEqualsX(){
Jetty Embedded"We use Jetty for development
• Allows projects in workspace to run without building war • Starts fast, less restarts • Set up projects to build as AMPS • Easy to configure new projects to use Jetty • Easy to configure different startup setups depending on projects • Point jetty at config and classes dir in your project
<Set name="extraClasspath"> <Call class="org.apache.commons.lang.StringUtils" name="join"> <Arg> <Array type="java.lang.String"> <Item>../CCDCore/build/classes</Item> <Item>../CCDCore/config</Item> <Item>../ContractingAutomation/build/classes</Item> <Item>../ContractingAutomation/config</Item>
Lessons Learned"
• Long workflows difficult to get right (both design and implement) • Better to start simple and build incrementally • Testing is difficult (build infrastructure as you go) • Use web scripts when possible for UI modifications • J2EE servers can be difficult • Indexing Clustering issues • Alfresco configs
• LDAP • JODConverter • Fileservers • Don’t forget Zero Day config
• Test Performance!
It helps to know"Java, Javascript, Faces, Spring
Spring Framework • Spring patterns - DI/IoC, Interface, Marker, Factory"• Spring initialization life-cycle"
Alfresco API • Service based architecture"• Not very intuitive"• Consider getting properties from a node. You would expect to be able to get properties with a noderef. Instead you must use the node service."
Xpath • For complex queries use xpath and searchservice"• For simple queries use FileFolderService and simpleSearch"
Q&A"