diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/AntTelnetClient.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/AntTelnetClient.java new file mode 100644 index 000000000..3ebe990eb --- /dev/null +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/AntTelnetClient.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.tools.ant.taskdefs.optional.net; + +import com.oroinc.net.telnet.TelnetClient; +import java.io.InputStream; +import java.io.OutputStream; +import org.apache.myrmidon.api.TaskException; + +/** + * This class handles the abstraction of the telnet protocol. Currently it + * is a wrapper around ORO 's NetComponents + */ +public class AntTelnetClient + extends TelnetClient +{ + private TelnetTask m_task; + + public AntTelnetClient( final TelnetTask task ) + { + m_task = task; + } + + /** + * Write this string to the telnet session. + */ + public void sendString( final String string, final boolean echoString ) + throws TaskException + { + final OutputStream output = this.getOutputStream(); + m_task.doSendString( output, string, echoString ); + } + + /** + * Read from the telnet session until the string we are waiting for is + * found + */ + public void waitForString( final String string ) + throws TaskException + { + waitForString( string, null ); + } + + /** + * Read from the telnet session until the string we are waiting for is + * found or the timeout has been reached + * + * @parm s The string to wait on + * @parm timeout The maximum number of seconds to wait + */ + public void waitForString( final String string, + final Integer timeout ) + throws TaskException + { + final InputStream input = this.getInputStream(); + m_task.doWaitForString( input, string, timeout ); + } +} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetRead.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetRead.java new file mode 100644 index 000000000..3b02f79f7 --- /dev/null +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetRead.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.tools.ant.taskdefs.optional.net; + +import org.apache.myrmidon.api.TaskException; + +/** + * This class reads the output from the connected server until the required + * string is found. + */ +public class TelnetRead + extends TelnetSubTask +{ + private Integer m_timeout; + + /** + * Sets the default timeout if none has been set already + */ + public void setDefaultTimeout( final Integer defaultTimeout ) + { + if( m_timeout == null ) + { + m_timeout = defaultTimeout; + } + } + + /** + * Override any default timeouts + */ + public void setTimeout( final Integer timeout ) + { + m_timeout = timeout; + } + + public void execute( final AntTelnetClient telnet ) + throws TaskException + { + telnet.waitForString( getTaskString(), m_timeout ); + } +} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetSubTask.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetSubTask.java new file mode 100644 index 000000000..94d18548c --- /dev/null +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetSubTask.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.tools.ant.taskdefs.optional.net; + +import org.apache.myrmidon.api.TaskException; + +/** + * This class is the parent of the Read and Write tasks. It handles the + * common attributes for both. + */ +public abstract class TelnetSubTask +{ + private String m_taskString = ""; + + public void setString( final String string ) + { + m_taskString += string; + } + + public void addContent( final String string ) + { + setString( string ); + } + + public void execute( AntTelnetClient telnet ) + throws TaskException + { + throw new TaskException( "Shouldn't be able instantiate a SubTask directly" ); + } + + protected final String getTaskString() + { + return m_taskString; + } +} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java index 1479006fb..9108c20c0 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java @@ -7,398 +7,277 @@ */ package org.apache.tools.ant.taskdefs.optional.net; -import com.oroinc.net.telnet.TelnetClient; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Calendar; import java.util.Iterator; +import org.apache.myrmidon.api.AbstractTask; import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.Task; /** * Class to provide automated telnet protocol support for the Ant build tool * + * @author Peter Donald * @author ScottCarlson@email.com * @version $Revision$ */ - -public class TelnetTask extends Task +public class TelnetTask + extends AbstractTask { /** * The userid to login with, if automated login is used */ - private String userid = null; + private String m_userid; /** * The password to login with, if automated login is used */ - private String password = null; + private String m_password; /** * The server to connect to. */ - private String server = null; + private String m_server; /** * The tcp port to connect to. */ - private int port = 23; - - /** - * The Object which handles the telnet session. - */ - private AntTelnetClient telnet = null; + private int m_port = 23; /** * The list of read/write commands for this session */ - private ArrayList telnetTasks = new ArrayList(); + private ArrayList m_telnetTasks = new ArrayList(); /** * If true, adds a CR to beginning of login script */ - private boolean addCarriageReturn = false; + private boolean m_addCarriageReturn; /** * Default time allowed for waiting for a valid response for all child * reads. A value of 0 means no limit. */ - private Integer defaultTimeout = null; + private Integer m_defaultTimeout; /** * Set the tcp port to connect to attribute - * - * @param b The new InitialCR value */ - public void setInitialCR( boolean b ) + public void setInitialCR( final boolean addCarriageReturn ) { - this.addCarriageReturn = b; + m_addCarriageReturn = addCarriageReturn; } /** * Set the password attribute - * - * @param p The new Password value */ - public void setPassword( String p ) + public void setPassword( final String password ) { - this.password = p; + m_password = password; } /** * Set the tcp port to connect to attribute - * - * @param p The new Port value */ - public void setPort( int p ) + public void setPort( final int port ) { - this.port = p; + m_port = port; } /** * Set the server address attribute - * - * @param m The new Server value */ - public void setServer( String m ) + public void setServer( final String server ) { - this.server = m; + m_server = server; } /** * Change the default timeout to wait for valid responses - * - * @param i The new Timeout value */ - public void setTimeout( Integer i ) + public void setTimeout( final Integer defaultTimeout ) { - this.defaultTimeout = i; + m_defaultTimeout = defaultTimeout; } /** * Set the userid attribute - * - * @param u The new Userid value */ - public void setUserid( String u ) + public void setUserid( final String userid ) { - this.userid = u; + m_userid = userid; } /** * A subTask <read> tag was found. Create the object, Save it in our * list, and return it. - * - * @return Description of the Returned Value */ - - public TelnetSubTask createRead() + public void addRead( final TelnetRead read ) { - TelnetSubTask task = (TelnetSubTask)new TelnetRead(); - telnetTasks.add( task ); - return task; + m_telnetTasks.add( read ); } /** * A subTask <write> tag was found. Create the object, Save it in our * list, and return it. - * - * @return Description of the Returned Value */ - public TelnetSubTask createWrite() + public void addWrite( final TelnetWrite write ) { - TelnetSubTask task = (TelnetSubTask)new TelnetWrite(); - telnetTasks.add( task ); - return task; + m_telnetTasks.add( write ); } /** * Verify that all parameters are included. Connect and possibly login * Iterate through the list of Reads and writes - * - * @exception TaskException Description of Exception */ public void execute() throws TaskException { - /** - * A server name is required to continue - */ - if( server == null ) - throw new TaskException( "No Server Specified" ); - /** - * A userid and password must appear together if they appear. They are - * not required. - */ - if( userid == null && password != null ) - throw new TaskException( "No Userid Specified" ); - if( password == null && userid != null ) - throw new TaskException( "No Password Specified" ); + validate(); /** * Create the telnet client object */ - telnet = new AntTelnetClient(); + final AntTelnetClient telnet = new AntTelnetClient( this ); try { - telnet.connect( server, port ); + telnet.connect( m_server, m_port ); } - catch( IOException e ) + catch( final IOException ioe ) { - throw new TaskException( "Can't connect to " + server ); + throw new TaskException( "Can't connect to " + m_server, ioe ); } /** * Login if userid and password were specified */ - if( userid != null && password != null ) - login(); - /** - * Process each sub command - */ - Iterator tasksToRun = telnetTasks.iterator(); - while( tasksToRun != null && tasksToRun.hasNext() ) + if( m_userid != null && m_password != null ) { - TelnetSubTask task = (TelnetSubTask)tasksToRun.next(); - if( task instanceof TelnetRead && defaultTimeout != null ) - ( (TelnetRead)task ).setDefaultTimeout( defaultTimeout ); - task.execute( telnet ); + login( telnet ); } - } - /** - * Process a 'typical' login. If it differs, use the read and write tasks - * explicitely - */ - private void login() - { - if( addCarriageReturn ) - telnet.sendString( "\n", true ); - telnet.waitForString( "ogin:" ); - telnet.sendString( userid, true ); - telnet.waitForString( "assword:" ); - telnet.sendString( password, false ); + processTasks( telnet ); } /** - * This class handles the abstraction of the telnet protocol. Currently it - * is a wrapper around ORO 's NetComponents - * - * @author RT + * Process each sub command */ - public class AntTelnetClient extends TelnetClient + private void processTasks( final AntTelnetClient telnet ) + throws TaskException { - - /** - * Write this string to the telnet session. - * - * @param s Description of Parameter - * @param echoString Description of Parameter - * @parm echoString Logs string sent - */ - public void sendString( String s, boolean echoString ) + final Iterator tasks = m_telnetTasks.iterator(); + while( tasks != null && tasks.hasNext() ) { - OutputStream os = this.getOutputStream(); - try - { - os.write( ( s + "\n" ).getBytes() ); - if( echoString ) - getLogger().info( s ); - os.flush(); - } - catch( Exception e ) + final TelnetSubTask task = (TelnetSubTask)tasks.next(); + if( task instanceof TelnetRead && m_defaultTimeout != null ) { - throw new TaskException( "Error", e ); - } - } - - /** - * Read from the telnet session until the string we are waiting for is - * found - * - * @param s Description of Parameter - * @parm s The string to wait on - */ - public void waitForString( String s ) - { - waitForString( s, null ); - } - - /** - * Read from the telnet session until the string we are waiting for is - * found or the timeout has been reached - * - * @param s Description of Parameter - * @param timeout Description of Parameter - * @parm s The string to wait on - * @parm timeout The maximum number of seconds to wait - */ - public void waitForString( String s, Integer timeout ) - { - InputStream is = this.getInputStream(); - try - { - StringBuffer sb = new StringBuffer(); - if( timeout == null || timeout.intValue() == 0 ) - { - while( sb.toString().indexOf( s ) == -1 ) - { - sb.append( (char)is.read() ); - } - } - else - { - Calendar endTime = Calendar.getInstance(); - endTime.add( Calendar.SECOND, timeout.intValue() ); - while( sb.toString().indexOf( s ) == -1 ) - { - while( Calendar.getInstance().before( endTime ) && - is.available() == 0 ) - { - Thread.sleep( 250 ); - } - if( is.available() == 0 ) - throw new TaskException( "Response Timed-Out" ); - sb.append( (char)is.read() ); - } - } - getLogger().info( sb.toString() ); - } - catch( TaskException be ) - { - throw be; - } - catch( Exception e ) - { - throw new TaskException( "Error", e ); + ( (TelnetRead)task ).setDefaultTimeout( m_defaultTimeout ); } + task.execute( telnet ); } } - /** - * This class reads the output from the connected server until the required - * string is found. - * - * @author RT - */ - public class TelnetRead extends TelnetSubTask + private void validate() + throws TaskException { - private Integer timeout = null; - - /** - * Sets the default timeout if none has been set already - * - * @param defaultTimeout The new DefaultTimeout value - */ - public void setDefaultTimeout( Integer defaultTimeout ) + //A server name is required to continue + if( m_server == null ) { - if( timeout == null ) - timeout = defaultTimeout; + throw new TaskException( "No Server Specified" ); } - /** - * Override any default timeouts - * - * @param i The new Timeout value - */ - public void setTimeout( Integer i ) + //A userid and password must appear together if they appear. They are + //not required. + if( m_userid == null && m_password != null ) { - this.timeout = i; + throw new TaskException( "No Userid Specified" ); } - - public void execute( AntTelnetClient telnet ) - throws TaskException + if( m_password == null && m_userid != null ) { - telnet.waitForString( taskString, timeout ); + throw new TaskException( "No Password Specified" ); } } /** - * This class is the parent of the Read and Write tasks. It handles the - * common attributes for both. - * - * @author RT + * Process a 'typical' login. If it differs, use the read and write tasks + * explicitely */ - public class TelnetSubTask + private void login( final AntTelnetClient telnet ) + throws TaskException { - protected String taskString = ""; - - public void setString( String s ) + if( m_addCarriageReturn ) { - taskString += s; + telnet.sendString( "\n", true ); } + telnet.waitForString( "ogin:" ); + telnet.sendString( m_userid, true ); + telnet.waitForString( "assword:" ); + telnet.sendString( m_password, false ); + } - public void addContent( String s ) + protected void doSendString( final OutputStream output, + final String string, + final boolean echoString ) + throws TaskException + { + try { - setString( s ); + output.write( ( string + "\n" ).getBytes() ); + if( echoString ) + { + getLogger().info( string ); + } + output.flush(); } - - public void execute( AntTelnetClient telnet ) - throws TaskException + catch( final Exception e ) { - throw new TaskException( "Shouldn't be able instantiate a SubTask directly" ); + throw new TaskException( e.getMessage(), e ); } } - /** - * This class sends text to the connected server - * - * @author RT - */ - public class TelnetWrite extends TelnetSubTask + protected void doWaitForString( final InputStream input, + final String string, + final Integer timeout ) + throws TaskException { - private boolean echoString = true; - - public void setEcho( boolean b ) + try { - echoString = b; + final StringBuffer sb = new StringBuffer(); + if( timeout == null || timeout.intValue() == 0 ) + { + while( sb.toString().indexOf( string ) == -1 ) + { + sb.append( (char)input.read() ); + } + } + else + { + final Calendar endTime = Calendar.getInstance(); + endTime.add( Calendar.SECOND, timeout.intValue() ); + while( sb.toString().indexOf( string ) == -1 ) + { + while( Calendar.getInstance().before( endTime ) && + input.available() == 0 ) + { + Thread.sleep( 250 ); + } + if( input.available() == 0 ) + { + throw new TaskException( "Response Timed-Out" ); + } + sb.append( (char)input.read() ); + } + } + getLogger().info( sb.toString() ); } - - public void execute( AntTelnetClient telnet ) - throws TaskException + catch( final TaskException te ) + { + throw te; + } + catch( final Exception e ) { - telnet.sendString( taskString, echoString ); + throw new TaskException( e.getMessage(), e ); } } } diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetWrite.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetWrite.java new file mode 100644 index 000000000..bc4cdfa57 --- /dev/null +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetWrite.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.tools.ant.taskdefs.optional.net; + +import org.apache.myrmidon.api.TaskException; + +/** + * This class sends text to the connected server + */ +public class TelnetWrite + extends TelnetSubTask +{ + private boolean m_echo = true; + + public void setEcho( final boolean echo ) + { + m_echo = echo; + } + + public void execute( final AntTelnetClient telnet ) + throws TaskException + { + telnet.sendString( getTaskString(), m_echo ); + } +} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/AntTelnetClient.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/AntTelnetClient.java new file mode 100644 index 000000000..3ebe990eb --- /dev/null +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/AntTelnetClient.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.tools.ant.taskdefs.optional.net; + +import com.oroinc.net.telnet.TelnetClient; +import java.io.InputStream; +import java.io.OutputStream; +import org.apache.myrmidon.api.TaskException; + +/** + * This class handles the abstraction of the telnet protocol. Currently it + * is a wrapper around ORO 's NetComponents + */ +public class AntTelnetClient + extends TelnetClient +{ + private TelnetTask m_task; + + public AntTelnetClient( final TelnetTask task ) + { + m_task = task; + } + + /** + * Write this string to the telnet session. + */ + public void sendString( final String string, final boolean echoString ) + throws TaskException + { + final OutputStream output = this.getOutputStream(); + m_task.doSendString( output, string, echoString ); + } + + /** + * Read from the telnet session until the string we are waiting for is + * found + */ + public void waitForString( final String string ) + throws TaskException + { + waitForString( string, null ); + } + + /** + * Read from the telnet session until the string we are waiting for is + * found or the timeout has been reached + * + * @parm s The string to wait on + * @parm timeout The maximum number of seconds to wait + */ + public void waitForString( final String string, + final Integer timeout ) + throws TaskException + { + final InputStream input = this.getInputStream(); + m_task.doWaitForString( input, string, timeout ); + } +} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetRead.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetRead.java new file mode 100644 index 000000000..3b02f79f7 --- /dev/null +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetRead.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.tools.ant.taskdefs.optional.net; + +import org.apache.myrmidon.api.TaskException; + +/** + * This class reads the output from the connected server until the required + * string is found. + */ +public class TelnetRead + extends TelnetSubTask +{ + private Integer m_timeout; + + /** + * Sets the default timeout if none has been set already + */ + public void setDefaultTimeout( final Integer defaultTimeout ) + { + if( m_timeout == null ) + { + m_timeout = defaultTimeout; + } + } + + /** + * Override any default timeouts + */ + public void setTimeout( final Integer timeout ) + { + m_timeout = timeout; + } + + public void execute( final AntTelnetClient telnet ) + throws TaskException + { + telnet.waitForString( getTaskString(), m_timeout ); + } +} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetSubTask.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetSubTask.java new file mode 100644 index 000000000..94d18548c --- /dev/null +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetSubTask.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.tools.ant.taskdefs.optional.net; + +import org.apache.myrmidon.api.TaskException; + +/** + * This class is the parent of the Read and Write tasks. It handles the + * common attributes for both. + */ +public abstract class TelnetSubTask +{ + private String m_taskString = ""; + + public void setString( final String string ) + { + m_taskString += string; + } + + public void addContent( final String string ) + { + setString( string ); + } + + public void execute( AntTelnetClient telnet ) + throws TaskException + { + throw new TaskException( "Shouldn't be able instantiate a SubTask directly" ); + } + + protected final String getTaskString() + { + return m_taskString; + } +} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java index 1479006fb..9108c20c0 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java @@ -7,398 +7,277 @@ */ package org.apache.tools.ant.taskdefs.optional.net; -import com.oroinc.net.telnet.TelnetClient; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Calendar; import java.util.Iterator; +import org.apache.myrmidon.api.AbstractTask; import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.Task; /** * Class to provide automated telnet protocol support for the Ant build tool * + * @author Peter Donald * @author ScottCarlson@email.com * @version $Revision$ */ - -public class TelnetTask extends Task +public class TelnetTask + extends AbstractTask { /** * The userid to login with, if automated login is used */ - private String userid = null; + private String m_userid; /** * The password to login with, if automated login is used */ - private String password = null; + private String m_password; /** * The server to connect to. */ - private String server = null; + private String m_server; /** * The tcp port to connect to. */ - private int port = 23; - - /** - * The Object which handles the telnet session. - */ - private AntTelnetClient telnet = null; + private int m_port = 23; /** * The list of read/write commands for this session */ - private ArrayList telnetTasks = new ArrayList(); + private ArrayList m_telnetTasks = new ArrayList(); /** * If true, adds a CR to beginning of login script */ - private boolean addCarriageReturn = false; + private boolean m_addCarriageReturn; /** * Default time allowed for waiting for a valid response for all child * reads. A value of 0 means no limit. */ - private Integer defaultTimeout = null; + private Integer m_defaultTimeout; /** * Set the tcp port to connect to attribute - * - * @param b The new InitialCR value */ - public void setInitialCR( boolean b ) + public void setInitialCR( final boolean addCarriageReturn ) { - this.addCarriageReturn = b; + m_addCarriageReturn = addCarriageReturn; } /** * Set the password attribute - * - * @param p The new Password value */ - public void setPassword( String p ) + public void setPassword( final String password ) { - this.password = p; + m_password = password; } /** * Set the tcp port to connect to attribute - * - * @param p The new Port value */ - public void setPort( int p ) + public void setPort( final int port ) { - this.port = p; + m_port = port; } /** * Set the server address attribute - * - * @param m The new Server value */ - public void setServer( String m ) + public void setServer( final String server ) { - this.server = m; + m_server = server; } /** * Change the default timeout to wait for valid responses - * - * @param i The new Timeout value */ - public void setTimeout( Integer i ) + public void setTimeout( final Integer defaultTimeout ) { - this.defaultTimeout = i; + m_defaultTimeout = defaultTimeout; } /** * Set the userid attribute - * - * @param u The new Userid value */ - public void setUserid( String u ) + public void setUserid( final String userid ) { - this.userid = u; + m_userid = userid; } /** * A subTask <read> tag was found. Create the object, Save it in our * list, and return it. - * - * @return Description of the Returned Value */ - - public TelnetSubTask createRead() + public void addRead( final TelnetRead read ) { - TelnetSubTask task = (TelnetSubTask)new TelnetRead(); - telnetTasks.add( task ); - return task; + m_telnetTasks.add( read ); } /** * A subTask <write> tag was found. Create the object, Save it in our * list, and return it. - * - * @return Description of the Returned Value */ - public TelnetSubTask createWrite() + public void addWrite( final TelnetWrite write ) { - TelnetSubTask task = (TelnetSubTask)new TelnetWrite(); - telnetTasks.add( task ); - return task; + m_telnetTasks.add( write ); } /** * Verify that all parameters are included. Connect and possibly login * Iterate through the list of Reads and writes - * - * @exception TaskException Description of Exception */ public void execute() throws TaskException { - /** - * A server name is required to continue - */ - if( server == null ) - throw new TaskException( "No Server Specified" ); - /** - * A userid and password must appear together if they appear. They are - * not required. - */ - if( userid == null && password != null ) - throw new TaskException( "No Userid Specified" ); - if( password == null && userid != null ) - throw new TaskException( "No Password Specified" ); + validate(); /** * Create the telnet client object */ - telnet = new AntTelnetClient(); + final AntTelnetClient telnet = new AntTelnetClient( this ); try { - telnet.connect( server, port ); + telnet.connect( m_server, m_port ); } - catch( IOException e ) + catch( final IOException ioe ) { - throw new TaskException( "Can't connect to " + server ); + throw new TaskException( "Can't connect to " + m_server, ioe ); } /** * Login if userid and password were specified */ - if( userid != null && password != null ) - login(); - /** - * Process each sub command - */ - Iterator tasksToRun = telnetTasks.iterator(); - while( tasksToRun != null && tasksToRun.hasNext() ) + if( m_userid != null && m_password != null ) { - TelnetSubTask task = (TelnetSubTask)tasksToRun.next(); - if( task instanceof TelnetRead && defaultTimeout != null ) - ( (TelnetRead)task ).setDefaultTimeout( defaultTimeout ); - task.execute( telnet ); + login( telnet ); } - } - /** - * Process a 'typical' login. If it differs, use the read and write tasks - * explicitely - */ - private void login() - { - if( addCarriageReturn ) - telnet.sendString( "\n", true ); - telnet.waitForString( "ogin:" ); - telnet.sendString( userid, true ); - telnet.waitForString( "assword:" ); - telnet.sendString( password, false ); + processTasks( telnet ); } /** - * This class handles the abstraction of the telnet protocol. Currently it - * is a wrapper around ORO 's NetComponents - * - * @author RT + * Process each sub command */ - public class AntTelnetClient extends TelnetClient + private void processTasks( final AntTelnetClient telnet ) + throws TaskException { - - /** - * Write this string to the telnet session. - * - * @param s Description of Parameter - * @param echoString Description of Parameter - * @parm echoString Logs string sent - */ - public void sendString( String s, boolean echoString ) + final Iterator tasks = m_telnetTasks.iterator(); + while( tasks != null && tasks.hasNext() ) { - OutputStream os = this.getOutputStream(); - try - { - os.write( ( s + "\n" ).getBytes() ); - if( echoString ) - getLogger().info( s ); - os.flush(); - } - catch( Exception e ) + final TelnetSubTask task = (TelnetSubTask)tasks.next(); + if( task instanceof TelnetRead && m_defaultTimeout != null ) { - throw new TaskException( "Error", e ); - } - } - - /** - * Read from the telnet session until the string we are waiting for is - * found - * - * @param s Description of Parameter - * @parm s The string to wait on - */ - public void waitForString( String s ) - { - waitForString( s, null ); - } - - /** - * Read from the telnet session until the string we are waiting for is - * found or the timeout has been reached - * - * @param s Description of Parameter - * @param timeout Description of Parameter - * @parm s The string to wait on - * @parm timeout The maximum number of seconds to wait - */ - public void waitForString( String s, Integer timeout ) - { - InputStream is = this.getInputStream(); - try - { - StringBuffer sb = new StringBuffer(); - if( timeout == null || timeout.intValue() == 0 ) - { - while( sb.toString().indexOf( s ) == -1 ) - { - sb.append( (char)is.read() ); - } - } - else - { - Calendar endTime = Calendar.getInstance(); - endTime.add( Calendar.SECOND, timeout.intValue() ); - while( sb.toString().indexOf( s ) == -1 ) - { - while( Calendar.getInstance().before( endTime ) && - is.available() == 0 ) - { - Thread.sleep( 250 ); - } - if( is.available() == 0 ) - throw new TaskException( "Response Timed-Out" ); - sb.append( (char)is.read() ); - } - } - getLogger().info( sb.toString() ); - } - catch( TaskException be ) - { - throw be; - } - catch( Exception e ) - { - throw new TaskException( "Error", e ); + ( (TelnetRead)task ).setDefaultTimeout( m_defaultTimeout ); } + task.execute( telnet ); } } - /** - * This class reads the output from the connected server until the required - * string is found. - * - * @author RT - */ - public class TelnetRead extends TelnetSubTask + private void validate() + throws TaskException { - private Integer timeout = null; - - /** - * Sets the default timeout if none has been set already - * - * @param defaultTimeout The new DefaultTimeout value - */ - public void setDefaultTimeout( Integer defaultTimeout ) + //A server name is required to continue + if( m_server == null ) { - if( timeout == null ) - timeout = defaultTimeout; + throw new TaskException( "No Server Specified" ); } - /** - * Override any default timeouts - * - * @param i The new Timeout value - */ - public void setTimeout( Integer i ) + //A userid and password must appear together if they appear. They are + //not required. + if( m_userid == null && m_password != null ) { - this.timeout = i; + throw new TaskException( "No Userid Specified" ); } - - public void execute( AntTelnetClient telnet ) - throws TaskException + if( m_password == null && m_userid != null ) { - telnet.waitForString( taskString, timeout ); + throw new TaskException( "No Password Specified" ); } } /** - * This class is the parent of the Read and Write tasks. It handles the - * common attributes for both. - * - * @author RT + * Process a 'typical' login. If it differs, use the read and write tasks + * explicitely */ - public class TelnetSubTask + private void login( final AntTelnetClient telnet ) + throws TaskException { - protected String taskString = ""; - - public void setString( String s ) + if( m_addCarriageReturn ) { - taskString += s; + telnet.sendString( "\n", true ); } + telnet.waitForString( "ogin:" ); + telnet.sendString( m_userid, true ); + telnet.waitForString( "assword:" ); + telnet.sendString( m_password, false ); + } - public void addContent( String s ) + protected void doSendString( final OutputStream output, + final String string, + final boolean echoString ) + throws TaskException + { + try { - setString( s ); + output.write( ( string + "\n" ).getBytes() ); + if( echoString ) + { + getLogger().info( string ); + } + output.flush(); } - - public void execute( AntTelnetClient telnet ) - throws TaskException + catch( final Exception e ) { - throw new TaskException( "Shouldn't be able instantiate a SubTask directly" ); + throw new TaskException( e.getMessage(), e ); } } - /** - * This class sends text to the connected server - * - * @author RT - */ - public class TelnetWrite extends TelnetSubTask + protected void doWaitForString( final InputStream input, + final String string, + final Integer timeout ) + throws TaskException { - private boolean echoString = true; - - public void setEcho( boolean b ) + try { - echoString = b; + final StringBuffer sb = new StringBuffer(); + if( timeout == null || timeout.intValue() == 0 ) + { + while( sb.toString().indexOf( string ) == -1 ) + { + sb.append( (char)input.read() ); + } + } + else + { + final Calendar endTime = Calendar.getInstance(); + endTime.add( Calendar.SECOND, timeout.intValue() ); + while( sb.toString().indexOf( string ) == -1 ) + { + while( Calendar.getInstance().before( endTime ) && + input.available() == 0 ) + { + Thread.sleep( 250 ); + } + if( input.available() == 0 ) + { + throw new TaskException( "Response Timed-Out" ); + } + sb.append( (char)input.read() ); + } + } + getLogger().info( sb.toString() ); } - - public void execute( AntTelnetClient telnet ) - throws TaskException + catch( final TaskException te ) + { + throw te; + } + catch( final Exception e ) { - telnet.sendString( taskString, echoString ); + throw new TaskException( e.getMessage(), e ); } } } diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetWrite.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetWrite.java new file mode 100644 index 000000000..bc4cdfa57 --- /dev/null +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/TelnetWrite.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.tools.ant.taskdefs.optional.net; + +import org.apache.myrmidon.api.TaskException; + +/** + * This class sends text to the connected server + */ +public class TelnetWrite + extends TelnetSubTask +{ + private boolean m_echo = true; + + public void setEcho( final boolean echo ) + { + m_echo = echo; + } + + public void execute( final AntTelnetClient telnet ) + throws TaskException + { + telnet.sendString( getTaskString(), m_echo ); + } +}