com.idega.maven.webapp.IdegaWebWarMojo2.java Source code

Java tutorial

Introduction

Here is the source code for com.idega.maven.webapp.IdegaWebWarMojo2.java

Source

package com.idega.maven.webapp;

/*
 * Copyright 2001-2005 The Apache Software Foundation.
 *
 * Licensed 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.
 */

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.FileUtils;

import com.idega.util.WebXmlMerger;

/**
 * Build the necessary things up in an idegaweb webapp
 *
 * @author <a href="evenisse@apache.org">Emmanuel Venisse</a>
 * @version $Id: IdegaWebWarMojo2.java,v 1.1 2006/06/08 22:49:20 tryggvil Exp $
 * @goal war2
 * @phase package
 * @requiresDependencyResolution runtime
 */
public class IdegaWebWarMojo2 extends AbstractWarMojo {
    public static final String WEB_INF = "WEB-INF";

    /**
     * Copies webapp resources from the specified directory.
     * <p/>
     * Note that the <tt>webXml</tt> parameter could be null and may
     * specify a file which is not named <tt>web.xml<tt>. If the file
     * exists, it will be copied to the <tt>META-INF</tt> directory and
     * renamed accordingly.
     *
     * @param sourceDirectory the source directory
     * @param webappDirectory the target directory
     * @param webXml          the path to a custom web.xml
     * @throws IOException if an error occured while copying resources
     */
    public void copyResources(File sourceDirectory, File webappDirectory, String webXml) throws IOException {
        if (!sourceDirectory.equals(webappDirectory)) {
            getLog().info("Copy webapp resources to " + webappDirectory.getAbsolutePath());

            if (getWarSourceDirectory().exists()) {
                String[] fileNames = getWarFiles(sourceDirectory);
                for (int i = 0; i < fileNames.length; i++) {
                    FileUtils.copyFile(new File(sourceDirectory, fileNames[i]),
                            new File(webappDirectory, fileNames[i]));
                }
            }

            if (webXml != null && !"".equals(webXml)) {
                //rename to web.xml
                File webinfDir = new File(webappDirectory, WEB_INF);
                FileUtils.copyFile(new File(webXml), new File(webinfDir, "/web.xml"));
            }
        }
    }

    public void execute() throws MojoExecutionException {
        exctactResourcesFromJars();

        compileDependencyList();

        mergeWebInf();

    }

    private void compileDependencyList() {

        //File libDirectory = new File( webappDirectory, WEB_INF + "/lib" );
        //File tldDirectory = new File( webappDirectory, WEB_INF + "/tld" );
        //File webappClassesDirectory = new File( webappDirectory, WEB_INF + "/classes" );

        MavenProject project = getProject();
        if (project != null) {

            Set artifacts = project.getArtifacts();

            for (Iterator iter = artifacts.iterator(); iter.hasNext();) {
                Artifact artifact = (Artifact) iter.next();

                // TODO: utilise appropriate methods from project builder
                // TODO: scope handler
                // Include runtime and compile time libraries
                if (!Artifact.SCOPE_PROVIDED.equals(artifact.getScope())
                        && !Artifact.SCOPE_TEST.equals(artifact.getScope())) {
                    String type = artifact.getType();
                    if ("tld".equals(type)) {
                        //FileUtils.copyFileToDirectory( artifact.getFile(), tldDirectory );
                        getLog().debug("Getting artifact " + artifact.getArtifactId() + " of type " + type
                                + " for WEB-INF/lib");
                    } else if ("jar".equals(type) || "ejb".equals(type) || "ejb-client".equals(type)) {
                        //FileUtils.copyFileToDirectory( artifact.getFile(), libDirectory );
                        getLog().debug("Getting artifact " + artifact.getArtifactId() + " of type " + type
                                + " for WEB-INF/lib");
                    } else {
                        getLog().debug("Skipping artifact of type " + type + " for WEB-INF/lib");
                    }
                }

            }
        } else {
            getLog().debug("compileDependencyList() project is null");
        }
    }

    private void mergeWebInf() {
        // TODO Auto-generated method stub
        WebXmlMerger merger = new WebXmlMerger();
        merger.setBundlesFolder(getAndCreatePrivateBundlesDir());
        merger.setOutputFile(getWebXmlFile());
        merger.process();
    }

