001: /* ====================================================================
002: * The JRefactory License, Version 1.0
003: *
004: * Copyright (c) 2001 JRefactory. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by the
021: * JRefactory (http://www.sourceforge.org/projects/jrefactory)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. The names "JRefactory" must not be used to endorse or promote
026: * products derived from this software without prior written
027: * permission. For written permission, please contact seguin@acm.org.
028: *
029: * 5. Products derived from this software may not be called "JRefactory",
030: * nor may "JRefactory" appear in their name, without prior written
031: * permission of Chris Seguin.
032: *
033: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
034: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
035: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
036: * DISCLAIMED. IN NO EVENT SHALL THE CHRIS SEGUIN OR
037: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
038: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
039: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
040: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
041: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
042: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
043: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
044: * SUCH DAMAGE.
045: * ====================================================================
046: *
047: * This software consists of voluntary contributions made by many
048: * individuals on behalf of JRefactory. For more information on
049: * JRefactory, please see
050: * <http://www.sourceforge.org/projects/jrefactory>.
051: */
052: package org.acm.seguin.tools.stub;
053:
054: import java.io.File;
055: import java.io.FileWriter;
056: import java.io.IOException;
057: import java.io.Reader;
058: import java.io.Writer;
059: import java.io.OutputStreamWriter;
060: import net.sourceforge.jrefactory.ast.SimpleNode;
061: import net.sourceforge.jrefactory.factory.FileParserFactory;
062: import net.sourceforge.jrefactory.factory.InputStreamParserFactory;
063: import net.sourceforge.jrefactory.factory.ParserFactory;
064: import org.acm.seguin.awt.ExceptionPrinter;
065: import org.acm.seguin.pretty.PrintData;
066: import org.acm.seguin.util.FileSettings;
067:
068: /**
069: * Holds a refactoring. Default version just pretty prints the file.
070: *
071: *@author Chris Seguin
072: *@author <a href="JRefactory@ladyshot.demon.co.uk">Mike Atkinson</a>
073: *@version $Id: StubFile.java,v 1.7 2003/10/30 15:24:23 mikeatkinson Exp $
074: *@created May 12, 1999
075: */
076: public class StubFile {
077: // Instance Variables
078: private ParserFactory factory;
079: private Writer out;
080: private String name;
081: private File outputFile;
082:
083: private static boolean creating = false;
084:
085: /**
086: * Refactors java code.
087: *
088: *@param init Description of Parameter
089: *@param file Description of Parameter
090: */
091: public StubFile(String init, File file) {
092: factory = null;
093: out = null;
094: name = init;
095: outputFile = file;
096:
097: StubFile.creating = true;
098: }
099:
100: /**
101: * Set the parser factory
102: *
103: *@param factory Description of Parameter
104: */
105: public void setParserFactory(ParserFactory factory) {
106: this .factory = factory;
107: }
108:
109: /**
110: * Return the factory that gets the abstract syntax trees
111: *
112: *@return the parser factory
113: */
114: public ParserFactory getParserFactory() {
115: return factory;
116: }
117:
118: /**
119: * Create the stub for this file
120: *
121: *@param inputFile the input file
122: */
123: public void apply(File inputFile) {
124: setParserFactory(new FileParserFactory(inputFile));
125: apply();
126: }
127:
128: /**
129: * Create the stub for this file
130: *
131: *@param inputStream the input stream
132: *@param filename the name of the file contained by the input stream
133: */
134: public void apply(Reader inputStream, String filename) {
135: setParserFactory(new InputStreamParserFactory(inputStream,
136: filename));
137: apply();
138: }
139:
140: /**
141: * Close the file and note that we have completed this operation
142: */
143: public void done() {
144: if (out != null) {
145: try {
146: out.close();
147: } catch (IOException ioe) {
148: }
149: }
150:
151: StubFile.creating = false;
152: StubFile.resume();
153: }
154:
155: /**
156: * Create the output stream
157: *
158: *@param file the name of the file
159: *@return the output stream
160: */
161: protected Writer getOutputStream(File file) {
162: if (out != null) {
163: return out;
164: }
165:
166: if (name != null) {
167: File directory = FileSettings.getRefactorySettingsRoot();
168: if (!directory.exists()) {
169: directory.mkdirs();
170: }
171:
172: try {
173: File outFile = new File(directory, name + ".stub");
174: out = new FileWriter(outFile.getPath(), true);
175: } catch (IOException ioe) {
176: out = new OutputStreamWriter(System.out);
177: }
178: } else {
179: try {
180: out = new FileWriter(outputFile.getPath(), true);
181: } catch (IOException ioe) {
182: out = new OutputStreamWriter(System.out);
183: }
184: }
185:
186: return out; // Return the output stream
187: }
188:
189: /**
190: * Return the appropriate print data
191: *
192: *@param input Description of Parameter
193: *@return the print data
194: */
195: private PrintData getPrintData(File input) {
196: // Create the new stream
197: return new PrintData(getOutputStream(input));
198: }
199:
200: /**
201: * Create the stub for this file
202: */
203: private void apply() {
204: // Create the visitor
205: StubPrintVisitor printer = new StubPrintVisitor();
206:
207: // Create the appropriate print data
208: PrintData data = getPrintData(null);
209: SimpleNode root = factory.getAbstractSyntaxTree(false,
210: ExceptionPrinter.getInstance());
211:
212: if (root != null) {
213: printer.visit(root, data);
214: }
215:
216: // Flush the output stream
217: data.flush();
218: try {
219: out.write("\n\n|\n");
220: } catch (IOException ioe) {
221: ioe.printStackTrace(System.out);
222: }
223: }
224:
225: /**
226: * Wait while this is being created
227: */
228: public static synchronized void waitForCreation() {
229: if (creating) {
230: try {
231: StubFile.class.wait();
232: } catch (InterruptedException ie) {
233: }
234: }
235: }
236:
237: /**
238: * Resume all processing
239: */
240: private static synchronized void resume() {
241: StubFile.class.notifyAll();
242: }
243: }
|