001 /* 002 * To change this template, choose Tools | Templates 003 * and open the template in the editor. 004 */ 005 package org.kuali.student.contract.model.util; 006 007 import java.io.PrintStream; 008 import java.util.Stack; 009 010 import org.kuali.student.contract.model.MessageStructure; 011 import org.kuali.student.contract.model.ServiceContractModel; 012 import org.kuali.student.contract.model.XmlType; 013 014 /** 015 * 016 * @author nwright 017 */ 018 public class MessageStructureHierarchyDumper { 019 020 private ServiceContractModel model; 021 private ModelFinder finder; 022 private PrintStream out; 023 024 public MessageStructureHierarchyDumper(PrintStream out, 025 ServiceContractModel model) { 026 this.out = out; 027 this.model = model; 028 this.finder = new ModelFinder(model); 029 } 030 031 public void writeTabbedHeader() { 032 out.print("id"); 033 out.print("\t"); 034 out.print("Action"); 035 out.print("\t"); 036 out.print("xmlObject"); 037 out.print("\t"); 038 out.print("ShortName"); 039 out.print("\t"); 040 out.print("Name"); 041 out.print("\t"); 042 out.print("Type"); 043 out.print("\t"); 044 out.print("Description"); 045 out.print("\t"); 046 out.print("Required"); 047 out.print("\t"); 048 out.print("Cardinality"); 049 out.print("\t"); 050 out.print("XMLAttribute"); 051 out.print("\t"); 052 out.print("Status"); 053 out.print("\t"); 054 out.print("Feedback"); 055 out.println(""); 056 } 057 058 private String clean(String str) { 059 int len = str.length(); 060 StringBuffer buffer = new StringBuffer(len); 061 for (int i = 0; i < len; i++) { 062 char c = str.charAt(i); 063 // skip \n, \r, \r\n 064 switch (c) { 065 case '\n': 066 case '\r': // do lookahead 067 if (i + 1 < len && str.charAt(i + 1) == '\n') { 068 i++; 069 } 070 071 buffer.append(" "); 072 break; 073 default: 074 buffer.append(c); 075 } 076 } 077 return buffer.toString(); 078 } 079 080 public String calcId(MessageStructure ms, Stack<String> parents) { 081 StringBuilder bldr = new StringBuilder(); 082 { 083 for (String parent : parents) { 084 bldr.append(parent); 085 bldr.append("."); 086 } 087 } 088 bldr.append(ms.getShortName()); 089 return bldr.toString(); 090 } 091 092 public void writeTabbedData(MessageStructure ms, Stack<String> parents) { 093 out.print(calcId(ms, parents)); 094 out.print("\t"); 095 out.print(""); 096 out.print("\t"); 097 out.print(ms.getXmlObject()); 098 out.print("\t"); 099 out.print(ms.getShortName()); 100 out.print("\t"); 101 out.print(ms.getName()); 102 out.print("\t"); 103 out.print(ms.getType()); 104 out.print("\t"); 105 out.print(clean(ms.getDescription())); 106 out.print("\t"); 107 out.print(ms.getRequired()); 108 out.print("\t"); 109 out.print(ms.getCardinality()); 110 out.print("\t"); 111 out.print(ms.getXmlAttribute()); 112 out.print("\t"); 113 out.print(ms.getStatus()); 114 out.print("\t"); 115 out.print(ms.getImplNotes()); 116 out.println(""); 117 XmlType st = finder.findXmlType(stripList(ms.getType())); 118 if (st.getPrimitive().equalsIgnoreCase(XmlType.COMPLEX)) { 119 if (!parents.contains(st.getName())) { 120 parents.push(st.getName()); 121 for (MessageStructure childMs : finder.findMessageStructures(st.getName())) { 122 this.writeTabbedData(childMs, parents); 123 } 124 parents.pop(); 125 } 126 } 127 } 128 129 private String stripList(String type) { 130 if (type.endsWith("List")) { 131 return type.substring(0, type.length() - "List".length()); 132 } 133 return type; 134 } 135 }