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