001: /*
002: * Author: Chris Seguin
003: *
004: * This software has been developed under the copyleft
005: * rules of the GNU General Public License. Please
006: * consult the GNU General Public License for more
007: * details about use and distribution of this software.
008: */
009: package org.acm.seguin.refactor;
010:
011: import java.util.ArrayList;
012: import java.io.File;
013: import java.io.IOException;
014: import net.sourceforge.jrefactory.ast.SimpleNode;
015: import org.acm.seguin.pretty.PrettyPrintFile;
016: import org.acm.seguin.refactor.undo.UndoAction;
017: import org.acm.seguin.version.VersionControl;
018: import org.acm.seguin.version.VersionControlFactory;
019: import org.acm.seguin.awt.ExceptionPrinter;
020: import net.sourceforge.jrefactory.factory.FileParserFactory;
021: import net.sourceforge.jrefactory.factory.ParserFactory;
022:
023: /**
024: * Base class for a program that reads in an abstract syntax tree, transforms
025: * the code, and rewrites the file to disk.
026: *
027: *@author Chris Seguin
028: */
029: public class DefaultComplexTransform implements ComplexTransform {
030: // Instance Variables
031: private ArrayList transforms;
032: private UndoAction undo;
033:
034: /**
035: * Constructor for the ComplexTransform object
036: *
037: *@param init the undo action
038: */
039: public DefaultComplexTransform() {
040: transforms = new ArrayList();
041: }
042:
043: public void setUndoAction(UndoAction init) {
044: undo = init;
045: }
046:
047: /**
048: * Adds a syntax tree transformation
049: *
050: *@param value Description of Parameter
051: */
052: public void add(TransformAST value) {
053: if (value != null) {
054: transforms.add(value);
055: }
056: }
057:
058: /**
059: * Clears all the transforms
060: */
061: public void clear() {
062: transforms.clear();
063: }
064:
065: /**
066: * Is it worth applying the transforms
067: *
068: *@return true if there is any
069: */
070: public boolean hasAnyChanges() {
071: return (transforms.size() > 0);
072: }
073:
074: /**
075: * Given a file, applies a set of transformations to it
076: *
077: *@param inputFile Description of Parameter
078: *@param outputFile Description of Parameter
079: */
080: public void apply(File inputFile, File outputFile) {
081: // Get the abstract syntax tree
082: ParserFactory factory = new FileParserFactory(inputFile);
083: SimpleNode root = factory.getAbstractSyntaxTree(false,
084: ExceptionPrinter.getInstance());
085:
086: // Apply each individual transformation
087: int last = transforms.size();
088: for (int ndx = 0; ndx < last; ndx++) {
089: TransformAST next = (TransformAST) transforms.get(ndx);
090: next.update(root);
091: }
092:
093: // Check it out if it is read only
094: if (!inputFile.canWrite()) {
095: checkOut(inputFile);
096: }
097:
098: // Print it
099: undo.add(inputFile, outputFile);
100: createParent(outputFile);
101: try {
102: (new PrettyPrintFile()).apply(outputFile, root);
103: } catch (Throwable thrown) {
104: ExceptionPrinter.print(thrown, false);
105: }
106: }
107:
108: /**
109: * Creates a new file
110: *
111: *@param file Description of Parameter
112: */
113: public void createFile(File file) {
114: undo.add(null, file);
115: }
116:
117: /**
118: * Removes an old file
119: *
120: *@param file Description of Parameter
121: */
122: public void removeFile(File file) {
123: undo.add(file, null);
124: }
125:
126: /**
127: * Creates the parent directory if it does not exist
128: *
129: *@param file the file that is about to be created
130: */
131: private void createParent(File file) {
132: File parent = file.getParentFile();
133: if (!parent.exists()) {
134: parent.mkdirs();
135: }
136: }
137:
138: /**
139: * Checks out the specific file from the repository
140: *
141: *@param file the file to check out
142: */
143: private void checkOut(File file) {
144: VersionControl controller = VersionControlFactory.get();
145: String filename;
146:
147: try {
148: filename = file.getCanonicalPath();
149: } catch (IOException ioe) {
150: filename = file.getPath();
151: }
152:
153: controller.checkOut(filename);
154: }
155: }
|