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 */
020package org.kuali.student.contract.model.util;
021
022import java.io.PrintStream;
023import java.util.Stack;
024
025import org.kuali.student.contract.model.MessageStructure;
026import org.kuali.student.contract.model.ServiceContractModel;
027import org.kuali.student.contract.model.XmlType;
028
029/**
030 *
031 * @author nwright
032 */
033public 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}