You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cactus-dev@jakarta.apache.org by pt...@apache.org on 2008/06/09 10:50:31 UTC

svn commit: r664662 - /jakarta/cactus/trunk/integration/maven2/src/main/java/org/apache/cactus/maven2/mojos/CactifyEarMojo.java

Author: ptahchiev
Date: Mon Jun  9 01:50:31 2008
New Revision: 664662

URL: http://svn.apache.org/viewvc?rev=664662&view=rev
Log:
Added the cactifyEarMojo modifications - it is still not working and we need to improve it a lot.

Modified:
    jakarta/cactus/trunk/integration/maven2/src/main/java/org/apache/cactus/maven2/mojos/CactifyEarMojo.java

Modified: jakarta/cactus/trunk/integration/maven2/src/main/java/org/apache/cactus/maven2/mojos/CactifyEarMojo.java
URL: http://svn.apache.org/viewvc/jakarta/cactus/trunk/integration/maven2/src/main/java/org/apache/cactus/maven2/mojos/CactifyEarMojo.java?rev=664662&r1=664661&r2=664662&view=diff
==============================================================================
--- jakarta/cactus/trunk/integration/maven2/src/main/java/org/apache/cactus/maven2/mojos/CactifyEarMojo.java (original)
+++ jakarta/cactus/trunk/integration/maven2/src/main/java/org/apache/cactus/maven2/mojos/CactifyEarMojo.java Mon Jun  9 01:50:31 2008
@@ -20,9 +20,35 @@
  */
 package org.apache.cactus.maven2.mojos;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.apache.cactus.integration.ant.CactusWar;
