001    /*
002     * Copyright 2009 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.osedu.org/licenses/ECL-2.0
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;
017    
018    import org.kuali.student.contract.exception.DictionaryExecutionException;
019    import org.kuali.student.contract.model.impl.ServiceContractModelPescXsdLoader;
020    import org.slf4j.Logger;
021    import org.slf4j.LoggerFactory;
022    
023    import java.io.ByteArrayOutputStream;
024    import java.io.File;
025    import java.io.FileNotFoundException;
026    import java.io.FileOutputStream;
027    import java.io.PrintStream;
028    import java.util.Calendar;
029    import java.util.Set;
030    import java.util.TreeSet;
031    import java.util.regex.Matcher;
032    import java.util.regex.Pattern;
033    
034    /**
035     *
036     * @author nwright
037     */
038    public abstract class JavaClassWriter extends XmlWriter {
039    
040        private static Logger log = LoggerFactory.getLogger(JavaClassWriter.class);
041        
042        private String rootDirectory;
043        private String packageName;
044        private String className;
045        private String fileName;
046        private String directory;
047        private ByteArrayOutputStream body;
048        private Set<String> imports;
049    
050        public JavaClassWriter(String rootDirectory, String packageName,
051                String className) {
052            super();
053            this.body = new ByteArrayOutputStream(1000);
054            this.setOut(new PrintStream(body));
055            this.setIndent(0);
056            this.rootDirectory = rootDirectory;
057    
058            this.packageName = packageName;
059            this.className = className;
060            this.fileName =
061                    new JavaClassFileNameBuilder(rootDirectory, packageName, className).build();
062            this.directory =
063                    new JavaClassFileNameBuilder(rootDirectory, packageName, className).buildDirectory();
064            this.imports = new TreeSet();
065        }
066    
067        public ByteArrayOutputStream getBody() {
068            return body;
069        }
070    
071        public String getClassName() {
072            return className;
073        }
074    
075        public String getDirectory() {
076            return directory;
077        }
078    
079        public String getFileName() {
080            return fileName;
081        }
082    
083        public String getPackageName() {
084            return packageName;
085        }
086    
087        protected void setPackageName(String packageName) {
088            this.packageName = packageName;
089        }
090    
091        public String getRootDirectory() {
092            return rootDirectory;
093        }
094    
095        public void importsAdd(String pack) {
096            this.imports.add(pack);
097        }
098    
099        public void writeHeader() {
100            indentPrintln("/*");
101            indentPrintln(" * Copyright " + Calendar.getInstance().get(Calendar.YEAR)  + " The Kuali Foundation");
102            indentPrintln(" *");
103            indentPrintln(" * Licensed under the Educational Community License, Version 2.0 (the \"License\");");
104            indentPrintln(" * you may not use this file except in compliance with the License.");
105            indentPrintln(" * You may obtain a copy of the License at");
106            indentPrintln(" *");
107            indentPrintln(" *       http://www.osedu.org/licenses/ECL-2.0");
108            indentPrintln(" *");
109            indentPrintln(" * Unless required by applicable law or agreed to in writing, software");
110            indentPrintln(" * distributed under the License is distributed on an \"AS IS\" BASIS,");
111            indentPrintln(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.");
112            indentPrintln(" * See the License for the specific language governing permissions and");
113            indentPrintln(" * limitations under the License.");
114            indentPrintln(" */");
115            indentPrintln("package " + packageName + ";");
116            indentPrintln("");
117        }
118    
119        public void writeImports() {
120            if (imports.size() == 0) {
121                return;
122            }
123    
124    
125            for (String imprt : imports) {
126                // exclude imports from same package
127                if (imprt.startsWith(packageName)) {
128                    // don't exclude imports for same package that are including nested classes
129                    if (!imprt.substring(packageName.length() + 1).contains(".")) {
130                        continue;
131                    }
132                }
133                indentPrintln("import " + imprt + ";");
134            }
135            indentPrintln("");
136        }
137    
138        public void writeJavaClassAndImportsOutToFile() {
139    
140            File dir = new File(this.directory);
141            log.debug ("Writing java class: " + fileName + " to " + dir.getAbsolutePath ());
142    
143            if (!dir.exists()) {
144                if (!dir.mkdirs()) {
145                    throw new DictionaryExecutionException("Could not create directory "
146                            + this.directory);
147                }
148            }
149            try {
150                PrintStream out = new PrintStream(new FileOutputStream(fileName, false));
151                this.setOut(out);
152            } catch (FileNotFoundException ex) {
153                throw new DictionaryExecutionException(ex);
154            }
155            writeHeader();
156            indentPrintln("");
157            writeImports();
158            indentPrintln("");
159            indentPrintln(body.toString());
160        }
161    
162        public void openBrace() {
163            indentPrintln("{");
164            incrementIndent();
165        }
166    
167        public void closeBrace() {
168            decrementIndent();
169            indentPrintln("}");
170        }
171    
172        public void indentPrintWrappedComment(String str) {
173            Pattern pattern = Pattern.compile(".{0,79}(?:\\S(?:-| |$)|$)");
174            Matcher m = pattern.matcher(str);
175            while (m.find()) {
176                // suppresss blank lines
177                if (m.group().equals("")) {
178                    continue;
179                }
180                indentPrint("* ");
181                println(m.group());
182            }
183        }
184    }