001 /**
002 * Copyright 2004-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 /*
017 * To change this template, choose Tools | Templates
018 * and open the template in the editor.
019 */
020 package org.kuali.student.contract.model.util;
021
022 import java.io.PrintStream;
023 import java.util.Stack;
024
025 import org.kuali.student.contract.model.MessageStructure;
026 import org.kuali.student.contract.model.ServiceContractModel;
027 import org.kuali.student.contract.model.XmlType;
028
029 /**
030 *
031 * @author nwright
032 */
033 public class MessageStructureHierarchyDumper {
034
035 private ServiceContractModel model;
036 private ModelFinder finder;
037 private PrintStream out;
038
039 public MessageStructureHierarchyDumper(PrintStream out,
040 ServiceContractModel model) {
041 this.out = out;
042 this.model = model;
043 this.finder = new ModelFinder(model);
044 }
045
046 public void writeTabbedHeader() {
047 out.print("id");
048 out.print("\t");
049 out.print("Action");
050 out.print("\t");
051 out.print("xmlObject");
052 out.print("\t");
053 out.print("ShortName");
054 out.print("\t");
055 out.print("Name");
056 out.print("\t");
057 out.print("Type");
058 out.print("\t");
059 out.print("Description");
060 out.print("\t");
061 out.print("Required");
062 out.print("\t");
063 out.print("Cardinality");
064 out.print("\t");
065 out.print("XMLAttribute");
066 out.print("\t");
067 out.print("Status");
068 out.print("\t");
069 out.print("Feedback");
070 out.println("");
071 }
072
073 private String clean(String str) {
074 int len = str.length();
075 StringBuffer buffer = new StringBuffer(len);
076 for (int i = 0; i < len; i++) {
077 char c = str.charAt(i);
078 // skip \n, \r, \r\n
079 switch (c) {
080 case '\n':
081 case '\r': // do lookahead
082 if (i + 1 < len && str.charAt(i + 1) == '\n') {
083 i++;
084 }
085
086 buffer.append(" ");
087 break;
088 default:
089 buffer.append(c);
090 }
091 }
092 return buffer.toString();
093 }
094
095 public String calcId(MessageStructure ms, Stack<String> parents) {
096 StringBuilder bldr = new StringBuilder();
097 {
098 for (String parent : parents) {
099 bldr.append(parent);
100 bldr.append(".");
101 }
102 }
103 bldr.append(ms.getShortName());
104 return bldr.toString();
105 }
106
107 public void writeTabbedData(MessageStructure ms, Stack<String> parents) {
108 out.print(calcId(ms, parents));
109 out.print("\t");
110 out.print("");
111 out.print("\t");
112 out.print(ms.getXmlObject());
113 out.print("\t");
114 out.print(ms.getShortName());
115 out.print("\t");
116 out.print(ms.getName());
117 out.print("\t");
118 out.print(ms.getType());
119 out.print("\t");
120 out.print(clean(ms.getDescription()));
121 out.print("\t");
122 out.print(ms.getRequired());
123 out.print("\t");
124 out.print(ms.getCardinality());
125 out.print("\t");
126 out.print(ms.getXmlAttribute());
127 out.print("\t");
128 out.print(ms.getStatus());
129 out.print("\t");
130 out.print(ms.getImplNotes());
131 out.println("");
132 XmlType st = finder.findXmlType(stripList(ms.getType()));
133 if (st.getPrimitive().equalsIgnoreCase(XmlType.COMPLEX)) {
134 if (!parents.contains(st.getName())) {
135 parents.push(st.getName());
136 for (MessageStructure childMs : finder.findMessageStructures(st.getName())) {
137 this.writeTabbedData(childMs, parents);
138 }
139 parents.pop();
140 }
141 }
142 }
143
144 private String stripList(String type) {
145 if (type.endsWith("List")) {
146 return type.substring(0, type.length() - "List".length());
147 }
148 return type;
149 }
150 }