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.RefactoringException;
013: import org.acm.seguin.summary.PackageSummary;
014: import org.acm.seguin.summary.TypeSummary;
015: import org.acm.seguin.summary.query.GetTypeSummary;
016:
017: /**
018: * Adds a child class and makes sure that the rest of the system is ready to
019: * have a class with that name.
020: *
021: *@author Chris Seguin
022: */
023: public class AddChildRefactoring extends AddClassRefactoring {
024: private String packageName;
025:
026: /**
027: * Constructor for the AddChildRefactoring object
028: */
029: protected AddChildRefactoring() {
030: super ();
031: packageName = null;
032: }
033:
034: /**
035: * Sets the name of the child class to be created
036: *
037: *@param value the name of the child class
038: */
039: public void setChildName(String value) {
040: setNewClassName(value);
041: }
042:
043: /**
044: * Sets the ChildClass attribute of the AddClassRefactoring object
045: *
046: *@param packageName The feature to be added to the ChildClass attribute
047: *@param className The feature to be added to the ChildClass attribute
048: */
049: public void setParentClass(String packageName, String className) {
050: addTargetClass(GetTypeSummary.query(PackageSummary
051: .getPackageSummary(packageName), className));
052: }
053:
054: /**
055: * Sets the ChildClass attribute of the AddClassRefactoring object
056: *
057: *@param summary The feature to be added to the ChildClass attribute
058: */
059: public void setParentClass(TypeSummary summary) {
060: addTargetClass(summary);
061: }
062:
063: /**
064: * Sets the name of the package of the new child class
065: *
066: *@param value the package name
067: */
068: public void setPackageName(String value) {
069: packageName = value;
070: }
071:
072: /**
073: * Gets the description of the refactoring
074: *
075: *@return the description
076: */
077: public String getDescription() {
078: return "Adds a child class named " + getNewClassName();
079: }
080:
081: /**
082: * Gets the id for this refactoring to track which refactorings are used.
083: *
084: *@return the id
085: */
086: public int getID() {
087: return ADD_CHILD;
088: }
089:
090: /**
091: * Creates a class
092: *
093: *@param existingType the existing type
094: *@param className the name of the new class
095: */
096: protected void createClass(TypeSummary existingType,
097: String className) {
098: try {
099: CreateClass cc = new CreateClass(existingType, className,
100: false);
101: if (packageName != null) {
102: cc.setPackageName(packageName);
103: }
104: cc.setAbstract(false);
105: File newFile = cc.run();
106: getComplexTransform().createFile(newFile);
107: } catch (RefactoringException re) {
108: System.out.println(re.getMessage());
109: }
110: }
111:
112: /**
113: * Transforms the original AST. For a child refactoring, we don't need to do
114: * anything special to the original type.
115: *
116: *@param typeSummary the particular type that is being changed
117: */
118: protected void transformOriginal(TypeSummary typeSummary) {
119: }
120: }
|