+import org.apache.cactus.integration.api.version.Version;
+import org.apache.maven.archiver.MavenArchiveConfiguration;
+import org.apache.maven.archiver.MavenArchiver;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.cargo.module.application.ApplicationXml;
+import org.codehaus.cargo.module.application.ApplicationXmlIo;
+import org.codehaus.cargo.module.application.DefaultEarArchive;
+import org.codehaus.cargo.module.application.EarArchive;
+import org.codehaus.cargo.module.ejb.EjbArchive;
+import org.codehaus.cargo.module.ejb.EjbJarXml;
+import org.codehaus.cargo.module.ejb.Entity;
+import org.codehaus.cargo.module.ejb.Session;
+import org.codehaus.cargo.module.webapp.EjbRef;
+import org.codehaus.plexus.archiver.ArchiverException;
+import org.codehaus.plexus.archiver.ear.EarArchiver;
+import org.codehaus.plexus.archiver.jar.ManifestException;
+import org.codehaus.plexus.util.FileUtils;
+
+import org.jdom.JDOMException;
 /**
  * A maven2 mojo that injects elements necessary to run Cactus tests into an
  * existing EAR file.
@@ -33,9 +59,340 @@
  */
 public class CactifyEarMojo extends AbstractMojo
 {
+    /**
+     * Cactus war configuration holder.
+     */
+    private CactusWar cactusWar;
+    
+    /**
+     * The archive that contains the web-app that should be cactified.
+     */
+    private File srcFile;
 
+    /**
+     * Indicates whether or not we should add ejb references to local ejbs
+     * in the deployment descriptor.
+     */
+    private boolean addEjbReferences;
+    
+    /**
+     * The Ear archiver.
+     *
+     * @parameter expression="${component.org.codehaus.plexus.archiver.Archiver#ear}"
+     * @required
+     */
+    private EarArchiver earArchiver;
+    
+    /**
+     * The maven archive configuration to use.
+     *
+     * @parameter
+     */
+    private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+    
+    /**
+     * The maven project.
+     *
+     * @parameter expression="${project}"
+     * @required
+     * @readonly
+     */
+    private MavenProject project;
+    
+    /**
+     * The "main" method of the mojo.
+     * @throws MojoExecutionException in case an error occurs.
+     * @throws MojoFailureException in case a failure occurs.
+     */
 	public void execute() throws MojoExecutionException, MojoFailureException 
 	{
+        if (cactusWar == null)
+        {
+            cactusWar = createCactusWarConfig();
+        }
+        
+        MavenArchiver archiver = new MavenArchiver();
+        archiver.setArchiver(earArchiver);
+        
+        //Add everything that's in the source EAR to the destination EAR
+        File tempLocation = null;
+        
+        tempLocation = FileUtils.createTempFile("cactus", "explode.tmp.dir",
+                getProject().getBasedir());
+        tempLocation.mkdirs();
+        tempLocation.deleteOnExit();
+        
+        //ZipFileSet currentFiles = new ZipFileSet();
+        //currentFiles.setSrc(this.srcFile);
+        //currentFiles.createExclude().setName("META-INF/application.xml");
+        //addZipfileset(currentFiles);
+        
+        // cactify the application.xml
+        ApplicationXml appXml = null;
+        try 
+        {
+            appXml = getOriginalApplicationXml();
+        } 
+        catch (JDOMException e) 
+        {
+            throw new MojoExecutionException("Unable to get the "
+               + "original application.xml", e);
+        }
+        
+        File tmpAppXml = cactifyApplicationXml(appXml);
+        
+        try 
+        {
+            earArchiver.addDirectory(tempLocation);
+            earArchiver.setAppxml(tmpAppXml);
+            archiver.createArchive(getProject(), getArchive());
+    
+            
+            // create the cactus war
+            File cactusWarFile = createCactusWar();
+            addFileToEar(cactusWarFile, cactusWar.getFileName());
+        }
+        catch(ArchiverException aex)
+        {
+            throw new MojoExecutionException("Error while performing the "
+                    + "cactified archive.", aex);
+        } 
+        catch (ManifestException me) 
+        {
+            throw new MojoExecutionException("Error reading the manifest "
+                   + "data in the original file.", me);
+        } 
+        catch (IOException ioe) 
+        {
+            throw new MojoExecutionException("Input/output exception occured ",
+                    ioe);
+        }
+        catch (DependencyResolutionRequiredException de) 
+        {
+            throw new MojoExecutionException("Problem with resolving the"
+                    + " dependencies of the project. ", de);
+        }
+        
+        //super.execute();
 	}
+    
+    /**
+     * A helper method to create a temporary file.
+     * @return the cactus.war
+     * @throws MojoExecutionException in case a runtime error occurs.
+     */
+    private File createCactusWar() throws MojoExecutionException
+    {
+        File tmpCactusWar = FileUtils.createTempFile("cactus", "cactus.war",
+                                                     getProject().getBasedir());
+        tmpCactusWar.deleteOnExit();
+        cactusWar.setDestFile(tmpCactusWar);
+        
+        if (addEjbReferences)
+        {
+            try 
+            {
+                addEjbReferencesToWar(tmpCactusWar);
+            } 
+            catch (JDOMException e) 
+            {
+                throw new MojoExecutionException(
+                        "Unable to add ejb-references", e);
+            }
+        }
+        
+        cactusWar.execute();
+        
+        return tmpCactusWar;
+    }
+    
+    /**
+     * 
+     * @param theAppXml the application.xml to cactify
+     * @return the cactified application.xml
+     * @throws MojoExecutionException 
+     */
+    private File cactifyApplicationXml(ApplicationXml theAppXml) 
+                                            throws MojoExecutionException
+    {
+        theAppXml.addWebModule(cactusWar.getFileName(), cactusWar.getContext());
+        // serialize the cactified app xml
+        //FileUtils fileUtils = FileUtils.newFileUtils();
+        File tmpAppXml = FileUtils.createTempFile("cactus", "application.xml",
+                                                  getProject().getBasedir());
+        tmpAppXml.deleteOnExit();
+        try
+        {
+            ApplicationXmlIo.writeApplicationXml(theAppXml, 
+                                                 tmpAppXml, 
+                                                 null, true);
+        }
+        catch (IOException ioe)
+        {
+            throw new MojoExecutionException(
+                "Could not write temporary deployment descriptor", ioe);
+        }
+        return tmpAppXml;
+    }
+    
+    /**
+     * 
+     * @return the application.xml from the source ear
+     * @throws JDOMException in case a JDOM exception is thrown
+     * @throws MojoExecutionException 
+     */
+    private ApplicationXml getOriginalApplicationXml() 
+                            throws JDOMException, MojoExecutionException
+    {
+        ApplicationXml appXml = null;
+        try
+        {
+            EarArchive ear = new DefaultEarArchive(
+                new FileInputStream(this.srcFile));
+            appXml = ear.getApplicationXml();
+            if (appXml == null)
+            {
+                throw new MojoExecutionException("The EAR source file does not "
+                    + "contain a META-INF/application.xml " 
+                    + "deployment descriptor");
+            }
+        }
+        catch (IOException e)
+        {
+            throw new MojoExecutionException("Failed to open EAR", e);
+        }
+        
+        return appXml;
+    }
+
+    /**
+     * 
+     * @param theFile the file to add
+     * @param theFullPath the path within the ear
+     * @throws ArchiverException in case the adding is impossible.
+     */
+    private void addFileToEar(File theFile, String theFullPath) 
+                                                    throws ArchiverException
+    {
+        earArchiver.addFile(theFile, theFullPath);
+    }
+    
+    /**
+     * Add ejb references.
+     * 
+     * @param theWar temporary cactus war
+     * @throws JDOMException in case a parse exception is thrown 
+     * @throws MojoExecutionException in case any other error occurs.
+     */
+    private void addEjbReferencesToWar(File theWar) 
+                    throws JDOMException, MojoExecutionException 
+    {
+        try
+        {
+            EarArchive ear = new DefaultEarArchive(
+                new FileInputStream(srcFile));
+            ApplicationXml appXml = ear.getApplicationXml();
+            Iterator ejbModules = appXml.getEjbModules();
+            while (ejbModules.hasNext())
+            {
+                String module = (String) ejbModules.next();
+                EjbArchive ejbArchive = ear.getEjbModule(module);
+                EjbJarXml descr = ejbArchive.getEjbJarXml();
+                Iterator vendorDescrIterator = descr.getVendorDescriptors();
+                if (vendorDescrIterator == null 
+                    || !vendorDescrIterator.hasNext())
+                {
+                    throw new MojoExecutionException("Failed to find vendor " 
+                                             + "deployment descriptor " 
+                                             + "for ejb jar " + module);
+                }
+                
+                Iterator ejbs = descr.getSessionEjbs();
+                while (ejbs.hasNext())
+                {
+                    Session ejb = (Session) ejbs.next();
+                    String name = ejb.getName();
+                    String local = ejb.getLocal();
+                    String localHome = ejb.getLocalHome();
+                    if (local != null)
+                    {
+                        getLog().debug("Adding ejb-ref for local session ejb "
+                            + ejb.getName());
+                        EjbRef ref = new EjbRef();
+                        ref.setType("Session");
+                        ref.setEjbName(name);
+                        ref.setName("ejb/" + name);
+                        ref.setEjbInterface(local);
+                        ref.setEjbHomeInterface(localHome);
+                        ref.setLocal(true);
+                        
+                        cactusWar.addConfiguredEjbref(ref);
+                    }
+                }
+                ejbs = descr.getEntityEjbs();
+                while (ejbs.hasNext())
+                {
+                    Entity ejb = (Entity) ejbs.next();
+                    String name = ejb.getName();
+                    String local = ejb.getLocal();
+                    String localHome = ejb.getLocalHome();
+                    if (local != null)
+                    {
+                        getLog().debug("Adding ejb-ref for local entity ejb "
+                            + ejb.getName());
+                        EjbRef ref = new EjbRef();
+                        ref.setType("Entity");
+                        ref.setEjbName(name);
+                        ref.setName("ejb/" + name);
+                        ref.setEjbInterface(local);
+                        ref.setEjbHomeInterface(localHome);
+                        ref.setLocal(true);
+                        
+                        cactusWar.addConfiguredEjbref(ref);
+                    }
+                }
+            }
+        }
+        catch (IOException e)
+        {
+            throw new MojoExecutionException("Could not merge deployment " 
+                                     + "descriptors", e);
+        }
+    }
+    
+    /**
+     * Initialize cactusWar with some default values.
+     *
+     * @return the CactusWar configuration
+     */
+    private CactusWar createCactusWarConfig()
+    {
+        CactusWar cactusWarConfig = new CactusWar();
+        Version version = new Version();
+        version.setValue("2.3");
+        cactusWarConfig.setVersion(version);
+        cactusWarConfig.setContext("/cactus");
+        cactusWarConfig.setProject(getProject());
+        
+        return cactusWarConfig;
+    }
+    
+    /**
+     * Getter method for the MavenProject.
+     * @return the MavenProject
+     */
+    public MavenProject getProject()
+    {
+        return project;
+    }
+    
+    /**
+     * Getter method for the MavenArchiveConfiguration.
+     * @return the MavenArchiveConfiguration
+     */
+    public MavenArchiveConfiguration getArchive()
+    {
+        return archive;
+    }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: cactus-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: cactus-dev-help@jakarta.apache.org