private void setDefaultInputStream(GantBinding binding) { // Gant does not initialise the default input stream for // the Ant project, so we manually do it here. AntBuilder antBuilder = (AntBuilder) binding.getVariable("ant"); Project p = antBuilder.getAntProject(); try { System.setIn(originalIn); p.setInputHandler(new CommandLineInputHandler()); p.setDefaultInputStream(originalIn); } catch (NoSuchMethodError nsme) { // will only happen due to a bug in JRockit // note - the only approach that works is to loop through the public methods for (Method m : p.getClass().getMethods()) { if ("setDefaultInputStream".equals(m.getName()) && m.getParameterTypes().length == 1 && InputStream.class.equals(m.getParameterTypes()[0])) { try { m.invoke(p, originalIn); break; } catch (Exception e) { // shouldn't happen, but let it bubble up to the catch(Throwable) throw new RuntimeException(e); } } } } }
/** Runs the given targets for the test project specified */ public Map run( File buildFile, List targets, Properties projectProperties, Properties pluginState) { Project project = new Project(); project.setCoreLoader(getClass().getClassLoader()); antListener = new AntRunner.AntListener(); project.addBuildListener( createLogger(projectProperties.getProperty("quokka.debugger.logLevel"))); project.addBuildListener(antListener); // project.setInputHandler(new DefaultInputHandler()); project.setInputHandler( new InputHandler() { public void handleInput(InputRequest request) throws BuildException { System.out.println(request.getPrompt()); try { String line = new BufferedReader(new InputStreamReader(System.in)).readLine(); request.setInput(line); } catch (IOException e) { e.printStackTrace(); } } }); project.setKeepGoingMode(false); // PrintStream err = System.err; // PrintStream out = System.out; // InputStream in = System.in; project.setDefaultInputStream(System.in); // System.setIn(new DemuxInputStream(project)); // System.setOut(new PrintStream(new DemuxOutputStream(project, false))); // System.setErr(new PrintStream(new DemuxOutputStream(project, true))); for (Iterator i = projectProperties.entrySet().iterator(); i.hasNext(); ) { Map.Entry entry = (Map.Entry) i.next(); project.setUserProperty((String) entry.getKey(), (String) entry.getValue()); } Exception exception = null; try { project.fireBuildStarted(); project.init(); project.setUserProperty("ant.version", "1.7.0"); project.setUserProperty("ant.file", buildFile.getAbsolutePath()); // Remove hard dependency on core.main to allow integration tests to be // done within the core.main package. This is ok as AntRunner is loaded via the integration // test class loader. org.apache.tools.ant.ProjectHelper helper = (org.apache.tools.ant.ProjectHelper) getClass() .getClassLoader() .loadClass("ws.quokka.core.main.ant.ProjectHelper") .newInstance(); project.addReference("ant.projectHelper", helper); helper.parse(project, buildFile); // Add any plugin state PluginState state = (PluginState) project.getReference("quokka.pluginState"); for (Iterator i = pluginState.entrySet().iterator(); i.hasNext(); ) { Map.Entry entry = (Map.Entry) i.next(); state.put((String) entry.getKey(), entry.getValue()); } Vector targetsVector = new Vector(); targetsVector.addAll(targets); // make sure that we have a target to execute if (targets.size() == 0) { if (project.getDefaultTarget() != null) { targetsVector.add(project.getDefaultTarget()); } } project.executeTargets(targetsVector); Map results = antListener.toMap(); results.put("antProperties", new HashMap(project.getProperties())); return results; } catch (Exception e) { exception = e; if (e instanceof RuntimeException) { throw (RuntimeException) e; } else { throw new BuildException(e); } } finally { // System.setOut(out); // System.setErr(err); // System.setIn(in); project.fireBuildFinished(exception); } }