/* * Copyright (c) 2005 Pankaj Kumar (pankaj.kumar@gmail.com) * This software is being made available on "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. */ ant(){ if (getResource("/org/apache/tools/ant/Project.class") == null){ print("WARNING: Cannot initialize Ant."); print("WARNING: Perhaps ant.jar is not in CLASSPATH ..."); return null; } project = new org.apache.tools.ant.Project(); project.setCoreLoader(null); project.init(); logger = new org.apache.tools.ant.DefaultLogger(); logger.setOutputPrintStream(System.out); logger.setErrorPrintStream(System.err); logger.setMessageOutputLevel(org.apache.tools.ant.Project.MSG_INFO); project.addBuildListener(logger); project.setBaseDir(new File(".")); tasks = new Properties(); propFilename = "/org/apache/tools/ant/taskdefs/defaults.properties"; tasks.load(tasks.getClass().getResourceAsStream(propFilename)); // Set environment. env_prop = new org.apache.tools.ant.taskdefs.Property(); env_prop.setProject(project); env_prop.setEnvironment("myenv"); env_prop.execute(); invoke(String tname, Object[] args){ clazz = tasks.getProperty(tname); if (clazz == null){ throw new Exception("no such task: " + tname); } tobj = Class.forName(clazz).newInstance(); tobj.setProject(project); tobj.setTaskName(tname); return element(tobj, null); } // need separate method for ant(). May be a BeanShell bug. ant(){ return invoke("ant", new Object[] { }); } convType(String arg, Class type){ if (type.isPrimitive()){ if (type.toString().equals("boolean")){ ucArg = arg.toUpperCase(); return ((ucArg.equals("TRUE") || ucArg.equals("ON") || ucArg.equals("YES")) ? Boolean.TRUE : Boolean.FALSE); } else if (type.toString().equals("int")){ return Integer.valueOf(arg); } else if (type.toString().equals("short")){ return Short.valueOf(arg); } else { print("unknown type: " + type); return null; } } else { ctor = type.getConstructor(new Class[] {arg.getClass()}); return ctor.newInstance(new Object[] { arg }); } } element(aobj, parent){ this.aobj = aobj; this.parent = parent; java.lang.reflect.Method[] methods = aobj.getClass().getMethods(); invoke(String aname, Object[] args){ if (args.length == 0){ // treat aname as an inner element for (method:methods){ mName = method.getName(); if (mName.equalsIgnoreCase("create" + aname)){ return element(method.invoke(aobj, args), this); } else if (mName.equalsIgnoreCase("add" + aname)|| mName.equalsIgnoreCase("addConfigured" + aname)){ Class[] ptypes = method.getParameterTypes(); if (ptypes.length == 1){ args = new Object[] { ptypes[0].newInstance() }; method.invoke(aobj, args); return element(args[0], this); } } } print("no such inner element: " + aname); } else if (args.length == 1){ for (method:methods){ if (method.getName().equalsIgnoreCase("set" + aname) || (aname.equalsIgnoreCase("text") && method.getName().equals("addText")) ){ Class[] ptypes = method.getParameterTypes(); if (ptypes.length != 1){ print("no such attribute: " + aname); return null; } // May need for type conversion if (!ptypes[0].equals(args[0].getClass())){ args[0] = convType(args[0], ptypes[0]); } method.invoke(aobj, args); return this; } } print("no such attribute: " + aname); } else { print("invalid signature for: " + aname); } return null; } // Convenience method, so that one can call // task().innerelem().....execute() // in place of task().innerelem().....parent.execute() execute(){ if (parent == null) aobj.execute(); else parent.execute(); } return this; } String getenv(String key){ return project.getProperty("myenv." + key); } String getenv(String key, String def){ value = project.getProperty("myenv." + key); return (value == null ? def : value); } return this; }