package com.erggroup.mass.ant;
import java.io.*;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Copy;
import org.apache.tools.ant.taskdefs.Echo;
import org.apache.tools.ant.types.FileSet;
public class SandboxElement implements JatsElement
{
private Jats parent;
private Project project;
private String name;
private String version;
private String includes; //= "**/*";
private String excludes;
private Boolean verbose;
private boolean runtime = false;
private static Collection sandboxed = new ArrayList();
public String getElementType()
{
return "sandbox";
}
public void execute(Jats parent)
{
this.parent = parent;
this.project = parent.getProject();
if (name == null || version == null)
{
throw new BuildException("Both \'name\' and \'version\' must be specified for ");
}
if ( isVerbose() )
{
this.doEcho("Updating package \'" + name + "\' version \'" + version + "\'." );
}
Copy copyTask = new Copy();
copyTask.setProject(project);
copyTask.setTaskName("sandbox");
copyTask.setTodir(parent.getTodir());
copyTask.setIncludeEmptyDirs(false);
FileSet set = getFileSet();
set.setProject(project);
if (set != null)
{
copyTask.addFileset(set);
}
copyTask.perform();
sandboxed.add(this);
PackageRef packageRef = new PackageRef();
packageRef.setProject(project);
copyTask.setTaskName("sandbox");
packageRef.setPackage(name);
packageRef.setVersion(version);
packageRef.setVerbose( "false" );
packageRef.execute();
}
private FileSet getFileSet()
{
if (name == null || version == null)
{
throw new BuildException("Either 'name' or 'version' was not specifies for ");
}
FileSet fileSet = null;
File projectNameDir = new File(parent.getFromdir(), name);
File projectVersionDir = new File(projectNameDir, version);
if (projectVersionDir.exists() == false || projectVersionDir.isDirectory() == false)
{
throw new BuildException("Directory " + projectVersionDir.toString() +
" for package \'" + name
+ "\' version \'" + version
+ "\' does not exist");
}
else
{
validatePackageDescriptionFile(projectVersionDir);
// Setup the file set
fileSet = new FileSet();
fileSet.setProject(project);
fileSet.setDir(projectVersionDir);
if ( includes == null )
{
includes = parent.getIncludes();
}
fileSet.setIncludes(includes);
fileSet.setExcludes("descpkg");
if (excludes != null)
{
fileSet.setExcludes(excludes);
}
}
return fileSet;
}
private void doEcho(String message)
{
Echo echo = new Echo();
echo.setTaskName(this.getElementType());
echo.setProject(this.project);
echo.setMessage(message);
echo.execute();
}
private void validatePackageDescriptionFile(File location)
{
// Look for the descpkg file and determine whether it contains the correct info.
//
File descpkg = new File(location, "descpkg");
if (descpkg.exists() == false || descpkg.isFile() == false)
{
throw new BuildException("The \'descpkg\' file for package \'" + name
+ "\' version \'" + version
+ "\' does not exist");
}
else
{
// Read in the file, and determine whether in contain
// the correct 'version' string.
//
try
{
FileReader reader = new FileReader(descpkg);
BufferedReader buffer = new BufferedReader(reader);
try
{
String line = buffer.readLine();
String strippedLine = line.trim();
/** @todo currently there is an issue with some descpkg file
* not having the correct format (i.e. 1.2.2 cr instead of 1.2.2.cr)
*/
if (line == null /*|| strippedLine.endsWith(version) == false*/)
{
throw new BuildException("The \'descpkg\' file for package \'" + name
+ "\' version \'" + version
+ "\' does contain the correct version info.");
}
}
catch (IOException ex)
{
throw new BuildException("The \'descpkg\' file for package \'" + name
+ "\' version \'" + version
+ "\' could not be read.");
}
}
catch (FileNotFoundException ex)
{
throw new BuildException("The \'descpkg\' file for package \'" + name
+ "\' version \'" + version
+ "\' does not exist");
}
}
}
public void setName(String name)
{
this.name = name;
}
public void setVersion(String version)
{
this.version = version;
}
public void setIncludes(String includes)
{
this.includes = includes;
}
public void setExcludes(String excludes)
{
this.excludes = excludes;
}
public void setRuntime( String newValue )
{
this.runtime = ( "true".equalsIgnoreCase(newValue) );
}
static Collection getSandboxElements()
{
return sandboxed;
}
public String getName()
{
return name;
}
public String getVersion()
{
return version;
}
public boolean isRuntime()
{
return runtime;
}
public void setVerbose( String newValue )
{
this.verbose = new Boolean(!( "false".equalsIgnoreCase(newValue) ));
}
public boolean isVerbose()
{
if ( verbose == null )
{
return parent.isVerbose();
}
return verbose.booleanValue();
}
}