org.eclipse.jst.ws.internal.axis.consumption.ui.util.ClasspathUtils.java Source code

Java tutorial

Introduction

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

Source

/*******************************************************************************
 * 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();
    }
}