org.eclipse.jst.ws.internal.axis.consumption.ui.task.CopyAxisJarCommand.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.ws.internal.axis.consumption.ui.task.CopyAxisJarCommand.java

Source

/*******************************************************************************
 * Copyright (c) 2003, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * IBM Corporation - initial API and implementation
 * yyyymmdd bug      Email and other contact information
 * -------- -------- -----------------------------------------------------------
 * 20060509   125094 sengpl@ca.ibm.com - Seng Phung-Lu, Use WorkspaceModifyOperation
 * 20060515   115225 sengpl@ca.ibm.com - Seng Phung-Lu
 * 20060517   142342 kathy@ca.ibm.com - Kathy Chan
 * 20060828     155439 mahutch@ca.ibm.com - Mark Hutchinson
 * 20070501   184505 kathy@ca.ibm.com - Kathy Chan
 * 20070502   184505 kathy@ca.ibm.com - Kathy Chan, Update JAR sizes
 * 20071102   208620 kathy@ca.ibm.com - Kathy Chan, Update JAR sizes
 * 20071102   202222 kathy@ca.ibm.com - Kathy Chan
 * 20080122   216165 kathy@ca.ibm.com - Kathy Chan
 * 20080326   224148 makandre@ca.ibm.com - Andrew Mak, Web service scenarios broke in latest builds with Equinox p2
 * 20100304   304385 mahutch@ca.ibm.com - Mark Hutchinson, Allow users to disable copying axis jars
 * 20100414   309040 mahutch@ca.ibm.com - Mark Hutchinson, update jar sizes
 * 20120418   364026 lippert@acm.org - Martin Lippert, saaj.jar deployment fails when multiple javax.xml.soap bundles are installed 
 *******************************************************************************/
package org.eclipse.jst.ws.internal.axis.consumption.ui.task;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.internal.axis.consumption.ui.AxisConsumptionUIMessages;
import org.eclipse.jst.ws.internal.axis.consumption.ui.plugin.WebServiceAxisConsumptionUIPlugin;
import org.eclipse.jst.ws.internal.common.J2EEUtils;
import org.eclipse.jst.ws.internal.common.ResourceUtils;
import org.eclipse.jst.ws.internal.consumption.ConsumptionMessages;
import org.eclipse.wst.command.internal.env.common.FileResourceUtils;
import org.eclipse.wst.command.internal.env.core.common.ProgressUtils;
import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
import org.eclipse.wst.command.internal.env.core.context.ResourceContext;
import org.eclipse.wst.command.internal.env.core.context.TransientResourceContext;
import org.eclipse.wst.common.environment.IEnvironment;
import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
import org.eclipse.wst.ws.internal.common.BundleUtils;
import org.osgi.framework.Version;

public class CopyAxisJarCommand extends AbstractDataModelOperation {

    public static String AXIS_JAR = "axis.jar"; //$NON-NLS-1$
    public static String AXIS_RUNTIME_PLUGIN_ID = "org.apache.axis"; //$NON-NLS-1$
    public static String COMMON_DISCOVERY_PLUGIN_ID = "org.apache.commons.discovery"; //$NON-NLS-1$
    public static String COMMON_DISCOVERY_JAR = "commons-discovery-0.2.jar"; //$NON-NLS-1$
    public static String JAVAX_XML_RPC_PLUGIN_ID = "javax.xml.rpc"; //$NON-NLS-1$
    public static String JAVAX_XML_RPC_JAR = "jaxrpc.jar"; //$NON-NLS-1$
    public static String JAVAX_XML_SOAP_PLUGIN_ID = "javax.xml.soap"; //$NON-NLS-1$
    public static Version JAVAX_XML_SOAP_PLUGIN_VERSION = Version.parseVersion("1.2.0");
    private static Version JAVAX_XML_SOAP_PLUGIN_UPPER_VERSION = Version.parseVersion("1.3.0");
    public static String JAVAX_XML_SOAP_JAR = "saaj.jar"; //$NON-NLS-1$
    public static String JAVAX_WSDL_PLUGIN_ID = "javax.wsdl"; //$NON-NLS-1$
    public static String JAVAX_WSDL_JAR = "wsdl4j.jar"; //$NON-NLS-1$
    public static String COMMON_LOGGING_PLUGIN_ID = "org.apache.commons.logging"; //$NON-NLS-1$
    public static String COMMON_LOGGING_JAR = "commons-logging.jar"; //$NON-NLS-1$
    private static long AXIS_JAR_SIZE = 1599570L;
    private static long COMMON_DISCOVERY_JAR_SIZE = 71442L;
    private static long JAVAX_XML_RPC_JAR_SIZE = 31191L;
    private static long JAVAX_XML_SOAP_JAR_SIZE = 18979L;
    private static long JAVAX_WSDL_JAR_SIZE = 168178L;
    private static long COMMON_LOGGING_JAR_SIZE = 44210L;

