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.util;
053:
054: import org.acm.seguin.tools.RefactoryInstaller;
055: import java.io.*;
056: import org.acm.seguin.io.DirectoryTreeTraversal;
057: import org.acm.seguin.io.FileCopy;
058:
059: /**
060: * Traverses a directory structure and backups all java files found
061: *
062: *@author Chris Seguin
063: *@created October 31, 1999
064: *@date May 12, 1999
065: */
066: public class BackupTraversal extends DirectoryTreeTraversal {
067: // Instance Variables
068: private String dest;
069:
070: /**
071: * Traverses a directory tree structure
072: *
073: *@param init the initial directory
074: *@param out the output directory
075: */
076: public BackupTraversal(String init, String out) {
077: super (init);
078: if (out.charAt(out.length() - 1) != File.separatorChar) {
079: dest = out + File.separator;
080: } else {
081: dest = out;
082: }
083: }
084:
085: /**
086: * Determines if this file should be handled by this traversal
087: *
088: *@param currentFile the current file
089: *@return true if the file should be handled
090: */
091: protected boolean isTarget(File currentFile) {
092: String filename = currentFile.getName();
093: String lowercase = filename.toLowerCase();
094: if (!lowercase.endsWith(".java")) {
095: return false;
096: }
097:
098: String classname = lowercase.substring(0,
099: lowercase.length() - 5)
100: + ".class";
101: File classFile = new File(currentFile.getParentFile(),
102: classname);
103: return classFile.exists();
104: }
105:
106: /**
107: * Visits the current file
108: *
109: *@param currentFile the current file
110: */
111: protected void visit(File currentFile) {
112: String destString = getDestination(currentFile);
113: File destFile = new File(destString);
114: (new FileCopy(currentFile, destFile)).run();
115: }
116:
117: /**
118: * Program called when we arrive at a directory
119: *
120: *@param current the current directory
121: */
122: protected void arriveAtDir(File current) {
123: String currentPath = current.getPath();
124: String base = "";
125: if (currentPath.startsWith("./")
126: || currentPath.startsWith(".\\")) {
127: base = currentPath.substring(2);
128: } else {
129: base = currentPath;
130: }
131: createDir(dest + "src/" + base);
132: createDir(dest + "test/src/" + base);
133: }
134:
135: /**
136: * Returns the destination file from the current file
137: *
138: *@param current the current file
139: *@return the destination file
140: */
141: private String getDestination(File current) {
142: String prefix = "src/";
143: if (current.getName().startsWith("Test")) {
144: prefix = "test/src/";
145: }
146:
147: String currentPath = current.getPath();
148: if (currentPath.startsWith("./")
149: || currentPath.startsWith(".\\")) {
150: return dest + prefix + currentPath.substring(2);
151: } else {
152: return dest + prefix + currentPath;
153: }
154: }
155:
156: /**
157: * The main program
158: *
159: *@param args Description of Parameter
160: */
161: public static void main(String[] args) {
162: // Make sure everything is installed properly
163: (new RefactoryInstaller(false)).run();
164:
165: if (args.length != 2) {
166: System.out
167: .println("Syntax: java BackupTraversal source dest");
168: return;
169: }
170: (new BackupTraversal(args[0], args[1])).run();
171: }
172:
173: /**
174: * Creates a named directory if it does not exist
175: *
176: *@param destDir Description of the Parameter
177: */
178: private void createDir(String destDir) {
179: File destDirFile = new File(destDir);
180: if (destDirFile.exists()) {
181: // Nothing to do
182: } else {
183: destDirFile.mkdirs();
184: }
185: }
186:
187: /**
188: * Creates a named directory if it does not exist
189: *
190: *@param destDir Description of the Parameter
191: */
192: private void deleteDir(String destDir) {
193: File destDirFile = new File(destDir);
194: String[] children = destDirFile.list();
195: if (children.length == 0) {
196: destDirFile.delete();
197: }
198: }
199:
200: /**
201: * Program called when we arrive at a directory
202: *
203: *@param current Description of the Parameter
204: */
205: protected void leaveDir(File current) {
206: String currentPath = current.getPath();
207: String base = "";
208: if (currentPath.startsWith("./")
209: || currentPath.startsWith(".\\")) {
210: base = currentPath.substring(2);
211: } else {
212: base = currentPath;
213: }
214: deleteDir(dest + "src/" + base);
215: deleteDir(dest + "test/src/" + base);
216: }
217: }
|