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    package org.kuali.student.contract.writer.service;
017    
018    import java.io.Serializable;
019    import java.util.List;
020    
021    import org.kuali.student.contract.model.MessageStructure;
022    import org.kuali.student.contract.model.ServiceContractModel;
023    import org.kuali.student.contract.model.XmlType;
024    import org.kuali.student.contract.model.util.ModelFinder;
025    import org.kuali.student.contract.model.validation.DictionaryValidationException;
026    import org.kuali.student.contract.writer.JavaClassWriter;
027    
028    /**
029     *
030     * @author nwright
031     */
032    public class PureJavaInfcBeanWriter extends JavaClassWriter {
033    
034        private ServiceContractModel model;
035        private String directory;
036        private String rootPackage;
037        private String service;
038        private XmlType type;
039        private ModelFinder finder;
040    
041        public PureJavaInfcBeanWriter(ServiceContractModel model,
042                String directory,
043                String rootPackage,
044                String service,
045                XmlType type) {
046            super(directory, calcPackage(service, rootPackage), calcClassName(type.getName()));
047            this.model = model;
048            this.finder = new ModelFinder(model);
049            this.directory = directory;
050            this.rootPackage = rootPackage;
051            this.service = service;
052            this.type = type;
053        }
054    
055        public static String calcPackage(String service, String rootPackage) {
056            if (service.contains(",")) {
057                service = "common";
058            }
059            return PureJavaInfcServiceWriter.calcPackage(service, rootPackage);
060        }
061    
062        public static String calcClassName(String name) {
063            if (name.endsWith("Info")) {
064                name = name.substring(0, name.length() - "Info".length());
065            }
066            name = name + "Bean";
067            return GetterSetterNameCalculator.calcInitUpper(name);
068    
069        }
070    
071        /**
072         * Write out the entire file
073         * @param out
074         */
075        public void write() {
076            indentPrintln("public class " + calcClassName(type.getName()));
077            incrementIndent();
078            indentPrint(" implements "
079                    + PureJavaInfcInfcWriter.calcClassName(type.getName()));
080            importsAdd(PureJavaInfcInfcWriter.calcPackage(service, rootPackage)
081                    + "." + PureJavaInfcInfcWriter.calcClassName(type.getName()));
082            this.importsAdd(Serializable.class.getName());
083            indentPrintln(", Serializable");
084            openBrace();
085    
086            indentPrintln("");
087            indentPrintln("private static final long serialVersionUID = 1L;");
088    
089            List<MessageStructure> list =
090                    finder.findMessageStructures(type.getName());
091    //        if (list.size() == 0) {
092    //            throw new DictionaryExecutionException("xmlType " + type.getName()
093    //                    + " has no fields defined in the message structure tab");
094    //        }
095            for (MessageStructure ms : list) {
096                String realType = stripList(PureJavaInfcInfcWriter.calcClassName(ms.getType()));
097                String fieldType = null;
098                if (ms.getId().equals("RegistrationGroupTemplateInfo.activityOfferingCombinations")) {
099                    continue;
100                }
101                try {
102                 fieldType = this.calcFieldTypeToUse(ms.getType(), realType);
103                } catch (DictionaryValidationException ex) {
104                    throw new DictionaryValidationException (ms.getId(), ex);
105                }
106                String name = initLower(ms.getShortName());
107                indentPrintln("");
108                indentPrintln("private " + fieldType + " " + name + ";");
109                indentPrintln("");
110                indentPrintln("/**");
111                indentPrintWrappedComment("Set " + ms.getName());
112                indentPrintln("*");
113                indentPrintln("* Type: " + ms.getType());
114                indentPrintln("*");
115                indentPrintWrappedComment(ms.getDescription());
116                indentPrintln("*/");
117                indentPrintln("@Override");
118                indentPrintln("public void " + calcSetter(ms) + "(" + fieldType + " "
119                        + name + ")");
120                openBrace();
121                indentPrintln("this." + name + " = " + name + ";");
122                closeBrace();
123    
124                indentPrintln("");
125                indentPrintln("/**");
126                indentPrintWrappedComment("Get " + ms.getName());
127                indentPrintln("*");
128                indentPrintln("* Type: " + ms.getType());
129                indentPrintln("*");
130                indentPrintWrappedComment(ms.getDescription());
131                indentPrintln("*/");
132                indentPrintln("@Override");
133                indentPrintln("public " + fieldType + " " + calcGetter(ms) + "()");
134                openBrace();
135                indentPrintln("return this." + name + ";");
136                closeBrace();
137                indentPrint("");
138    
139                indentPrint("");
140            }
141            indentPrintln("");
142            closeBrace();
143    
144            this.writeJavaClassAndImportsOutToFile();
145            this.getOut().close();
146        }
147    
148        private String stripList(String str) {
149            return GetterSetterNameCalculator.stripList(str);
150        }
151    
152        private String initLower(String str) {
153            if (str == null) {
154                return null;
155            }
156            if (str.isEmpty()) {
157                return str;
158            }
159            if (str.length() == 1) {
160                return str.toLowerCase();
161            }
162            return str.substring(0, 1).toLowerCase() + str.substring(1);
163        }
164    
165        private String calcGetter(MessageStructure ms) {
166            return new GetterSetterNameCalculator(ms, this, model).calcGetter();
167        }
168    
169        private String calcSetter(MessageStructure ms) {
170            return new GetterSetterNameCalculator(ms, this, model).calcSetter();
171        }
172    
173        private String calcFieldTypeToUse(String type, String realType) {
174            XmlType t = finder.findXmlType(this.stripList(type));
175            String pckName = calcPackage(t.getService(), rootPackage);
176            return MessageStructureTypeCalculator.calculate(this, model, type, realType,
177                    pckName);
178        }
179    }