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 */
016package org.kuali.student.contract.writer.service;
017
018import java.io.Serializable;
019import java.util.List;
020
021import org.kuali.student.contract.model.MessageStructure;
022import org.kuali.student.contract.model.ServiceContractModel;
023import org.kuali.student.contract.model.XmlType;
024import org.kuali.student.contract.model.util.ModelFinder;
025import org.kuali.student.contract.model.validation.DictionaryValidationException;
026import org.kuali.student.contract.writer.JavaClassWriter;
027
028/**
029 *
030 * @author nwright
031 */
032public 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}