    // Web Services Jars Used in previous Versions of WTP but now obsolete
    private static String[] OBSOLETE_JARS = new String[] { "commons-discovery.jar", "commons-logging-1.0.4.jar",
            "log4j-1.2.4.jar", "log4j-1.2.8.jar", "wsdl4j-1.5.1.jar", "axis-ant.jar" };

    public static String PATH_TO_JARS_IN_PLUGIN = "lib/";

    private IProject project;
    private Boolean projectRestartRequired_ = Boolean.FALSE;
    private IClasspathEntry[] oldClasspath;
    private ArrayList newJarNamesList = new ArrayList();

    /**
     * Default CTOR;
     */
    public CopyAxisJarCommand() {
    }

    /**
     * Execute the command
     */
    public IStatus execute(IProgressMonitor monitor, IAdaptable adaptable) {

        if (WebServiceAxisConsumptionUIPlugin.getInstance().getPluginPreferences()
                .getBoolean("disableAxisJarCopy")) {
            //IStatus status = new Status(IStatus.WARNING, WebServiceAxisConsumptionUIPlugin.ID,"Copying of Apache Axis Web Services jars has been disabled");
            //WebServiceAxisConsumptionUIPlugin.getInstance().getLog().log(status);
            return Status.OK_STATUS;
        }

        IEnvironment env = getEnvironment();
        IStatus status = Status.OK_STATUS;
        ProgressUtils.report(monitor, AxisConsumptionUIMessages.PROGRESS_INFO_COPY_AXIS_CFG);

        if (J2EEUtils.isWebComponent(project)) {
            copyAxisJarsToProject(project, status, env, monitor);
        } else {
            // Check if it's a plain old Java project
            if (J2EEUtils.isJavaComponent(project)) {
                status = addAxisJarsToBuildPath(project, env, monitor);
                if (status.getSeverity() == Status.ERROR) {
                    env.getStatusHandler().reportError(status);
                    return status;
                }
            } else {
                status = StatusUtils.errorStatus(AxisConsumptionUIMessages.MSG_WARN_NO_JAVA_NATURE);
                env.getStatusHandler().reportError(status);
                return status;
            }

        }

        return status;

    }

