001: /*
002: * $Id: oroToApache.java,v 1.7 2003/11/07 20:16:26 dfs Exp $
003: *
004: * ====================================================================
005: * The Apache Software License, Version 1.1
006: *
007: * Copyright (c) 2000 The Apache Software Foundation. All rights
008: * reserved.
009: *
010: * Redistribution and use in source and binary forms, with or without
011: * modification, are permitted provided that the following conditions
012: * are met:
013: *
014: * 1. Redistributions of source code must retain the above copyright
015: * notice, this list of conditions and the following disclaimer.
016: *
017: * 2. Redistributions in binary form must reproduce the above copyright
018: * notice, this list of conditions and the following disclaimer in
019: * the documentation and/or other materials provided with the
020: * distribution.
021: *
022: * 3. The end-user documentation included with the redistribution,
023: * if any, must include the following acknowledgment:
024: * "This product includes software developed by the
025: * Apache Software Foundation (http://www.apache.org/)."
026: * Alternately, this acknowledgment may appear in the software itself,
027: * if and wherever such third-party acknowledgments normally appear.
028: *
029: * 4. The names "Apache" and "Apache Software Foundation", "Jakarta-Oro"
030: * must not be used to endorse or promote products derived from this
031: * software without prior written permission. For written
032: * permission, please contact apache@apache.org.
033: *
034: * 5. Products derived from this software may not be called "Apache"
035: * or "Jakarta-Oro", nor may "Apache" or "Jakarta-Oro" appear in their
036: * name, without prior written permission of the Apache Software Foundation.
037: *
038: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
039: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
040: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
041: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
042: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
043: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
044: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
045: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
046: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
047: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
048: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
049: * SUCH DAMAGE.
050: * ====================================================================
051: *
052: * This software consists of voluntary contributions made by many
053: * individuals on behalf of the Apache Software Foundation. For more
054: * information on the Apache Software Foundation, please see
055: * <http://www.apache.org/>.
056: */
057:
058: package tools;
059:
060: import java.io.*;
061: import org.apache.oro.text.regex.*;
062:
063: /**
064: * This is a program you can use to convert older source code that uses
065: * the com.oroinc prefixes for the ORO text processing Java classes
066: * to org.apache. It assumes source files are small enough to store in
067: * memory and perform the substitutions. A small effort is made to not
068: * blindly substitute com.oroinc so that code using NetComponents or other
069: * ORO software will not have packages like com.oroinc.net become
070: * org.apache.net. However, you will still have to manually fix some
071: * code if you use the com.oroinc.io classes from NetComponents.
072: *
073: * @version @version@
074: * @since 2.0
075: */
076: public final class oroToApache {
077: public static final String PACKAGE_PATTERN = "com\\.oroinc\\.(io|text|util)";
078: public static final String PACKAGE_SUBSTITUTION = "org.apache.oro.$1";
079: public static final String OLD_FILE_EXTENSION = "_old";
080:
081: public static final class RenameException extends IOException {
082: public RenameException() {
083: }
084:
085: public RenameException(String message) {
086: super (message);
087: }
088: }
089:
090: public static final class Converter {
091: Pattern _sourcePattern;
092: Perl5Matcher _matcher;
093: Perl5Substitution _substitution;
094:
095: public static final int readFully(Reader reader, char[] buffer)
096: throws IOException {
097: int offset, length, charsRead;
098:
099: offset = 0;
100: length = buffer.length;
101:
102: while (offset < buffer.length) {
103: charsRead = reader.read(buffer, offset, length);
104: if (charsRead == -1)
105: break;
106: offset += charsRead;
107: length -= charsRead;
108: }
109:
110: return offset;
111: }
112:
113: public Converter(String patternString)
114: throws MalformedPatternException {
115: Perl5Compiler compiler;
116:
117: _matcher = new Perl5Matcher();
118: compiler = new Perl5Compiler();
119: _sourcePattern = compiler.compile(patternString);
120: _substitution = new Perl5Substitution(PACKAGE_SUBSTITUTION);
121: }
122:
123: public void convertFile(String filename, String oldExtension)
124: throws FileNotFoundException, RenameException,
125: SecurityException, IOException {
126: char[] inputBuffer;
127: int inputLength;
128: File srcFile, outputFile;
129: FileReader input;
130: FileWriter output;
131: String outputData;
132:
133: srcFile = new File(filename);
134: input = new FileReader(srcFile);
135: outputFile = File.createTempFile(srcFile.getName(), null,
136: srcFile.getAbsoluteFile().getParentFile());
137: output = new FileWriter(outputFile);
138:
139: inputBuffer = new char[(int) srcFile.length()];
140:
141: inputLength = readFully(input, inputBuffer);
142: input.close();
143:
144: // new String(inputBuffer) is terribly inefficient because the
145: // string ultimately gets converted back to a char[], but if we've
146: // got the memory it's expedient.
147: outputData = Util.substitute(_matcher, _sourcePattern,
148: _substitution, new String(inputBuffer),
149: Util.SUBSTITUTE_ALL);
150: output.write(outputData);
151: output.close();
152:
153: if (!srcFile.renameTo(new File(srcFile.getAbsolutePath()
154: + OLD_FILE_EXTENSION)))
155: throw new RenameException("Could not rename "
156: + srcFile.getPath() + ".");
157:
158: if (!outputFile.renameTo(srcFile))
159: throw new RenameException(
160: "Could not rename temporary output file. "
161: + "Original file is in "
162: + srcFile.getAbsolutePath()
163: + OLD_FILE_EXTENSION);
164: }
165: }
166:
167: public static final void main(String[] args) {
168: int file;
169: Converter converter;
170:
171: if (args.length < 1) {
172: System.err.println("usage: oroToApache [file ...]");
173: return;
174: }
175:
176: try {
177: converter = new Converter(PACKAGE_PATTERN);
178: } catch (MalformedPatternException mpe) {
179: // Shouldn''t happen
180: mpe.printStackTrace();
181: return;
182: }
183:
184: for (file = 0; file < args.length; file++) {
185: try {
186: System.out.println("Converting " + args[file]);
187: converter.convertFile(args[file], OLD_FILE_EXTENSION);
188: } catch (FileNotFoundException fnfe) {
189: System.err
190: .println("Error: Could not open file. Skipping "
191: + args[file]);
192: } catch (RenameException re) {
193: System.err.println("Error: " + re.getMessage());
194: } catch (SecurityException se) {
195: System.err
196: .println("Error: Could not rename a file while processing"
197: + args[file]
198: + ". Insufficient permission. "
199: + "File may not have been converted.");
200: } catch (IOException ioe) {
201: ioe.printStackTrace();
202: System.err
203: .println("Error: I/O exception while converting "
204: + args[file] + ". File not converted.");
205: }
206: }
207: }
208: }
|