/* * Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sf.antcontrib.antserver.client; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Enumeration; import java.util.Vector; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import net.sf.antcontrib.antserver.Command; import net.sf.antcontrib.antserver.Response; import net.sf.antcontrib.antserver.commands.RunAntCommand; import net.sf.antcontrib.antserver.commands.RunTargetCommand; import net.sf.antcontrib.antserver.commands.SendFileCommand; import net.sf.antcontrib.antserver.commands.ShutdownCommand; /**************************************************************************** * Place class description here. * * @author <a href='mailto:mattinger@yahoo.com'>Matthew Inger</a> * @author <additional author> * * @since * ****************************************************************************/ public class ClientTask extends Task { private String machine = "localhost"; private int port = 17000; private Vector commands; private boolean persistant = false; private boolean failOnError = true; public ClientTask() { super(); this.commands = new Vector(); } public void setMachine(String machine) { this.machine = machine; } public void setPort(int port) { this.port = port; } public void setPersistant(boolean persistant) { this.persistant = persistant; } public void setFailOnError(boolean failOnError) { this.failOnError = failOnError; } public void addConfiguredShutdown(ShutdownCommand cmd) { commands.add(cmd); } public void addConfiguredRunTarget(RunTargetCommand cmd) { commands.add(cmd); } public void addConfiguredRunAnt(RunAntCommand cmd) { commands.add(cmd); } public void addConfiguredSendFile(SendFileCommand cmd) { commands.add(cmd); } public void execute() { Enumeration e = commands.elements(); Command c = null; while (e.hasMoreElements()) { c = (Command)e.nextElement(); c.validate(getProject()); } Client client = new Client(getProject(), machine, port); try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); try { int failCount = 0; client.connect(); e = commands.elements(); c = null; Response r = null; Document d = null; boolean keepGoing = true; while (e.hasMoreElements() && keepGoing) { c = (Command)e.nextElement(); r = client.sendCommand(c); if (! r.isSucceeded()) { failCount++; log("Command caused a build failure:" + c, Project.MSG_ERR); log(r.getErrorMessage(), Project.MSG_ERR); log(r.getErrorStackTrace(), Project.MSG_DEBUG); if (! persistant) keepGoing = false; } try { ByteArrayInputStream bais = new ByteArrayInputStream(r.getResultsXml().getBytes()); d = db.parse(bais); NodeList nl = d.getElementsByTagName("target"); int len = nl.getLength(); Element element = null; for (int i=0;i<len;i++) { element = (Element)nl.item(i); getProject().log("[" + element.getAttribute("name") + "]", Project.MSG_INFO); } } catch (SAXException se) { } if (c instanceof ShutdownCommand) { keepGoing = false; client.shutdown(); } } if (failCount > 0 && failOnError) throw new BuildException("One or more commands failed."); } finally { if (client != null) client.disconnect(); } } catch (ParserConfigurationException ex) { throw new BuildException(ex); } catch (IOException ex) { throw new BuildException(ex); } } }