    private void copyAxisJarsToProject(IProject project, IStatus status, IEnvironment env,
            IProgressMonitor monitor) {

        IPath webModulePath = J2EEUtils.getWebContentPath(project);
        if (webModulePath == null) {
            status = StatusUtils.errorStatus(ConsumptionMessages.MSG_ERROR_PROJECT_NOT_FOUND);
            env.getStatusHandler().reportError(status);
            return;
        }

        deleteObsoleteJars(webModulePath);

        copyIFile(AXIS_RUNTIME_PLUGIN_ID, null, null, "lib/" + AXIS_JAR, webModulePath, "WEB-INF/lib/" + AXIS_JAR,
                status, env, monitor);
        if (status.getSeverity() == Status.ERROR) {
            return;
        }
        copyIFile(COMMON_DISCOVERY_PLUGIN_ID, null, null, "lib/" + COMMON_DISCOVERY_JAR, webModulePath,
                "WEB-INF/lib/" + COMMON_DISCOVERY_JAR, status, env, monitor);
        if (status.getSeverity() == Status.ERROR) {
            return;
        }
        copyIFile(JAVAX_XML_RPC_PLUGIN_ID, null, null, "lib/" + JAVAX_XML_RPC_JAR, webModulePath,
                "WEB-INF/lib/" + JAVAX_XML_RPC_JAR, status, env, monitor);
        if (status.getSeverity() == Status.ERROR) {
            return;
        }
        copyIFile(JAVAX_XML_SOAP_PLUGIN_ID, JAVAX_XML_SOAP_PLUGIN_VERSION, JAVAX_XML_SOAP_PLUGIN_UPPER_VERSION,
                "lib/" + JAVAX_XML_SOAP_JAR, webModulePath, "WEB-INF/lib/" + JAVAX_XML_SOAP_JAR, status, env,
                monitor);
        if (status.getSeverity() == Status.ERROR) {
            return;
        }
        copyPluginJar(JAVAX_WSDL_PLUGIN_ID, webModulePath, "WEB-INF/lib/" + JAVAX_WSDL_JAR, status, env, monitor);
        if (status.getSeverity() == Status.ERROR) {
            return;
        }

        copyPluginJar(COMMON_LOGGING_PLUGIN_ID, webModulePath, "WEB-INF/lib/" + COMMON_LOGGING_JAR, status, env,
                monitor);
        if (status.getSeverity() == Status.ERROR) {
            return;
        }
        return;
    }

    /**
     * 
     */
    private void copyIFile(String pluginId, Version pluginVersion, Version upperVersion, String source,
            IPath targetPath, String targetFile, IStatus status, IEnvironment env, IProgressMonitor monitor) {
        IPath target = targetPath.append(new Path(targetFile));
        ProgressUtils.report(monitor, ConsumptionMessages.PROGRESS_INFO_COPYING_FILE);

        try {
            ResourceContext context = new TransientResourceContext();
            context.setOverwriteFilesEnabled(true);
            context.setCreateFoldersEnabled(true);
            context.setCheckoutFilesEnabled(true);

            URL sourceURL = null;
            if (pluginVersion != null) {
                sourceURL = BundleUtils.getURLFromBundle(pluginId, pluginVersion, upperVersion, source);
            } else {
                sourceURL = BundleUtils.getURLFromBundle(pluginId, source);
            }

            IFile resource = ResourceUtils.getWorkspaceRoot().getFile(target);
            if (!resource.exists()) {
                IFile file = FileResourceUtils.createFile(context, target, sourceURL.openStream(), monitor,
                        env.getStatusHandler());
                if ((projectRestartRequired_.booleanValue() == false) && file.exists()) {
                    projectRestartRequired_ = Boolean.TRUE;
                }

            }
        } catch (Exception e) {
            status = StatusUtils.errorStatus(AxisConsumptionUIMessages.MSG_ERROR_FILECOPY, e);
            env.getStatusHandler().reportError(status);

        }
    }

    /**
     * Copy plugins that has been JARed
     */
    private void copyPluginJar(String pluginId, IPath targetPath, String targetFile, IStatus status,
            IEnvironment env, IProgressMonitor monitor) {
        IPath target = targetPath.append(new Path(targetFile));
        ProgressUtils.report(monitor, ConsumptionMessages.PROGRESS_INFO_COPYING_FILE);

        try {
            ResourceContext context = new TransientResourceContext();
            context.setOverwriteFilesEnabled(true);
            context.setCreateFoldersEnabled(true);
            context.setCheckoutFilesEnabled(true);

            File jarFile = FileLocator.getBundleFile(Platform.getBundle(pluginId));
            if (jarFile != null && jarFile.isFile()) {
                IFile resource = ResourceUtils.getWorkspaceRoot().getFile(target);

                if (!resource.exists()) {
                    InputStream is = new FileInputStream(jarFile);
                    IFile file = FileResourceUtils.createFile(context, target, is, monitor, env.getStatusHandler());
                    if ((projectRestartRequired_.booleanValue() == false) && file.exists()) {
                        projectRestartRequired_ = Boolean.TRUE;
                    }

                }
            }
        } catch (Exception e) {
            status = StatusUtils.errorStatus(AxisConsumptionUIMessages.MSG_ERROR_FILECOPY, e);
            env.getStatusHandler().reportError(status);

        }
    }