    private void exctactResourcesFromJars() {
        File libDir = getLibDirectory();
        File[] jarfiles = libDir.listFiles();
        for (int i = 0; i < jarfiles.length; i++) {
            File fJarFile = jarfiles[i];
            try {
                JarFile jarFile = new JarFile(fJarFile);
                Enumeration entries = jarFile.entries();
                while (entries.hasMoreElements()) {
                    JarEntry entry = (JarEntry) entries.nextElement();
                    String name = entry.getName();
                    if (name.startsWith("properties") || name.startsWith("jsp") || name.startsWith("WEB-INF")
                            || name.startsWith("resources")) {
                        File file = null;
                        if (name.startsWith("properties") || name.startsWith("jsp") || name.startsWith("WEB-INF")) {
                            file = new File(getAndCreatePrivateBundleDir(fJarFile), name);
                        } else if (name.startsWith("resources")) {
                            file = new File(getAndCreatePublicBundleDir(fJarFile), name);
                        }
                        if (entry.isDirectory()) {
                            file.mkdirs();
                        } else {
                            file.createNewFile();
                            InputStream inStream = jarFile.getInputStream(entry);
                            FileOutputStream outStream = new FileOutputStream(file);
                            int bufferlen = 1000;
                            byte[] buf = new byte[bufferlen];
                            int noRead = inStream.read(buf);
                            while (noRead != -1) {
                                outStream.write(buf);
                                noRead = inStream.read(buf);
                            }
                            outStream.close();
                            inStream.close();

                        }
                    }
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

    private File getWebInfDirectory() {
        File libDirectory = new File(getWebappDirectory(), WEB_INF);
        return libDirectory;
    }

    private File getWebXmlFile() {
        File file = new File(getWebInfDirectory(), "web.xml");
        return file;
    }

    private File getLibDirectory() {
        File libDirectory = new File(getWebInfDirectory(), "lib");
        return libDirectory;
    }

    private File getAndCreatePublicIdegawebDir() {
        File idegawebDir = new File(getWebappDirectory(), "idegaweb");
        if (!idegawebDir.exists()) {
            idegawebDir.mkdir();
        }
        return idegawebDir;
    }

    private File getAndCreatePrivateIdegawebDir() {
        File idegawebDir = new File(getWebInfDirectory(), "idegaweb");
        if (!idegawebDir.exists()) {
            idegawebDir.mkdir();
        }
        return idegawebDir;
    }

    private File getAndCreatePublicBundlesDir() {
        File bundlesDir = new File(getAndCreatePublicIdegawebDir(), "bundles");
        if (!bundlesDir.exists()) {
            bundlesDir.mkdir();
        }
        return bundlesDir;
    }

    private File getAndCreatePrivateBundlesDir() {
        File bundlesDir = new File(getAndCreatePrivateIdegawebDir(), "bundles");
        if (!bundlesDir.exists()) {
            bundlesDir.mkdir();
        }
        return bundlesDir;
    }

    private File getAndCreatePublicBundleDir(File bundleJar) {
        String bundleFolderName = getBundleFolderName(bundleJar);
        File bundlesDir = new File(getAndCreatePublicBundlesDir(), bundleFolderName);
        if (!bundlesDir.exists()) {
            bundlesDir.mkdir();
            getLog().info("Extracting to bundle folder: " + bundlesDir.toURI());
        }
        return bundlesDir;
    }

    private File getAndCreatePrivateBundleDir(File bundleJar) {
        String bundleFolderName = getBundleFolderName(bundleJar);
        File bundlesDir = new File(getAndCreatePrivateBundlesDir(), bundleFolderName);
        if (!bundlesDir.exists()) {
            bundlesDir.mkdir();
            getLog().info("Extracting to bundle folder: " + bundlesDir.toURI());
        }
        return bundlesDir;
    }

    private String getBundleFolderName(File bundleJarFile) {
        String jarName = bundleJarFile.getName();
        String bundleIdentifier = jarName.substring(0, jarName.indexOf("-"));
        String bundleFolderName = bundleIdentifier + ".bundle";
        return bundleFolderName;
    }

    /**
     * Returns the default exclude tokens.
     *
     * @return a list of <code>String</code> tokens
     * @todo copied again. Next person to touch it puts it in the right place! :)
     */
    public List getDefaultExcludes() {
        List defaultExcludes = new ArrayList();
        defaultExcludes.add("**/*~");
        defaultExcludes.add("**/#*#");
        defaultExcludes.add("**/.#*");
        defaultExcludes.add("**/%*%");
        defaultExcludes.add("**/._*");

        // CVS
        defaultExcludes.add("**/CVS");
        defaultExcludes.add("**/CVS/**");
        defaultExcludes.add("**/.cvsignore");

        // SCCS
        defaultExcludes.add("**/SCCS");
        defaultExcludes.add("**/SCCS/**");

        // Visual SourceSafe
        defaultExcludes.add("**/vssver.scc");

        // Subversion
        defaultExcludes.add("**/.svn");
        defaultExcludes.add("**/.svn/**");

        // Mac
        defaultExcludes.add("**/.DS_Store");

        // Windows Thumbs
        defaultExcludes.add("**/Thumbs.db");

        return defaultExcludes;
    }

    /**
     * Returns a list of filenames that should be copied
     * over to the destination directory.
     *
     * @param sourceDir the directory to be scanned
     * @return the array of filenames, relative to the sourceDir
     */
    private String[] getWarFiles(File sourceDir) {
        DirectoryScanner scanner = new DirectoryScanner();
        scanner.setBasedir(sourceDir);
        scanner.setExcludes(getExcludes());
        scanner.addDefaultExcludes();

        scanner.setIncludes(getIncludes());

        scanner.scan();

        return scanner.getIncludedFiles();
    }

    /**
     * Test method
     * @param args
     */
    public static void main(String[] args) throws Exception {

        IdegaWebWarMojo2 mojo = new IdegaWebWarMojo2();
        //mojo.webappDirectory=new File("/idega/eclipse/maven2/eplatform/target/eplatform-3.2");
        //mojo.webappDirectory=new File("/idega/eclipse/content/applications/base/target/base-3.1-SNAPSHOT");
        mojo.execute();

    }
}