Author: peterreilly Date: Mon Aug 20 08:57:39 2007 New Revision: 567734 URL: http://svn.apache.org/viewvc?rev=567734&view=rev Log: initial checkin
Added: ant/sandbox/antlibs/weblogic/trunk/NOTICE ant/sandbox/antlibs/weblogic/trunk/build.xml ant/sandbox/antlibs/weblogic/trunk/src/ ant/sandbox/antlibs/weblogic/trunk/src/main/ ant/sandbox/antlibs/weblogic/trunk/src/main/org/ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/antlib.xml ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreator.java ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreatorHelper.java ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLStop.java Added: ant/sandbox/antlibs/weblogic/trunk/NOTICE URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/weblogic/trunk/NOTICE?rev=567734&view=auto ============================================================================== --- ant/sandbox/antlibs/weblogic/trunk/NOTICE (added) +++ ant/sandbox/antlibs/weblogic/trunk/NOTICE Mon Aug 20 08:57:39 2007 @@ -0,0 +1,11 @@ + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0 == + ========================================================================= + + Apache AntLib for weblogic + Copyright 2005-2007 The Apache Software Foundation + + This product includes software developed by + The Apache Software Foundation (http://www.apache.org/). + Added: ant/sandbox/antlibs/weblogic/trunk/build.xml URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/weblogic/trunk/build.xml?rev=567734&view=auto ============================================================================== --- ant/sandbox/antlibs/weblogic/trunk/build.xml (added) +++ ant/sandbox/antlibs/weblogic/trunk/build.xml Mon Aug 20 08:57:39 2007 @@ -0,0 +1,44 @@ +<?xml version="1.0"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<project default="compile" name="weblogic"> + + <!-- easy way to override properties --> + <property file="build.properties"/> + + <!-- don't fork junit; regexp classes not available --> + <property name="junit.fork" value="false" /> + + <import file="common/build.xml"/> + + <!-- override compile target --> + <target name="compile" depends="setup"> + <javac + srcdir="src/main" + destdir="${build.classes}" + debug="${javac.debug}" + source="${javac.-source}" + target="${javac.-target}" + > + <classpath> + <fileset dir="lib/optional" includes="*.jar"/> + </classpath> + </javac> + </target> +</project> Added: ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/antlib.xml URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/antlib.xml?rev=567734&view=auto ============================================================================== --- ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/antlib.xml (added) +++ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/antlib.xml Mon Aug 20 08:57:39 2007 @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<antlib> + <taskdef name="wljspc" + classname="org.apache.tools.ant.taskdefs.optional.jsp.WLJspc"/> + <taskdef name="wlrun" + classname="org.apache.tools.ant.taskdefs.optional.ejb.WLRun"/> + <taskdef name="wlstop" + classname="org.apache.tools.ant.taskdefs.optional.ejb.WLStop"/> + <taskdef name="ddcreator" + classname="org.apache.tools.ant.taskdefs.optional.ejb.DDCreator"/> +</antlib> Added: ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreator.java URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreator.java?rev=567734&view=auto ============================================================================== --- ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreator.java (added) +++ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreator.java Mon Aug 20 08:57:39 2007 @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + +import java.io.File; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.taskdefs.Java; +import org.apache.tools.ant.taskdefs.MatchingTask; +import org.apache.tools.ant.types.Commandline; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.util.FileUtils; + +/** + * Builds a serialized deployment descriptor given a text file description of the + * descriptor in the format supported by WebLogic. + * + * This ant task is a front end for the weblogic DDCreator tool. + * + */ +public class DDCreator extends MatchingTask { + /** + * The root directory of the tree containing the textual deployment descriptors. The actual + * deployment descriptor files are selected using include and exclude constructs + * on the EJBC task, as supported by the MatchingTask superclass. + */ + private File descriptorDirectory; + + /** + * The directory where generated serialised deployment descriptors are placed. + */ + private File generatedFilesDirectory; + + /** + * The classpath to be used in the weblogic ejbc calls. It must contain the weblogic + * classes necessary fro DDCreator <b>and</b> the implementation classes of the + * home and remote interfaces. + */ + private String classpath; + + /** + * Do the work. + * + * The work is actually done by creating a helper task. This approach allows + * the classpath of the helper task to be set. Since the weblogic tools require + * the class files of the project's home and remote interfaces to be available in + * the classpath, this also avoids having to start ant with the class path of the + * project it is building. + * + * @exception BuildException if something goes wrong with the build + */ + public void execute() throws BuildException { + if (descriptorDirectory == null + || !descriptorDirectory.isDirectory()) { + throw new BuildException("descriptors directory " + + descriptorDirectory + " is not valid"); + } + if (generatedFilesDirectory == null + || !generatedFilesDirectory.isDirectory()) { + throw new BuildException("dest directory " + + generatedFilesDirectory + " is not valid"); + } + + String args = descriptorDirectory + " " + generatedFilesDirectory; + + // get all the files in the descriptor directory + DirectoryScanner ds = super.getDirectoryScanner(descriptorDirectory); + + String[] files = ds.getIncludedFiles(); + + for (int i = 0; i < files.length; ++i) { + args += " " + files[i]; + } + + String systemClassPath = System.getProperty("java.class.path"); + String execClassPath = FileUtils.translatePath(systemClassPath + ":" + classpath); + Java ddCreatorTask = new Java(this); + ddCreatorTask.setFork(true); + ddCreatorTask.setClassname("org.apache.tools.ant.taskdefs.optional.ejb.DDCreatorHelper"); + Commandline.Argument arguments = ddCreatorTask.createArg(); + arguments.setLine(args); + ddCreatorTask.setClasspath(new Path(getProject(), execClassPath)); + if (ddCreatorTask.executeJava() != 0) { + throw new BuildException("Execution of ddcreator helper failed"); + } + } + + /** + * Set the directory from where the text descriptions of the deployment descriptors are + * to be read. + * + * @param dirName the name of the directory containing the text deployment descriptor files. + */ + public void setDescriptors(String dirName) { + descriptorDirectory = new File(dirName); + } + + /** + * Set the directory into which the serialized deployment descriptors are to + * be written. + * + * @param dirName the name of the directory into which the serialised deployment + * descriptors are written. + */ + public void setDest(String dirName) { + generatedFilesDirectory = new File(dirName); + } + + /** + * Set the classpath to be used for this compilation. + * + * @param s the classpath to use for the ddcreator tool. + */ + public void setClasspath(String s) { + this.classpath = FileUtils.translatePath(s); + } +} Added: ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreatorHelper.java URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreatorHelper.java?rev=567734&view=auto ============================================================================== --- ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreatorHelper.java (added) +++ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreatorHelper.java Mon Aug 20 08:57:39 2007 @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + +import java.io.File; +import java.io.FileInputStream; +import java.io.ObjectInputStream; +import javax.ejb.deployment.DeploymentDescriptor; + +/** + * A helper class which performs the actual work of the ddcreator 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 built. + * + */ +public final class DDCreatorHelper { + /** + * The root directory of the tree containing the textual deployment descriptors. + */ + private File descriptorDirectory; + + /** + * The directory where generated serialised deployment descriptors are written. + */ + private File generatedFilesDirectory; + + // CheckStyle:VisibilityModifier OFF - bc + /** + * The descriptor text files for which a serialised descriptor is to be created. + */ + String[] descriptors; + // CheckStyle:VisibilityModifier ON + + /** + * The main method. + * + * The main method creates an instance of the DDCreatorHelper, passing it the + * args which it then processes. + * @param args the arguments + * @throws Exception on error + */ + public static void main(String[] args) throws Exception { + DDCreatorHelper helper = new DDCreatorHelper(args); + helper.process(); + } + + /** + * Initialise the helper with the command arguments. + * + */ + private DDCreatorHelper(String[] args) { + int index = 0; + descriptorDirectory = new File(args[index++]); + generatedFilesDirectory = new File(args[index++]); + + descriptors = new String[args.length - index]; + for (int i = 0; index < args.length; ++i) { + descriptors[i] = args[index++]; + } + } + + /** + * Do the actual work. + * + * The work proceeds by examining each descriptor given. If the serialised + * file does not exist or is older than the text description, the weblogic + * DDCreator tool is invoked directly to build the serialised descriptor. + */ + private void process() throws Exception { + for (int i = 0; i < descriptors.length; ++i) { + String descriptorName = descriptors[i]; + File descriptorFile = new File(descriptorDirectory, descriptorName); + + int extIndex = descriptorName.lastIndexOf("."); + String serName = null; + if (extIndex != -1) { + serName = descriptorName.substring(0, extIndex) + ".ser"; + } else { + serName = descriptorName + ".ser"; + } + File serFile = new File(generatedFilesDirectory, serName); + + // do we need to regenerate the file + if (!serFile.exists() || serFile.lastModified() < descriptorFile.lastModified() + || regenerateSerializedFile(serFile)) { + + String[] args = {"-noexit", + "-d", serFile.getParent(), + "-outputfile", serFile.getName(), + descriptorFile.getPath()}; + try { + weblogic.ejb.utils.DDCreator.main(args); + } catch (Exception e) { + // there was an exception - run with no exit to get proper error + String[] newArgs = {"-d", generatedFilesDirectory.getPath(), + "-outputfile", serFile.getName(), + descriptorFile.getPath()}; + weblogic.ejb.utils.DDCreator.main(newArgs); + } + } + } + } + + /** + * EJBC will fail if the serialized descriptor file does not match the bean classes. + * You can test for this by trying to load the deployment descriptor. If it fails, + * the serialized file needs to be regenerated because the associated class files + * don't match. + */ + private boolean regenerateSerializedFile(File serFile) { + try { + + FileInputStream fis = new FileInputStream(serFile); + ObjectInputStream ois = new ObjectInputStream(fis); + DeploymentDescriptor dd = (DeploymentDescriptor) ois.readObject(); + fis.close(); + + // Since the descriptor read properly, everything should be o.k. + return false; + + } catch (Exception e) { + + // Weblogic will throw an error if the deployment descriptor does + // not match the class files. + return true; + + } + } +} Added: ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java?rev=567734&view=auto ============================================================================== --- ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java (added) +++ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java Mon Aug 20 08:57:39 2007 @@ -0,0 +1,197 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + +import java.io.File; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.taskdefs.Java; +import org.apache.tools.ant.taskdefs.MatchingTask; +import org.apache.tools.ant.types.Commandline; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.util.FileUtils; + +/** + * Builds EJB support classes using WebLogic's ejbc tool from a directory containing + * a set of deployment descriptors. + * + * + */ +public class Ejbc extends MatchingTask { + /** + * The root directory of the tree containing the serialised deployment desciptors. The actual + * deployment descriptor files are selected using include and exclude constructs + * on the ejbc task provided by the MatchingTask superclass. + */ + private File descriptorDirectory; + + /** + * The directory where generated files are placed. + */ + private File generatedFilesDirectory; + + /** + * The name of the manifest file generated for the EJB jar. + */ + private File generatedManifestFile; + + /** + * The classpath to be used in the weblogic ejbc calls. It must contain the weblogic + * classes <b>and</b> the implementation classes of the home and remote interfaces. + */ + private String classpath; + + /** + * The source directory for the home and remote interfaces. This is used to determine if + * the generated deployment classes are out of date. + */ + private File sourceDirectory; + + // CheckStyle:VisibilityModifier OFF - bc + /** Whether to keep the generated files */ + public boolean keepgenerated; + // CheckStyle:VisibilityModifier ON + + /** + * Do the work. + * + * The work is actually done by creating a separate JVM to run a helper task. + * This approach allows the classpath of the helper task to be set. Since the + * weblogic tools require the class files of the project's home and remote + * interfaces to be available in the classpath, this also avoids having to + * start ant with the class path of the project it is building. + * + * @exception BuildException if someting goes wrong with the build + */ + public void execute() throws BuildException { + if (descriptorDirectory == null + || !descriptorDirectory.isDirectory()) { + throw new BuildException("descriptors directory " + + descriptorDirectory + " is not valid"); + } + if (generatedFilesDirectory == null + || !generatedFilesDirectory.isDirectory()) { + throw new BuildException("dest directory " + + generatedFilesDirectory + " is not valid"); + } + + if (sourceDirectory == null + || !sourceDirectory.isDirectory()) { + throw new BuildException("src directory " + + sourceDirectory + " is not valid"); + } + + String systemClassPath = System.getProperty("java.class.path"); + String execClassPath + = FileUtils.translatePath(systemClassPath + ":" + classpath + + ":" + generatedFilesDirectory); + // get all the files in the descriptor directory + DirectoryScanner ds = super.getDirectoryScanner(descriptorDirectory); + + String[] files = ds.getIncludedFiles(); + + Java helperTask = new Java(this); + helperTask.setFork(true); + helperTask.setClassname("org.apache.tools.ant.taskdefs.optional.ejb.EjbcHelper"); + String args = ""; + args += " " + descriptorDirectory; + args += " " + generatedFilesDirectory; + args += " " + sourceDirectory; + args += " " + generatedManifestFile; + args += " " + keepgenerated; + + for (int i = 0; i < files.length; ++i) { + args += " " + files[i]; + } + + Commandline.Argument arguments = helperTask.createArg(); + arguments.setLine(args); + helperTask.setClasspath(new Path(getProject(), execClassPath)); + if (helperTask.executeJava() != 0) { + throw new BuildException("Execution of ejbc helper failed"); + } + } + + /** + * get the keep generated attribute. + * @return the attribute. + */ + public boolean getKeepgenerated() { + return keepgenerated; + } + + /** + * Set the directory from where the serialized deployment descriptors are + * to be read. + * + * @param dirName the name of the directory containing the serialised deployment descriptors. + */ + public void setDescriptors(String dirName) { + descriptorDirectory = new File(dirName); + } + + /** + * Set the directory into which the support classes, RMI stubs, etc are to be written. + * + * @param dirName the name of the directory into which code is generated + */ + public void setDest(String dirName) { + generatedFilesDirectory = new File(dirName); + } + + /** + * If true, ejbc will keep the + * intermediate Java files used to build the class files. + * This can be useful when debugging. + * @param newKeepgenerated a boolean as a string. + */ + public void setKeepgenerated(String newKeepgenerated) { + keepgenerated = Boolean.valueOf(newKeepgenerated.trim()).booleanValue(); + + } + + /** + * Set the name of the generated manifest file. + * + * For each EJB that is processed an entry is created in this file. This can then be used + * to create a jar file for dploying the beans. + * + * @param manifestFilename the name of the manifest file to be generated. + */ + public void setManifest(String manifestFilename) { + generatedManifestFile = new File(manifestFilename); + } + + /** + * Set the classpath to be used for this compilation. + * @param s the classpath (as a string) to use. + */ + public void setClasspath(String s) { + this.classpath = FileUtils.translatePath(s); + } + + /** + * Set the directory containing the source code for the home interface, remote interface + * and public key class definitions. + * + * @param dirName the directory containg the source tree for the EJB's interface classes. + */ + public void setSrc(String dirName) { + sourceDirectory = new File(dirName); + } +} Added: ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java?rev=567734&view=auto ============================================================================== --- ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java (added) +++ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java Mon Aug 20 08:57:39 2007 @@ -0,0 +1,259 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.PrintWriter; +import java.util.Vector; +import javax.ejb.deployment.DeploymentDescriptor; +import javax.ejb.deployment.EntityDescriptor; + + +/** + * 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. + * + */ +public final class EjbcHelper { + /** + * The root directory of the tree containing the serialised deployment desciptors. + */ + private File descriptorDirectory; + + /** + * The directory where generated files are placed. + */ + private File generatedFilesDirectory; + + /** + * The name of the manifest file generated for the EJB jar. + */ + private File manifestFile; + + /** + * The source directory for the home and remote interfaces. This is used to determine if + * the generated deployment classes are out of date. + */ + private File sourceDirectory; + + // CheckStyle:VisibilityModifier OFF - bc + /** + * The names of the serialised deployment descriptors + */ + String[] descriptors; + // CheckStyle:VisibilityModifier ON + + private boolean keepGenerated; + + /** + * Command line interface for the ejbc helper task. + * @param args command line arguments. + * @throws Exception if there is a problem. + */ + public static void main(String[] args) throws Exception { + EjbcHelper helper = new EjbcHelper(args); + helper.process(); + } + + /** + * Initialise the EjbcHelper by reading the command arguments. + */ + private EjbcHelper(String[] args) { + 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++]; + } + } + + private String[] getCommandLine(boolean debug, 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; + } + + /** + * 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. + * + * @param descriptorFile the serialised deployment descriptor + * + * @return true if the support classes need to be regenerated. + * + * @throws IOException if the descriptor file cannot be closed. + */ + private boolean isRegenRequired(File descriptorFile) throws IOException { + // 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; + } + + /** + * Process the descriptors in turn generating support classes for each and a manifest + * file for all of the beans. + */ + private void process() throws Exception { + 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(); + } + + /** + * 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. + */ + private void regenerateSupportClasses(File descriptorFile) throws Exception { + // 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); + } + } +} Added: ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java?rev=567734&view=auto ============================================================================== --- ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java (added) +++ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java Mon Aug 20 08:57:39 2007 @@ -0,0 +1,421 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + + +import java.io.File; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.Java; +import org.apache.tools.ant.types.Path; + +/** + * Starts a WebLogic server. + * A number of parameters are used to control the operation of the weblogic + * instance. Note that the task, and hence ant, will not complete until the + * weblogic instance is stopped.</p> + * + */ +public class WLRun extends Task { + protected static final String DEFAULT_WL51_POLICY_FILE = "weblogic.policy"; + protected static final String DEFAULT_WL60_POLICY_FILE = "lib/weblogic.policy"; + protected static final String DEFAULT_PROPERTIES_FILE = "weblogic.properties"; + + /** + * The classpath to be used when running the Java VM. It must contain the + * weblogic classes <b>and</b> the implementation classes of the home and + * remote interfaces. + */ + private Path classpath; + + /** + * The weblogic classpath to the be used when running weblogic. + */ + private Path weblogicClasspath; + + private String weblogicMainClass = "weblogic.Server"; + + /** + * Addional arguments to pass to the JVM used to run weblogic + */ + private String additionalArgs = ""; + + /** + * The security policy to use when running the weblogic server + */ + private String securityPolicy; + + /** + * The weblogic system home directory + */ + private File weblogicSystemHome; + + /** + * The weblogic domain + */ + private String weblogicDomainName; + + /** + * The name of the weblogic server - used to select the server's directory in the + * weblogic home directory. + */ + private String weblogicSystemName = "myserver"; + + /** + * The file containing the weblogic properties for this server. + */ + private String weblogicPropertiesFile = null; + + /** + * additional args to pass to the spawned jvm + */ + private String additionalJvmArgs = ""; + + /** + * The location of the BEA Home under which this server is run. + * WL6 only + */ + private File beaHome = null; + + /** + * The management username + */ + private String managementUsername = "system"; + + /** + * The management password + */ + private String managementPassword = null; + + /** + * The provate key password - used for SSL + */ + private String pkPassword = null; + + /** + * Add the classpath for the user classes + * @return a path to be configured + */ + public Path createClasspath() { + if (classpath == null) { + classpath = new Path(getProject()); + } + return classpath.createPath(); + } + + /** + * Get the classpath to the weblogic classpaths + * @return a path to be configured + */ + public Path createWLClasspath() { + if (weblogicClasspath == null) { + weblogicClasspath = new Path(getProject()); + } + return weblogicClasspath.createPath(); + } + + /** + * Do the work. + * + * The work is actually done by creating a separate JVM to run a helper task. + * This approach allows the classpath of the helper task to be set. Since the + * weblogic tools require the class files of the project's home and remote + * interfaces to be available in the classpath, this also avoids having to + * start ant with the class path of the project it is building. + * + * @exception BuildException if someting goes wrong with the build + */ + public void execute() throws BuildException { + if (weblogicSystemHome == null) { + throw new BuildException("weblogic home must be set"); + } + if (!weblogicSystemHome.isDirectory()) { + throw new BuildException("weblogic home directory " + + weblogicSystemHome.getPath() + " is not valid"); + } + + if (beaHome != null) { + executeWLS6(); + } else { + executeWLS(); + } + } + + private File findSecurityPolicyFile(String defaultSecurityPolicy) { + String securityPolicy = this.securityPolicy; + if (securityPolicy == null) { + securityPolicy = defaultSecurityPolicy; + } + File securityPolicyFile = new File(weblogicSystemHome, securityPolicy); + // If an explicit securityPolicy file was specified, it maybe an + // absolute path. Use the project to resolve it. + if (this.securityPolicy != null && !securityPolicyFile.exists()) { + securityPolicyFile = getProject().resolveFile(securityPolicy); + } + // If we still can't find it, complain + if (!securityPolicyFile.exists()) { + throw new BuildException("Security policy " + securityPolicy + + " was not found."); + } + return securityPolicyFile; + } + + private void executeWLS6() { + File securityPolicyFile + = findSecurityPolicyFile(DEFAULT_WL60_POLICY_FILE); + if (!beaHome.isDirectory()) { + throw new BuildException("BEA home " + beaHome.getPath() + + " is not valid"); + } + + File configFile = new File(weblogicSystemHome, "config/" + + weblogicDomainName + "/config.xml"); + if (!configFile.exists()) { + throw new BuildException("Server config file " + configFile + + " not found."); + } + + if (managementPassword == null) { + throw new BuildException("You must supply a management password " + + "to start the server"); + } + + Java weblogicServer = new Java(this); + weblogicServer.setTaskName(getTaskName()); + weblogicServer.setFork(true); + weblogicServer.setDir(weblogicSystemHome); + weblogicServer.setClassname(weblogicMainClass); + + String jvmArgs = additionalJvmArgs; + + jvmArgs += " -Dweblogic.Domain=" + weblogicDomainName; + jvmArgs += " -Dweblogic.Name=" + weblogicSystemName; + jvmArgs += " -Dweblogic.system.home=" + weblogicSystemHome; + + jvmArgs += " -Dbea.home=" + beaHome; + jvmArgs += " -Djava.security.policy==" + securityPolicyFile; + + jvmArgs += " -Dweblogic.management.username=" + managementUsername; + jvmArgs += " -Dweblogic.management.password=" + managementPassword; + if (pkPassword != null) { + jvmArgs += " -Dweblogic.pkpassword=" + pkPassword; + } + + + weblogicServer.createJvmarg().setLine(jvmArgs); + weblogicServer.createArg().setLine(additionalArgs); + + if (classpath != null) { + weblogicServer.setClasspath(classpath); + } + + if (weblogicServer.executeJava() != 0) { + throw new BuildException("Execution of weblogic server failed"); + } + } + + private void executeWLS() { + File securityPolicyFile + = findSecurityPolicyFile(DEFAULT_WL51_POLICY_FILE); + File propertiesFile = null; + + + if (weblogicPropertiesFile == null) { + weblogicPropertiesFile = DEFAULT_PROPERTIES_FILE; + } + propertiesFile = new File(weblogicSystemHome, weblogicPropertiesFile); + if (!propertiesFile.exists()) { + // OK, properties file may be absolute + propertiesFile = getProject().resolveFile(weblogicPropertiesFile); + if (!propertiesFile.exists()) { + throw new BuildException("Properties file " + + weblogicPropertiesFile + + " not found in weblogic home " + weblogicSystemHome + + " or as absolute file"); + } + } + + Java weblogicServer = new Java(this); + weblogicServer.setFork(true); + weblogicServer.setClassname(weblogicMainClass); + + String jvmArgs = additionalJvmArgs; + + if (weblogicClasspath != null) { + jvmArgs += " -Dweblogic.class.path=" + weblogicClasspath; + } + + jvmArgs += " -Djava.security.manager -Djava.security.policy==" + securityPolicyFile; + jvmArgs += " -Dweblogic.system.home=" + weblogicSystemHome; + jvmArgs += " -Dweblogic.system.name=" + weblogicSystemName; + jvmArgs += " -Dweblogic.system.propertiesFile=" + weblogicPropertiesFile; + + weblogicServer.createJvmarg().setLine(jvmArgs); + weblogicServer.createArg().setLine(additionalArgs); + + if (classpath != null) { + weblogicServer.setClasspath(classpath); + } + if (weblogicServer.executeJava() != 0) { + throw new BuildException("Execution of weblogic server failed"); + } + } + + + /** + * The classpath to be used with the Java Virtual Machine that runs the Weblogic + * Server; required. Prior to Weblogic 6.0, this is typically set to the Weblogic + * boot classpath. Under Weblogic 6.0 this should include all the + * weblogic jars + * + * @param classpath the classpath to use when executing the weblogic server. + */ + public void setClasspath(Path classpath) { + this.classpath = classpath; + } + + /** + * Set the weblogic classpath used by the Weblogic Server; + * optional, and only applicable to WL4.5.1 + * + * The weblogic classpath is used by weblogic to support dynamic class loading. + * + * @param weblogicClasspath the weblogic classpath + */ + public void setWlclasspath(Path weblogicClasspath) { + this.weblogicClasspath = weblogicClasspath; + } + + /** + * The name of the security policy file within the weblogic home directory that + * is to be used. If not specified, the default policy file <code>weblogic.policy</code> + * is used. + * + * @param securityPolicy the security policy to use. + */ + public void setPolicy(String securityPolicy) { + this.securityPolicy = securityPolicy; + } + + /** + * The location where weblogic lives. + * Required. This is the absolute location, not relative to + * BEA home. + * @param weblogicHome the home directory of weblogic. + * + */ + public void setHome(File weblogicHome) { + weblogicSystemHome = weblogicHome; + } + + /** + * The location of the BEA Home; implicitly + * selects Weblogic 6.0; optional. + * + * @param beaHome the BEA Home directory. + * + */ + public void setBEAHome(File beaHome) { + this.beaHome = beaHome; + } + + /** + * The name of the weblogic server within the weblogic home which is to be run. + * Optiona, defaults to "myserver" + * + * @param serverName the name of the server. + */ + public void setName(String serverName) { + this.weblogicSystemName = serverName; + } + + /** + * Set the Domain to run in; required for WL6.0 + * + * @param domain the domain + */ + public void setDomain(String domain) { + this.weblogicDomainName = domain; + } + + /** + * The name of the server's properties file within the weblogic home directory + * used to control the weblogic instance; + * required for WL4.5.1 + * + * + * @param propertiesFilename the properties file name + */ + public void setProperties(String propertiesFilename) { + this.weblogicPropertiesFile = propertiesFilename; + } + + /** + * Set the additional arguments to pass to the weblogic JVM + * @param args the arguments to be passed to the JVM + */ + public void setJvmargs(String args) { + this.additionalJvmArgs = args; + } + + /** + * Set the management username to run the server; + * optional and only applicable to WL6.0. + * + * @param username the management username of the server. + */ + public void setUsername(String username) { + this.managementUsername = username; + } + + + /** + * Set the management password of the server; + * optional and only applicable to WL6.0. + * @param password the management pasword of the server. + */ + public void setPassword(String password) { + this.managementPassword = password; + } + + /** + * Set the private key password so the server can decrypt the SSL private key file; + * optional and only applicable to WL6.0. + * @param pkpassword the private key password, + */ + public void setPKPassword(String pkpassword) { + this.pkPassword = pkpassword; + } + + /** + * Additional argument string passed to the Weblogic instance; + * optional. + * @param args the argument string + */ + public void setArgs(String args) { + additionalArgs = args; + } + + /** + * name of the main class for weblogic; optional. + * @param c the name of the class + */ + public void setWeblogicMainClass(String c) { + weblogicMainClass = c; + } +} Added: ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLStop.java URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLStop.java?rev=567734&view=auto ============================================================================== --- ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLStop.java (added) +++ ant/sandbox/antlibs/weblogic/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLStop.java Mon Aug 20 08:57:39 2007 @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + + +import java.io.File; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.Java; +import org.apache.tools.ant.types.Path; + +/** + * Shuts down a WebLogic server. + * To shut down an instance you must supply both a username and + * a password. + * + */ +public class WLStop extends Task { + /** + * The classpath to be used. It must contains the weblogic.Admin class. + */ + private Path classpath; + + /** + * The weblogic username to use to request the shutdown. + */ + private String username; + + /** + * The password to use to shutdown the weblogic server. + */ + private String password; + + /** + * The URL which the weblogic server is listening on. + */ + private String serverURL; + + /** + * The delay (in seconds) to wait before shutting down. + */ + private int delay = 0; + + /** + * The location of the BEA Home under which this server is run. + * WL6 only + */ + private File beaHome = null; + + /** + * Do the work. + * + * The work is actually done by creating a separate JVM to run the weblogic admin task + * This approach allows the classpath of the helper task to be set. + * + * @exception BuildException if someting goes wrong with the build + */ + public void execute() throws BuildException { + if (username == null || password == null) { + throw new BuildException("weblogic username and password must both be set"); + } + + if (serverURL == null) { + throw new BuildException("The url of the weblogic server must be provided."); + } + + Java weblogicAdmin = new Java(this); + weblogicAdmin.setFork(true); + weblogicAdmin.setClassname("weblogic.Admin"); + String args; + + if (beaHome == null) { + args = serverURL + " SHUTDOWN " + username + " " + password + " " + delay; + } else { + args = " -url " + serverURL + + " -username " + username + + " -password " + password + + " SHUTDOWN " + " " + delay; + } + + weblogicAdmin.createArg().setLine(args); + weblogicAdmin.setClasspath(classpath); + weblogicAdmin.execute(); + } + + /** + * The classpath to be used with the Java Virtual Machine that runs the Weblogic + * Shutdown command; + * + * @param path the classpath to use when executing the weblogic admin task. + */ + public void setClasspath(Path path) { + this.classpath = path; + } + + /** + * The classpath to be used with the Java Virtual Machine that runs the Weblogic + * Shutdown command; + * @return the path to be configured. + */ + public Path createClasspath() { + if (classpath == null) { + classpath = new Path(getProject()); + } + return classpath.createPath(); + } + + /** + * The username of the account which will be used to shutdown the server; + * required. + * + * @param s the username. + */ + public void setUser(String s) { + this.username = s; + } + + /** + * The password for the account specified in the + * user parameter; required + * + * @param s the password. + */ + public void setPassword(String s) { + this.password = s; + } + + /** + * Set the URL to which the weblogic server is listening + * for T3 connections; required. + * + * @param s the url. + */ + public void setUrl(String s) { + this.serverURL = s; + } + + + /** + * Set the delay (in seconds) before shutting down the server; + * optional. + * + * @param s the selay. + */ + public void setDelay(String s) { + delay = Integer.parseInt(s); + } + + /** + * The location of the BEA Home; implicitly + * selects Weblogic 6.0 shutdown; optional. + * + * @param beaHome the BEA Home directory. + * + */ + public void setBEAHome(File beaHome) { + this.beaHome = beaHome; + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]