| 1 package org.antmod.util; 2 3 import java.io.File ; 4 import java.lang.reflect.Method ; 5 import java.util.ArrayList ; 6 import java.util.Enumeration ; 7 import java.util.Hashtable ; 8 import java.util.Vector ; 9 10 import org.apache.tools.ant.*; 11 import org.apache.tools.ant.taskdefs.Input; 12 import org.apache.tools.ant.util.FileUtils; 13 14 19 public final class AntUtil { 20 21 private static int askCounter; 22 23 24 private final static Object SYNC_ASK = new Object (); 25 26 27 28 private AntUtil() { 29 } 30 31 38 public static String ask(Project antProject, String question, String validArgs) throws BuildException { 39 synchronized (SYNC_ASK) { 40 String askProperty = "input.antmod.ask.internal." + (askCounter++); 41 42 Input in = new Input(); 43 in.setProject(antProject); 44 in.setTaskName("input"); 45 in.setMessage(question); 46 in.setValidargs(validArgs); 47 in.setAddproperty(askProperty); 48 in.execute(); 49 50 return antProject.getProperty(askProperty); 51 } 52 } 53 54 57 public static ArrayList getAntTargets(Project antProject) { 58 ArrayList result = new ArrayList (); 59 if (antProject != null) { 60 Enumeration targetNames = antProject.getTargets().keys(); 61 while (targetNames.hasMoreElements()) { 62 result.add(targetNames.nextElement()); 63 } 64 } 65 return result; 66 } 67 68 71 public static Project getAntProject(Project parentAntProject, File antXmlFile, boolean inheritAll) { 72 if (!antXmlFile.exists()) { 73 return null; 74 } 75 76 Project newProject = createEmptyProject(parentAntProject, inheritAll); 77 try { 78 ProjectHelper.getProjectHelper().parse(newProject, antXmlFile); 79 80 newProject.setBaseDir(parentAntProject.getBaseDir()); 82 83 newProject.setUserProperty("ant.file" , FileUtils.newFileUtils().resolveFile(parentAntProject.getBaseDir(), antXmlFile.getAbsolutePath()).getAbsolutePath()); 85 86 return newProject; 88 } catch (BuildException e) { 89 BuildException throwing = new BuildException("Failed to parse \"" + antXmlFile + "\": " + e.getMessage()); 90 throwing.setStackTrace(e.getStackTrace()); 91 throw throwing; 92 } 93 } 94 95 private static Project createEmptyProject(Project parentAntProject, boolean inheritAll) { 96 Project newProject = new Project(); 97 newProject.setJavaVersionProperty(); 98 99 newProject.setDefaultInputStream(parentAntProject.getDefaultInputStream()); 101 newProject.setInputHandler(parentAntProject.getInputHandler()); 102 Vector listeners = parentAntProject.getBuildListeners(); 103 final int count = listeners.size(); 104 for (int i = 0; i < count; i++) { 105 newProject.addBuildListener((BuildListener) listeners.elementAt(i)); 106 } 107 108 parentAntProject.initSubProject(newProject); 110 111 newProject.addTaskDefinition("property", (Class ) parentAntProject.getTaskDefinitions().get("property")); 113 Hashtable taskdefs = parentAntProject.getTaskDefinitions(); 114 Enumeration et = taskdefs.keys(); 115 while (et.hasMoreElements()) { 116 String taskName = (String ) et.nextElement(); 117 if (taskName.equals("property")) { 118 continue; 120 } 121 Class taskClass = (Class ) taskdefs.get(taskName); 122 newProject.addTaskDefinition(taskName, taskClass); 123 } 124 125 Hashtable typedefs = parentAntProject.getDataTypeDefinitions(); 126 Enumeration e = typedefs.keys(); 127 while (e.hasMoreElements()) { 128 String typeName = (String ) e.nextElement(); 129 Class typeClass = (Class ) typedefs.get(typeName); 130 newProject.addDataTypeDefinition(typeName, typeClass); 131 } 132 133 if (!inheritAll) { 135 newProject.setSystemProperties(); 137 } else { 138 addAlmostAll(newProject, parentAntProject.getProperties()); 140 } 141 142 return newProject; 143 } 144 145 146 147 155 private static void addAlmostAll(Project newProject, Hashtable props) { 156 Enumeration e = props.keys(); 157 while (e.hasMoreElements()) { 158 String key = e.nextElement().toString(); 159 if ("basedir".equals(key) || "ant.file".equals(key)) { 160 continue; 162 } 163 164 String value = props.get(key).toString(); 165 if (newProject.getProperty(key) == null) { 167 newProject.setNewProperty(key, value); 169 } 170 } 171 } 172 173 public static void inheritRefs(Project parentProject, Project newProject) { 174 Hashtable thisReferences = (Hashtable ) parentProject.getReferences().clone(); 175 Hashtable newReferences = newProject.getReferences(); 176 177 for (Enumeration e = thisReferences.keys(); e.hasMoreElements();) { 180 String key = (String ) e.nextElement(); 181 if (newReferences.containsKey(key)) { 182 continue; 183 } 184 copyReference(parentProject, newProject, key, key); 185 } 186 } 187 188 199 private static void copyReference(Project parentProject, Project newProject, String oldKey, String newKey) { 200 Object orig = parentProject.getReference(oldKey); 201 if (orig == null) { 202 parentProject.log("No object referenced by " + oldKey + ". Can't copy to " 203 + newKey, 204 Project.MSG_WARN); 205 return; 206 } 207 208 Class c = orig.getClass(); 209 Object copy = orig; 210 try { 211 Method cloneM = c.getMethod("clone", new Class [0]); 212 if (cloneM != null) { 213 copy = cloneM.invoke(orig, new Object [0]); 214 parentProject.log("Adding clone of reference " + oldKey, Project.MSG_DEBUG); 215 } 216 } catch (Exception e) { 217 } 219 220 221 if (copy instanceof ProjectComponent) { 222 ((ProjectComponent) copy).setProject(newProject); 223 } else { 224 try { 225 Method setProjectM = 226 c.getMethod("setProject", new Class [] {Project.class}); 227 if (setProjectM != null) { 228 setProjectM.invoke(copy, new Object [] {newProject}); 229 } 230 } catch (NoSuchMethodException e) { 231 } catch (Exception e2) { 234 String msg = "Error setting new project instance for " 235 + "reference with id " + oldKey; 236 throw new BuildException(msg, e2); } 238 } 239 newProject.addReference(newKey, copy); 240 } 241 } 242 | Popular Tags |