| /******************************************************************************* |
| * Copyright (c) 2003, 2006 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 |
| * -------- -------- ----------------------------------------------------------- |
| * 20060203 126418 kathy@ca.ibm.com - Kathy Chan |
| *******************************************************************************/ |
| package org.eclipse.jst.ws.internal.axis.consumption.ui.util; |
| |
| |
| import java.io.File; |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.Vector; |
| |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IPackageFragmentRoot; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; |
| import org.eclipse.jst.ws.internal.common.J2EEUtils; |
| import org.eclipse.jst.ws.internal.common.ResourceUtils; |
| import org.eclipse.wst.common.componentcore.ComponentCore; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualResource; |
| |
| public class ClasspathUtils { |
| |
| // Copyright |
| public static final String copyright = "(c) Copyright IBM Corporation 2003."; //$NON-NLS-1$ |
| |
| private static ClasspathUtils instance_; //$NON-NLS-1$ |
| private static String DOT_JAR = ".jar"; //$NON-NLS-1$ |
| private static String JAR = "jar"; //$NON-NLS-1$ |
| private static String WEBINF_LIB = "/WEB-INF/lib"; //$NON-NLS-1$ |
| |
| private ClasspathUtils() { |
| } |
| |
| public static ClasspathUtils getInstance() { |
| if (instance_ == null) |
| instance_ = new ClasspathUtils(); |
| return instance_; |
| } |
| |
| public String getClasspathString(IProject project) { |
| StringBuffer classpath = new StringBuffer(); |
| String[] classpathEntries = getClasspath(project, false); |
| |
| Vector classpathVector = new Vector(); |
| for (int i = 0; i < classpathEntries.length; i++) { |
| if (!classpathVector.contains(classpathEntries[i])) { |
| classpathVector.add(classpathEntries[i]); |
| classpath.append(classpathEntries[i]); |
| classpath.append(";"); //$NON-NLS-1$ |
| } |
| } |
| return classpath.toString(); |
| } |
| |
| |
| private String[] getClasspath(IProject project, boolean isDependent) { |
| String[] moduleClasspath = new String[0]; |
| ArrayList projectClasspath = new ArrayList(); |
| boolean needJavaClasspath = false; |
| |
| IVirtualComponent comp = ComponentCore.createComponent(project); |
| if (comp != null) { |
| // get the module's classpath |
| |
| if (J2EEUtils.isEARComponent(comp)) { |
| moduleClasspath = getClasspathForEARProject(project, comp.getName()); |
| // add module classpath to project classpath |
| for (int j = 0; j < moduleClasspath.length; j++) { |
| projectClasspath.add(moduleClasspath[j]); |
| } |
| } else if (J2EEUtils.isWebComponent(comp) || J2EEUtils.isJavaComponent(comp)) { |
| needJavaClasspath = true; |
| |
| IContainer outputContainer = null; |
| IResource fragmentRoot = null; |
| IPackageFragmentRoot[] pkgFragmentRoot = ResourceUtils.getJavaPackageFragmentRoots(project); |
| ArrayList webModuleClasspath = new ArrayList(); |
| try { |
| for (int i = 0; i < pkgFragmentRoot.length; i++) { |
| fragmentRoot = pkgFragmentRoot[i].getCorrespondingResource(); |
| if (fragmentRoot != null |
| && (fragmentRoot.getProject().equals(project)) |
| && (fragmentRoot.getType() != IResource.FILE)) { |
| outputContainer = J2EEProjectUtilities.getOutputContainer(project, pkgFragmentRoot[i]); |
| if (outputContainer != null) { |
| webModuleClasspath.add(outputContainer.getLocation().toOSString()); |
| } |
| } |
| } |
| } catch (JavaModelException e) { |
| } |
| |
| // add Web module classpath to project classpath |
| Iterator iter = webModuleClasspath.iterator(); |
| while (iter.hasNext()) { |
| projectClasspath.add((String) iter.next()); |
| } |
| } |
| |
| if (!isDependent) { |
| if (J2EEUtils.isWebComponent(comp)) { |
| needJavaClasspath = true; |
| moduleClasspath = getWEBINFLib(project); |
| for (int j = 0; j < moduleClasspath.length; j++) { |
| projectClasspath.add(moduleClasspath[j]); |
| } |
| } |
| } |
| |
| } else { |
| needJavaClasspath = true; |
| } |
| |
| // If there are Web or Java module in the project, get the project's Java classpath |
| if (needJavaClasspath) { |
| String[] javaClasspath; |
| try { |
| IJavaProject javaProj = (IJavaProject) project.getNature(JavaCore.NATURE_ID); |
| if (javaProj != null) { |
| javaClasspath = getClasspathForJavaProject(javaProj); |
| for (int j = 0; j < javaClasspath.length; j++) { |
| projectClasspath.add(javaClasspath[j]); |
| } |
| } |
| } catch (CoreException e) { |
| // not able to get Java classpath, just ignore |
| } |
| } |
| |
| return (String[]) projectClasspath.toArray(new String[projectClasspath.size()]); |
| } |
| |
| // Need to get all modules in the project. If there's a EAR module, get the utility JARs |
| private String[] getUtilityJarClasspath(IProject project) { |
| String[] utilityJarString = new String[0]; |
| String[] moduleClasspath = new String[0]; |
| ArrayList utilityJarsClasspath = new ArrayList(); |
| |
| String module; |
| IVirtualComponent comp = ComponentCore.createComponent(project); |
| if (comp != null) { |
| module = comp.getName(); |
| if (J2EEUtils.isEARComponent(comp)) { |
| moduleClasspath = getClasspathForEARProject(project, module); |
| for (int j = 0; j < moduleClasspath.length; j++) { |
| utilityJarsClasspath.add(moduleClasspath[j]); |
| } |
| utilityJarString = (String[]) utilityJarsClasspath.toArray(new String[utilityJarsClasspath.size()]); |
| } |
| } |
| |
| return utilityJarString; |
| } |
| |
| private String[] getClasspathForEARProject(IProject project, String module) { |
| IPath projectPath = |
| project.getProject().getLocation().addTrailingSeparator().append(module).addTrailingSeparator(); |
| return getDirectoryJarFiles(projectPath); |
| } |
| |
| private String[] getDirectoryJarFiles(IPath iPath) { |
| File dir = iPath.toFile(); |
| Vector jarsVector = new Vector(); |
| if (dir.exists() && dir.isDirectory()) { |
| String[] filenames = dir.list(); |
| for (int i = 0; i < filenames.length; i++) { |
| if (filenames[i].endsWith(DOT_JAR)) |
| jarsVector.add(path2String(iPath) + filenames[i]); |
| } |
| } |
| String[] jars = new String[jarsVector.size()]; |
| jarsVector.copyInto(jars); |
| return jars; |
| } |
| |
| private String[] getWEBINFLib(IProject project) { |
| String[] webinfLibJars = new String[0]; |
| ArrayList anArrayList = new ArrayList(); |
| try { |
| IVirtualComponent component = ComponentCore.createComponent(project); |
| if (component != null) { |
| |
| IVirtualFolder webInfLib = component.getRootFolder().getFolder(new Path( |
| WEBINF_LIB)); |
| if (webInfLib != null) { |
| IVirtualResource[] resources = webInfLib.members(); |
| IResource aResource = null; |
| for (int i = 0; i < resources.length; i++) { |
| aResource = resources[i].getUnderlyingResource(); |
| if (JAR.equalsIgnoreCase(aResource.getFileExtension())) |
| anArrayList.add( aResource.getLocation().toOSString()); |
| } |
| if (anArrayList.size() != 0) |
| webinfLibJars = (String[]) anArrayList.toArray(new String[anArrayList.size()]); |
| } |
| } |
| } catch (CoreException e) { |
| } |
| return webinfLibJars; |
| } |
| |
| private String[] getClasspathForJavaProject(IJavaProject javaProject) { |
| ArrayList projectClasspath = new ArrayList(); |
| try { |
| IClasspathEntry[] buildPath = |
| javaProject.getResolvedClasspath(true); |
| for (int i = 0; i < buildPath.length; i++) { |
| String[] buildPathString = |
| classpathEntry2String( |
| buildPath[i], |
| javaProject.getProject()); |
| for (int j = 0; j < buildPathString.length; j++) { |
| projectClasspath.add(buildPathString[j]); |
| } |
| } |
| } catch (JavaModelException jme) { |
| } |
| |
| String[] utilityJarsClasspath; |
| IProject project = javaProject.getProject(); |
| IProject[] referencingProjects = project.getReferencingProjects(); |
| for (int i = 0; i < referencingProjects.length; i++) { |
| utilityJarsClasspath = getUtilityJarClasspath(referencingProjects[i]); |
| for (int j = 0; j < utilityJarsClasspath.length; j++) { |
| projectClasspath.add(utilityJarsClasspath[j]); |
| } |
| } |
| |
| return (String[]) projectClasspath.toArray(new String[projectClasspath.size()]); |
| } |
| |
| private String[] classpathEntry2String( |
| IClasspathEntry entry, |
| IProject project) |
| { |
| switch (entry.getEntryKind()) { |
| case IClasspathEntry.CPE_LIBRARY : |
| { |
| return new String[] { path2String(entry.getPath())}; |
| } |
| case IClasspathEntry.CPE_PROJECT : |
| { |
| return getClasspath( |
| ResourcesPlugin.getWorkspace().getRoot().getProject( |
| entry.getPath().lastSegment()), true); |
| } |
| case IClasspathEntry.CPE_SOURCE : |
| { |
| IPath path = entry.getPath(); |
| if (path.segment(0).equals(project.getName())) |
| path = path.removeFirstSegments(1); |
| return new String[] { |
| path2String( |
| project |
| .getLocation() |
| .addTrailingSeparator() |
| .append( |
| path))}; |
| } |
| case IClasspathEntry.CPE_VARIABLE : |
| { |
| return classpathEntry2String( |
| JavaCore.getResolvedClasspathEntry(entry), |
| project); |
| } |
| default : |
| { |
| return new String[] { path2String(entry.getPath())}; |
| } |
| } |
| } |
| |
| private String path2String(IPath path) { |
| return path.toOSString(); |
| } |
| } |