    /*
     * Check for any obsolete Jars in WEB-INF/lib folder Obsolete jars would
     * be found in projects migrated from older versions of WTP
     */
    private void deleteObsoleteJars(IPath webModulePath) {
        // First check for Any jars that have names that are known to be
        // obsolete
        for (int i = 0; i < OBSOLETE_JARS.length; i++) {
            IPath path = webModulePath.append("WEB-INF/lib/" + OBSOLETE_JARS[i]);

            IFile resource = ResourceUtils.getWorkspaceRoot().getFile(path);
            if (resource.exists()) {
                deleteResource(resource);
            }
        }

        // delete older JARs of the same name
        deleteOldJar(webModulePath.append("WEB-INF/lib/" + AXIS_JAR), AXIS_JAR_SIZE);
        deleteOldJar(webModulePath.append("WEB-INF/lib/" + COMMON_DISCOVERY_JAR), COMMON_DISCOVERY_JAR_SIZE);
        deleteOldJar(webModulePath.append("WEB-INF/lib/" + JAVAX_XML_RPC_JAR), JAVAX_XML_RPC_JAR_SIZE);
        deleteOldJar(webModulePath.append("WEB-INF/lib/" + JAVAX_XML_SOAP_JAR), JAVAX_XML_SOAP_JAR_SIZE);
        deleteOldJar(webModulePath.append("WEB-INF/lib/" + JAVAX_WSDL_JAR), JAVAX_WSDL_JAR_SIZE);
        deleteOldJar(webModulePath.append("WEB-INF/lib/" + COMMON_LOGGING_JAR), COMMON_LOGGING_JAR_SIZE);

    }

    private void deleteOldJar(IPath jarPath, long jarSize) {
        IFile resource = ResourceUtils.getWorkspaceRoot().getFile(jarPath);
        if (resource.exists()) {
            // calculate the size of the resource by getting the java.io.File
            long fileSize = resource.getLocation().toFile().length();
            if (fileSize != jarSize) {
                deleteResource(resource);
            }
        }
    }

    private void deleteResource(IFile resource) { // delete the resource
        try {
            // System.out.println("Obsolete Jar!! " + resource.getName());
            resource.delete(true, null);
        } catch (Exception e) { // e.printStackTrace();
        }
    }

    /**
     * Addes Axis JARs to the build path of Java project
     * 
     * @param env
     * @param monitor
     * @return
     */
    public IStatus addAxisJarsToBuildPath(IProject project, IEnvironment env, IProgressMonitor monitor) {

        IStatus status;

        try {
            getJavaProjectClasspath(env, monitor);

            addNewJarEntry(PATH_TO_JARS_IN_PLUGIN + AXIS_JAR,
                    getTheJarPath(AXIS_RUNTIME_PLUGIN_ID, PATH_TO_JARS_IN_PLUGIN + AXIS_JAR));
            addNewJarEntry(PATH_TO_JARS_IN_PLUGIN + COMMON_DISCOVERY_JAR,
                    getTheJarPath(COMMON_DISCOVERY_PLUGIN_ID, PATH_TO_JARS_IN_PLUGIN + COMMON_DISCOVERY_JAR));
            addNewJarEntry(PATH_TO_JARS_IN_PLUGIN + JAVAX_XML_RPC_JAR,
                    getTheJarPath(JAVAX_XML_RPC_PLUGIN_ID, PATH_TO_JARS_IN_PLUGIN + JAVAX_XML_RPC_JAR));
            addNewJarEntry(PATH_TO_JARS_IN_PLUGIN + JAVAX_XML_SOAP_JAR,
                    getTheJarPath(JAVAX_XML_SOAP_PLUGIN_ID, PATH_TO_JARS_IN_PLUGIN + JAVAX_XML_SOAP_JAR));

            IPath javaxWsdlJarPath = BundleUtils.getJarredPluginPath(JAVAX_WSDL_PLUGIN_ID);
            if (javaxWsdlJarPath != null) {
                addNewJarEntry(javaxWsdlJarPath.toString(), javaxWsdlJarPath);
            }

            IPath commonLoggingJarPath = BundleUtils.getJarredPluginPath(COMMON_LOGGING_PLUGIN_ID);
            if (commonLoggingJarPath != null) {
                addNewJarEntry(commonLoggingJarPath.toString(), commonLoggingJarPath);
            }
            updateClasspath(monitor);
        } catch (Exception e) {
            status = StatusUtils.errorStatus(AxisConsumptionUIMessages.MSG_ERROR_BAD_BUILDPATH, e);
            return status;
        }

        return Status.OK_STATUS;
    }

