Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'core/bundles/org.eclipse.jst.ws.axis.consumption.ui/src/org/eclipse/jst/ws/internal/axis/consumption/ui/task/CopyAxisJarCommand.java')
-rw-r--r--core/bundles/org.eclipse.jst.ws.axis.consumption.ui/src/org/eclipse/jst/ws/internal/axis/consumption/ui/task/CopyAxisJarCommand.java467
1 files changed, 467 insertions, 0 deletions
diff --git a/core/bundles/org.eclipse.jst.ws.axis.consumption.ui/src/org/eclipse/jst/ws/internal/axis/consumption/ui/task/CopyAxisJarCommand.java b/core/bundles/org.eclipse.jst.ws.axis.consumption.ui/src/org/eclipse/jst/ws/internal/axis/consumption/ui/task/CopyAxisJarCommand.java
new file mode 100644
index 000000000..0dbb49758
--- /dev/null
+++ b/core/bundles/org.eclipse.jst.ws.axis.consumption.ui/src/org/eclipse/jst/ws/internal/axis/consumption/ui/task/CopyAxisJarCommand.java
@@ -0,0 +1,467 @@
+/*******************************************************************************
+ * 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;
+ }
+
+ }
+}

Back to the top