diff options
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.java | 467 |
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; + } + + } +} |