ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From anto...@apache.org
Subject cvs commit: ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce P4OutputStream.java P4HandlerAdapter.java P4Handler.java
Date Fri, 06 Jun 2003 21:12:13 GMT
antoine     2003/06/06 14:12:13

  Modified:    src/main/org/apache/tools/ant/taskdefs/optional/perforce
                        P4HandlerAdapter.java P4Handler.java
  Added:       src/main/org/apache/tools/ant/taskdefs/optional/perforce
                        P4OutputStream.java
  Log:
  Fix hopefully bug 18956.
  The code has been tested on Linux by Adam Ambrose
  P4HandlerAdapter will now delegate to PumpStreamHandler
  PR: 18956
  
  Revision  Changes    Path
  1.13      +32 -63    ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4HandlerAdapter.java
  
  Index: P4HandlerAdapter.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4HandlerAdapter.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- P4HandlerAdapter.java	18 Apr 2003 23:40:26 -0000	1.12
  +++ P4HandlerAdapter.java	6 Jun 2003 21:12:13 -0000	1.13
  @@ -54,46 +54,47 @@
   
   package org.apache.tools.ant.taskdefs.optional.perforce;
   
  -import java.io.BufferedReader;
  -import java.io.IOException;
  -import java.io.InputStream;
  -import java.io.InputStreamReader;
  -import java.io.OutputStream;
  -import org.apache.tools.ant.BuildException;
  -
  -public abstract class P4HandlerAdapter implements P4Handler {
  -
  -    public abstract void process(String line);
  +import java.io.*;
   
  +import org.apache.tools.ant.BuildException;
  +import org.apache.tools.ant.taskdefs.PumpStreamHandler;
  +/**
  + *    base class to manage streams around the execution of the Perforce
  + *    command line client
  + */
  +public abstract class P4HandlerAdapter  implements P4Handler {
   
       String p4input = "";
  -
  -    //set any data to be written to P4's stdin - messy, needs work
  +    private PumpStreamHandler myHandler = null;
  +    /**
  +     *  set any data to be written to P4's stdin
  +     *  @param p4Input the text to write to P4's stdin
  +     */
       public void setOutput(String p4Input) {
           this.p4input = p4Input;
       }
  -
  +    /**
  +     * subclasses of P4HandlerAdapter must implement this routine
  +     * processing of one line of stdout or of stderr
  +     * @param line
  +     */
  +    public abstract void process(String line);
   
       public void start() throws BuildException {
  -
  -        try {
  -            //First write any output to P4
  -            if (p4input != null && p4input.length() > 0 && os != null)
{
  -                os.write(p4input.getBytes());
  -                os.flush();
  -                os.close();
  -            }
  -
  -            //Now read any input and process
  -            Thread output = new Thread(new Reader(is));
  -            Thread error = new Thread(new Reader(es));
  -            output.start();
  -            error.start();
  -            output.join();
  -            error.join();
  -        } catch (Exception e) {
  -            throw new BuildException(e);
  +        if (p4input != null && p4input.length() > 0) {
  +            myHandler = new PumpStreamHandler(new P4OutputStream(this),new P4OutputStream(this),
new ByteArrayInputStream(p4input.getBytes()));
           }
  +        else {
  +            myHandler = new PumpStreamHandler(new P4OutputStream(this), new P4OutputStream(this));
  +        }
  +        myHandler.setProcessInputStream(os);
  +        myHandler.setProcessErrorStream(es);
  +        myHandler.setProcessOutputStream(is);
  +        myHandler.start();
  +    }
  +
  +    public void stop() {
  +        myHandler.stop();
       }
   
       OutputStream os;    //OUtput
  @@ -111,36 +112,4 @@
       public void setProcessOutputStream(InputStream is) throws IOException {
           this.is = is;
       }
  -
  -    public void stop() {
  -    }
  -
  -    public class Reader implements Runnable {
  -        protected InputStream mystream;
  -        public Reader(InputStream is)
  -        {
  -            mystream=is;
  -        }
  -        public void setStream(InputStream is) {
  -            mystream=is;
  -        }
  -        public void run() {
  -            BufferedReader input = new BufferedReader(
  -                    new InputStreamReader(mystream));
  -
  -            String line;
  -            try {
  -                while ((line = input.readLine()) != null) {
  -                    synchronized (this){
  -                        process(line);
  -                    }
  -                }
  -            }
  -            catch (Exception e) {
  -                throw new BuildException(e);
  -            }
  -        }
  -
  -    }
   }
  -
  
  
  
  1.5       +8 -0      ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Handler.java
  
  Index: P4Handler.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Handler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- P4Handler.java	10 Feb 2003 14:14:19 -0000	1.4
  +++ P4Handler.java	6 Jun 2003 21:12:13 -0000	1.5
  @@ -64,7 +64,15 @@
    */
   public interface P4Handler extends ExecuteStreamHandler {
   
  +  /**
  +   * processing of one line of stdout or of stderr
  +   * @param line
  +   */
       public void process(String line) throws BuildException;
   
  +  /**
  +   *  set any data to be written to P4's stdin
  +   *  @param line the text to write to P4's stdin
  +   */
       public void setOutput(String line) throws BuildException;
   }
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4OutputStream.java
  
  Index: P4OutputStream.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "Ant" and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs.optional.perforce;
  
  import java.io.OutputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  
  /**
   * heavily inspired from LogOutputStream
   * this stream class calls back the P4Handler on each line of stdout or stderr read
   * @author : <a href="mailto:levylambert@tiscali-dsl.de">Antoine Levy-Lambert</a>
   */
  public class P4OutputStream extends OutputStream {
      private P4Handler handler;
      private ByteArrayOutputStream buffer = new ByteArrayOutputStream();
      private boolean skip = false;
  
      /**
       * creates a new P4OutputStream for a P4Handler
       * @param handler
       */
      public P4OutputStream(P4Handler handler) {
          this.handler = handler;
      }
  
      /**
       * Write the data to the buffer and flush the buffer, if a line
       * separator is detected.
       *
       * @param cc data to log (byte).
       */
      public void write(int cc) throws IOException {
          final byte c = (byte) cc;
          if ((c == '\n') || (c == '\r')) {
              if (!skip) {
                  processBuffer();
              }
          } else {
              buffer.write(cc);
          }
          skip = (c == '\r');
      }
  
  
      /**
       * Converts the buffer to a string and sends it to <code>processLine</code>
       */
      protected void processBuffer() {
          handler.process(buffer.toString());
          buffer.reset();
      }
  
      /**
       * Writes all remaining
       */
      public void close() throws IOException {
          if (buffer.size() > 0) {
              processBuffer();
          }
          super.close();
      }
  
  }
  
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Mime
View raw message