make the basejarname attribute actually do something useful git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269221 13f79535-47bb-0310-9956-ffa450edef68master
@@ -240,7 +240,7 @@ public class BorlandDeploymentTool extends GenericDeploymentTool | |||||
* Add any vendor specific files which should be included in the | * Add any vendor specific files which should be included in the | ||||
* EJB Jar. | * EJB Jar. | ||||
*/ | */ | ||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName) { | |||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName, String descriptorFileName) { | |||||
File borlandDD = new File(getConfig().descriptorDir,META_DIR+BAS_DD); | File borlandDD = new File(getConfig().descriptorDir,META_DIR+BAS_DD); | ||||
if (borlandDD.exists()) { | if (borlandDD.exists()) { | ||||
@@ -131,6 +131,7 @@ public class DescriptorHandler extends org.xml.sax.HandlerBase { | |||||
if (fileDTD.exists()) { | if (fileDTD.exists()) { | ||||
if (publicId != null) { | if (publicId != null) { | ||||
fileDTDs.put(publicId, fileDTD); | fileDTDs.put(publicId, fileDTD); | ||||
owningTask.log("Mapped publicId " + publicId + " to file " + fileDTD, Project.MSG_VERBOSE); | |||||
} | } | ||||
return; | return; | ||||
} | } | ||||
@@ -138,6 +139,7 @@ public class DescriptorHandler extends org.xml.sax.HandlerBase { | |||||
if (getClass().getResource(location) != null) { | if (getClass().getResource(location) != null) { | ||||
if (publicId != null) { | if (publicId != null) { | ||||
resourceDTDs.put(publicId, location); | resourceDTDs.put(publicId, location); | ||||
owningTask.log("Mapped publicId " + publicId + " to resource " + location, Project.MSG_VERBOSE); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -469,6 +469,13 @@ public class EjbJar extends MatchingTask { | |||||
throw new BuildException(msg, pce); | throw new BuildException(msg, pce); | ||||
} | } | ||||
} // end of execute() | } // end of execute() | ||||
public static class NamignScheme extends EnumeratedAttribute { | |||||
public String[] getValues() { | |||||
return new String[] {"ejb-name", "directory", "descriptor"}; | |||||
} | |||||
} | |||||
} | } | ||||
@@ -113,10 +113,10 @@ public class GenericDeploymentTool implements EJBDeploymentTool { | |||||
*/ | */ | ||||
private List addedfiles; | private List addedfiles; | ||||
/** | |||||
* Handler used to parse the EJB XML descriptor | |||||
*/ | |||||
private DescriptorHandler handler; | |||||
/** | |||||
* Handler used to parse the EJB XML descriptor | |||||
*/ | |||||
private DescriptorHandler handler; | |||||
/** | /** | ||||
* Setter used to store the value of destination directory prior to execute() | * Setter used to store the value of destination directory prior to execute() | ||||
@@ -210,9 +210,9 @@ public class GenericDeploymentTool implements EJBDeploymentTool { | |||||
getTask().log(message, level); | getTask().log(message, level); | ||||
} | } | ||||
protected Location getLocation() { | |||||
return getTask().getLocation(); | |||||
} | |||||
protected Location getLocation() { | |||||
return getTask().getLocation(); | |||||
} | |||||
/** | /** | ||||
@@ -303,24 +303,24 @@ public class GenericDeploymentTool implements EJBDeploymentTool { | |||||
public void processDescriptor(String descriptorFileName, SAXParser saxParser) { | public void processDescriptor(String descriptorFileName, SAXParser saxParser) { | ||||
checkConfiguration(descriptorFileName, saxParser); | |||||
checkConfiguration(descriptorFileName, saxParser); | |||||
try { | try { | ||||
// Retrive the files to be added to JAR from EJB descriptor | |||||
Hashtable ejbFiles = parseEjbFiles(descriptorFileName, saxParser); | |||||
// Retrive the files to be added to JAR from EJB descriptor | |||||
Hashtable ejbFiles = parseEjbFiles(descriptorFileName, saxParser); | |||||
// Add any support classes specified in the build file | |||||
addSupportClasses(ejbFiles); | |||||
// Add any support classes specified in the build file | |||||
addSupportClasses(ejbFiles); | |||||
// Determine the JAR filename (without filename extension) | |||||
String baseName = getJarBaseName(descriptorFileName); | |||||
// Determine the JAR filename (without filename extension) | |||||
String baseName = getJarBaseName(descriptorFileName); | |||||
// First the regular deployment descriptor | // First the regular deployment descriptor | ||||
ejbFiles.put(META_DIR + EJB_DD, | ejbFiles.put(META_DIR + EJB_DD, | ||||
new File(config.descriptorDir, descriptorFileName)); | new File(config.descriptorDir, descriptorFileName)); | ||||
// now the vendor specific files, if any | // now the vendor specific files, if any | ||||
addVendorFiles(ejbFiles, baseName); | |||||
addVendorFiles(ejbFiles, baseName, descriptorFileName); | |||||
// add any inherited files | // add any inherited files | ||||
checkAndAddInherited(ejbFiles); | checkAndAddInherited(ejbFiles); | ||||
@@ -351,7 +351,7 @@ public class GenericDeploymentTool implements EJBDeploymentTool { | |||||
Project.MSG_INFO); | Project.MSG_INFO); | ||||
// Use helper method to write the jarfile | // Use helper method to write the jarfile | ||||
String publicId = getPublicId(); | |||||
String publicId = getPublicId(); | |||||
writeJar(baseName, jarFile, ejbFiles, publicId); | writeJar(baseName, jarFile, ejbFiles, publicId); | ||||
} | } | ||||
@@ -380,59 +380,59 @@ public class GenericDeploymentTool implements EJBDeploymentTool { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* This method is called as the first step in the processDescriptor method | |||||
* to allow vendor-specific subclasses to validate the task configuration | |||||
* prior to processing the descriptor. If the configuration is invalid, | |||||
* a BuildException should be thrown. | |||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @param saxParser SAXParser which may be used to parse the XML | |||||
* descriptor | |||||
* @thows BuildException Thrown if the configuration is invalid | |||||
*/ | |||||
protected void checkConfiguration(String descriptorFileName, | |||||
SAXParser saxParser) throws BuildException { | |||||
/* | |||||
* For the GenericDeploymentTool, do nothing. Vendor specific | |||||
* subclasses should throw a BuildException if the configuration is | |||||
* invalid for their server. | |||||
*/ | |||||
} | |||||
/** | |||||
* This method returns a list of EJB files found when the specified EJB | |||||
* descriptor is parsed and processed. | |||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @param saxParser SAXParser which may be used to parse the XML | |||||
* descriptor | |||||
* @return Hashtable of EJB class (and other) files to be | |||||
* added to the completed JAR file | |||||
* @throws SAXException Any SAX exception, possibly wrapping another | |||||
* exception | |||||
/** | |||||
* This method is called as the first step in the processDescriptor method | |||||
* to allow vendor-specific subclasses to validate the task configuration | |||||
* prior to processing the descriptor. If the configuration is invalid, | |||||
* a BuildException should be thrown. | |||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @param saxParser SAXParser which may be used to parse the XML | |||||
* descriptor | |||||
* @thows BuildException Thrown if the configuration is invalid | |||||
*/ | |||||
protected void checkConfiguration(String descriptorFileName, | |||||
SAXParser saxParser) throws BuildException { | |||||
/* | |||||
* For the GenericDeploymentTool, do nothing. Vendor specific | |||||
* subclasses should throw a BuildException if the configuration is | |||||
* invalid for their server. | |||||
*/ | |||||
} | |||||
/** | |||||
* This method returns a list of EJB files found when the specified EJB | |||||
* descriptor is parsed and processed. | |||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @param saxParser SAXParser which may be used to parse the XML | |||||
* descriptor | |||||
* @return Hashtable of EJB class (and other) files to be | |||||
* added to the completed JAR file | |||||
* @throws SAXException Any SAX exception, possibly wrapping another | |||||
* exception | |||||
* @throws IOException An IOException from the parser, possibly from a | * @throws IOException An IOException from the parser, possibly from a | ||||
* the byte stream or character stream | |||||
*/ | |||||
protected Hashtable parseEjbFiles(String descriptorFileName, SAXParser saxParser) | |||||
throws IOException, SAXException { | |||||
FileInputStream descriptorStream = null; | |||||
Hashtable ejbFiles = null; | |||||
try { | |||||
handler = getDescriptorHandler(config.srcDir); | |||||
/* Parse the ejb deployment descriptor. While it may not | |||||
* look like much, we use a SAXParser and an inner class to | |||||
* get hold of all the classfile names for the descriptor. | |||||
*/ | |||||
descriptorStream = new FileInputStream(new File(config.descriptorDir, descriptorFileName)); | |||||
saxParser.parse(new InputSource(descriptorStream), handler); | |||||
ejbFiles = handler.getFiles(); | |||||
* the byte stream or character stream | |||||
*/ | |||||
protected Hashtable parseEjbFiles(String descriptorFileName, SAXParser saxParser) | |||||
throws IOException, SAXException { | |||||
FileInputStream descriptorStream = null; | |||||
Hashtable ejbFiles = null; | |||||
try { | |||||
handler = getDescriptorHandler(config.srcDir); | |||||
/* Parse the ejb deployment descriptor. While it may not | |||||
* look like much, we use a SAXParser and an inner class to | |||||
* get hold of all the classfile names for the descriptor. | |||||
*/ | |||||
descriptorStream = new FileInputStream(new File(config.descriptorDir, descriptorFileName)); | |||||
saxParser.parse(new InputSource(descriptorStream), handler); | |||||
ejbFiles = handler.getFiles(); | |||||
} finally { | } finally { | ||||
if (descriptorStream != null) { | if (descriptorStream != null) { | ||||
@@ -443,74 +443,79 @@ public class GenericDeploymentTool implements EJBDeploymentTool { | |||||
} | } | ||||
} | } | ||||
return ejbFiles; | |||||
} | |||||
/** | |||||
* Adds any classes the user specifies using <i>support</i> nested elements | |||||
* to the <code>ejbFiles</code> Hashtable. | |||||
* | |||||
* @param ejbFiles Hashtable of EJB classes (and other) files that will be | |||||
* added to the completed JAR file | |||||
*/ | |||||
protected void addSupportClasses(Hashtable ejbFiles) { | |||||
// add in support classes if any | |||||
Project project = task.getProject(); | |||||
for (Iterator i = config.supportFileSets.iterator(); i.hasNext();) { | |||||
FileSet supportFileSet = (FileSet)i.next(); | |||||
File supportBaseDir = supportFileSet.getDir(project); | |||||
DirectoryScanner supportScanner = supportFileSet.getDirectoryScanner(project); | |||||
supportScanner.scan(); | |||||
String[] supportFiles = supportScanner.getIncludedFiles(); | |||||
for (int j = 0; j < supportFiles.length; ++j) { | |||||
ejbFiles.put(supportFiles[j], new File(supportBaseDir, supportFiles[j])); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Using the EJB descriptor file name passed from the <code>ejbjar</code> | |||||
* task, this method returns the "basename" which will be used to name the | |||||
* completed JAR file. | |||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @return The "basename" which will be used to name the | |||||
* completed JAR file | |||||
*/ | |||||
protected String getJarBaseName(String descriptorFileName) { | |||||
String baseName = ""; | |||||
// Work out what the base name is | |||||
if (config.baseJarName != null) { | |||||
baseName = config.baseJarName; | |||||
} else { | |||||
int lastSeparatorIndex = descriptorFileName.lastIndexOf(File.separator); | |||||
int endBaseName = -1; | |||||
if (lastSeparatorIndex != -1) { | |||||
endBaseName = descriptorFileName.indexOf(config.baseNameTerminator, | |||||
lastSeparatorIndex); | |||||
} else { | |||||
endBaseName = descriptorFileName.indexOf(config.baseNameTerminator); | |||||
} | |||||
if (endBaseName != -1) { | |||||
baseName = descriptorFileName.substring(0, endBaseName); | |||||
} | |||||
baseName = descriptorFileName.substring(0, endBaseName); | |||||
} | |||||
return baseName; | |||||
} | |||||
return ejbFiles; | |||||
} | |||||
/** | |||||
* Adds any classes the user specifies using <i>support</i> nested elements | |||||
* to the <code>ejbFiles</code> Hashtable. | |||||
* | |||||
* @param ejbFiles Hashtable of EJB classes (and other) files that will be | |||||
* added to the completed JAR file | |||||
*/ | |||||
protected void addSupportClasses(Hashtable ejbFiles) { | |||||
// add in support classes if any | |||||
Project project = task.getProject(); | |||||
for (Iterator i = config.supportFileSets.iterator(); i.hasNext();) { | |||||
FileSet supportFileSet = (FileSet)i.next(); | |||||
File supportBaseDir = supportFileSet.getDir(project); | |||||
DirectoryScanner supportScanner = supportFileSet.getDirectoryScanner(project); | |||||
supportScanner.scan(); | |||||
String[] supportFiles = supportScanner.getIncludedFiles(); | |||||
for (int j = 0; j < supportFiles.length; ++j) { | |||||
ejbFiles.put(supportFiles[j], new File(supportBaseDir, supportFiles[j])); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Using the EJB descriptor file name passed from the <code>ejbjar</code> | |||||
* task, this method returns the "basename" which will be used to name the | |||||
* completed JAR file. | |||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @return The "basename" which will be used to name the | |||||
* completed JAR file | |||||
*/ | |||||
protected String getJarBaseName(String descriptorFileName) { | |||||
String baseName = ""; | |||||
// Work out what the base name is | |||||
if (config.baseJarName != null) { | |||||
String canonicalDescriptor = descriptorFileName.replace('\\', '/'); | |||||
int index = canonicalDescriptor.lastIndexOf('/'); | |||||
if (index != -1) { | |||||
baseName = descriptorFileName.substring(0, index + 1); | |||||
} | |||||
baseName += config.baseJarName; | |||||
} else { | |||||
int lastSeparatorIndex = descriptorFileName.lastIndexOf(File.separator); | |||||
int endBaseName = -1; | |||||
if (lastSeparatorIndex != -1) { | |||||
endBaseName = descriptorFileName.indexOf(config.baseNameTerminator, | |||||
lastSeparatorIndex); | |||||
} else { | |||||
endBaseName = descriptorFileName.indexOf(config.baseNameTerminator); | |||||
} | |||||
if (endBaseName != -1) { | |||||
baseName = descriptorFileName.substring(0, endBaseName); | |||||
} | |||||
baseName = descriptorFileName.substring(0, endBaseName); | |||||
} | |||||
return baseName; | |||||
} | |||||
/** | /** | ||||
* Add any vendor specific files which should be included in the | * Add any vendor specific files which should be included in the | ||||
* EJB Jar. | * EJB Jar. | ||||
*/ | */ | ||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName) { | |||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName, String descriptorFileName) { | |||||
// nothing to add for generic tool. | // nothing to add for generic tool. | ||||
} | } | ||||
@@ -523,55 +528,55 @@ public class GenericDeploymentTool implements EJBDeploymentTool { | |||||
return new File(destDir, baseName + genericJarSuffix); | return new File(destDir, baseName + genericJarSuffix); | ||||
} | } | ||||
/** | |||||
* This method checks the timestamp on each file listed in the <code> | |||||
* ejbFiles</code> and compares them to the timestamp on the <code>jarFile | |||||
* </code>. If the <code>jarFile</code>'s timestamp is more recent than | |||||
* each EJB file, <code>false</code> is returned. Otherwise, <code>true | |||||
* </code> is returned. | |||||
* | |||||
* @param ejbFiles Hashtable of EJB classes (and other) files that will be | |||||
* added to the completed JAR file | |||||
* @param jarFile JAR file which will contain all of the EJB classes (and | |||||
* other) files | |||||
* @return boolean indicating whether or not the <code>jarFile</code> | |||||
* is up to date | |||||
*/ | |||||
protected boolean needToRebuild(Hashtable ejbFiles, File jarFile) { | |||||
// By default we assume we need to build. | |||||
boolean needBuild = true; | |||||
if (jarFile.exists()) { | |||||
long lastBuild = jarFile.lastModified(); | |||||
Iterator fileIter = ejbFiles.values().iterator(); | |||||
// Set the need build to false until we find out otherwise. | |||||
needBuild = false; | |||||
// Loop through the files seeing if any has been touched | |||||
// more recently than the destination jar. | |||||
while( (needBuild == false) && (fileIter.hasNext()) ) { | |||||
File currentFile = (File) fileIter.next(); | |||||
needBuild = ( lastBuild < currentFile.lastModified() ); | |||||
if (needBuild) { | |||||
log("Build needed because " + currentFile.getPath() + " is out of date", | |||||
Project.MSG_VERBOSE); | |||||
} | |||||
} | |||||
} | |||||
return needBuild; | |||||
} | |||||
/** | |||||
* Returns the Public ID of the DTD specified in the EJB descriptor. Not | |||||
* every vendor-specific <code>DeploymentTool</code> will need to reference | |||||
* this value or may want to determine this value in a vendor-specific way. | |||||
* | |||||
* @return Public ID of the DTD specified in the EJB descriptor. | |||||
*/ | |||||
protected String getPublicId() { | |||||
return handler.getPublicId(); | |||||
} | |||||
/** | |||||
* This method checks the timestamp on each file listed in the <code> | |||||
* ejbFiles</code> and compares them to the timestamp on the <code>jarFile | |||||
* </code>. If the <code>jarFile</code>'s timestamp is more recent than | |||||
* each EJB file, <code>false</code> is returned. Otherwise, <code>true | |||||
* </code> is returned. | |||||
* | |||||
* @param ejbFiles Hashtable of EJB classes (and other) files that will be | |||||
* added to the completed JAR file | |||||
* @param jarFile JAR file which will contain all of the EJB classes (and | |||||
* other) files | |||||
* @return boolean indicating whether or not the <code>jarFile</code> | |||||
* is up to date | |||||
*/ | |||||
protected boolean needToRebuild(Hashtable ejbFiles, File jarFile) { | |||||
// By default we assume we need to build. | |||||
boolean needBuild = true; | |||||
if (jarFile.exists()) { | |||||
long lastBuild = jarFile.lastModified(); | |||||
Iterator fileIter = ejbFiles.values().iterator(); | |||||
// Set the need build to false until we find out otherwise. | |||||
needBuild = false; | |||||
// Loop through the files seeing if any has been touched | |||||
// more recently than the destination jar. | |||||
while( (needBuild == false) && (fileIter.hasNext()) ) { | |||||
File currentFile = (File) fileIter.next(); | |||||
needBuild = ( lastBuild < currentFile.lastModified() ); | |||||
if (needBuild) { | |||||
log("Build needed because " + currentFile.getPath() + " is out of date", | |||||
Project.MSG_VERBOSE); | |||||
} | |||||
} | |||||
} | |||||
return needBuild; | |||||
} | |||||
/** | |||||
* Returns the Public ID of the DTD specified in the EJB descriptor. Not | |||||
* every vendor-specific <code>DeploymentTool</code> will need to reference | |||||
* this value or may want to determine this value in a vendor-specific way. | |||||
* | |||||
* @return Public ID of the DTD specified in the EJB descriptor. | |||||
*/ | |||||
protected String getPublicId() { | |||||
return handler.getPublicId(); | |||||
} | |||||
/** | /** | ||||
* Method used to encapsulate the writing of the JAR file. Iterates over the | * Method used to encapsulate the writing of the JAR file. Iterates over the | ||||
@@ -785,14 +790,14 @@ public class GenericDeploymentTool implements EJBDeploymentTool { | |||||
/** | /** | ||||
* Called to validate that the tool parameters have been configured. | * Called to validate that the tool parameters have been configured. | ||||
* | * | ||||
* @throws BuildException If the Deployment Tool's configuration isn't | |||||
* valid | |||||
* @throws BuildException If the Deployment Tool's configuration isn't | |||||
* valid | |||||
*/ | */ | ||||
public void validateConfigured() throws BuildException { | public void validateConfigured() throws BuildException { | ||||
if ((destDir == null) || (!destDir.isDirectory())) { | if ((destDir == null) || (!destDir.isDirectory())) { | ||||
String msg = "A valid destination directory must be specified " | |||||
+ "using the \"destdir\" attribute."; | |||||
throw new BuildException(msg, getLocation()); | |||||
String msg = "A valid destination directory must be specified " | |||||
+ "using the \"destdir\" attribute."; | |||||
throw new BuildException(msg, getLocation()); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -122,302 +122,301 @@ import org.apache.tools.ant.BuildException; | |||||
*/ | */ | ||||
public class IPlanetDeploymentTool extends GenericDeploymentTool { | public class IPlanetDeploymentTool extends GenericDeploymentTool { | ||||
/* Attributes set by the Ant build file */ | |||||
private File iashome; | |||||
private String jarSuffix = ".jar"; | |||||
private boolean keepgenerated = false; | |||||
private boolean debug = false; | |||||
/* | |||||
* Filenames of the standard EJB descriptor (which is passed to this class | |||||
* from the parent "ejbjar" task) and the iAS-specific EJB descriptor | |||||
* (whose name is determined by this class). Both filenames are relative | |||||
* to the directory specified by the "srcdir" attribute in the ejbjar task. | |||||
*/ | |||||
private String descriptorName; | |||||
private String iasDescriptorName; | |||||
/* | |||||
* The displayName variable stores the value of the "display-name" element | |||||
* from the standard EJB descriptor. As a future enhancement to this task, | |||||
* we may determine the name of the EJB JAR file using this display-name, | |||||
* but this has not be implemented yet. | |||||
*/ | |||||
private String displayName; | |||||
/* | |||||
* Regardless of the name of the iAS-specific EJB descriptor file, it will | |||||
* written in the completed JAR file as "ias-ejb-jar.xml". This is the | |||||
* naming convention implemented by iAS. | |||||
*/ | |||||
/* Attributes set by the Ant build file */ | |||||
private File iashome; | |||||
private String jarSuffix = ".jar"; | |||||
private boolean keepgenerated = false; | |||||
private boolean debug = false; | |||||
/* | |||||
* Filenames of the standard EJB descriptor (which is passed to this class | |||||
* from the parent "ejbjar" task) and the iAS-specific EJB descriptor | |||||
* (whose name is determined by this class). Both filenames are relative | |||||
* to the directory specified by the "srcdir" attribute in the ejbjar task. | |||||
*/ | |||||
private String descriptorName; | |||||
private String iasDescriptorName; | |||||
/* | |||||
* The displayName variable stores the value of the "display-name" element | |||||
* from the standard EJB descriptor. As a future enhancement to this task, | |||||
* we may determine the name of the EJB JAR file using this display-name, | |||||
* but this has not be implemented yet. | |||||
*/ | |||||
private String displayName; | |||||
/* | |||||
* Regardless of the name of the iAS-specific EJB descriptor file, it will | |||||
* written in the completed JAR file as "ias-ejb-jar.xml". This is the | |||||
* naming convention implemented by iAS. | |||||
*/ | |||||
private static final String IAS_DD = "ias-ejb-jar.xml"; | private static final String IAS_DD = "ias-ejb-jar.xml"; | ||||
/** | /** | ||||
* Setter method used to store the "home" directory of the user's iAS | * Setter method used to store the "home" directory of the user's iAS | ||||
* installation. The directory specified should typically be | |||||
* <code>[install-location]/iplanet/ias6/ias</code>. | |||||
* | |||||
* installation. The directory specified should typically be | |||||
* <code>[install-location]/iplanet/ias6/ias</code>. | |||||
* | |||||
* @param iashome The home directory for the user's iAS installation. | * @param iashome The home directory for the user's iAS installation. | ||||
*/ | */ | ||||
public void setIashome(File iashome) { | |||||
this.iashome = iashome; | |||||
} | |||||
public void setIashome(File iashome) { | |||||
this.iashome = iashome; | |||||
} | |||||
/** | /** | ||||
* Setter method used to specify whether the Java source files generated by | * Setter method used to specify whether the Java source files generated by | ||||
* the ejbc utility should be saved or automatically deleted. | * the ejbc utility should be saved or automatically deleted. | ||||
* | |||||
* | |||||
* @param keepgenerated boolean which, if <code>true</code>, indicates that | * @param keepgenerated boolean which, if <code>true</code>, indicates that | ||||
* Java source files generated by ejbc for the stubs | |||||
* and skeletons should be kept. | |||||
* Java source files generated by ejbc for the stubs | |||||
* and skeletons should be kept. | |||||
*/ | */ | ||||
public void setKeepgenerated(boolean keepgenerated) { | |||||
this.keepgenerated = keepgenerated; | |||||
} | |||||
public void setKeepgenerated(boolean keepgenerated) { | |||||
this.keepgenerated = keepgenerated; | |||||
} | |||||
/** | /** | ||||
* Sets whether or not debugging output will be generated when ejbc is | * Sets whether or not debugging output will be generated when ejbc is | ||||
* executed. | |||||
* | |||||
* @param debug A boolean indicating if debugging output should be generated | |||||
* executed. | |||||
* | |||||
* @param debug A boolean indicating if debugging output should be generated | |||||
*/ | */ | ||||
public void setDebug(boolean debug) { | |||||
this.debug = debug; | |||||
} | |||||
public void setDebug(boolean debug) { | |||||
this.debug = debug; | |||||
} | |||||
/** | /** | ||||
* Setter method used to specify the filename suffix (for example, ".jar") | * Setter method used to specify the filename suffix (for example, ".jar") | ||||
* for the JAR files to be created. | |||||
* | |||||
* for the JAR files to be created. | |||||
* | |||||
* @param jarSuffix The string to use as the JAR filename suffix. | * @param jarSuffix The string to use as the JAR filename suffix. | ||||
*/ | */ | ||||
public void setSuffix(String jarSuffix) { | public void setSuffix(String jarSuffix) { | ||||
this.jarSuffix = jarSuffix; | this.jarSuffix = jarSuffix; | ||||
} | } | ||||
/** | |||||
/** | |||||
* Since iAS doesn't generate a "generic" JAR as part of its processing, | * Since iAS doesn't generate a "generic" JAR as part of its processing, | ||||
* this attribute is ignored and a warning message is displayed to the user. | |||||
* | |||||
* this attribute is ignored and a warning message is displayed to the user. | |||||
* | |||||
* @param inString the string to use as the suffix. This parameter is | * @param inString the string to use as the suffix. This parameter is | ||||
* ignored. | |||||
* ignored. | |||||
*/ | */ | ||||
public void setGenericJarSuffix(String inString) { | public void setGenericJarSuffix(String inString) { | ||||
log("Since a generic JAR file is not created during processing, the " | log("Since a generic JAR file is not created during processing, the " | ||||
+ "iPlanet Deployment Tool does not support the " | |||||
+ "\"genericjarsuffix\" attribute. It will be ignored.", | |||||
Project.MSG_WARN); | |||||
+ "iPlanet Deployment Tool does not support the " | |||||
+ "\"genericjarsuffix\" attribute. It will be ignored.", | |||||
Project.MSG_WARN); | |||||
} | } | ||||
public void processDescriptor(String descriptorName, SAXParser saxParser) { | |||||
this.descriptorName = descriptorName; | |||||
public void processDescriptor(String descriptorName, SAXParser saxParser) { | |||||
this.descriptorName = descriptorName; | |||||
log("iPlanet Deployment Tool processing: " + descriptorName + " (and " | |||||
+ getIasDescriptorName() + ")", Project.MSG_VERBOSE); | |||||
log("iPlanet Deployment Tool processing: " + descriptorName + " (and " | |||||
+ getIasDescriptorName() + ")", Project.MSG_VERBOSE); | |||||
super.processDescriptor(descriptorName, saxParser); | |||||
} | |||||
super.processDescriptor(descriptorName, saxParser); | |||||
} | |||||
/** | /** | ||||
* Verifies that the user selections are valid. | * Verifies that the user selections are valid. | ||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @param saxParser SAXParser which may be used to parse the XML | |||||
* descriptor | |||||
* @throws BuildException If the user selections are invalid. | |||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @param saxParser SAXParser which may be used to parse the XML | |||||
* descriptor | |||||
* @throws BuildException If the user selections are invalid. | |||||
*/ | */ | ||||
protected void checkConfiguration(String descriptorFileName, | |||||
SAXParser saxParser) throws BuildException { | |||||
int startOfName = descriptorFileName.lastIndexOf(File.separatorChar) + 1; | |||||
String stdXml = descriptorFileName.substring(startOfName); | |||||
if (stdXml.equals(EJB_DD) && (getConfig().baseJarName == null)) { | |||||
String msg = "No name specified for the completed JAR file. The EJB" | |||||
+ " descriptor should be prepended with the JAR " | |||||
+ "name or it should be specified using the " | |||||
+ "attribute \"basejarname\" in the \"ejbjar\" task."; | |||||
throw new BuildException(msg, getLocation()); | |||||
} | |||||
File iasDescriptor = new File(getConfig().descriptorDir, | |||||
getIasDescriptorName()); | |||||
if ((!iasDescriptor.exists()) || (!iasDescriptor.isFile())) { | |||||
String msg = "The iAS-specific EJB descriptor (" | |||||
+ iasDescriptor + ") was not found."; | |||||
throw new BuildException(msg, getLocation()); | |||||
} | |||||
if ((iashome != null) && (!iashome.isDirectory())) { | |||||
String msg = "If \"iashome\" is specified, it must be a valid " | |||||
+ "directory (it was set to " + iashome + ")."; | |||||
throw new BuildException(msg, getLocation()); | |||||
} | |||||
} | |||||
/** | |||||
* This method returns a list of EJB files found when the specified EJB | |||||
* descriptor is parsed and processed. | |||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @param saxParser SAXParser which may be used to parse the XML | |||||
* descriptor | |||||
* @return Hashtable of EJB class (and other) files to be | |||||
* added to the completed JAR file | |||||
protected void checkConfiguration(String descriptorFileName, | |||||
SAXParser saxParser) throws BuildException { | |||||
int startOfName = descriptorFileName.lastIndexOf(File.separatorChar) + 1; | |||||
String stdXml = descriptorFileName.substring(startOfName); | |||||
if (stdXml.equals(EJB_DD) && (getConfig().baseJarName == null)) { | |||||
String msg = "No name specified for the completed JAR file. The EJB" | |||||
+ " descriptor should be prepended with the JAR " | |||||
+ "name or it should be specified using the " | |||||
+ "attribute \"basejarname\" in the \"ejbjar\" task."; | |||||
throw new BuildException(msg, getLocation()); | |||||
} | |||||
File iasDescriptor = new File(getConfig().descriptorDir, | |||||
getIasDescriptorName()); | |||||
if ((!iasDescriptor.exists()) || (!iasDescriptor.isFile())) { | |||||
String msg = "The iAS-specific EJB descriptor (" | |||||
+ iasDescriptor + ") was not found."; | |||||
throw new BuildException(msg, getLocation()); | |||||
} | |||||
if ((iashome != null) && (!iashome.isDirectory())) { | |||||
String msg = "If \"iashome\" is specified, it must be a valid " | |||||
+ "directory (it was set to " + iashome + ")."; | |||||
throw new BuildException(msg, getLocation()); | |||||
} | |||||
} | |||||
/** | |||||
* This method returns a list of EJB files found when the specified EJB | |||||
* descriptor is parsed and processed. | |||||
* | |||||
* @param descriptorFileName String representing the file name of an EJB | |||||
* descriptor to be processed | |||||
* @param saxParser SAXParser which may be used to parse the XML | |||||
* descriptor | |||||
* @return Hashtable of EJB class (and other) files to be | |||||
* added to the completed JAR file | |||||
* @throws IOException An IOException from the parser, possibly from | * @throws IOException An IOException from the parser, possibly from | ||||
* the byte stream or character stream | |||||
* @throws SAXException Any SAX exception, possibly wrapping another | |||||
* exception | |||||
*/ | |||||
protected Hashtable parseEjbFiles(String descriptorFileName, | |||||
SAXParser saxParser) throws IOException, SAXException { | |||||
Hashtable files; | |||||
/* Build and populate an instance of the ejbc utility */ | |||||
IPlanetEjbc ejbc = new IPlanetEjbc( | |||||
new File(getConfig().descriptorDir, | |||||
descriptorFileName), | |||||
new File(getConfig().descriptorDir, | |||||
getIasDescriptorName()), | |||||
getConfig().srcDir, | |||||
getCombinedClasspath().toString(), | |||||
saxParser); | |||||
ejbc.setRetainSource(keepgenerated); | |||||
ejbc.setDebugOutput(debug); | |||||
if (iashome != null) { | |||||
ejbc.setIasHomeDir(iashome); | |||||
} | |||||
/* Execute the ejbc utility -- stubs/skeletons are rebuilt, if needed */ | |||||
try { | |||||
ejbc.execute(); | |||||
} catch (IPlanetEjbc.EjbcException e) { | |||||
throw new BuildException("An error has occurred while trying to " | |||||
+ "execute the iAS ejbc utility", e, getLocation()); | |||||
} | |||||
displayName = ejbc.getDisplayName(); | |||||
files = ejbc.getEjbFiles(); | |||||
/* Add CMP descriptors to the list of EJB files */ | |||||
String[] cmpDescriptors = ejbc.getCmpDescriptors(); | |||||
if (cmpDescriptors.length > 0) { | |||||
File baseDir = getConfig().descriptorDir; | |||||
int endOfPath = descriptorFileName.lastIndexOf(File.separator); | |||||
String relativePath = descriptorFileName.substring(0, endOfPath + 1); | |||||
for (int i = 0; i < cmpDescriptors.length; i++) { | |||||
int endOfCmp = cmpDescriptors[i].lastIndexOf('/'); | |||||
String cmpDescriptor = cmpDescriptors[i].substring(endOfCmp + 1); | |||||
File cmpFile = new File(baseDir, relativePath + cmpDescriptor); | |||||
if (!cmpFile.exists()) { | |||||
throw new BuildException("The CMP descriptor file (" | |||||
+ cmpFile + ") could not be found.", getLocation()); | |||||
} | |||||
files.put(cmpDescriptors[i], cmpFile); | |||||
} | |||||
} | |||||
return files; | |||||
} | |||||
* the byte stream or character stream | |||||
* @throws SAXException Any SAX exception, possibly wrapping another | |||||
* exception | |||||
*/ | |||||
protected Hashtable parseEjbFiles(String descriptorFileName, | |||||
SAXParser saxParser) throws IOException, SAXException { | |||||
Hashtable files; | |||||
/* Build and populate an instance of the ejbc utility */ | |||||
IPlanetEjbc ejbc = new IPlanetEjbc( | |||||
new File(getConfig().descriptorDir, | |||||
descriptorFileName), | |||||
new File(getConfig().descriptorDir, | |||||
getIasDescriptorName()), | |||||
getConfig().srcDir, | |||||
getCombinedClasspath().toString(), | |||||
saxParser); | |||||
ejbc.setRetainSource(keepgenerated); | |||||
ejbc.setDebugOutput(debug); | |||||
if (iashome != null) { | |||||
ejbc.setIasHomeDir(iashome); | |||||
} | |||||
/* Execute the ejbc utility -- stubs/skeletons are rebuilt, if needed */ | |||||
try { | |||||
ejbc.execute(); | |||||
} catch (IPlanetEjbc.EjbcException e) { | |||||
throw new BuildException("An error has occurred while trying to " | |||||
+ "execute the iAS ejbc utility", e, getLocation()); | |||||
} | |||||
displayName = ejbc.getDisplayName(); | |||||
files = ejbc.getEjbFiles(); | |||||
/* Add CMP descriptors to the list of EJB files */ | |||||
String[] cmpDescriptors = ejbc.getCmpDescriptors(); | |||||
if (cmpDescriptors.length > 0) { | |||||
File baseDir = getConfig().descriptorDir; | |||||
int endOfPath = descriptorFileName.lastIndexOf(File.separator); | |||||
String relativePath = descriptorFileName.substring(0, endOfPath + 1); | |||||
for (int i = 0; i < cmpDescriptors.length; i++) { | |||||
int endOfCmp = cmpDescriptors[i].lastIndexOf('/'); | |||||
String cmpDescriptor = cmpDescriptors[i].substring(endOfCmp + 1); | |||||
File cmpFile = new File(baseDir, relativePath + cmpDescriptor); | |||||
if (!cmpFile.exists()) { | |||||
throw new BuildException("The CMP descriptor file (" | |||||
+ cmpFile + ") could not be found.", getLocation()); | |||||
} | |||||
files.put(cmpDescriptors[i], cmpFile); | |||||
} | |||||
} | |||||
return files; | |||||
} | |||||
/** | /** | ||||
* Add the iAS-specific EJB descriptor to the list of files which will be | * Add the iAS-specific EJB descriptor to the list of files which will be | ||||
* written to the JAR file. | |||||
* | |||||
* @param ejbFiles Hashtable of EJB class (and other) files to be added to | |||||
* the completed JAR file. | |||||
* @param baseName String name of the EJB JAR file to be written (without | |||||
* a filename extension). | |||||
* written to the JAR file. | |||||
* | |||||
* @param ejbFiles Hashtable of EJB class (and other) files to be added to | |||||
* the completed JAR file. | |||||
* @param baseName String name of the EJB JAR file to be written (without | |||||
* a filename extension). | |||||
*/ | */ | ||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName) { | |||||
ejbFiles.put(META_DIR + IAS_DD, new File(getConfig().descriptorDir, | |||||
getIasDescriptorName())); | |||||
} | |||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName, String descriptorFileName) { | |||||
ejbFiles.put(META_DIR + IAS_DD, new File(getConfig().descriptorDir, | |||||
getIasDescriptorName())); | |||||
} | |||||
/** | /** | ||||
* Get the name of the Jar that will be written. The modification date | * Get the name of the Jar that will be written. The modification date | ||||
* of this jar will be checked against the dependent bean classes. | * of this jar will be checked against the dependent bean classes. | ||||
* | |||||
* @param baseName String name of the EJB JAR file to be written (without | |||||
* a filename extension). | |||||
* | |||||
* @return File representing the JAR file which will be written. | |||||
* | |||||
* @param baseName String name of the EJB JAR file to be written (without | |||||
* a filename extension). | |||||
* | |||||
* @return File representing the JAR file which will be written. | |||||
*/ | */ | ||||
File getVendorOutputJarFile(String baseName) { | File getVendorOutputJarFile(String baseName) { | ||||
File jarFile = new File(getDestDir(), baseName + jarSuffix); | |||||
log("JAR file name: " + jarFile.toString(), Project.MSG_VERBOSE); | |||||
File jarFile = new File(getDestDir(), baseName + jarSuffix); | |||||
log("JAR file name: " + jarFile.toString(), Project.MSG_VERBOSE); | |||||
return jarFile; | return jarFile; | ||||
} | } | ||||
/** | |||||
* The iAS ejbc utility doesn't require the Public ID of the descriptor's | |||||
* DTD for it to process correctly--this method always returns <code>null | |||||
* </code>. | |||||
* | |||||
* @return <code>null</code>. | |||||
*/ | |||||
protected String getPublicId() { | |||||
return null; | |||||
} | |||||
/** | |||||
* Determines the name of the iAS-specific EJB descriptor using the | |||||
* specified standard EJB descriptor name. In general, the standard | |||||
* descriptor will be named "[basename]-ejb-jar.xml", and this method will | |||||
* return "[basename]-ias-ejb-jar.xml". | |||||
* | |||||
* @return The name of the iAS-specific EJB descriptor file. | |||||
*/ | |||||
private String getIasDescriptorName() { | |||||
/* Only calculate the descriptor name once */ | |||||
if (iasDescriptorName != null) { | |||||
return iasDescriptorName; | |||||
} | |||||
String path = ""; // Directory path of the EJB descriptor | |||||
String basename; // Filename appearing before name terminator | |||||
String remainder; // Filename appearing after the name terminator | |||||
/* Find the end of the standard descriptor's relative path */ | |||||
int startOfFileName = descriptorName.lastIndexOf(File.separatorChar); | |||||
if (startOfFileName != -1) { | |||||
path = descriptorName.substring(0, startOfFileName + 1); | |||||
} | |||||
/* Check to see if the standard name is used (there's no basename) */ | |||||
if (descriptorName.substring(startOfFileName + 1).equals(EJB_DD)) { | |||||
basename = ""; | |||||
remainder = EJB_DD; | |||||
} else { | |||||
int endOfBaseName = descriptorName.indexOf( | |||||
getConfig().baseNameTerminator, | |||||
startOfFileName); | |||||
/* | |||||
* Check for the odd case where the terminator and/or filename | |||||
* extension aren't found. These will ensure "ias-" appears at the | |||||
* end of the name and before the '.' (if present). | |||||
*/ | |||||
if (endOfBaseName < 0) { | |||||
endOfBaseName = descriptorName.lastIndexOf('.') - 1; | |||||
if (endOfBaseName < 0) { | |||||
endOfBaseName = descriptorName.length() - 1; | |||||
} | |||||
} | |||||
basename = descriptorName.substring(startOfFileName + 1, | |||||
endOfBaseName + 1); | |||||
remainder = descriptorName.substring(endOfBaseName + 1); | |||||
} | |||||
iasDescriptorName = path + basename + "ias-" + remainder; | |||||
return iasDescriptorName; | |||||
} | |||||
/** | |||||
* The iAS ejbc utility doesn't require the Public ID of the descriptor's | |||||
* DTD for it to process correctly--this method always returns <code>null | |||||
* </code>. | |||||
* | |||||
* @return <code>null</code>. | |||||
*/ | |||||
protected String getPublicId() { | |||||
return null; | |||||
} | |||||
/** | |||||
* Determines the name of the iAS-specific EJB descriptor using the | |||||
* specified standard EJB descriptor name. In general, the standard | |||||
* descriptor will be named "[basename]-ejb-jar.xml", and this method will | |||||
* return "[basename]-ias-ejb-jar.xml". | |||||
* | |||||
* @return The name of the iAS-specific EJB descriptor file. | |||||
*/ | |||||
private String getIasDescriptorName() { | |||||
/* Only calculate the descriptor name once */ | |||||
if (iasDescriptorName != null) { | |||||
return iasDescriptorName; | |||||
} | |||||
String path = ""; // Directory path of the EJB descriptor | |||||
String basename; // Filename appearing before name terminator | |||||
String remainder; // Filename appearing after the name terminator | |||||
/* Find the end of the standard descriptor's relative path */ | |||||
int startOfFileName = descriptorName.lastIndexOf(File.separatorChar); | |||||
if (startOfFileName != -1) { | |||||
path = descriptorName.substring(0, startOfFileName + 1); | |||||
} | |||||
/* Check to see if the standard name is used (there's no basename) */ | |||||
if (descriptorName.substring(startOfFileName + 1).equals(EJB_DD)) { | |||||
basename = ""; | |||||
remainder = EJB_DD; | |||||
} else { | |||||
int endOfBaseName = descriptorName.indexOf( | |||||
getConfig().baseNameTerminator, | |||||
startOfFileName); | |||||
/* | |||||
* Check for the odd case where the terminator and/or filename | |||||
* extension aren't found. These will ensure "ias-" appears at the | |||||
* end of the name and before the '.' (if present). | |||||
*/ | |||||
if (endOfBaseName < 0) { | |||||
endOfBaseName = descriptorName.lastIndexOf('.') - 1; | |||||
if (endOfBaseName < 0) { | |||||
endOfBaseName = descriptorName.length() - 1; | |||||
} | |||||
} | |||||
basename = descriptorName.substring(startOfFileName + 1, | |||||
endOfBaseName + 1); | |||||
remainder = descriptorName.substring(endOfBaseName + 1); | |||||
} | |||||
iasDescriptorName = path + basename + "ias-" + remainder; | |||||
return iasDescriptorName; | |||||
} | |||||
} | } |
@@ -77,7 +77,7 @@ public class JbossDeploymentTool extends GenericDeploymentTool { | |||||
* Add any vendor specific files which should be included in the | * Add any vendor specific files which should be included in the | ||||
* EJB Jar. | * EJB Jar. | ||||
*/ | */ | ||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName) { | |||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName, String descriptorFileName) { | |||||
String ddPrefix = (usingBaseJarName() ? "" : baseName + getConfig().baseNameTerminator); | String ddPrefix = (usingBaseJarName() ? "" : baseName + getConfig().baseNameTerminator); | ||||
File jbossDD = new File(getConfig().descriptorDir, ddPrefix + JBOSS_DD); | File jbossDD = new File(getConfig().descriptorDir, ddPrefix + JBOSS_DD); | ||||
@@ -297,9 +297,21 @@ public class WeblogicDeploymentTool extends GenericDeploymentTool { | |||||
* Add any vendor specific files which should be included in the | * Add any vendor specific files which should be included in the | ||||
* EJB Jar. | * EJB Jar. | ||||
*/ | */ | ||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName) { | |||||
String ddPrefix = (usingBaseJarName() ? "" : baseName + getConfig().baseNameTerminator); | |||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName, String descriptorFileName) { | |||||
String ddPrefix = null; | |||||
if (!usingBaseJarName()) { | |||||
ddPrefix = baseName + getConfig().baseNameTerminator; | |||||
} | |||||
else { | |||||
String canonicalDescriptor = descriptorFileName.replace('\\', '/'); | |||||
int index = canonicalDescriptor.lastIndexOf('/'); | |||||
if (index == -1) { | |||||
ddPrefix = ""; | |||||
} | |||||
else { | |||||
ddPrefix = descriptorFileName.substring(0, index + 1); | |||||
} | |||||
} | |||||
File weblogicDD = new File(getConfig().descriptorDir, ddPrefix + WL_DD); | File weblogicDD = new File(getConfig().descriptorDir, ddPrefix + WL_DD); | ||||
if (weblogicDD.exists()) { | if (weblogicDD.exists()) { | ||||
@@ -102,8 +102,8 @@ public class WeblogicTOPLinkDeploymentTool extends WeblogicDeploymentTool { | |||||
* Add any vendor specific files which should be included in the | * Add any vendor specific files which should be included in the | ||||
* EJB Jar. | * EJB Jar. | ||||
*/ | */ | ||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName) { | |||||
super.addVendorFiles(ejbFiles, baseName); | |||||
protected void addVendorFiles(Hashtable ejbFiles, String baseName, String descriptorFileName) { | |||||
super.addVendorFiles(ejbFiles, baseName, descriptorFileName); | |||||
// Then the toplink deployment descriptor | // Then the toplink deployment descriptor | ||||
// Setup a naming standard here?. | // Setup a naming standard here?. | ||||