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 Lic" +
111                    "+ense is distributed on an \"AS IS\" BASIS,");
112            indentPrintln(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.");
113            indentPrintln(" * See the License for the specific language governing permissions and");
114            indentPrintln(" * limitations under the License.");
115            indentPrintln(" */");
116            indentPrintln("package " + packageName + ";");
117            indentPrintln("");
118        }
119    
120        public void writeImports() {
121            if (imports.size() == 0) {
122                return;
123            }
124    
125    
126            for (String imprt : imports) {
127                // exclude imports from same package
128                if (imprt.startsWith(packageName)) {
129                    // don't exclude imports for same package that are including nested classes
130                    if (!imprt.substring(packageName.length() + 1).contains(".")) {
131                        continue;
132                    }
133                }
134                indentPrintln("import " + imprt + ";");
135            }
136            indentPrintln("");
137        }
138    
139        public void writeJavaClassAndImportsOutToFile() {
140    
141            File dir = new File(this.directory);
142            log.debug ("Writing java class: " + fileName + " to " + dir.getAbsolutePath ());
143    
144            if (!dir.exists()) {
145                if (!dir.mkdirs()) {
146                    throw new DictionaryExecutionException("Could not create directory "
147                            + this.directory);
148                }
149            }
150            try {
151                PrintStream out = new PrintStream(new FileOutputStream(fileName, false));
152                this.setOut(out);
153            } catch (FileNotFoundException ex) {
154                throw new DictionaryExecutionException(ex);
155            }
156            writeHeader();
157            indentPrintln("");
158            writeImports();
159            indentPrintln("");
160            indentPrintln(body.toString());
161        }
162    
163        public void openBrace() {
164            indentPrintln("{");
165            incrementIndent();
166        }
167    
168        public void closeBrace() {
169            decrementIndent();
170            indentPrintln("}");
171        }
172    
173        public void indentPrintWrappedComment(String str) {
174            Pattern pattern = Pattern.compile(".{0,79}(?:\\S(?:-| |$)|$)");
175            Matcher m = pattern.matcher(str);
176            while (m.find()) {
177                // suppresss blank lines
178                if (m.group().equals("")) {
179                    continue;
180                }
181                indentPrint("* ");
182                println(m.group());
183            }
184        }
185    }