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.
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
CASE-4 Automating Business Processes in Denver: A Technical Case Study
1. Automating Business Processes in Denver
A Technical Case Study"
" " "Eric Harper " " " "Zia Consulting" " "eharper@ziaconsulting.com"
" " "Paul Lungu " " "City & County of Denver " " paul.lungu@denvergov.org"
2. Who are we?"
Eric Harper
• Zia Consulting"
• Architect/PM/Developer"
Paul Lungu
• City & County of Denver"
• Associate Developer"
3. 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
Our
Partners
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
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.
Enterprise Mobile Applications
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.
Zia s Agile Solution Methodology
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.
4. 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!
5. Denverʼs Many Content Management
Systems"
Poor
UI
Meager
search
capability
Manual
load
of
metadata
Slow
Performance
Memory
Leaks
Nightly
Server
Reboots
One
security
role
14
disconnected
Doc
Mgmt
systems
Poor
audi=ng
&
RM
capability
LiFle
Staff
Exper=se
6. 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"
7. 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)"
8. 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"
10. Customizations"
Web Services UI Customizations
• Workflow Initiation" • Simple (& Non-Simple)
• Other apps interfacing " Filtered Association Gen"
with Alfresco" • Content Upload"
• Wiring webscripts with JSF"
Workflow Features
• Action Classes" Custom Actions on Spaces
• Delegation"
Custom Core Services
• Electronic Signature (PIN)"
• Rules-driven Assignment" Testing
• PDF Generation" • Workflow Testing"
• Unit testing actions, web
services"
11. 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?"
12. 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;
13. 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
15. 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"
16. 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>
17. 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"
18. 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(){
19. 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>
20. 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!
21. 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"