001    /**
002     * Copyright 2004-2014 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    }