001: /*
002: * ====================================================================
003: * The JRefactory License, Version 1.0
004: *
005: * Copyright (c) 2001 JRefactory. All rights reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * 1. Redistributions of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * 2. Redistributions in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * 3. The end-user documentation included with the redistribution,
020: * if any, must include the following acknowledgment:
021: * "This product includes software developed by the
022: * JRefactory (http://www.sourceforge.org/projects/jrefactory)."
023: * Alternately, this acknowledgment may appear in the software itself,
024: * if and wherever such third-party acknowledgments normally appear.
025: *
026: * 4. The names "JRefactory" must not be used to endorse or promote
027: * products derived from this software without prior written
028: * permission. For written permission, please contact seguin@acm.org.
029: *
030: * 5. Products derived from this software may not be called "JRefactory",
031: * nor may "JRefactory" appear in their name, without prior written
032: * permission of Chris Seguin.
033: *
034: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
035: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
036: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
037: * DISCLAIMED. IN NO EVENT SHALL THE CHRIS SEGUIN OR
038: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
039: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
040: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
041: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
042: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
043: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
044: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
045: * SUCH DAMAGE.
046: * ====================================================================
047: *
048: * This software consists of voluntary contributions made by many
049: * individuals on behalf of JRefactory. For more information on
050: * JRefactory, please see
051: * <http://www.sourceforge.org/projects/jrefactory>.
052: */
053: package org.acm.seguin.tools.builder;
054:
055: import java.io.*;
056: import java.util.ArrayList;
057: import net.sourceforge.jrefactory.parser.ParseException;
058: import net.sourceforge.jrefactory.ast.SimpleNode;
059: import net.sourceforge.jrefactory.factory.FileParserFactory;
060: import net.sourceforge.jrefactory.factory.ParserFactory;
061: import net.sourceforge.jrefactory.factory.StdInParserFactory;
062: import org.acm.seguin.pretty.PrettyPrintVisitor;
063: import org.acm.seguin.pretty.PrintData;
064: import org.acm.seguin.pretty.line.LineNumberingData;
065: import org.acm.seguin.util.FileSettings;
066: import org.acm.seguin.awt.ExceptionPrinter;
067: import org.acm.seguin.tools.RefactoryInstaller;
068:
069: /**
070: * Tool that uses the pretty printer to number lines
071: *
072: *@author Chris Seguin
073: *@created May 11, 1999
074: */
075: public class LineNumberTool {
076: private String dest;
077: // Instance Variables
078: private ArrayList inputList;
079: private Writer out;
080:
081: /**
082: * Constructor for the line numbering
083: */
084: public LineNumberTool() {
085: inputList = new ArrayList();
086: dest = null;
087: out = null;
088: }
089:
090: /**
091: * Read command line inputs
092: *
093: *@param args Description of Parameter
094: */
095: protected void init(String[] args) {
096: int last = args.length;
097: for (int ndx = 0; ndx < last; ndx++) {
098: if (args[ndx].equals("-help")) {
099: System.out
100: .println("Pretty Printer Version 1.0. Has the following inputs");
101: System.out
102: .println(" java LineNumberTool [-out filename] (inputfile)*");
103: System.out.println("OR");
104: System.out
105: .println(" java LineNumberTool [-out filename] < inputfile");
106: System.out.println("where");
107: System.out
108: .println(" -out filename Output to the file or directory");
109: } else if (args[ndx].equals("-out")) {
110: ndx++;
111: dest = args[ndx];
112: } else {
113: // Add another input to the list
114: inputList.add(args[ndx]);
115: }
116: }
117: }
118:
119: /**
120: * Run the pretty printer
121: */
122: protected void run() {
123: // Local Variables
124: int last = inputList.size();
125:
126: // Create the visitor
127: PrettyPrintVisitor printer = new PrettyPrintVisitor();
128:
129: // Create the appropriate print data
130: PrintData data = null;
131:
132: for (int index = 0; (index < last) || (index == 0); index++) {
133: data = getPrintData(index, data);
134:
135: // Create the parser and visit the parse tree
136: printer.visit(getRoot(index), data);
137:
138: // Flush the output stream
139: data.flush();
140: }
141: data.close();
142: }
143:
144: /**
145: * Create the output stream
146: *
147: *@param index the index of the output stream
148: *@param filename the name of the file
149: *@return the output stream
150: */
151: private Writer getOutputStream(int index, String filename) {
152: // Local Variables
153: Writer out = null;
154:
155: // Check the destination
156: if (dest == null) {
157: out = new OutputStreamWriter(System.out);
158: } else {
159: try {
160: out = new FileWriter(dest);
161: } catch (IOException ioe) {
162: // Hmmm... Can't create the output stream, then fall back to stdout
163: out = new OutputStreamWriter(System.out);
164: }
165: }
166:
167: // Return the output stream
168: return out;
169: }
170:
171: /**
172: * Return the appropriate print data
173: *
174: *@param oldPrintData the old print data
175: *@param index Description of Parameter
176: *@return the print data
177: */
178: private PrintData getPrintData(int index, PrintData oldPrintData) {
179: if (oldPrintData == null) {
180: out = getOutputStream(index, null);
181: return new LineNumberingData(out);
182: } else {
183: oldPrintData.flush();
184: try {
185: out.write(12);
186: } catch (IOException ioe) {
187: }
188: return oldPrintData;
189: }
190: }
191:
192: /**
193: * Create the parser
194: *
195: *@param index the index
196: *@return the java parser
197: */
198: private SimpleNode getRoot(int index) {
199: File in;
200: ParserFactory factory;
201:
202: if (inputList.size() > index) {
203: in = new File((String) inputList.get(index));
204: factory = new FileParserFactory(in);
205: } else {
206: factory = new StdInParserFactory();
207: }
208:
209: // Create the parse tree
210: return factory.getAbstractSyntaxTree(true, ExceptionPrinter
211: .getInstance());
212: }
213:
214: /**
215: * Main program
216: *
217: *@param args the command line arguments
218: */
219: public static void main(String args[]) {
220: for (int ndx = 0; ndx < args.length; ndx++) {
221: if (args[ndx].equals("-config")) {
222: String dir = args[ndx + 1];
223: ndx++;
224: FileSettings.setSettingsRoot(dir);
225: }
226: }
227:
228: // Make sure everything is installed properly
229: (new RefactoryInstaller(false)).run();
230:
231: try {
232: LineNumberTool pp = new LineNumberTool();
233: pp.init(args);
234: pp.run();
235: } catch (Throwable t) {
236: if (t == null) {
237: System.out.println("We have caught a null throwable");
238: } else {
239: System.out.println("t is a " + t.getClass().getName());
240: System.out.println("t has a message " + t.getMessage());
241: t.printStackTrace(System.out);
242: }
243: }
244: }
245: }
246: // EOF
|