Browse Source

Start to refactor this to work with new Execute patterns

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270595 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Donald 23 years ago
parent
commit
0f1c5dd88e
2 changed files with 398 additions and 600 deletions
  1. +199
    -300
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java
  2. +199
    -300
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java

+ 199
- 300
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java View File

@@ -15,14 +15,14 @@ import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import org.apache.myrmidon.api.AbstractTask;
import org.apache.myrmidon.api.TaskException;
import org.apache.tools.ant.taskdefs.exec.Execute;
import org.apache.tools.ant.taskdefs.exec.Execute2;
import org.apache.tools.ant.taskdefs.exec.LogOutputStream;
import org.apache.tools.ant.types.Commandline;

@@ -42,7 +42,8 @@ import org.apache.tools.ant.types.Commandline;
* @author <a href="mailto:donj@apogeenet.com">Don Jeffery</a>
* @author <a href="snewton@standard.com">Steven E. Newton</a>
*/
public class Pvcs extends org.apache.tools.ant.Task
public class Pvcs
extends AbstractTask
{
/**
* Constant for the thing to execute
@@ -59,441 +60,344 @@ public class Pvcs extends org.apache.tools.ant.Task
* Constant for the thing to execute
*/
private final static String GET_EXE = "get";
private String filenameFormat;
private String force;
private boolean ignorerc;
private String label;
private String lineStart;
private String promotiongroup;
private String pvcsProject;
private ArrayList pvcsProjects;
private String pvcsbin;
private String repository;
private boolean updateOnly;
private String workspace;
private String m_filenameFormat;
private boolean m_force;
private boolean m_ignoreReturnCode;
private String m_label;
private String m_lineStart;
private String m_promotiongroup;
private String m_pvcsProject;
private ArrayList m_pvcsProjects;
private String m_pvcsbin;
private String m_repository;
private boolean m_updateOnly;
private String m_workspace;

/**
* Creates a Pvcs object
*/
public Pvcs()
{
super();
pvcsProject = null;
pvcsProjects = new ArrayList();
workspace = null;
repository = null;
pvcsbin = null;
force = null;
promotiongroup = null;
label = null;
ignorerc = false;
updateOnly = false;
lineStart = "\"P:";
filenameFormat = "{0}_arc({1})";
m_pvcsProjects = new ArrayList();
m_lineStart = "\"P:";
m_filenameFormat = "{0}_arc({1})";
}

public void setFilenameFormat( String f )
public void setFilenameFormat( final String filenameFormat )
{
filenameFormat = f;
m_filenameFormat = filenameFormat;
}

/**
* Specifies the value of the force argument
*
* @param f The new Force value
*/
public void setForce( String f )
public void setForce( final boolean force )
{
if( f != null && f.equalsIgnoreCase( "yes" ) )
force = "yes";
else
force = "no";
m_force = force;
}

/**
* If set to true the return value from executing the pvcs commands are
* ignored.
*
* @param b The new IgnoreReturnCode value
*/
public void setIgnoreReturnCode( boolean b )
public void setIgnoreReturnCode( final boolean ignoreReturnCode )
{
ignorerc = b;
m_ignoreReturnCode = ignoreReturnCode;
}

/**
* Specifies the name of the label argument
*
* @param l The new Label value
*/
public void setLabel( String l )
public void setLabel( final String label )
{
label = l;
m_label = label;
}

public void setLineStart( String l )
public void setLineStart( final String lineStart )
{
lineStart = l;
m_lineStart = lineStart;
}

/**
* Specifies the name of the promotiongroup argument
*
* @param w The new Promotiongroup value
*/
public void setPromotiongroup( String w )
public void setPromotiongroup( final String promotiongroup )
{
promotiongroup = w;
m_promotiongroup = promotiongroup;
}

/**
* Specifies the location of the PVCS bin directory
*
* @param bin The new Pvcsbin value
*/
public void setPvcsbin( String bin )
public void setPvcsbin( final String pvcsbin )
{
pvcsbin = bin;
m_pvcsbin = pvcsbin;
}

/**
* Specifies the name of the project in the PVCS repository
*
* @param prj String
*/
public void setPvcsproject( String prj )
public void setPvcsproject( final String pvcsProject )
{
pvcsProject = prj;
m_pvcsProject = pvcsProject;
}

/**
* Specifies the network name of the PVCS repository
*
* @param repo String
*/
public void setRepository( String repo )
public void setRepository( final String repository )
{
repository = repo;
m_repository = repository;
}

/**
* If set to true files are gotten only if newer than existing local files.
*
* @param l The new UpdateOnly value
*/
public void setUpdateOnly( boolean l )
public void setUpdateOnly( final boolean updateOnly )
{
updateOnly = l;
m_updateOnly = updateOnly;
}

/**
* Specifies the name of the workspace to store retrieved files
*
* @param ws String
*/
public void setWorkspace( String ws )
{
workspace = ws;
}

public String getFilenameFormat()
{
return filenameFormat;
}

/**
* Get value of force
*
* @return String
*/
public String getForce()
public void setWorkspace( final String workspace )
{
return force;
m_workspace = workspace;
}

/**
* Get value of ignorereturncode
*
* @return String
* handles &lt;pvcsproject&gt; subelements
*/
public boolean getIgnoreReturnCode()
public void addPvcsproject( final PvcsProject pvcsProject )
{
return ignorerc;
m_pvcsProjects.add( pvcsProject );
}

/**
* Get value of label
*
* @return String
*/
public String getLabel()
public void execute()
throws TaskException
{
return label;
}
int result = 0;

public String getLineStart()
{
return lineStart;
}
validate();

/**
* Get value of promotiongroup
*
* @return String
*/
public String getPromotiongroup()
{
return promotiongroup;
}
final File filelist = getFileList();

/**
* Get name of the PVCS bin directory
*
* @return String
*/
public String getPvcsbin()
{
return pvcsbin;
final Commandline cmd = buildGetCommand( filelist );
getLogger().info( "Getting files" );
getLogger().debug( "Executing " + cmd.toString() );
try
{
final Execute2 exe = new Execute2();
setupLogger( exe );
exe.setWorkingDirectory( getBaseDirectory() );
exe.setCommandline( cmd.getCommandline() );
result = exe.execute();
checkResultCode( result, cmd );
}
catch( IOException e )
{
String msg = "Failed executing: " + cmd.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
}
finally
{
if( filelist != null )
{
filelist.delete();
}
}
}

/**
* Get name of the project in the PVCS repository
*
* @return String
*/
public String getPvcsproject()
private Commandline buildGetCommand( final File filelist )
{
return pvcsProject;
}
final Commandline cmd = new Commandline();
cmd.setExecutable( getExecutable( GET_EXE ) );

/**
* Get name of the project in the PVCS repository
*
* @return ArrayList
*/
public ArrayList getPvcsprojects()
{
return pvcsProjects;
}
if( m_force )
{
cmd.createArgument().setValue( "-Y" );
}
else
{
cmd.createArgument().setValue( "-N" );
}

/**
* Get network name of the PVCS repository
*
* @return String
*/
public String getRepository()
{
return repository;
}
if( null != m_promotiongroup )
{
cmd.createArgument().setValue( "-G" + m_promotiongroup );
}
else if( null != m_label )
{
cmd.createArgument().setValue( "-r" + m_label );
}

public boolean getUpdateOnly()
{
return updateOnly;
}
if( m_updateOnly )
{
cmd.createArgument().setValue( "-U" );
}

/**
* Get name of the workspace to store the retrieved files
*
* @return String
*/
public String getWorkspace()
{
return workspace;
cmd.createArgument().setValue( "@" + filelist.getAbsolutePath() );
return cmd;
}

/**
* handles &lt;pvcsproject&gt; subelements
*
* @param p The feature to be added to the Pvcsproject attribute
*/
public void addPvcsproject( PvcsProject p )
private void checkResultCode( final int result, final Commandline cmd )
throws TaskException
{
pvcsProjects.add( p );
if( result != 0 && !m_ignoreReturnCode )
{
final String message = "Failed executing: " + cmd.toString() +
". Return code was " + result;
throw new TaskException( message );
}
}

/**
* @exception org.apache.tools.ant.TaskException Something is stopping the
* build...
*/
public void execute()
private File getFileList()
throws TaskException
{
int result = 0;

if( repository == null || repository.trim().equals( "" ) )
throw new TaskException( "Required argument repository not specified" );

// Check workspace exists
// Launch PCLI listversionedfiles -z -aw
// Capture output
// build the command line from what we got the format is
Commandline commandLine = new Commandline();
commandLine.setExecutable( getExecutable( PCLI_EXE ) );

commandLine.createArgument().setValue( "lvf" );
commandLine.createArgument().setValue( "-z" );
commandLine.createArgument().setValue( "-aw" );
if( getWorkspace() != null )
commandLine.createArgument().setValue( "-sp" + getWorkspace() );
commandLine.createArgument().setValue( "-pr" + getRepository() );

// default pvcs project is "/"
if( getPvcsproject() == null && getPvcsprojects().isEmpty() )
pvcsProject = "/";

if( getPvcsproject() != null )
commandLine.createArgument().setValue( getPvcsproject() );
if( !getPvcsprojects().isEmpty() )
{
Iterator e = getPvcsprojects().iterator();
while( e.hasNext() )
{
String projectName = ( (PvcsProject)e.next() ).getName();
if( projectName == null || ( projectName.trim() ).equals( "" ) )
throw new TaskException( "name is a required attribute of pvcsproject" );
commandLine.createArgument().setValue( projectName );
}
}
final Commandline cmd = buildPCLICommand();
getLogger().debug( "Executing " + cmd.toString() );

File tmp = null;
File tmp2 = null;

try
{
Random rand = new Random( System.currentTimeMillis() );
tmp = new File( "pvcs_ant_" + rand.nextLong() + ".log" );
tmp2 = new File( "pvcs_ant_" + rand.nextLong() + ".log" );
getLogger().debug( "Executing " + commandLine.toString() );
result = runCmd( commandLine, new FileOutputStream( tmp ),
new LogOutputStream( getLogger(), true ) );
if( result != 0 && !ignorerc )
{
String msg = "Failed executing: " + commandLine.toString();
throw new TaskException( msg );
}
tmp = File.createTempFile( "pvcs_ant_", ".log" );
final File fileList = File.createTempFile( "pvcs_ant_", ".log" );

final Execute exe = new Execute();
exe.setOutput( new FileOutputStream( tmp ) );
exe.setError( new LogOutputStream( getLogger(), true ) );
exe.setWorkingDirectory( getBaseDirectory() );
exe.setCommandline( cmd.getCommandline() );
final int result = exe.execute();
checkResultCode( result, cmd );

if( !tmp.exists() )
throw new TaskException( "Communication between ant and pvcs failed. No output generated from executing PVCS commandline interface \"pcli\" and \"get\"" );
{
final String message = "Communication between ant and pvcs failed. No output " +
"generated from executing PVCS commandline interface \"pcli\" and \"get\"";
throw new TaskException( message );
}

// Create folders in workspace
getLogger().info( "Creating folders" );
createFolders( tmp );

// Massage PCLI lvf output transforming '\' to '/' so get command works appropriately
massagePCLI( tmp, tmp2 );

// Launch get on output captured from PCLI lvf
commandLine.clearArgs();
commandLine.setExecutable( getExecutable( GET_EXE ) );

if( getForce() != null && getForce().equals( "yes" ) )
commandLine.createArgument().setValue( "-Y" );
else
commandLine.createArgument().setValue( "-N" );

if( getPromotiongroup() != null )
commandLine.createArgument().setValue( "-G" + getPromotiongroup() );
else
{
if( getLabel() != null )
commandLine.createArgument().setValue( "-r" + getLabel() );
}

if( updateOnly )
{
commandLine.createArgument().setValue( "-U" );
}

commandLine.createArgument().setValue( "@" + tmp2.getAbsolutePath() );
getLogger().info( "Getting files" );
getLogger().debug( "Executing " + commandLine.toString() );
final LogOutputStream output = new LogOutputStream( getLogger(), false );
final LogOutputStream error = new LogOutputStream( getLogger(), true );
result = runCmd( commandLine, output, error );

if( result != 0 && !ignorerc )
{
String msg = "Failed executing: " + commandLine.toString() + ". Return code was " + result;
throw new TaskException( msg );
}

massagePCLI( tmp, fileList );
return fileList;
}
catch( FileNotFoundException e )
catch( final ParseException pe )
{
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
}
catch( IOException e )
{
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
final String message = "Failed executing: " +
cmd.toString() + ". Exception: " + pe.getMessage();
throw new TaskException( message );
}
catch( ParseException e )
catch( final IOException ioe )
{
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
final String message = "Failed executing: " +
cmd.toString() + ". Exception: " + ioe.getMessage();
throw new TaskException( message );
}
finally
{
if( tmp != null )
if( null != tmp )
{
tmp.delete();
}
if( tmp2 != null )
}
}

private Commandline buildPCLICommand()
throws TaskException
{
final Commandline cmd = new Commandline();
cmd.setExecutable( getExecutable( PCLI_EXE ) );

cmd.createArgument().setValue( "lvf" );
cmd.createArgument().setValue( "-z" );
cmd.createArgument().setValue( "-aw" );
if( m_workspace != null )
{
cmd.createArgument().setValue( "-sp" + m_workspace );
}
cmd.createArgument().setValue( "-pr" + m_repository );

if( m_pvcsProject != null )
{
cmd.createArgument().setValue( m_pvcsProject );
}

if( !m_pvcsProjects.isEmpty() )
{
Iterator e = m_pvcsProjects.iterator();
while( e.hasNext() )
{
tmp2.delete();
final PvcsProject project = (PvcsProject)e.next();
final String name = project.getName();
if( name == null || ( name.trim() ).equals( "" ) )
{
final String message = "name is a required attribute of pvcsproject";
throw new TaskException( message );
}
cmd.createArgument().setValue( name );
}
}
return cmd;
}

protected int runCmd( Commandline cmd, OutputStream output, OutputStream error )
private void validate()
throws TaskException
{
try
if( m_repository == null || m_repository.trim().equals( "" ) )
{
final Execute exe = new Execute();
exe.setOutput( output );
exe.setError( error );
exe.setWorkingDirectory( getBaseDirectory() );
exe.setCommandline( cmd.getCommandline() );
return exe.execute();
throw new TaskException( "Required argument repository not specified" );
}
catch( java.io.IOException e )

// default pvcs project is "/"
if( m_pvcsProject == null && m_pvcsProjects.isEmpty() )
{
String msg = "Failed executing: " + cmd.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
m_pvcsProject = "/";
}
}

private String getExecutable( String exe )
private String getExecutable( final String exe )
{
StringBuffer correctedExe = new StringBuffer();
if( getPvcsbin() != null )
if( pvcsbin.endsWith( File.separator ) )
correctedExe.append( pvcsbin );
final StringBuffer correctedExe = new StringBuffer();
if( null != m_pvcsbin )
{
if( m_pvcsbin.endsWith( File.separator ) )
{
correctedExe.append( m_pvcsbin );
}
else
correctedExe.append( pvcsbin ).append( File.separator );
{
correctedExe.append( m_pvcsbin ).append( File.separator );
}
}
return correctedExe.append( exe ).toString();
}

/**
* Parses the file and creates the folders specified in the output section
*
* @param file Description of Parameter
* @exception IOException Description of Exception
* @exception ParseException Description of Exception
*/
private void createFolders( File file )
private void createFolders( final File file )
throws IOException, ParseException
{
BufferedReader in = new BufferedReader( new FileReader( file ) );
MessageFormat mf = new MessageFormat( getFilenameFormat() );
final BufferedReader in = new BufferedReader( new FileReader( file ) );
final MessageFormat mf = new MessageFormat( m_filenameFormat );
String line = in.readLine();
while( line != null )
{
getLogger().debug( "Considering \"" + line + "\"" );
if( line.startsWith( "\"\\" ) ||
line.startsWith( "\"/" ) ||
line.startsWith( getLineStart() ) )
line.startsWith( m_lineStart ) )
{
Object[] objs = mf.parse( line );
String f = (String)objs[ 1 ];
@@ -536,21 +440,16 @@ public class Pvcs extends org.apache.tools.ant.Task
/**
* Simple hack to handle the PVCS command-line tools botch when handling UNC
* notation.
*
* @param in Description of Parameter
* @param out Description of Parameter
* @exception FileNotFoundException Description of Exception
* @exception IOException Description of Exception
*/
private void massagePCLI( File in, File out )
private void massagePCLI( final File in, final File out )
throws FileNotFoundException, IOException
{
BufferedReader inReader = new BufferedReader( new FileReader( in ) );
BufferedWriter outWriter = new BufferedWriter( new FileWriter( out ) );
final BufferedReader inReader = new BufferedReader( new FileReader( in ) );
final BufferedWriter outWriter = new BufferedWriter( new FileWriter( out ) );
String s = null;
while( ( s = inReader.readLine() ) != null )
{
String sNormal = s.replace( '\\', '/' );
final String sNormal = s.replace( '\\', '/' );
outWriter.write( sNormal );
outWriter.newLine();
}


+ 199
- 300
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java View File

@@ -15,14 +15,14 @@ import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import org.apache.myrmidon.api.AbstractTask;
import org.apache.myrmidon.api.TaskException;
import org.apache.tools.ant.taskdefs.exec.Execute;
import org.apache.tools.ant.taskdefs.exec.Execute2;
import org.apache.tools.ant.taskdefs.exec.LogOutputStream;
import org.apache.tools.ant.types.Commandline;

@@ -42,7 +42,8 @@ import org.apache.tools.ant.types.Commandline;
* @author <a href="mailto:donj@apogeenet.com">Don Jeffery</a>
* @author <a href="snewton@standard.com">Steven E. Newton</a>
*/
public class Pvcs extends org.apache.tools.ant.Task
public class Pvcs
extends AbstractTask
{
/**
* Constant for the thing to execute
@@ -59,441 +60,344 @@ public class Pvcs extends org.apache.tools.ant.Task
* Constant for the thing to execute
*/
private final static String GET_EXE = "get";
private String filenameFormat;
private String force;
private boolean ignorerc;
private String label;
private String lineStart;
private String promotiongroup;
private String pvcsProject;
private ArrayList pvcsProjects;
private String pvcsbin;
private String repository;
private boolean updateOnly;
private String workspace;
private String m_filenameFormat;
private boolean m_force;
private boolean m_ignoreReturnCode;
private String m_label;
private String m_lineStart;
private String m_promotiongroup;
private String m_pvcsProject;
private ArrayList m_pvcsProjects;
private String m_pvcsbin;
private String m_repository;
private boolean m_updateOnly;
private String m_workspace;

/**
* Creates a Pvcs object
*/
public Pvcs()
{
super();
pvcsProject = null;
pvcsProjects = new ArrayList();
workspace = null;
repository = null;
pvcsbin = null;
force = null;
promotiongroup = null;
label = null;
ignorerc = false;
updateOnly = false;
lineStart = "\"P:";
filenameFormat = "{0}_arc({1})";
m_pvcsProjects = new ArrayList();
m_lineStart = "\"P:";
m_filenameFormat = "{0}_arc({1})";
}

public void setFilenameFormat( String f )
public void setFilenameFormat( final String filenameFormat )
{
filenameFormat = f;
m_filenameFormat = filenameFormat;
}

/**
* Specifies the value of the force argument
*
* @param f The new Force value
*/
public void setForce( String f )
public void setForce( final boolean force )
{
if( f != null && f.equalsIgnoreCase( "yes" ) )
force = "yes";
else
force = "no";
m_force = force;
}

/**
* If set to true the return value from executing the pvcs commands are
* ignored.
*
* @param b The new IgnoreReturnCode value
*/
public void setIgnoreReturnCode( boolean b )
public void setIgnoreReturnCode( final boolean ignoreReturnCode )
{
ignorerc = b;
m_ignoreReturnCode = ignoreReturnCode;
}

/**
* Specifies the name of the label argument
*
* @param l The new Label value
*/
public void setLabel( String l )
public void setLabel( final String label )
{
label = l;
m_label = label;
}

public void setLineStart( String l )
public void setLineStart( final String lineStart )
{
lineStart = l;
m_lineStart = lineStart;
}

/**
* Specifies the name of the promotiongroup argument
*
* @param w The new Promotiongroup value
*/
public void setPromotiongroup( String w )
public void setPromotiongroup( final String promotiongroup )
{
promotiongroup = w;
m_promotiongroup = promotiongroup;
}

/**
* Specifies the location of the PVCS bin directory
*
* @param bin The new Pvcsbin value
*/
public void setPvcsbin( String bin )
public void setPvcsbin( final String pvcsbin )
{
pvcsbin = bin;
m_pvcsbin = pvcsbin;
}

/**
* Specifies the name of the project in the PVCS repository
*
* @param prj String
*/
public void setPvcsproject( String prj )
public void setPvcsproject( final String pvcsProject )
{
pvcsProject = prj;
m_pvcsProject = pvcsProject;
}

/**
* Specifies the network name of the PVCS repository
*
* @param repo String
*/
public void setRepository( String repo )
public void setRepository( final String repository )
{
repository = repo;
m_repository = repository;
}

/**
* If set to true files are gotten only if newer than existing local files.
*
* @param l The new UpdateOnly value
*/
public void setUpdateOnly( boolean l )
public void setUpdateOnly( final boolean updateOnly )
{
updateOnly = l;
m_updateOnly = updateOnly;
}

/**
* Specifies the name of the workspace to store retrieved files
*
* @param ws String
*/
public void setWorkspace( String ws )
{
workspace = ws;
}

public String getFilenameFormat()
{
return filenameFormat;
}

/**
* Get value of force
*
* @return String
*/
public String getForce()
public void setWorkspace( final String workspace )
{
return force;
m_workspace = workspace;
}

/**
* Get value of ignorereturncode
*
* @return String
* handles &lt;pvcsproject&gt; subelements
*/
public boolean getIgnoreReturnCode()
public void addPvcsproject( final PvcsProject pvcsProject )
{
return ignorerc;
m_pvcsProjects.add( pvcsProject );
}

/**
* Get value of label
*
* @return String
*/
public String getLabel()
public void execute()
throws TaskException
{
return label;
}
int result = 0;

public String getLineStart()
{
return lineStart;
}
validate();

/**
* Get value of promotiongroup
*
* @return String
*/
public String getPromotiongroup()
{
return promotiongroup;
}
final File filelist = getFileList();

/**
* Get name of the PVCS bin directory
*
* @return String
*/
public String getPvcsbin()
{
return pvcsbin;
final Commandline cmd = buildGetCommand( filelist );
getLogger().info( "Getting files" );
getLogger().debug( "Executing " + cmd.toString() );
try
{
final Execute2 exe = new Execute2();
setupLogger( exe );
exe.setWorkingDirectory( getBaseDirectory() );
exe.setCommandline( cmd.getCommandline() );
result = exe.execute();
checkResultCode( result, cmd );
}
catch( IOException e )
{
String msg = "Failed executing: " + cmd.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
}
finally
{
if( filelist != null )
{
filelist.delete();
}
}
}

/**
* Get name of the project in the PVCS repository
*
* @return String
*/
public String getPvcsproject()
private Commandline buildGetCommand( final File filelist )
{
return pvcsProject;
}
final Commandline cmd = new Commandline();
cmd.setExecutable( getExecutable( GET_EXE ) );

/**
* Get name of the project in the PVCS repository
*
* @return ArrayList
*/
public ArrayList getPvcsprojects()
{
return pvcsProjects;
}
if( m_force )
{
cmd.createArgument().setValue( "-Y" );
}
else
{
cmd.createArgument().setValue( "-N" );
}

/**
* Get network name of the PVCS repository
*
* @return String
*/
public String getRepository()
{
return repository;
}
if( null != m_promotiongroup )
{
cmd.createArgument().setValue( "-G" + m_promotiongroup );
}
else if( null != m_label )
{
cmd.createArgument().setValue( "-r" + m_label );
}

public boolean getUpdateOnly()
{
return updateOnly;
}
if( m_updateOnly )
{
cmd.createArgument().setValue( "-U" );
}

/**
* Get name of the workspace to store the retrieved files
*
* @return String
*/
public String getWorkspace()
{
return workspace;
cmd.createArgument().setValue( "@" + filelist.getAbsolutePath() );
return cmd;
}

/**
* handles &lt;pvcsproject&gt; subelements
*
* @param p The feature to be added to the Pvcsproject attribute
*/
public void addPvcsproject( PvcsProject p )
private void checkResultCode( final int result, final Commandline cmd )
throws TaskException
{
pvcsProjects.add( p );
if( result != 0 && !m_ignoreReturnCode )
{
final String message = "Failed executing: " + cmd.toString() +
". Return code was " + result;
throw new TaskException( message );
}
}

/**
* @exception org.apache.tools.ant.TaskException Something is stopping the
* build...
*/
public void execute()
private File getFileList()
throws TaskException
{
int result = 0;

if( repository == null || repository.trim().equals( "" ) )
throw new TaskException( "Required argument repository not specified" );

// Check workspace exists
// Launch PCLI listversionedfiles -z -aw
// Capture output
// build the command line from what we got the format is
Commandline commandLine = new Commandline();
commandLine.setExecutable( getExecutable( PCLI_EXE ) );

commandLine.createArgument().setValue( "lvf" );
commandLine.createArgument().setValue( "-z" );
commandLine.createArgument().setValue( "-aw" );
if( getWorkspace() != null )
commandLine.createArgument().setValue( "-sp" + getWorkspace() );
commandLine.createArgument().setValue( "-pr" + getRepository() );

// default pvcs project is "/"
if( getPvcsproject() == null && getPvcsprojects().isEmpty() )
pvcsProject = "/";

if( getPvcsproject() != null )
commandLine.createArgument().setValue( getPvcsproject() );
if( !getPvcsprojects().isEmpty() )
{
Iterator e = getPvcsprojects().iterator();
while( e.hasNext() )
{
String projectName = ( (PvcsProject)e.next() ).getName();
if( projectName == null || ( projectName.trim() ).equals( "" ) )
throw new TaskException( "name is a required attribute of pvcsproject" );
commandLine.createArgument().setValue( projectName );
}
}
final Commandline cmd = buildPCLICommand();
getLogger().debug( "Executing " + cmd.toString() );

File tmp = null;
File tmp2 = null;

try
{
Random rand = new Random( System.currentTimeMillis() );
tmp = new File( "pvcs_ant_" + rand.nextLong() + ".log" );
tmp2 = new File( "pvcs_ant_" + rand.nextLong() + ".log" );
getLogger().debug( "Executing " + commandLine.toString() );
result = runCmd( commandLine, new FileOutputStream( tmp ),
new LogOutputStream( getLogger(), true ) );
if( result != 0 && !ignorerc )
{
String msg = "Failed executing: " + commandLine.toString();
throw new TaskException( msg );
}
tmp = File.createTempFile( "pvcs_ant_", ".log" );
final File fileList = File.createTempFile( "pvcs_ant_", ".log" );

final Execute exe = new Execute();
exe.setOutput( new FileOutputStream( tmp ) );
exe.setError( new LogOutputStream( getLogger(), true ) );
exe.setWorkingDirectory( getBaseDirectory() );
exe.setCommandline( cmd.getCommandline() );
final int result = exe.execute();
checkResultCode( result, cmd );

if( !tmp.exists() )
throw new TaskException( "Communication between ant and pvcs failed. No output generated from executing PVCS commandline interface \"pcli\" and \"get\"" );
{
final String message = "Communication between ant and pvcs failed. No output " +
"generated from executing PVCS commandline interface \"pcli\" and \"get\"";
throw new TaskException( message );
}

// Create folders in workspace
getLogger().info( "Creating folders" );
createFolders( tmp );

// Massage PCLI lvf output transforming '\' to '/' so get command works appropriately
massagePCLI( tmp, tmp2 );

// Launch get on output captured from PCLI lvf
commandLine.clearArgs();
commandLine.setExecutable( getExecutable( GET_EXE ) );

if( getForce() != null && getForce().equals( "yes" ) )
commandLine.createArgument().setValue( "-Y" );
else
commandLine.createArgument().setValue( "-N" );

if( getPromotiongroup() != null )
commandLine.createArgument().setValue( "-G" + getPromotiongroup() );
else
{
if( getLabel() != null )
commandLine.createArgument().setValue( "-r" + getLabel() );
}

if( updateOnly )
{
commandLine.createArgument().setValue( "-U" );
}

commandLine.createArgument().setValue( "@" + tmp2.getAbsolutePath() );
getLogger().info( "Getting files" );
getLogger().debug( "Executing " + commandLine.toString() );
final LogOutputStream output = new LogOutputStream( getLogger(), false );
final LogOutputStream error = new LogOutputStream( getLogger(), true );
result = runCmd( commandLine, output, error );

if( result != 0 && !ignorerc )
{
String msg = "Failed executing: " + commandLine.toString() + ". Return code was " + result;
throw new TaskException( msg );
}

massagePCLI( tmp, fileList );
return fileList;
}
catch( FileNotFoundException e )
catch( final ParseException pe )
{
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
}
catch( IOException e )
{
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
final String message = "Failed executing: " +
cmd.toString() + ". Exception: " + pe.getMessage();
throw new TaskException( message );
}
catch( ParseException e )
catch( final IOException ioe )
{
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
final String message = "Failed executing: " +
cmd.toString() + ". Exception: " + ioe.getMessage();
throw new TaskException( message );
}
finally
{
if( tmp != null )
if( null != tmp )
{
tmp.delete();
}
if( tmp2 != null )
}
}

private Commandline buildPCLICommand()
throws TaskException
{
final Commandline cmd = new Commandline();
cmd.setExecutable( getExecutable( PCLI_EXE ) );

cmd.createArgument().setValue( "lvf" );
cmd.createArgument().setValue( "-z" );
cmd.createArgument().setValue( "-aw" );
if( m_workspace != null )
{
cmd.createArgument().setValue( "-sp" + m_workspace );
}
cmd.createArgument().setValue( "-pr" + m_repository );

if( m_pvcsProject != null )
{
cmd.createArgument().setValue( m_pvcsProject );
}

if( !m_pvcsProjects.isEmpty() )
{
Iterator e = m_pvcsProjects.iterator();
while( e.hasNext() )
{
tmp2.delete();
final PvcsProject project = (PvcsProject)e.next();
final String name = project.getName();
if( name == null || ( name.trim() ).equals( "" ) )
{
final String message = "name is a required attribute of pvcsproject";
throw new TaskException( message );
}
cmd.createArgument().setValue( name );
}
}
return cmd;
}

protected int runCmd( Commandline cmd, OutputStream output, OutputStream error )
private void validate()
throws TaskException
{
try
if( m_repository == null || m_repository.trim().equals( "" ) )
{
final Execute exe = new Execute();
exe.setOutput( output );
exe.setError( error );
exe.setWorkingDirectory( getBaseDirectory() );
exe.setCommandline( cmd.getCommandline() );
return exe.execute();
throw new TaskException( "Required argument repository not specified" );
}
catch( java.io.IOException e )

// default pvcs project is "/"
if( m_pvcsProject == null && m_pvcsProjects.isEmpty() )
{
String msg = "Failed executing: " + cmd.toString() + ". Exception: " + e.getMessage();
throw new TaskException( msg );
m_pvcsProject = "/";
}
}

private String getExecutable( String exe )
private String getExecutable( final String exe )
{
StringBuffer correctedExe = new StringBuffer();
if( getPvcsbin() != null )
if( pvcsbin.endsWith( File.separator ) )
correctedExe.append( pvcsbin );
final StringBuffer correctedExe = new StringBuffer();
if( null != m_pvcsbin )
{
if( m_pvcsbin.endsWith( File.separator ) )
{
correctedExe.append( m_pvcsbin );
}
else
correctedExe.append( pvcsbin ).append( File.separator );
{
correctedExe.append( m_pvcsbin ).append( File.separator );
}
}
return correctedExe.append( exe ).toString();
}

/**
* Parses the file and creates the folders specified in the output section
*
* @param file Description of Parameter
* @exception IOException Description of Exception
* @exception ParseException Description of Exception
*/
private void createFolders( File file )
private void createFolders( final File file )
throws IOException, ParseException
{
BufferedReader in = new BufferedReader( new FileReader( file ) );
MessageFormat mf = new MessageFormat( getFilenameFormat() );
final BufferedReader in = new BufferedReader( new FileReader( file ) );
final MessageFormat mf = new MessageFormat( m_filenameFormat );
String line = in.readLine();
while( line != null )
{
getLogger().debug( "Considering \"" + line + "\"" );
if( line.startsWith( "\"\\" ) ||
line.startsWith( "\"/" ) ||
line.startsWith( getLineStart() ) )
line.startsWith( m_lineStart ) )
{
Object[] objs = mf.parse( line );
String f = (String)objs[ 1 ];
@@ -536,21 +440,16 @@ public class Pvcs extends org.apache.tools.ant.Task
/**
* Simple hack to handle the PVCS command-line tools botch when handling UNC
* notation.
*
* @param in Description of Parameter
* @param out Description of Parameter
* @exception FileNotFoundException Description of Exception
* @exception IOException Description of Exception
*/
private void massagePCLI( File in, File out )
private void massagePCLI( final File in, final File out )
throws FileNotFoundException, IOException
{
BufferedReader inReader = new BufferedReader( new FileReader( in ) );
BufferedWriter outWriter = new BufferedWriter( new FileWriter( out ) );
final BufferedReader inReader = new BufferedReader( new FileReader( in ) );
final BufferedWriter outWriter = new BufferedWriter( new FileWriter( out ) );
String s = null;
while( ( s = inReader.readLine() ) != null )
{
String sNormal = s.replace( '\\', '/' );
final String sNormal = s.replace( '\\', '/' );
outWriter.write( sNormal );
outWriter.newLine();
}


Loading…
Cancel
Save