Hi Chris, closing the Flash Player is quite fine. On Windows this actually already done by killing the process.
Cheers, Simon Chris Allen wrote: > Okay, > > It seems to work great so here is the version that will quit the > SAFlashPlayer when it's done. Let me know if this is even a feature > that people would want, and does it screw up your workflow having the > script close Flash player like this? Please test and let me know. > > The Jar file is included with this as well for those that don't want > to compile it. > > -Chris > > /* > * Copyright the original author or authors. > * > * Licensed under the MOZILLA PUBLIC LICENSE, Version 1.1 (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.mozilla.org/MPL/MPL-1.1.html > * > * 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 org.as2lib.ant; > > import java.io.BufferedReader; > import java.io.ByteArrayInputStream; > import java.io.File; > import java.io.IOException; > import java.io.InputStreamReader; > import java.net.ServerSocket; > import java.net.Socket; > > 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.apache.tools.ant.taskdefs.Execute; > import org.apache.tools.ant.types.Commandline; > import org.w3c.dom.Document; > import org.w3c.dom.Element; > import org.xml.sax.SAXException; > > /** > * [EMAIL PROTECTED] UnitTest} executes a unit test swf and writes the result > to the > * console. > * > * <p> > * The unit test swf must send the result over the XML socket, with host > * "localhost" and port 3212 by default or the one declared in the > build file. > * > * <p> > * If <b>As2lib Unit Test</b> is used the unit test swf may register the > * [EMAIL PROTECTED] XmlSocketTestListener} at the test runner which sends the > test > * execution information properly formatted to this task. > * > * <p> > * <p> > * If <b>AsUnit</b> is used the unit test swf may register the > * [EMAIL PROTECTED] XmlSocketResultPrinter} at the test runner which sends > the test > * execution information properly formatted to this task. > * > * <p> > * The sent test execution information must be formatted as follows: > * <ul> > * <li><start>Start message.</start></li> > * <li><update>Update message.</update></li> > * <li><pause>Pause message.</pause></li> > * <li><resume>Resume message.</resume> > * <li><error>Error message.</error></li> > * <li><failure>Failure message.</failure></li> > * <li><finish hasErrors="false/true">Finish > message.</finish></li> > * <li><message>Arbitrary message.</message></li> > * </ul> > * > * <p> > * As soon as the ant task receives the finish information it will > close the > * opened unit test swf and finish its execution. > * > * <p> > * This task can take the following arguments: > * <ul> > * <li> [EMAIL PROTECTED] #setSwf(File) swf} (test swf file to execute and > receive > unit > * test results from) </li> > * <li> [EMAIL PROTECTED] #setFlashPlayer(File) flashplayer} (location of the > flashplayer > * to execute the swf with) </li> > * <li>[EMAIL PROTECTED] #setPort(int) port} (port of the xml socket to listen > to)</li> > * </ul> > * > * <p> > * You must supply 'swf' and 'flashplayer'. > * > * @author Simon Wacker > * @author Christophe Herreman > * @author Chris Allen > */ > public class UnitTestForMacAndPC extends Task { > > public static final String START_ELEMENT = "start"; > > public static final String UPDATE_ELEMENT = "update"; > > public static final String PAUSE_ELEMENT = "pause"; > > public static final String RESUME_ELEMENT = "resume"; > > public static final String ERROR_ELEMENT = "error"; > > public static final String FAILURE_ELEMENT = "failure"; > > public static final String FINISH_ELEMENT = "finish"; > > public static final String HAS_ERRORS_ATTRIBUTE = "hasErrors"; > > public static final String TRUE_VALUE = "true"; > > private File swf; > > private File flashPlayer; > > private int port; > > private boolean isFinished = false; > > private boolean hasFailed = false; > > /** > * Constructs a new [EMAIL PROTECTED] UnitTest} instance, with the > default > port 3212. > */ > public UnitTestForMacAndPC() { > port = 3212; > // log("OS Name: " + System.getProperty("os.name")); > } > > /** > * Sets the swf file which executes the compiled unit tests and > sends the > * result through the xml socket. > */ > public void setSwf(File swf) { > this.swf = swf; > } > > /** > * Returns the swf file which executes the compiled unit tests and > sends the > * result through the xml socket. > */ > public File getSwf() { > return swf; > } > > /** > * Sets the flash player to run the unit test swf in. > */ > public void setFlashPlayer(File flashPlayer) { > this.flashPlayer = flashPlayer; > } > > /** > * Returns the flash player to run the unit test swf in. > */ > public File getFlashPlayer() { > return flashPlayer; > } > > /** > * Sets the port to listen for unit test results on. The default > port is > * 3212. > */ > public void setPort(int port) { > this.port = port; > } > > /** > * Returns the port to listen for unit test results on. The > default port is > * 3212. > */ > public int getPort() { > return port; > } > > /** > * Returns whether the process has finished. This is nedded on Mac > OSX > * because the open command finishes before the Flash Player is done > * executing. > */ > public boolean isFinished() { > return isFinished; > } > > /** > * Sets a flag for whether the process has finished. This is > nedded on Mac > * OSX because the open command finishes before the Flash Player > is done > * executing. > * > * @param isFinished > */ > > public void setFinished(boolean isFinished) { > this.isFinished = isFinished; > } > > public void setHasFailed(boolean hasFailed) { > this.hasFailed = hasFailed; > } > > /** > * Executes this task. > * > * @throws BuildException > * if swf or flash player is not specified > */ > public void execute() throws BuildException { > if (swf == null) { > throw new BuildException("A unit test swf must be supplied.", > getLocation()); > } > if (flashPlayer == null) { > throw new BuildException("A flash player must be supplied.", > getLocation()); > } > Commandline command = new Commandline(); > boolean isAMac = System.getProperty("os.name").equals("Mac OS > X"); > > if (isAMac) { > command.setExecutable("open"); > // command.createArgument().setValue(flashPlayer.getPath()); > } else { > // for windows > command.setExecutable(flashPlayer.getPath()); > } > > command.createArgument().setFile(swf); > Receiver receiver = new Receiver(this); > receiver.startServer(port); > try { > log(command.toString()); > Process process = Execute.launch(getProject(), command > .getCommandline(), null, > getProject().getBaseDir(), true); > receiver.setProcess(process); > process.waitFor(); > > // loop for Mac Flash Player > if (isAMac) { > > while (!isFinished) { > Thread.sleep(4); > } > > killMacFlashPlayer(); > > if (hasFailed) { > throw new BuildException( > "The build failed because a unit test did > not pass."); > } > } else { > if (hasFailed) { > throw new BuildException( > "The build failed because a unit test did > not pass."); > } > } > > } catch (IOException e) { > throw new BuildException("Error running unit tests.", e, > getLocation()); > } catch (InterruptedException e) { > throw new BuildException("Error running unit tests.", e, > getLocation()); > } > receiver.stopServer(); > } > > private void killMacFlashPlayer() throws IOException { > Commandline command = new Commandline(); > command.setExecutable("killall"); > command.createArgument().setValue("SAFlashPlayer"); > Execute.launch(getProject(), command.getCommandline(), null, > getProject().getBaseDir(), true); > } > > private static class Receiver extends Thread { > > private UnitTestForMacAndPC task; > > private ServerSocket server; > > private BufferedReader in; > > private Process process; > > public Receiver(UnitTestForMacAndPC task) { > this.task = task; > } > > public void setProcess(Process process) { > this.process = process; > } > > public void run() { > try { > task.log("-\n-"); > task.log("running"); > String previousNodeName = ""; > while (true) { > Socket socket = server.accept(); > in = new BufferedReader(new InputStreamReader(socket > .getInputStream())); > char[] charBuffer = new char[1]; > while (in.read(charBuffer, 0, 1) != -1) { > StringBuffer stringBuffer = new > StringBuffer(8192); > while (charBuffer[0] != '\0') { > stringBuffer.append(charBuffer[0]); > in.read(charBuffer, 0, 1); > } > DocumentBuilderFactory factory = > DocumentBuilderFactory > .newInstance(); > DocumentBuilder builder = > factory.newDocumentBuilder(); > Document document = builder > .parse(new > ByteArrayInputStream(stringBuffer > .toString().getBytes())); > Element element = document.getDocumentElement(); > String message = > element.getFirstChild().getNodeValue(); > String nodeName = element.getNodeName(); > if (nodeName.equals(START_ELEMENT)) { > task.log(message + "\n-"); > } else if (nodeName.equals(UPDATE_ELEMENT)) { > task.log(message); > } else if (nodeName.equals(PAUSE_ELEMENT)) { > task.log("-\n" + message); > } else if (nodeName.equals(RESUME_ELEMENT)) { > task.log(message + "\n-"); > } else if (nodeName.equals(ERROR_ELEMENT) > || nodeName.equals(FAILURE_ELEMENT)) { > task.setHasFailed(true); > task.log(message, Project.MSG_ERR); > } else if (nodeName.equals(FINISH_ELEMENT)) { > if (!previousNodeName.equals(START_ELEMENT) > && > !previousNodeName.equals(RESUME_ELEMENT)) { > task.log("-"); > } > if > (element.getAttribute(HAS_ERRORS_ATTRIBUTE) > .equals(TRUE_VALUE)) { > task.log(message, Project.MSG_ERR); > } else { > task.log(message); > } > task.log("-\n-"); > task.setFinished(true); > process.destroy(); > return; > } else { > task.log(message); > } > previousNodeName = nodeName; > } > > } > } catch (IOException e) { > throw new BuildException("Error on reading result.", > e, task > .getLocation()); > } catch (ParserConfigurationException e) { > throw new BuildException("Error on reading result.", > e, task > .getLocation()); > } catch (SAXException e) { > throw new BuildException("Error on reading result.", > e, task > .getLocation()); > } > } > > public void startServer(int port) { > try { > server = new ServerSocket(port); > super.start(); > } catch (IOException e) { > stopServer(); > throw new BuildException("Error on starting server.", > e, task > .getLocation()); > } > } > > public void stopServer() { > try { > if (server != null) { > server.close(); > } > } catch (IOException e) { > throw new BuildException("Error on stopping server.", > e, task > .getLocation()); > } finally { > try { > if (in != null) { > in.close(); > } > } catch (IOException e) { > throw new BuildException("Error on stopping > server.", e, > task.getLocation()); > } > } > } > > } > } > >------------------------------------------------------------------------ > >_______________________________________________ >osflash mailing list >[email protected] >http://osflash.org/mailman/listinfo/osflash_osflash.org > > -- Simon Wacker www.simonwacker.com www.as2lib.org www.hq-heilbronn.de www.flik-flak.de _______________________________________________ osflash mailing list [email protected] http://osflash.org/mailman/listinfo/osflash_osflash.org
