EjbcHelperpublic final class EjbcHelper extends Object A helper class which performs the actual work of the ejbc task.
This class is run with a classpath which includes the weblogic tools and the home and remote
interface class files referenced in the deployment descriptors being processed. |
Fields Summary |
---|
private File | descriptorDirectoryThe root directory of the tree containing the serialised deployment desciptors. | private File | generatedFilesDirectoryThe directory where generated files are placed. | private File | manifestFileThe name of the manifest file generated for the EJB jar. | private File | sourceDirectoryThe source directory for the home and remote interfaces. This is used to determine if
the generated deployment classes are out of date. | String[] | descriptorsThe names of the serialised deployment descriptors | private boolean | keepGenerated |
Constructors Summary |
---|
private EjbcHelper(String[] args)Initialise the EjbcHelper by reading the command arguments.
int index = 0;
descriptorDirectory = new File(args[index++]);
generatedFilesDirectory = new File(args[index++]);
sourceDirectory = new File(args[index++]);
manifestFile = new File(args[index++]);
keepGenerated = Boolean.valueOf(args[index++]).booleanValue();
descriptors = new String[args.length - index];
for (int i = 0; index < args.length; ++i) {
descriptors[i] = args[index++];
}
|
Methods Summary |
---|
private java.lang.String[] | getCommandLine(boolean debug, java.io.File descriptorFile)
Vector v = new Vector();
if (!debug) {
v.addElement("-noexit");
}
if (keepGenerated) {
v.addElement("-keepgenerated");
}
v.addElement("-d");
v.addElement(generatedFilesDirectory.getPath());
v.addElement(descriptorFile.getPath());
String[] args = new String[v.size()];
v.copyInto(args);
return args;
| private boolean | isRegenRequired(java.io.File descriptorFile)Determine if the weblogic EJB support classes need to be regenerated
for a given deployment descriptor.
This process attempts to determine if the support classes need to be
rebuilt. It does this by examining only some of the support classes
which are typically generated. If the ejbc task is interrupted generating
the support classes for a bean, all of the support classes should be removed
to force regeneration of the support classes.
// read in the descriptor. Under weblogic, the descriptor is a weblogic
// specific subclass which has references to the implementation classes.
// These classes must, therefore, be in the classpath when the deployment
// descriptor is loaded from the .ser file
FileInputStream fis = null;
try {
fis = new FileInputStream(descriptorFile);
ObjectInputStream ois = new ObjectInputStream(fis);
DeploymentDescriptor dd = (DeploymentDescriptor) ois.readObject();
fis.close();
String homeInterfacePath
= dd.getHomeInterfaceClassName().replace('.", '/") + ".java";
String remoteInterfacePath
= dd.getRemoteInterfaceClassName().replace('.", '/") + ".java";
String primaryKeyClassPath = null;
if (dd instanceof EntityDescriptor) {
primaryKeyClassPath
= ((EntityDescriptor) dd).getPrimaryKeyClassName();
primaryKeyClassPath
= primaryKeyClassPath.replace('.", '/") + ".java";
}
File homeInterfaceSource = new File(sourceDirectory, homeInterfacePath);
File remoteInterfaceSource = new File(sourceDirectory, remoteInterfacePath);
File primaryKeyClassSource = null;
if (primaryKeyClassPath != null) {
primaryKeyClassSource = new File(sourceDirectory, remoteInterfacePath);
}
// are any of the above out of date.
// we find the implementation classes and see if they are older than any
// of the above or the .ser file itself.
String beanClassBase = dd.getEnterpriseBeanClassName().replace('.", '/");
File ejbImplentationClass
= new File(generatedFilesDirectory, beanClassBase + "EOImpl.class");
File homeImplementationClass
= new File(generatedFilesDirectory, beanClassBase + "HomeImpl.class");
File beanStubClass
= new File(generatedFilesDirectory, beanClassBase + "EOImpl_WLStub.class");
// if the implementation classes don;t exist regenerate
if (!ejbImplentationClass.exists()
|| !homeImplementationClass.exists()
|| !beanStubClass.exists()) {
return true;
}
// Is the ser file or any of the source files newer then the class files.
// firstly find the oldest of the two class files.
long classModificationTime = ejbImplentationClass.lastModified();
if (homeImplementationClass.lastModified() < classModificationTime) {
classModificationTime = homeImplementationClass.lastModified();
}
if (beanStubClass.lastModified() < classModificationTime) {
classModificationTime = beanStubClass.lastModified();
}
if (descriptorFile.lastModified() > classModificationTime
|| homeInterfaceSource.lastModified() > classModificationTime
|| remoteInterfaceSource.lastModified() > classModificationTime) {
return true;
}
if (primaryKeyClassSource != null
&& primaryKeyClassSource.lastModified() > classModificationTime) {
return true;
}
} catch (Throwable descriptorLoadException) {
System.out.println("Exception occurred reading "
+ descriptorFile.getName() + " - continuing");
// any problems - just regenerate
return true;
} finally {
if (fis != null) {
fis.close();
}
}
return false;
| public static void | main(java.lang.String[] args)Command line interface for the ejbc helper task.
EjbcHelper helper = new EjbcHelper(args);
helper.process();
| private void | process()Process the descriptors in turn generating support classes for each and a manifest
file for all of the beans.
String manifest = "Manifest-Version: 1.0\n\n";
for (int i = 0; i < descriptors.length; ++i) {
String descriptorName = descriptors[i];
File descriptorFile = new File(descriptorDirectory, descriptorName);
if (isRegenRequired(descriptorFile)) {
System.out.println("Running ejbc for " + descriptorFile.getName());
regenerateSupportClasses(descriptorFile);
} else {
System.out.println(descriptorFile.getName() + " is up to date");
}
manifest += "Name: " + descriptorName.replace('\\", '/")
+ "\nEnterprise-Bean: True\n\n";
}
FileWriter fw = new FileWriter(manifestFile);
PrintWriter pw = new PrintWriter(fw);
pw.print(manifest);
fw.flush();
fw.close();
| private void | regenerateSupportClasses(java.io.File descriptorFile)Perform the weblogic.ejbc call to regenerate the support classes.
Note that this method relies on an undocumented -noexit option to the
ejbc tool to stop the ejbc tool exiting the VM altogether.
// create a Java task to do the rebuild
String[] args = getCommandLine(false, descriptorFile);
try {
weblogic.ejbc.main(args);
} catch (Exception e) {
// run with no exit for better reporting
String[] newArgs = getCommandLine(true, descriptorFile);
weblogic.ejbc.main(newArgs);
}
|
|