<p> Capstone Project Group #3 The TieFlow WorkFlow ToolKit Process Definition XML</p><p>DEMO 1 Date: April 5, 2007 Venue: Tietronix Inc.</p><p>Members: </p><p>Jigyasa Dubey Plabita Baruah Preetha Boisen Paul Sarjana Singh</p><p>Instructor: Dr.Kwok Bun Yue</p><p>Mentors: Mr. Scott Hetherington Mr. Abbasi Dhilawa</p><p>1 Contents 1. Use case diagram ……………………………………………………………</p><p>2. Class Diagram ………………………………………………………………</p><p>3. Activity Diagram ……………………………………………………………</p><p>4. Sequence Diagram ………………………………………………………….</p><p>5. Mapping File 5.1. Mapping.xls ……………………………………………………………</p><p>6. Configuration File 6.1. TieFlow-XpdlTransformation.xml ……………………………………</p><p>7. Source Code 6.0 TieflowXmlConverter.java 7.1. XMLTranslator.java …………………………………………………….. 7.2. XMLTranslatorUtility.java ……………………………………………… 7.3. NodeTranslator.java ……………………………………………………… 7.4. ElementToElementTranslator.java ………………………………………. 7.5. ElementToAttributeTranslator.java ………………………………………. 7.6. AttributeToElementTranslator.java ………………………………………. 7.7. AttributeToAttributeTranslator.java ………………………………………</p><p>8. Test Run and sample output</p><p>2 Use Case Diagram</p><p>Translate User</p><p>Class Diagram</p><p>3. Activity Diagram :</p><p>3 User</p><p>Select Files</p><p>Select XML Select File Configuration XML</p><p>Translate XML File to String</p><p>Parse XML File</p><p>Create Hash Maps</p><p>Translate Node</p><p>Output XML</p><p>Validate</p><p>4 xmltranslator : translatorutil:XMLTranslatorUtility nodetranslator:NodeTranslator new() : new():ElementtoElementTran new() : new() : XMLTranslator : XMLTranslatorUtility : NodeTranslator ElementtoElementTranslator slator : ElementtoAttribute AttriuttoElement AttributetoAttribute : User translatexmlfiletostring( )</p><p> translate( )</p><p> translatorutil( )</p><p> void( )</p><p> translateNode( )</p><p> createlastNode( )</p><p> void( )</p><p> createlastNode( )</p><p> void( )</p><p> createlastNode( )</p><p> void( )</p><p> createlastNode( )</p><p> void( )</p><p> void( )</p><p>Sequence Diagram</p><p>Configuration File</p><p>File name: TieFlow-XpdlTransformation.xml</p><p><?xml version="1.0" encoding="utf-8"?> <Translations> <Translation> <RootNodeName>Package</RootNodeName> </Translation> <Translation> <NodeName translatorClassName="ElementToElementTranslator">Package::Role</NodeName> <NodeName translatorClassName="ElementToElementTranslator">Package::Lane</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Role::id</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Lane::id</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Role::name</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Lane::name</NodeName> </Translation> <Translation> <NodeName translatorClassName="ElementToElementTranslator">Package::Process</NodeName> <NodeName translatorClassName="ElementToElementTranslator">Package::WorkFlowProcess</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Process::id</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::WorkFlowProcess::id</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Process::name</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::WorkFlowProcess::name</NodeName> </Translation> <Translation></p><p>5 <NodeName translatorClassName="ElementToElementTranslator">Package::Process::(empty)</NodeName> <NodeName translatorClassName="ElementToElementTranslator" onlyOne="true">Package::WorkFlowProcess::ProcessHeader</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Process::timeUnit</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::WorkFlowProcess::ProcessHeader::DurationUnit</NodeName> </Translation> <Translation> <NodeName translatorClassName="ElementToElementTranslator">Package::RulesFileReference</NodeName> <NodeName translatorClassName="ElementToElementTranslator">Package::Association</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::RulesFileReference::rulesFileId</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Association::Id</NodeName> </Translation> <Translation> <NodeName translatorClassName="ElementToElementTranslator">Package::RulesFile</NodeName> <NodeName translatorClassName="ElementToElementTranslator">Package::Artifact</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::RulesFile::id</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Artifact::Id</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::RulesFile::type</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::Artifact::Name</NodeName> </Translation> <Translation> <NodeName translatorClassName="ElementToElementTranslator">Package::ContentDataSection</NodeName> <NodeName translatorClassName="ElementToElementTranslator">Package::DataFields</NodeName> </Translation> <Translation> <NodeName translatorClassName="ElementToElementTranslator" onlyOne="true">Package::ContentDataSection::ContentDataSectionField</NodeName> <NodeName translatorClassName="ElementToElementTranslator" onlyOne="true">Package::DataFields::DataField</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::ContentDataSection::ContentDataSectionField::id</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::DataFields::DataField::Id</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::ContentDataSection::ContentDataSectionField::name</NodeName > <NodeName translatorClassName="AttributeToAttributeTranslator">Package::DataFields::DataField::Name</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::ContentDataSection::ContentDataSectionField::dataType</NodeNa me> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::DataFields::DataField::DataType</NodeName> </Translation> <Translation> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::ContentDataSection::ContentDataSectionField::size</NodeName> <NodeName translatorClassName="AttributeToAttributeTranslator">Package::DataFields::DataField::Length</NodeName> </Translation> </Translations></p><p>TieflowXmlConverter.java [ Main GUI program ]</p><p> import java.io.*; import java.awt.*;</p><p>6 import java.awt.event.*; import javax.swing.*; import javax.swing.filechooser.*; public class TieflowXmlConverter extends JPanel implements ActionListener { static private final String newline = "\n"; JButton openButton, outButton, saveButton; JTextArea log; JFileChooser fc; //, fc_out; JLabel lblFilePath; JLabel lblHeader;</p><p> public TieflowXmlConverter() { super(new BorderLayout());</p><p>//Create the log first, because the action listeners //need to refer to it. log = new JTextArea(5,20); log.setMargin(new Insets(10,10,10,10)); log.setEditable(false); JScrollPane logScrollPane = new JScrollPane(log);</p><p>//Create a file chooser fc = new JFileChooser(); //fc_out = new JFileChooser(); //fc_out.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);</p><p> openButton = new JButton("Get Tietronix XML..."); openButton.addActionListener(this);</p><p> outButton = new JButton("Output XML Location..."); outButton.addActionListener(this);</p><p> saveButton = new JButton("Translate to XPDL..."); saveButton.addActionListener(this);</p><p>//For layout purposes, put the buttons in a separate panel JPanel buttonPanel = new JPanel(); //use FlowLayout buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS)); buttonPanel.add(openButton); buttonPanel.add(outButton); buttonPanel.add(saveButton);</p><p> lblHeader = new JLabel("Tietronix XML Transformer"); lblFilePath = new JLabel("XML File path to be displayed here kjhkjhjhjh");</p><p>//Add the buttons and the log to this panel. add(lblHeader, BorderLayout.PAGE_START); add(buttonPanel, BorderLayout.CENTER); add(logScrollPane, BorderLayout.LINE_END); add(lblFilePath, BorderLayout.PAGE_END);</p><p> setBackground(Color.green); }</p><p> public void actionPerformed(ActionEvent e) {</p><p>//Handle open button action. if (e.getSource() == openButton) { int returnVal = fc.showOpenDialog(TieflowXmlConverter.this);</p><p> if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile();</p><p> log.append("Opening: " + file.getName() + "." + newline); lblFilePath.setText(file.getPath());</p><p>7 } else { log.append("Open command cancelled by user." + newline); } log.setCaretPosition(log.getDocument().getLength());</p><p>} else if (e.getSource() == outButton) {</p><p>/* int returnVal = fc.showOpenDialog(TieflowXmlConverter.this);</p><p> if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc_out.getSelectedFile();</p><p> log.append("Opening: " + file.getName() + "." + newline); lblFilePath.setText(file.getPath()); } else { log.append("Open command cancelled by user." + newline); } log.setCaretPosition(log.getDocument().getLength()); */</p><p>} //Handle save button action. else if (e.getSource() == saveButton) {</p><p> log.append("Translating to XPDL standard. Please wait." + newline);</p><p>XMLTranslator translater = new XMLTranslator(); String OutputXMLString = translater.translateXMLFileToString(lblFilePath.getText(), "C:\\Capstone\\TieFlow-XpdlTransformation.xml"); System.out.println(OutputXMLString); translater.WriteOutputXMLStringToXMLFile(OutputXMLString, lblFilePath.getText());</p><p> log.append("Translated to c:\\Capstone\\output_file.xml." + newline);</p><p> log.setCaretPosition(log.getDocument().getLength()); } }</p><p>/** * Create the GUI and show it. For thread safety, * this method should be invoked from the * event-dispatching thread. */ private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("TieflowXmlConverter"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p><p>//Create and set up the content pane. JComponent newContentPane = new TieflowXmlConverter(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane);</p><p>//Display the window. frame.pack(); frame.setVisible(true); }</p><p> public static void main(String[] args) { //Schedule a job for the event-dispatching thread:</p><p>8 //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } XMLTranslator.java import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; import java.io.FileOutputStream; import java.io.PrintStream; import java.util.HashMap; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.traversal.DocumentTraversal; import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.NodeIterator; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import com.sun.org.apache.xml.internal.serialize.XMLSerializer;</p><p>/** * @author BPaul * Created: Mar 15, 2007 */ public class XMLTranslator { protected DocumentBuilderFactory _docBuilderFactory; protected HashMap _configNamesToConfigNodesMap; protected HashMap _configNamesXrefMap; protected XMLTranslatorUtility _translatorUtil;</p><p>/* This method reads the contents of input XML file as a string and the configuration * file and translates it * to output XML based upon the configuration file. The output XML is returned in a * string format */ public String translateXMLStringToString(String inputXml, String configFileName){ try{ InputSource inXmlSource = new InputSource(new StringReader(inputXml)); FileInputStream configFis = new FileInputStream(new File(configFileName)); String outXml = translate(inXmlSource.getByteStream(), configFis); configFis.close(); return outXml; } catch(FileNotFoundException ex){ ex.printStackTrace(); } catch(IOException ex){</p><p>9 ex.printStackTrace(); } return ""; }</p><p>/* This method reads the contents of input XML file given the input file name and the * configuration file and translates it to output XML based upon the configuration file. * The output XML is returned in a string format */ public String translateXMLFileToString(String inputXmlFile, String configFileName){ try{ //read from the input XML file FileInputStream fis = new FileInputStream(new File(inputXmlFile)); //read from the configuration file FileInputStream configFis = new FileInputStream(new File(configFileName)); String outXml = translate(fis, configFis);</p><p> fis.close(); configFis.close(); return outXml; } catch(FileNotFoundException ex){ ex.printStackTrace(); } catch(IOException ex){ ex.printStackTrace(); }</p><p> return ""; }</p><p>/* This method reads from the given input file as a string. It checks the configuration file given the * the configuration file name, translates the XML file and writes it to the output file * given the output file name */</p><p> public String translateXMLStringToFile(String inputXml, String configFileName, String outputFile){ try{ InputSource inXmlSource = new InputSource(new StringReader(inputXml)); FileInputStream configFis = new FileInputStream(new File(configFileName)); String outXml = translate(inXmlSource.getByteStream(), configFis); DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(outputFile)))); out.writeChars(outXml); out.close(); configFis.close(); return outXml; } catch(FileNotFoundException ex){ ex.printStackTrace(); } catch(IOException ex){ ex.printStackTrace(); } return ""; }</p><p>/* This method reads the from the given input file. It checks the configuration file given the * the configuration file name, translates the XML file and writes it to the output file * given the output file name */ public String translateXMLFileToFile(String inputXmlFile, String configFileName, String outputFile){ try{ FileInputStream fis = new FileInputStream(new File(inputXmlFile)); FileInputStream configFis = new FileInputStream(new File(configFileName)); String outXml = translate(fis, configFis); DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(outputFile)))); out.writeChars(outXml); out.close();</p><p>10 fis.close(); configFis.close(); return outXml; } catch(FileNotFoundException ex){ ex.printStackTrace(); } catch(IOException ex){ ex.printStackTrace(); }</p><p> return ""; }</p><p>/*The private utility method to parse the input XML file and do the actual translation */ private String translate(InputStream inputXmlStream, InputStream configXmlStream){ try{</p><p>DocumentBuilder docBuilder = getDocBuilderFactory().newDocumentBuilder(); getDocBuilderFactory().setValidating(true); Document inputDoc = docBuilder.parse(inputXmlStream); System.out.println(" Successfully parsed the input XML");</p><p> getDocBuilderFactory().setValidating(false); docBuilder = getDocBuilderFactory().newDocumentBuilder();</p><p>//parse the configuration file Document configDoc = docBuilder.parse(configXmlStream);</p><p>//create an empty output document Document outputDoc = docBuilder.newDocument();</p><p>//create and append root element for the output document Element root = createRoot(inputDoc.getDocumentElement(), configDoc, outputDoc); root.appendChild(outputDoc.createTextNode("\n")); outputDoc.appendChild(root);</p><p>//get the instance of XMLTranslatorUtility class and call its method getTranslatorUtil().loadConfigXml(configDoc);</p><p> translateNodes(inputDoc, outputDoc.getDocumentElement());</p><p>StringWriter writer = new StringWriter(); XMLSerializer serializer = new XMLSerializer(writer,null); serializer.serialize(outputDoc); writer.close();</p><p> return writer.toString(); } catch(ParserConfigurationException ex){ System.out.println("Parser not configured...."); ex.printStackTrace(); } catch(SAXException ex){ System.out.println("Input XML has parse errors...."); ex.printStackTrace(); } catch(IOException ex){ System.out.println("Error reading input XML...."); ex.printStackTrace(); } return null; }</p><p>/* This private helper method is used to create the root element for the output * XML document generated. */ private Element createRoot(Element inRoot, Document configDoc, Document outDoc){</p><p>11 //the root node of the input XML document NodeList list = configDoc.getElementsByTagName("RootNodeName");</p><p>String configRootName = getTranslatorUtil().getElementTextContent((Element)list.item(0));</p><p> if(list.getLength() > 1 && configRootName.equals(inRoot.getTagName())){ configRootName = getTranslatorUtil().getElementTextContent((Element)list.item(1)); }</p><p> return outDoc.createElement(configRootName); } private void translateNodes(Document inDoc, Element outRoot){ DocumentTraversal traversable = (DocumentTraversal) inDoc; NodeIterator iterator = traversable.createNodeIterator(inDoc, NodeFilter.SHOW_ALL, null, true);</p><p>Node node; while((node = iterator.nextNode()) != null) { if(node.getNodeType() == Node.ELEMENT_NODE){ translateNode(node, outRoot); NamedNodeMap attrNodes = node.getAttributes(); for(int i = 0; i < attrNodes.getLength(); i++){ Attr attr = (Attr) attrNodes.item(i); translateNode(attr, outRoot); } } } } private void translateNode(Node inNode, Element outRoot){ String fullyQualifiedNodeName = getTranslatorUtil().getFullyQualifiedNodeName(inNode); String outNodeName = getTranslatorUtil().getCorrespondingConfigName(fullyQualifiedNodeName); if(outNodeName != null){ Element configElement = getTranslatorUtil().getConfigElement(outNodeName); NodeTranslator translator = createNewTranslator(configElement); translator.translateNode(inNode, outRoot, configElement); } } private NodeTranslator createNewTranslator(Element configElement){ String className = configElement.getAttribute("translatorClassName"); try{ NodeTranslator tran = (NodeTranslator)Class.forName(className).newInstance(); tran.setTranslatorUtil(getTranslatorUtil()); return tran; } catch(InstantiationException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new RuntimeException(e); } }</p><p>/* Protected helper method to get an instance of the XMLTranslatorUtility class * This XMLTranslatorUtility class is a helper class. */ protected XMLTranslatorUtility getTranslatorUtil() {</p><p> if(_translatorUtil == null){ _translatorUtil = new XMLTranslatorUtility(); } return _translatorUtil; }</p><p>12 private DocumentBuilderFactory getDocBuilderFactory() { if(_docBuilderFactory == null){ _docBuilderFactory = DocumentBuilderFactory.newInstance(); _docBuilderFactory.setIgnoringComments(true); } return _docBuilderFactory; }</p><p> public void WriteOutputXMLStringToXMLFile( String OutputXMLString, String InFileName ) { FileOutputStream out; // declare a file output object PrintStream p; // declare a print stream object</p><p> try { // Create a new file output stream // connected to "output_file.xml" out = new FileOutputStream("output_file.xml");</p><p>// Connect print stream to the output stream p = new PrintStream( out );</p><p> p.println ( OutputXMLString );</p><p> p.close(); } catch (Exception e) { System.err.println ("Error writing to file"); } }</p><p> public boolean IsFileValid( String strInputFile ) { File xmlInputFile = new File(strInputFile); if (xmlInputFile.exists()) { return false; } // the file exists else { return true; } // the file does not exist }</p><p>} XMLTranslatorUtility.java import java.util.HashMap; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class XMLTranslatorUtility {</p><p>//Hash map that has the protected HashMap _configNamesToConfigNodesMap; protected HashMap _configNamesXrefMap;</p><p> public void loadConfigXml(Document configDoc){</p><p>_configNamesToConfigNodesMap = new HashMap(); _configNamesXrefMap = new HashMap();</p><p>//get all the Elements in document with a given tag name NodeList list = configDoc.getElementsByTagName("NodeName"); for(int i = 0; i < list.getLength(); i++){ Element element = (Element) list.item(i);</p><p>13 String configName = getElementTextContent(element); if(configName.trim().length() > 0){ _configNamesToConfigNodesMap.put(configName, element); NodeList siblings = ((Element)element.getParentNode()).getElementsByTagName("NodeName"); Element sibling = (Element) siblings.item(0); String siblingConfigName = getElementTextContent(sibling); //if more than one and the fuly qualified name is same as 0th Ele //then sibling is the next one if(siblings.getLength() > 1 && siblingConfigName.equals(configName)){ sibling = (Element) siblings.item(1); siblingConfigName = getElementTextContent(sibling); } _configNamesXrefMap.put(configName, siblingConfigName); } } } public String getElementTextContent(Element ele){</p><p>NodeList list = ele.getChildNodes(); for(int i = 0; i < list.getLength(); i++){ Node child = (Node) list.item(i); if(child.getNodeType() == Node.TEXT_NODE){ return child.getNodeValue(); } } return ""; } public Element getConfigElement(String configName){ return (Element)_configNamesToConfigNodesMap.get(configName); } public String getCorrespondingConfigName(String configName){ return (String)_configNamesXrefMap.get(configName); }</p><p>/* This method helps to find the fully qualified name of a particular node * that occurs in the input DOM tree */ public String getFullyQualifiedNodeName(Node node){</p><p>Node parentNode = null; //check if the current node is an attrubute node or an element node if(node.getNodeType() == Node.ATTRIBUTE_NODE){ parentNode = ((Attr)node).getOwnerElement(); } else{ parentNode = node.getParentNode(); } String fullyQualifiedNodeName = node.getNodeName(); //continue adding the parent nodes to make the fully qualified node name while(parentNode.getNodeType() == Node.ELEMENT_NODE) { fullyQualifiedNodeName = parentNode.getNodeName() + "::" + fullyQualifiedNodeName; parentNode = parentNode.getParentNode(); } return fullyQualifiedNodeName; } public Element getCorrespondingConfigElement(Element element){ String correspondingName = (String) getCorrespondingConfigName(getElementTextContent(element)); return getConfigElement(correspondingName); } public String getCorrespondingAttributeName(Attr attr){ String fullyQualifiedNodeName = getFullyQualifiedNodeName(attr); String correspoindingConfigName = getCorrespondingConfigName(fullyQualifiedNodeName); if(correspoindingConfigName.indexOf("::") != -1){ return correspoindingConfigName.substring(correspoindingConfigName.lastIndexOf("::") + 2);</p><p>14 }</p><p> return ""; } } NodeTranslator.java import java.util.Vector; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public abstract class NodeTranslator{ protected Vector _nodeNames; protected Node _inputNode; protected Element _configElement; protected XMLTranslatorUtility _translatorUtil;</p><p> public void translateNode(Node inputNode, Node outRoot, Element configElement) { createNodeNames(configElement); setConfigElement(configElement); setInputNode(inputNode); createNodesRecursive(outRoot, 1); // 1st element is root which is already created }</p><p> protected boolean createNodesRecursive(Node parentNode, int index) { Node next = parentNode.getFirstChild(); while(next != null) { if(next.getNodeType() == Node.ELEMENT_NODE && next.getNodeName().equals(getNodeNames().get(index))){ if(index == getNodeNames().size() - 1){ boolean isCreated = createLastNode(parentNode); if(isCreated){ return true; //else continue with next sibling } } else{ int temp = index + 1; boolean isCreated = createNodesRecursive(next, temp); if(isCreated){ return true; //else continue with next sibling } } } next = next.getNextSibling(); } return createElementsFrom(index, parentNode); }</p><p> protected boolean isOnlyOneAllowed(int index){ String name = (String)getNodeNames().get(index); index--; while(index >= 0){ name = (String)getNodeNames().get(index) + "::" + name; index--; } Attr cardinality = null; if(getTranslatorUtil().getConfigElement(name) != null){ cardinality = getTranslatorUtil().getConfigElement(name).getAttributeNode("onlyOne"); } return cardinality != null && cardinality.getValue().equals("true"); }</p><p> protected boolean isLastNodeAttribute(){ return false; }</p><p>15 protected Element createElement(Node parent, int index){ String nodeName = (String)getNodeNames().get(index); Element element = parent.getOwnerDocument().createElement(nodeName); return element; } protected boolean createElementsFrom(int index, Node parent){ while(index < getNodeNames().size() - 1){//last node will be create by subclass Element temp = createNewElementsForParent(parent, index); if(temp == null){ return false; } //parent.appendChild(parent.getOwnerDocument().createTextNode("\n")); parent = temp; index++; } return createLastNode(parent); } protected Element createNewElementsForParent(Node parent, int index){ Attr cardinality = getConfigElement().getAttributeNode("onlyOne"); if(!isOnlyOneAllowed(index)){ return createNewElement(parent, index); } else{ String nodeName = (String)getNodeNames().get(index); Element parentEle = (Element) parent.getParentNode(); NodeList list = parentEle.getElementsByTagName(parent.getNodeName()); for(int i = 0; i < list.getLength(); i++){ Element element = (Element) list.item(i); if(element.getElementsByTagName(nodeName).getLength() == 0 && isMatchesWithInputParent(element)){ return createNewElement(element, index); } } } return null; } protected Element createNewElement(Node parent, int index){ Element element = createElement(parent, index); parent.appendChild(element); String emptyTag = getTranslatorUtil().getElementTextContent(getConfigElement()) + "::(empty)"; String childNodeName = getTranslatorUtil().getCorrespondingConfigName(emptyTag); if(childNodeName != null){ childNodeName = childNodeName.substring(childNodeName.indexOf("::") + 2); Element child = element.getOwnerDocument().createElement(childNodeName); element.appendChild(child); } parent.appendChild(parent.getOwnerDocument().createTextNode("\n")); return element; } protected boolean isMatchesWithInputParent(Element element){ Element inputParent = (Element)getInputNode().getParentNode(); NamedNodeMap newAttrNodes = element.getAttributes(); for(int i = 0; i < newAttrNodes.getLength(); i++){ Attr newAttr = (Attr) newAttrNodes.item(i); Attr inputAttr = inputParent.getAttributeNode(getTranslatorUtil().getCorrespondingAttributeName(newAttr)); if(inputAttr == null || !inputAttr.getValue().equals(newAttr.getValue())){ return false; } } return true; } protected abstract boolean createLastNode(Node parent);</p><p>16 protected void createNodeNames(Element configElement){ String nameString = getTranslatorUtil().getElementTextContent(configElement); _nodeNames = new Vector(); while(nameString.indexOf("::") != -1){ _nodeNames.add(nameString.substring(0, nameString.indexOf("::"))); nameString = nameString.substring(nameString.indexOf("::") + 2); } if(nameString.length() > 0){ _nodeNames.add(nameString); } }</p><p> protected Vector getNodeNames(){ return _nodeNames; }</p><p> protected Node getInputNode() { return _inputNode; }</p><p> protected void setInputNode(Node node) { _inputNode = node; }</p><p> protected Element getConfigElement() { return _configElement; }</p><p> protected void setConfigElement(Element element) { _configElement = element; } public XMLTranslatorUtility getTranslatorUtil() { return _translatorUtil; } public void setTranslatorUtil(XMLTranslatorUtility aTranslatorUtil) { _translatorUtil = aTranslatorUtil; } } ElementToElementTranslator.java import org.w3c.dom.Element; import org.w3c.dom.Node; public class ElementToElementTranslator extends NodeTranslator {</p><p> protected boolean createLastNode(Node parent){ Element element = createNewElementsForParent(parent, getNodeNames().size() - 1); if(element != null){ String text = getTranslatorUtil().getElementTextContent((Element) getInputNode()).trim(); if(text.length() > 0){ Node node = parent.getOwnerDocument().createTextNode(text); element.appendChild(node); } return true; } else{ return false; } } } ElementToAttributeTranslator.java import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList;</p><p>17 public class ElementToAttributeTranslator extends NodeTranslator { public boolean createLastNode(Node parent){ String lastNodeName = (String)getNodeNames().lastElement(); Element parentEle = (Element) parent.getParentNode(); NodeList list = parentEle.getElementsByTagName(parent.getNodeName()); String text = getTranslatorUtil().getElementTextContent((Element) getInputNode()).trim(); for(int i = 0; i < list.getLength(); i++){ Element element = (Element) list.item(i); if(element.getAttributeNode(lastNodeName) == null){ element.setAttribute(lastNodeName, text); return true; } } return false; }</p><p> protected boolean isLastNodeAttribute(){ return true; } } AttributeToAttributeTranslator.java import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class AttributeToAttributeTranslator extends NodeTranslator {</p><p> protected boolean createLastNode(Node parent){ String lastNodeName = (String)getNodeNames().lastElement(); Element parentEle = (Element) parent.getParentNode(); NodeList list = parentEle.getElementsByTagName(parent.getNodeName()); for(int i = 0; i < list.getLength(); i++){ Element element = (Element) list.item(i); if(element.getAttributeNode(lastNodeName) == null && isMatchesWithInputParent(element)){ element.setAttribute(lastNodeName, ((Attr)getInputNode()).getValue()); return true; } } return false; }</p><p> protected boolean isMatchesWithInputParent(Element element){ Element inputParent = ((Attr)getInputNode()).getOwnerElement(); NamedNodeMap newAttrNodes = element.getAttributes(); for(int i = 0; i < newAttrNodes.getLength(); i++){ Attr newAttr = (Attr) newAttrNodes.item(i); Attr inputAttr = inputParent.getAttributeNode(getTranslatorUtil().getCorrespondingAttributeName(newAttr)); if(inputAttr == null || !inputAttr.getValue().equals(newAttr.getValue())){ return false; } }</p><p> return true; }</p><p> protected boolean isLastNodeAttribute(){ return true; } } AttributeToElementTranslator.java import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.Node;</p><p>18 public class AttributeToElementTranslator extends NodeTranslator {</p><p> protected boolean createLastNode(Node parent) { Element element = createElement(parent, getNodeNames().size() - 1); Node node = parent.getOwnerDocument().createTextNode(((Attr)getInputNode()).getValue()); element.appendChild(node); parent.appendChild(element); String emptyTag = getTranslatorUtil().getElementTextContent(getConfigElement()) + "::(empty)"; String childNodeName = getTranslatorUtil().getCorrespondingConfigName(emptyTag); if(childNodeName != null){ childNodeName = childNodeName.substring(childNodeName.indexOf("::") + 2); Element child = element.getOwnerDocument().createElement(childNodeName); element.appendChild(child); } parent.appendChild(parent.getOwnerDocument().createTextNode("\n")); return true; } } TEST RUN Sample input XML file: BPSCM.xml</p><p>Sample output : output_file.xml</p><p><?xml version="1.0"?> <Package> <Lane id="Role_1082731465606990" name="Initiator"/> <Lane id="Role_1082731417627988" name="CMAdministrator"/> <Lane id="Role_1082731486155992" name="CCBChair"/> <Lane id="Role_1082731543678995" name="ConcurrencePersonnel"/> <Lane id="Role_1082731543678994" name="CPExplicit"/> <Lane id="Role_1082731590095998" name="MandatoryEvaluator"/> <Lane id="Role_1082731582324996" name="RequiredEvaluator"/> <Lane id="Role_10917192740906162" name="OptionalEvaluator"/> <Lane id="Role_109992501374210161" name="ActionConcurrence"/> <Lane id="Role_112083520284010759" name="EmailSender"/> <Artifact Id="STANDARD_DROOLS" Name="FILE">c:/Projects/SDA/rules/rules_3.1.drl</Artifact> <Artifact Id="TestRulesRole" Name="FILE">c:/Projects/SDA/rules/rules_role.drl</Artifact> <Association Id="STANDARD_DROOLS"/> <Association Id="TestRulesRole"/> <WorkFlowProcess id="PackageProcess_108272849214011" name="Change Request"><ProcessHeader DurationUnit="MINUTES"/> </WorkFlowProcess> <WorkFlowProcess id="PackageProcess_108272852662045" name="Change Request Evaluation"><ProcessHeader DurationUnit="MINUTES"/> </WorkFlowProcess> <WorkFlowProcess id="PackageProcess_108272854456679" name="Directive"><ProcessHeader DurationUnit="MINUTES"/> </WorkFlowProcess> <WorkFlowProcess id="PackageProcess_1082728557744113" name="Action Item"><ProcessHeader DurationUnit="MINUTES"/> </WorkFlowProcess> <WorkFlowProcess id="PackageProcess_10917181988845896" name="Action Item Delegation"><ProcessHeader DurationUnit="MINUTES"/> </WorkFlowProcess> <WorkFlowProcess id="PackageProcess_115229085191711139" name="Minutes Approval"><ProcessHeader DurationUnit="MINUTES"/> </WorkFlowProcess> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10893090285643639" Length="50" Name="ccbName"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_1084287893269802" Length="-1" Name="needDate"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287893640803" Length="50" Name="crNumber"/> </DataFields></p><p>19 <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_1084287893940804" Length="-1" Name="crDate"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084287894140805" Length="-1" Name="crTitle"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287894331806" Length="30" Name="initiator"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287894511807" Length="100" Name="initName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287894681808" Length="30" Name="initMailCode"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287894871809" Length="16" Name="initPhone"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287895062810" Length="100" Name="initEmail"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287895252811" Length="100" Name="crType"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287895462812" Length="100" Name="crTypeOtherDesc"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084287895843814" Length="-1" Name="hwPayload"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084287896023815" Length="-1" Name="endItemAffected"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084287896223816" Length="-1" Name="relatedChanges"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084287896404817" Length="-1" Name="docAffected"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084287896584818" Length="-1" Name="description"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084287896774819" Length="-1" Name="justification"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084287896964820" Length="-1" Name="impact"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10862770773662735" Length="50" Name="crTemplate"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10917263608116006" Length="7" Name="sensitiveData"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10946493173719839" Length="30" Name="crTemplateType"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10983640563709848" Length="30" Name="missionEffectivity"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288327010806" Length="30" Name="requestedAlternateProcessing"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10884420683022871" Length="-1" Name="justification"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10884524730452875" Length="7" Name="concurrenceReview"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10884524750082876" Length="7" Name="evaluation"/></p><p>20 </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288585334839" Length="30" Name="evaluator"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288585924840" Length="100" Name="evaluatorName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10850612097492823" Length="100" Name="evaluatorEmail"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10850612584482828" Length="30" Name="evaluator"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10850612594892829" Length="100" Name="evaluatorName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10850612597502830" Length="100" Name="evaluatorEmail"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_109172197965112021" Length="30" Name="evaluator"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_109172197996112022" Length="100" Name="evaluatorName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_109172198025212023" Length="100" Name="evaluatorEmail"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_109172261681712034" Length="-1" Name="evaluators"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287851230796" Length="30" Name="reviewer"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084287851230797" Length="100" Name="reviewerName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288491111829" Length="100" Name="name"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288491662830" Length="30" Name="disposition"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084288492253831" Length="-1" Name="comments"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_1084288493094832" Length="-1" Name="reviewDate"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288494195834" Length="30" Name="reassignTo"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084288301364801" Length="-1" Name="comments"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288357603811" Length="30" Name="approvedAlternateProcessing"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_1084288385392816" Length="-1" Name="ccbDate"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_1084288385632817" Length="-1" Name="evaluationDueDate"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10917260943986002" Length="-1" Name="evaluationTerminationDate"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10917260995356003" Length="-1" Name="evaluationResponseTerminationDate"/></p><p>21 </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10917261002166004" Length="-1" Name="evaluationReminderStartDate"/> </DataFields> <DataFields><DataField DataType="INTEGER" Id="ContentDataSectionField_10917261004766005" Length="-1" Name="evaluationReminderFrequencyHours"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288428323822" Length="50" Name="crDisposition"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_1084288428623823" Length="-1" Name="crDispositionDate"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_114079865463211082" Length="-1" Name="dispositionComments"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288673037851" Length="100" Name="evaluatorName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288674860877" Length="100" Name="evaluatorEmail"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288674860852" Length="30" Name="evaluatorOrg"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288675751853" Length="16" Name="evaluatorPhone"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288676592854" Length="50" Name="recommendation"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288677463855" Length="7" Name="impactHW"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288678305856" Length="7" Name="impactTraining"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288679066857" Length="7" Name="impactOps"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288679877858" Length="7" Name="impactInteg"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288680678859" Length="7" Name="impactSafety"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288681379860" Length="7" Name="impactMass"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288682150861" Length="7" Name="impactSchedule"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288683021862" Length="7" Name="impactCost"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288683832863" Length="7" Name="impactProc"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288684643864" Length="7" Name="impactManifest"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288685354865" Length="7" Name="impactSW"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288686096866" Length="7" Name="impactDoc"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288686847867" Length="7" Name="impactOther"/> </DataFields></p><p>22 <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084288687628868" Length="-1" Name="impactDesc"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288688399869" Length="7" Name="programShuttle"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288688950870" Length="7" Name="programISS"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288689630871" Length="7" Name="programEVA"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288690181872" Length="7" Name="programOther"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084288690852873" Length="50" Name="programOtherDesc"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084288691453874" Length="-1" Name="nonincorporation"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084288692074875" Length="-1" Name="comments"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_1084288692615876" Length="-1" Name="submitDate"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084289018243881" Length="30" Name="evaluator"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_1084289019235882" Length="30" Name="initiatorResponse"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_1084289019966883" Length="-1" Name="initiatorComments"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_1084289020556884" Length="-1" Name="submitDate"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10862772480182740" Length="30" Name="status"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10863592275208120" Length="30" Name="delegator"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10863592289928121" Length="100" Name="delegatorName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10863592319768122" Length="100" Name="delegatorEmail"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10863593059618123" Length="-1" Name="delegatedDate"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_115316940649211470" Length="-1" Name="delegateComments"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10863599030588150" Length="30" Name="evaluator"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10863599033588151" Length="100" Name="evaluatorName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10863599035498152" Length="100" Name="evaluatorEmail"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10866151749332872" Length="100" Name="delegatorName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10866151753942873" Length="100" Name="delegatorEmail"/></p><p>23 </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10866157205712874" Length="30" Name="delegator"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892066188522890" Length="30" Name="crNumber"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10892066191822891" Length="-1" Name="crTitle"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892066194532892" Length="30" Name="directiveNumber"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10892066196932893" Length="-1" Name="directiveDate"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10929216364829194" Length="-1" Name="ccbDirection"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10892067119842899" Length="-1" Name="comments"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892067122242900" Length="30" Name="chairSign"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892067124252901" Length="100" Name="chairSignName"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10892071852852952" Length="-1" Name="chairSignDate"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10892067713182906" Length="-1" Name="comments"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10892067715182907" Length="-1" Name="closeDate"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_109172505484312383" Length="30" Name="status"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892068215592913" Length="30" Name="directiveNumber"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892068218502914" Length="30" Name="actionNumber"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10892068221902915" Length="-1" Name="actionDate"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10892068225312916" Length="-1" Name="actionTitle"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10892068229112917" Length="-1" Name="actionDescription"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892068243632918" Length="30" Name="actionee"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892068245942919" Length="100" Name="actioneeName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10928476233639160" Length="50" Name="actionSource"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_109992401736810114" Length="30" Name="reviewer"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_109992401771810115" Length="100" Name="reviewerName"/> </DataFields></p><p>24 <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10892069374542924" Length="-1" Name="actionDueDate"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10892069637112929" Length="-1" Name="comments"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10892069941942934" Length="-1" Name="rationale"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10892070004432935" Length="-1" Name="closureDate"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_109992406337310116" Length="100" Name="name"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_109992406360310117" Length="30" Name="disposition"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_109992406396410118" Length="-1" Name="comments"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_109992406426410119" Length="-1" Name="reviewDate"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_10892071293862948" Length="-1" Name="comments"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892071300172949" Length="30" Name="chairSign"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10892071303672950" Length="100" Name="chairSignName"/> </DataFields> <DataFields><DataField DataType="DATEANDTIME" Id="ContentDataSectionField_10892071308582951" Length="-1" Name="chairSignDate"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10926749427498523" Length="30" Name="actionee"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10926749430298524" Length="100" Name="actioneeName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10926749432398525" Length="100" Name="actioneeEmail"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10926749434708526" Length="30" Name="delegator"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10926749437108527" Length="100" Name="delegatorName"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_10926749440518528" Length="100" Name="delegatorEmail"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_109172503243112378" Length="30" Name="status"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_115262420700011258" Length="-1" Name="minutesApprovalComments"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_115262977639511610" Length="256" Name="minutesApprovalStatus"/> </DataFields> <DataFields><DataField DataType="CHARACTER" Id="ContentDataSectionField_115262978700511611" Length="256" Name="minutesApprovedBy"/> </DataFields> <DataFields><DataField DataType="INTEGER" Id="ContentDataSectionField_115262591576111402" Length="-1" Name="ccbMinutesID"/> </DataFields></p><p>25 <DataFields><DataField DataType="INTEGER" Id="ContentDataSectionField_115280468394411534" Length="-1" Name="ccbScheduleID"/> </DataFields> <DataFields><DataField DataType="TEXT" Id="ContentDataSectionField_115316988626111542" Length="-1" Name="delegateComments"/> </DataFields> </Package></p><p>26</p>
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages26 Page
-
File Size-