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.type;
010:
011: import java.io.File;
012: import org.acm.seguin.refactor.ComplexTransform;
013: import org.acm.seguin.refactor.RefactoringException;
014: import org.acm.seguin.summary.FileSummary;
015: import org.acm.seguin.summary.PackageSummary;
016: import org.acm.seguin.summary.TypeSummary;
017: import org.acm.seguin.summary.query.GetTypeSummary;
018:
019: /**
020: * Adds an abstract parent to a class or a set of classes in the same
021: * package. The parent class that is created must be in the same package as
022: * the child classes that extend it. It is created with the package level
023: * scope, to minimize interactions elsewhere in the system. However, the
024: * other source files that import this class are proactively updated to
025: * minimize the name conflicts in the event that the user later wants to make
026: * the abstract class a public class.
027: *
028: *@author Chris Seguin
029: */
030: public class AddAbstractParent extends AddClassRefactoring {
031: /**
032: * Constructor for the AddAbstractParent object
033: */
034: protected AddAbstractParent() {
035: super ();
036: }
037:
038: /**
039: * Sets the ParentName attribute of the AddAbstractParent object
040: *
041: *@param parent The new ParentName value
042: */
043: public void setParentName(String parent) {
044: setNewClassName(parent);
045: }
046:
047: /**
048: * Gets the description of the refactoring
049: *
050: *@return the description
051: */
052: public String getDescription() {
053: return "Adds a parent class named " + getNewClassName();
054: }
055:
056: /**
057: * Gets the id for this refactoring to track which refactorings are used.
058: *
059: *@return the id
060: */
061: public int getID() {
062: return ADD_PARENT;
063: }
064:
065: /**
066: * Sets the ChildClass attribute of the AddClassRefactoring object
067: *
068: *@param packageName The feature to be added to the ChildClass attribute
069: *@param className The feature to be added to the ChildClass attribute
070: */
071: public void addChildClass(String packageName, String className) {
072: addTargetClass(GetTypeSummary.query(PackageSummary
073: .getPackageSummary(packageName), className));
074: }
075:
076: /**
077: * Sets the ChildClass attribute of the AddClassRefactoring object
078: *
079: *@param summary The feature to be added to the ChildClass attribute
080: */
081: public void addChildClass(TypeSummary summary) {
082: addTargetClass(summary);
083: }
084:
085: /**
086: * Creates a class
087: *
088: *@param existingType the existing type
089: *@param className the name of the new class
090: */
091: protected void createClass(TypeSummary existingType,
092: String className) {
093: try {
094: CreateClass cc = new CreateClass(existingType, className,
095: true);
096: File newFile = cc.run();
097: getComplexTransform().createFile(newFile);
098: } catch (RefactoringException re) {
099: System.out.println(re.getMessage());
100: }
101: }
102:
103: /**
104: * Transforms the original AST
105: *
106: *@param typeSummary the particular type that is being changed
107: */
108: protected void transformOriginal(TypeSummary typeSummary) {
109: FileSummary fileSummary = (FileSummary) typeSummary.getParent();
110: File file = fileSummary.getFile();
111: PackageSummary packageSummary = (PackageSummary) fileSummary
112: .getParent();
113: ComplexTransform ref = getComplexTransform();
114: ref.add(createRenameType(typeSummary, packageSummary));
115: ref.apply(file, file);
116: }
117:
118: /**
119: * Creates a rename parent type transformation
120: *
121: *@param typeSummary the type to be changed
122: *@param packageSummary the package to be changed
123: *@return the transform
124: */
125: RenameParentTypeTransform createRenameType(TypeSummary typeSummary,
126: PackageSummary packageSummary) {
127: RenameParentTypeTransform rptt = new RenameParentTypeTransform();
128:
129: rptt.setNewName(getNewClassName());
130: rptt.setOldName(typeSummary.getName());
131:
132: return rptt;
133: }
134: }
|