...
Let's create an XML file that defines some users who will help us simulate the Request Firewall Change process. We have requester1 who will submit all requests and FPG1 & FPG2, who will be tasked with reviewing and approving (or disapproving) those requests. Note: In the Kuali Rice production environment, users will be managed via the Identity Management system.
Code Block |
---|
|
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="ns:workflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:workflow resource:WorkflowData">
<users xmlns="ns:workflow/User" xsi:schemaLocation="ns:workflow/User resource:User">
<user>
<workflowId>requester1</workflowId>
<emplId>requester1</emplId>
<authenticationId>requester1</authenticationId>
<uuId>requester1</uuId>
<emailAddress>requester1@ucdavis.edu</emailAddress>
<displayName>Requester One</displayName>
<givenName>Requester</givenName>
<lastName>One</lastName>
</user>
<user>
<workflowId>FPG1</workflowId>
<emplId>FPG1</emplId>
<authenticationId>FPG1</authenticationId>
<uuId>FPG1</uuId>
<emailAddress>FPG1@ucdavis.edu</emailAddress>
<displayName>Firewall Group Policy User One</displayName>
<givenName>Firewall Group Policy User</givenName>
<lastName>One</lastName>
</user>
<user>
<workflowId>FPG2</workflowId>
<emplId>FPG2</emplId>
<authenticationId>FPG2</authenticationId>
<uuId>FPG2</uuId>
<emailAddress>FPG2@ucdavis.edu</emailAddress>
<displayName>Firewall Group Policy User Two</displayName>
<givenName>Firewall Group Policy User</givenName>
<lastName>Two</lastName>
</user>
</users>
</data>
|
Note: In the Kuali Rice production environment, users will be managed via the Identity Management system. |
Create Workgroups
Here we create a workgroup called eDoc.FirewallPolicyGroup.Workgroup. Per our business process, all Firewall Change Requests will be routed to this group for review and approval. The users FPG1 and FPG2 are hereby inducted into this group. Note 1: Just like users, workgroups will be managed via the Identity Management system in the Kuali Rice production environment.
Note 2: As more and more UCD departments use eDocLite, workgroup names will tend to become longer (i.e. eDoc.IET.DataCenter.FirewallPolicyGroup.Workgroup vs. eDoc.IET.Middleware.FirewallPolicyGroup.Workgroup vs. eDoc.ORMP.FacilitiesManagement.FMIS.FirewallPolicyGroup.Workgroup)
Code Block |
---|
|
<?xml version="1.0" encoding=" Code Block |
---|
|
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="ns:workflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:workflow resource:WorkflowData">
<workgroups xmlns="ns:workflow/Workgroup" xsi:schemaLocation="ns:workflow/Workgroup resource:Workgroup">
<workgroup>
<workgroupName>eDoc.FirewallPolicyGroup.Workgroup</workgroupName>
<description>Firewall Policy Group for Firewall Change Requests</description>
<members>
<authenticationId>FPG1</authenticationId>
<authenticationId>FPG2</authenticationId>
</members>
</workgroup>
</workgroups>
</data>
|
...
Note 1: | Just like users, workgroups will be managed via the Identity Management system in the Kuali Rice production environment. |
Note 2: | Once Kuali Rice is in production, workgroup names will tend to be long as a result of several UCD departments using eDocLite: - eDoc.IET.DataCenter.FirewallPolicyGroup.Workgroup
- eDoc.IET.Middleware.FirewallPolicyGroup.Workgroup
- eDoc.OOA.AFS.FirewallPolicyGroup.Workgroup
- eDoc.ORMP.FacilitiesManagement.FMIS.FirewallPolicyGroup.Workgroup
|
Create the Parent Document Type
Here we create a parent document type that defines the behavior of all Request Firewall Change documents. This particular parent document type defines everything short of routing paths. The idea is to allow for the possibility of other business processes called "Request Firewall Change" but will have different routing paths, validation rules, workgroups, etc., but use the same form, have the same super user workgroup, the same exception workgroup, etc.
Code Block |
---|
title | RFC-ParentDocType.xml |
---|
|
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="ns:workflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:workflow resource:WorkflowData">
<documentTypes xmlns="ns:workflow/DocumentType" xsi:schemaLocation="ns:workflow/DocumentType resource:DocumentType">
<documentType>
<name>eDoc.RequestFirewallChange.Parent</name>
<description>eDoc.RequestFirewallChange Parent Document</description>
<label>eDoc.RequestFirewallChange Parent Document</label>
<postProcessorName>edu.iu.uis.eden.edl.EDocLitePostProcessor</postProcessorName>
<superUserWorkgroupName>eDoc.FirewallPolicyGroup.Workgroup</superUserWorkgroupName>
<blanketApprovePolicy>NONE</blanketApprovePolicy>
<docHandler>${workflow.url}/EDocLite</docHandler>
<active>true</active>
<routingVersion>2</routingVersion>
</documentType>
</documentTypes>
</data>
{workflow.url}/EDocLite</docHandler>
<active>true</active>
<routingVersion>2</routingVersion>
</documentType>
</documentTypes>
</data>
|
Note: | Here we define the superUserWorkgroupName as eDoc.FirewallPolicyGroup.Workgroup. In production, the super user workgroup will likely be the group of eDocLite super users or Kuali Rice system administrators (some systemwide administrative group). Code Block |
---|
title | RFC-ChildDocTypes.xml |
---|
|
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="ns:workflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:workflow resource:WorkflowData">
<documentTypes xmlns="ns:workflow/DocumentType" xsi:schemaLocation="ns:workflow/DocumentType resource:DocumentType">
<documentType>
<name>eDoc.RequestFirewallChange</name>
<parent>eDoc.RequestFirewallChange.Parent</parent>
<description>eDoc.RequestFirewallChange Child Document Type</description>
<label>eDoc.RequestFirewallChange Child Document Type</label>
|
|
...
<defaultExceptionWorkgroupName>eDoc.FirewallPolicyGroup.Workgroup</defaultExceptionWorkgroupName> |
|
...
...
<routePaths>
<routePath>
<start name="Initiated" nextNode="eDoc.RequestFirewallChange.Node1" />
<requests name="eDoc.RequestFirewallChange.Node1" />
</routePath>
</routePaths>
<routeNodes>
<start name="Initiated">
<activationType>P</activationType>
<mandatoryRoute>false</mandatoryRoute>
<finalApproval>false</finalApproval>
</start>
<requests name="eDoc.RequestFirewallChange.Node1">
<activationType>P</activationType>
<ruleTemplate>eDoc.RequestFirewallChange.Node1</ruleTemplate>
<mandatoryRoute>false</mandatoryRoute>
<finalApproval>false</finalApproval>
</requests>
</routeNodes>
</documentType>
</documentTypes>
</data>
|
- The eDocLite Form Skeleton
Code Block |
---|
|
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="ns:workflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:workflow resource:WorkflowData">
<edoclite xmlns="ns:workflow/EDocLite" xsi:schemaLocation="ns:workflow/EDocLite resource:EDocLite">
<edl name="eDoc.RequestFirewallChange.Form" title="Request Firewall Change">
<security />
<createInstructions>** Fields with an asterisk are required.</createInstructions>
<instructions>** Fields with an asterisk are required.</instructions>
<validations />
<attributes />
...
...
</edl>
<style name="eDoc.RequestFirewallChange.Style">
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my-class="xalan://edu.iu.uis.eden.edl.WorkflowFunctions" version="1.0">
<xsl:include href="widgets" />
<xsl:output indent="yes" method="html" omit-xml-declaration="yes" version="4.01" />
<xsl:variable name="actionable" select="/documentContent/documentState/actionable" />
<xsl:variable name="docHeaderId" select="/documentContent/documentState/docId" />
<xsl:variable name="editable" select="/documentContent/documentState/editable" />
<xsl:variable name="globalReadOnly" select="/documentContent/documentState/editable != 'true'" />
<xsl:variable name="docStatus" select="//documentState/workflowDocumentState/status" />
<xsl:variable name="isAtNodeInitiated" select="my-class:isAtNode($docHeaderId, 'Initiated')" />
<xsl:variable name="isPastInitiated" select="my-class:isNodeInPreviousNodeList('Initiated', $docHeaderId)" />
<xsl:variable name="isUserInitiator" select="my-class:isUserInitiator($docHeaderId)" />
<xsl:param name="overrideMain" select="'true'" />
<xsl:template name="mainForm">
<html xmlns="">
<head>
<script language="javascript" />
<xsl:call-template name="htmlHead" />
</head>
<body onload="onPageLoad()">
<xsl:call-template name="errors" />
<xsl:call-template name="header" />
<xsl:call-template name="instructions" />
<xsl:variable name="formTarget" select="'EDocLite'" />
<form action="{$formTarget}" enctype="multipart/form-data" id="edoclite" method="post" onsubmit="return validateOnSubmit(this)">
<xsl:call-template name="hidden-params" />
<xsl:call-template name="mainBody" />
<xsl:call-template name="notes" />
<br />
<xsl:call-template name="buttons" />
<br />
</form>
<xsl:call-template name="footer" />
</body>
</html>
</xsl:template>
<xsl:template name="mainBody">
...
...
</xsl:template>
<xsl:template name="nbsp">
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
</xsl:template>
</xsl:stylesheet>
</style>
<association>
<docType>eDoc.RequestFirewallChange</docType>
<definition>eDoc.RequestFirewallChange.Form</definition>
<style>eDoc.RequestFirewallChange.Style</style>
<active>true</active>
</association>
</edoclite>
</data>
|
- Form Definition
Code Block |
---|
|
<fieldDef name="dateOfChange" title="Date and Time for Change">
<display>
<type>text</type>
</display>
<validation required="true">
<regex>^[0-1]?[0-9](/|-)[0-3]?[0-9](/|-)[1-2][0-9][0-9][0-9]$</regex>
<message>Enter a valid date in the format mm/dd/yyyy.</message>
</validation>
</fieldDef>
<fieldDef name="descriptionOfChange" title="Description of the Port Change">
<display>
<type>textarea</type>
<meta>
<name>rows</name>
<value>5</value>
</meta>
<meta>
<name>cols</name>
<value>60</value>
</meta>
<meta>
<name>wrap</name>
<value>hard</value>
</meta>
</display>
<validation required="true">
<message>Enter a description of the port change.</message>
</validation>
</fieldDef>
<fieldDef name="ingressEgressCharacteristic" title="Ingress/Egress Characteristic">
<display>
<type>textarea</type>
<meta>
<name>rows</name>
<value>5</value>
</meta>
<meta>
<name>cols</name>
<value>60</value>
</meta>
<meta>
<name>wrap</name>
<value>hard</value>
</meta>
</display>
<validation required="true">
<message>Enter the ingress/egress characteristic.</message>
</validation>
</fieldDef>
<fieldDef name="destinationSourceSpecification" title="Destination/Source Specification">
<display>
<type>textarea</type>
<meta>
<name>rows</name>
<value>5</value>
</meta>
<meta>
<name>cols</name>
<value>60</value>
</meta>
<meta>
<name>wrap</name>
<value>hard</value>
</meta>
</display>
<validation required="true">
<message>Enter the destination/source specification.</message>
</validation>
</fieldDef>
<fieldDef name="termOfRuleChange" title="Term of Rule Change (indefinite or otherwise)">
<display>
<type>text</type>
<meta>
<name>size</name>
<value>50</value>
</meta>
</display>
<validation required="true">
<message>Enter term of the rule change.</message>
</validation>
</fieldDef>
<fieldDef name="relatedProject" title="Project Related to Requested Rule(s) Change">
<display>
<type>text</type>
<meta>
<name>size</name>
<value>50</value>
</meta>
</display>
<validation required="true">
<message>Enter a related project to the requested rule change.</message>
</validation>
</fieldDef>
|
- Form Stylesheet
Code Block |
---|
|
<xsl:template name="mainBody">
<table xmlns="" align="center" border="0" cellpadding="0" cellspacing="0" class="bord-r-t" width="80%">
<tr>
<td align="left" border="3" class="thnormal" colspan="1">
<br />
<h3>
University of California, Davis
<br />
eDoclite Tutorial
</h3>
<br />
</td>
<td align="center" border="3" class="thnormal" colspan="2">
<br />
<h2>Request Firewall Change Form</h2>
</td>
</tr>
<tr>
<td class="headercell5" colspan="100%">
<b>Request Details</b>
</td>
</tr>
<tr>
<td class="thnormal">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'dateOfChange'" />
<xsl:with-param name="renderCmd" select="'title'" />
</xsl:call-template>
<font color="#ff0000">*</font>
</td>
<td class="datacell">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'dateOfChange'" />
<xsl:with-param name="renderCmd" select="'input'" />
<xsl:with-param name="readOnly" select="$isPastInitiated" />
</xsl:call-template>
</td>
</tr>
<tr>
<td class="thnormal">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'descriptionOfChange'" />
<xsl:with-param name="renderCmd" select="'title'" />
</xsl:call-template>
<font color="#ff0000">*</font>
</td>
<td class="datacell">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'descriptionOfChange'" />
<xsl:with-param name="renderCmd" select="'input'" />
<xsl:with-param name="readOnly" select="$isPastInitiated" />
</xsl:call-template>
</td>
</tr>
<tr>
<td class="thnormal">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'ingressEgressCharacteristic'" />
<xsl:with-param name="renderCmd" select="'title'" />
</xsl:call-template>
<font color="#ff0000">*</font>
</td>
<td class="datacell">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'ingressEgressCharacteristic'" />
<xsl:with-param name="renderCmd" select="'input'" />
<xsl:with-param name="readOnly" select="$isPastInitiated" />
</xsl:call-template>
</td>
</tr>
<tr>
<td class="thnormal">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'destinationSourceSpecification'" />
<xsl:with-param name="renderCmd" select="'title'" />
</xsl:call-template>
<font color="#ff0000">*</font>
</td>
<td class="datacell">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'destinationSourceSpecification'" />
<xsl:with-param name="renderCmd" select="'input'" />
<xsl:with-param name="readOnly" select="$isPastInitiated" />
</xsl:call-template>
</td>
</tr>
<tr>
<td class="thnormal">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'termOfRuleChange'" />
<xsl:with-param name="renderCmd" select="'title'" />
</xsl:call-template>
<font color="#ff0000">*</font>
</td>
<td class="datacell">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'termOfRuleChange'" />
<xsl:with-param name="renderCmd" select="'input'" />
<xsl:with-param name="readOnly" select="$isPastInitiated" />
</xsl:call-template>
</td>
</tr>
<tr>
<td class="thnormal">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'relatedProject'" />
<xsl:with-param name="renderCmd" select="'title'" />
</xsl:call-template>
<font color="#ff0000">*</font>
</td>
<td class="datacell">
<xsl:call-template name="widget_render">
<xsl:with-param name="fieldName" select="'relatedProject'" />
<xsl:with-param name="renderCmd" select="'input'" />
<xsl:with-param name="readOnly" select="$isPastInitiated" />
</xsl:call-template>
</td>
</tr>
</table>
<br xmlns="" />
<xsl:template>
|
|
Create the Rule Template
Code Block |
---|
title | RFC-RuleTemplate.xml |
---|
|
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="ns:workflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:workflow resource:WorkflowData">
<ruleTemplates xmlns="ns:workflow/RuleTemplate" xsi:schemaLocation="ns:workflow/RuleTemplate resource:RuleTemplate">
<ruleTemplate>
<name>eDoc.RequestFirewallChange.Node1</name>
<description>eDocLite RequestFirewallChange Routing</description>
</ruleTemplate>
</ruleTemplates>
</data>
|
...