    /**
     * @param env
     * @param monitor
     * @return The Java project classpath
     * @throws JavaModelException
     */
    private IStatus getJavaProjectClasspath(IEnvironment env, IProgressMonitor monitor) throws JavaModelException {

        IStatus status = Status.OK_STATUS;

        IJavaProject javaProject_ = null;
        oldClasspath = null;
        javaProject_ = JavaCore.create(project);

        oldClasspath = javaProject_.getRawClasspath();

        return status;
    }

    /**
     * Store new JAR name in newJarNamesList if it's not already on build path
     * 
     * @param jarName
     *            name of the JAR
     * @param jarPath
     *            Absolute path to the JAR
     */
    private void addNewJarEntry(String jarName, IPath jarPath) {

        boolean found = false;
        for (int i = 0; i < oldClasspath.length; i++) {
            found = oldClasspath[i].getPath().toString().toLowerCase().endsWith(jarName.toLowerCase());
            if (found) {
                break;
            }
        }

        if (!found) {
            newJarNamesList.add(new JarEntry(jarName, jarPath));
        }

    }

    /**
     * Update the Java project classpath adding classpath from newJarNamesList
     * to oldClasspath
     * 
     * @param monitor
     * @return
     * @throws JavaModelException
     */
    private IStatus updateClasspath(IProgressMonitor monitor) throws JavaModelException {

        IStatus status = Status.OK_STATUS;

        if (newJarNamesList.size() > 0) {
            JarEntry[] newJarEntries = (JarEntry[]) newJarNamesList.toArray(new JarEntry[] {});

            IClasspathEntry[] newClasspath = new IClasspathEntry[oldClasspath.length + newJarEntries.length];
            int i = 0;
            // Add oldClasspath entries
            while (i < oldClasspath.length) {
                newClasspath[i] = oldClasspath[i];
                i++;
            }

            int m = 0;
            while (i < newClasspath.length) {
                newClasspath[i] = JavaCore.newLibraryEntry(newJarEntries[m].getJarPath(), null, null);
                m++;
                i++;
            }

            //
            // Then update the project classpath.
            //

            IJavaProject javaProject = JavaCore.create(project);
            javaProject.setRawClasspath(newClasspath, monitor);

        }

        return status;

    }

    //
    // Returns the local native pathname of the jar.
    //
    private IPath getTheJarPath(String pluginId, String theJar) throws MalformedURLException, IOException {
        if (pluginId != null) {
            URL localURL = Platform.asLocalURL(BundleUtils.getURLFromBundle(pluginId, theJar));
            return new Path(localURL.getFile());
        } else {
            return new Path(theJar);
        }

    }

    public void setProject(IProject project) {
        this.project = project;
    }

    public boolean getProjectRestartRequired() {
        return projectRestartRequired_.booleanValue();
    }

    public class JarEntry {
        private String jarName;
        private IPath jarPath;

        public JarEntry(String name, IPath path) {
            jarName = name;
            jarPath = path;
        }

        public String getJarName() {
            return jarName;
        }

        public IPath getJarPath() {
            return jarPath;
        }

    }
}