org.eclipse.jst.ws.internal.common.ResourceUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.ws.internal.common.ResourceUtils.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2011 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
 * -------- -------- -----------------------------------------------------------
 * 20060330   124667 kathy@ca.ibm.com - Kathy Chan
 * 20060421   136761 rsinha@ca.ibm.com - Rupam Kuehner
 * 20060424   115690 sengpl@ca.ibm.com - Seng Phung-Lu
 * 20060503   126819 rsinha@ca.ibm.com - Rupam Kuehner
 * 20080122   215866 trungha@ca.ibm.com - Trung Ha
 * 20080303   218696 ericdp@ca.ibm.com - Eric D. Peters, APIs using EJBArtifactEdit not able to deal with some EJB 3.0 beans properly
 * 20080626   236645 kathy@ca.ibm.com - Kathy Chan
 * 20110824   355771 kchong@ca.ibm.com - Keith Chong, Remove unused/dead code as reported in build reports 
 *******************************************************************************/
package org.eclipse.jst.ws.internal.common;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaConventions;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.j2ee.applicationclient.componentcore.util.AppClientArtifactEdit;
import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.javaee.ejb.SessionBean;
import org.eclipse.jst.ws.internal.plugin.WebServicePlugin;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.internal.StructureEdit;
import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
import org.eclipse.wst.common.environment.EnvironmentService;
import org.eclipse.wst.common.environment.ILog;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.ServerUtil;
import org.eclipse.wst.server.core.model.IURLProvider;

/**
 * This class contains useful methods for working with Eclipse resources.
 */
public final class ResourceUtils {

    // Keeps the IWorkspaceRoot hanging around. See getWorkspaceRoot().
    private static IWorkspaceRoot root_ = null;

    // Keeps the IWorkspace hanging around. See getWorkspace().

    private static IWorkspace workspace_ = null;

    /**
     * As returned by {@link #getProjectType getProjectType()}, indicates that
     * the given project has no Java or Web nature.
     */
    public static byte PROJECT_TYPE_NONE = 0;

    /**
     * As returned by {@link #getProjectType getProjectType()}, indicates that
     * the given project has a Java project nature.
     */
    public static byte PROJECT_TYPE_JAVA = 1;

    /**
     * As returned by {@link #getProjectType getProjectType()}, indicates that
     * the given project has a Web project nature.
     */
    public static byte PROJECT_TYPE_WEB = 2;

    /**
     * As returned by {@link #getProjectType getProjectType()}, indicates that
     * the given project has an EJB project nature.
     */
    public static byte PROJECT_TYPE_EJB = 4;

    /**
     * As returned by {@link #getProjectType getProjectType()}, indicates that
     * the given project has an Application client project nature.
     */
    public static byte PROJECT_TYPE_APPCLIENT = 8;

    /**
     * The SOAP rpcrouter servlet extension to be added to web project URL
     */
    public static String SERVLET_EXT = "/servlet/rpcrouter";

    private static final String DEFAULT_CLIENT_WEB_PROJECT_EXT = "Client";
    private static final String DEFAULT_CLIENT_EJB_PROJECT_EXT = "EJBClient";
    private static final String DEFAULT_EJB_PROJECT_NAME = "WebServiceEJBProject";
    private static final String DEFAULT_EJB_COMPONENT_NAME = "WebServiceEJB";
    private static final String DEFAULT_WEB_PROJECT_NAME = "WebServiceProject";
    private static final String DEFAULT_WEB_COMPONENT_NAME = "WebServiceProject";
    private static final String DEFAULT_ROUTER_PROJECT_EXT = "Router";

    private static final String DEFAULT_SERVICE_EAR_PROJECT_NAME = "WebServiceProjectEAR";
    private static final String DEFAULT_SERVICE_EAR_COMPONENT_NAME = "WebServiceProjectEAR";
    private static final String DEFAULT_CLIENT_EAR_PROJECT_NAME = "WebServiceProjectClientEAR";
    private static final String DEFAULT_CLIENT_EAR_COMPONENT_NAME = "WebServiceProjectClientEAR";

    private static final String DEFAULT_EAR_EXT = "EAR";

    /**
     * Returns the IWorkspaceRoot object.
     * @return The IWorkspaceRoot object.
     */
    public static IWorkspaceRoot getWorkspaceRoot() {
        if (root_ == null) {
            root_ = ResourcesPlugin.getWorkspace().getRoot();
        }
        return root_;
    }

    /**
     * Returns the IWorkspace object.
     * @return The IWorkspace object.
     */
    public static IWorkspace getWorkspace() {
        if (workspace_ == null) {
            if (root_ == null) {
                root_ = ResourcesPlugin.getWorkspace().getRoot();
            }
            workspace_ = root_.getWorkspace();
        }
        return workspace_;
    }

    /**
     * Returns an {@link org.eclipse.core.resources.IResource IResource}of the
     * given absolute pathname or null if no such resource exists.
     * 
     * @param absolutePathname
     *            The absolute path of the resource.
     * @return The <code>IResource</code>.
     */
    public static IResource findResource(String absolutePathname) {
        if (absolutePathname == null) {
            return null;
        }
        return findResource(new Path(absolutePathname));
    }

    /**
     * Returns an {@link org.eclipse.core.resources.IResource IResource}of the
     * given absolute path or null if no such resource exists.
     * 
     * @param absolutePath
     *            The absolute <code>IPath</code> of the resource.
     * @return The <code>IResource</code>.
     */
    public static IResource findResource(IPath absolutePath) {
        if (absolutePath == null) {
            return null;
        }
        return ResourceUtils.getWorkspaceRoot().findMember(absolutePath);
    }

    /**
     * Returns an {@link org.eclipse.core.resources.IResource IResource}of the
     * given file system relative pathname and project or null if no such resource exists.
     *
     * @param filePath File system relative pathname
     * @param project Project
     * @return The <code>IResource</code>.
     */
    public static IResource findResourceAtLocation(String filePath, IProject project) {

        return findResource(findPathAtLocation(new Path(filePath), project));
    }

    /**
     * This method attempts to convert a path that is relative to a file system
     * to a path that is relative to the workspace. Instead of comparing the
     * filePath with the install location of the workspace (i.e.
     * Platform.getLocation()), the filePath is compared with the location of the project
     * since the project could be in a location other than the the default location relative to the
     * workspace.
     * 
     * @param filePath   File path relative to a file system
     * @param project   The project the file is in
     * @return          Path relative to the workspace
     */
    public static IPath findPathAtLocation(IPath filePath, IProject project) {
        IPath result = null;

        IPath projectLocation = project.getLocation();

        if (projectLocation.matchingFirstSegments(filePath) == projectLocation.segmentCount()) {
            filePath = filePath.removeFirstSegments(projectLocation.segmentCount() - 1);
            result = filePath.setDevice(null);
        }

        return result;
    }

    /**
     * Validates the given string as a name for a resource of the given type(s).
     * This method obeys the contract of
     * {@link org.eclipse.core.resources.IWorkspace#validateName IWorkspace.validateName()}.
     * 
     * @param segment
     *            The path to validate.
     * @param typeMask
     *            The <code>IResource</code> type or types.
     * @return The status with a value if <code>IStatus.OK</code> if the path
     *         is valid, or with appropriate severity and message information if
     *         the path is not valid.
     *         
     * @deprecated not used         
     */
    public static IStatus validateName(String segment, int typeMask) {
        return getWorkspace().validateName(segment, typeMask);
    }

    /**
     * Validates the given string as the path of a resource of the given
     * type(s). This method obeys the contract of
     * {@link org.eclipse.core.resources.IWorkspace#validatePath IWorkspace.validatePath()}.
     * 
     * @param path
     *            The path to validate.
     * @param typeMask
     *            The <code>IResource</code> type or types.
     * @return The status with a value if <code>IStatus.OK</code> if the path
     *         is valid, or with appropriate severity and message information if
     *         the path is not valid.
     * @deprecated not used 
     */
    public static IStatus validatePath(String path, int typeMask) {
        return getWorkspace().validatePath(path, typeMask);
    }

    /**
     * Validates the given Java type name.
     * 
     * @param typeName
     *            The Java type name.
     * @return The status with a value of <code>IStatus.OK</code> if the name
     *         is valid, or with appropriate severity and message information if
     *         name is not valid. The primitive types (boolean, char, byte,
     *         short, int, long, float, double) are valid. Arrays of valid types
     *         are themselves valid.
     * @deprecated use JavaConventions in the jdt core 
     */
    public static IStatus validateJavaTypeName(String typeName) {
        //
        // Strip off the trailing array bits, if any.
        //
        int a = typeName.indexOf('[');
        if (a > 0) {
            typeName = typeName.substring(0, a);
        }
        //
        // Allow primitives.
        //
        if (isPrimitiveJavaType(typeName)) {
            return new Status(IStatus.OK, WebServicePlugin.ID, 0, "", null);
        }
        //
        // Defer to JavaConventions.
        //
        return JavaConventions.validateJavaTypeName(typeName);
    }

    /**
     * Returns true if the given <code>typeName</code> is a Java primitive
     * (boolean, char, byte, short, int, long, float, double).
     * 
     * @return True if the type name is a Java primitive.
     * 
     * @deprecated
     */
    public static boolean isPrimitiveJavaType(String typeName) {
        return (typeName.equals("boolean") || typeName.equals("char") || typeName.equals("byte")
                || typeName.equals("short") || typeName.equals("int") || typeName.equals("long")
                || typeName.equals("float") || typeName.equals("double"));
    }

    /**
     * Returns the handle of the IProject at the beginning of the given
     * <code>absolutePath</code>. Neither the given path nor the project need
     * exist in the workspace. The path must be absolute, and must consist of at
     * least one segment.
     * 
     * @return An IProject handle for the project at the beginning of the given
     *         <code>absolutePath</code>, or null if the path does not
     *         specify a project.
     */
    public static IProject getProjectOf(IPath absolutePath) {
        if (absolutePath.isAbsolute()) {
            String projectName = absolutePath.segment(0);
            if (projectName != null) {
                return getWorkspaceRoot().getProject(projectName);
            }
        }
        return null;
    }

    /**
     * 
     * @param absolutePath
     * @return
     */
    public static IVirtualComponent getComponentOf(IPath absolutePath) {
        if (absolutePath.isAbsolute()) {
            String projectName = absolutePath.segment(0);
            IProject project = getWorkspaceRoot().getProject(projectName);
            if (projectName != null) {
                return ComponentCore.createComponent(project);
            }
        }
        return null;
    }

    public static IVirtualComponent getComponentOf(IResource res) {
        IVirtualResource[] vresources = ComponentCore.createResources(res);
        IVirtualComponent vcomp = null;
        if (vresources != null && vresources.length > 0) {
            IVirtualResource vres = vresources[0];
            vcomp = vres.getComponent();
        }
        return vcomp;
    }

    /**
     * Returns true if the given <code>project</code> is a Java Project.
     * 
     * @param project
     *            The project.
     * @return True if the project is a Java Project.
     */
    public static boolean isJavaProject(IProject project) {
        try {
            return project.hasNature(JavaCore.NATURE_ID);
        } catch (CoreException ce) {
            //Return false if CoreException occurs while checking nature.
            return false;
        }
    }

    /**
     * Returns true if the given <code>project</code> is a Java Project.
     * 
     * @param project
     *            The project.
     * @return True if the project is a Java Project.
     */
    public static boolean isTrueJavaProject(IProject project) {
        return (!isWebProject(project) && !isAppClientProject(project) && !isEARProject(project)
                && !isEJBProject(project) && isJavaProject(project));
        /*
         * try { String[] natures = project.getDescription().getNatureIds();
         * return (natures.length == 1 &&
         * natures[0].equals(JavaCore.NATURE_ID)); } catch (CoreException e) { }
         * return false;
         */
    }

    /**
     * Returns true if the given <code>project</code> is a Web Project.
     * Note: For components; use J2EEUtils.isWebComponent()
     * @param project
     *            The project.
     * @return True if the project is a Web Project.
    * 
    * @deprecated
     */
    public static boolean isWebProject(IProject project) {
        boolean isWeb = false;
        StructureEdit mc = null;
        try {
            mc = StructureEdit.getStructureEditForRead(project);
            WorkbenchComponent[] wbcs = mc.getWorkbenchModules();
            if (wbcs.length != 0) {
                //isWeb = WebArtifactEdit.isValidWebModule(wbcs[0]);
            }
        } catch (Exception ex) {
            // handle exception
        } finally {
            if (mc != null)
                mc.dispose();
        }

        return isWeb;
    }

    /**
     * Note: for components; use J2EEUtils.isEARComponent()
     * @param project
     * @return
    * 
    * @deprecated
     */
    public static boolean isEARProject(IProject project) {
        boolean isEAR = false;
        StructureEdit mc = null;
        try {
            mc = StructureEdit.getStructureEditForRead(project);
            WorkbenchComponent[] wbcs = mc.getWorkbenchModules();
            if (wbcs.length != 0) {
                EARArtifactEdit earEdit = null;
                try {
                    //earEdit = EARArtifactEdit.getEARArtifactEditForRead(wbcs[0]);
                    //           if (earEdit!=null){
                    //            isEAR = true;
                    //           }
                } finally {
                    if (earEdit != null)
                        earEdit.dispose();
                }
            }
        } catch (Exception ex) {
        } finally {
            if (mc != null)
                mc.dispose();
        }

        return isEAR;
    }

    /**
     * Returns true if the given <code>project</code> is an EJB 1.1 or EJB 2.0
     * Project.
     * Note: for components, use J2EEUtils.isEJBComponent
     * @param project
     *            The project.
     * @return True if the project is an EJB 1.1 or an EJB 2.0 Project.
    * 
    * @deprecated
    * 
     */
    public static boolean isEJBProject(IProject project) {
        boolean isEJB = false;
        StructureEdit mc = null;
        try {
            mc = StructureEdit.getStructureEditForRead(project);
            WorkbenchComponent[] wbcs = mc.getWorkbenchModules();
            if (wbcs.length != 0) {
                EJBArtifactEdit ejbEdit = null;
                try {
                    //ejbEdit = EJBArtifactEdit.getEJBArtifactEditForRead(wbcs[0]);
                    //           if (ejbEdit!=null){
                    //            isEJB = true;
                    //           }
                } finally {
                    if (ejbEdit != null)
                        ejbEdit.dispose();
                }
            }
        } catch (Exception ex) {
        } finally {
            if (mc != null)
                mc.dispose();
        }

        return isEJB;
    }

    /**
     * Returns true if the given <code>project</code> is an Application Client
     * Project.
     * Note: for components, use J2EEUtils.isAppClientComponent()
     * @param project
     *            The project.
     * @return True if the project is an Application Client Project
    * 
    * @deprecated
     */
    public static boolean isAppClientProject(IProject project) {
        boolean isAppClient = false;
        StructureEdit mc = null;
        try {
            mc = StructureEdit.getStructureEditForRead(project);
            WorkbenchComponent[] wbcs = mc.getWorkbenchModules();
            if (wbcs.length != 0) {
                AppClientArtifactEdit appClientEdit = null;
                try {
                    //appClientEdit = AppClientArtifactEdit.getAppClientArtifactEditForRead(wbcs[0]);
                    //           if (appClientEdit!=null){
                    //              isAppClient = true;
                    //           }
                } finally {
                    if (appClientEdit != null)
                        appClientEdit.dispose();
                }
            }
        } catch (Exception ex) {
        } finally {
            if (mc != null)
                mc.dispose();
        }

        return isAppClient;
    }

    /**
     * Returns the type of the given <code>project</code> as a bitmask.
     * Relevant bitmask values are:
     * <ol>
     * <li>{@link #PROJECT_TYPE_JAVA PROJECT_TYPE_JAVA}
     * <li>{@link #PROJECT_TYPE_WEB PROJECT_TYPE_WEB}
     * <li>{@link #PROJECT_TYPE_EJB PROJECT_TYPE_EJB}
     * <li>{@link #PROJECT_TYPE_NONE PROJECT_TYPE_NONE}
     * </ol>
     * 
     * @param project
     *            The project.
     * @return The type bitmask of the project.
     * 
     * @deprecated use getComponentType
     */
    public static byte getProjectType(IProject project) {
        byte projectType = PROJECT_TYPE_NONE;
        if (ResourceUtils.isJavaProject(project)) {
            projectType |= PROJECT_TYPE_JAVA;
        }
        if (ResourceUtils.isWebProject(project)) {
            projectType |= PROJECT_TYPE_WEB;
        }
        if (ResourceUtils.isEJBProject(project)) {
            projectType |= PROJECT_TYPE_EJB;
        }
        return projectType;
    }

    /**
     * Returns the component type id as defined in IModuleConstants
     * i.e. IModuleConstants.JST_WEB_MODULE = "jst.web"
     * @param project
     * @return
     */
    public static String getComponentType(IProject project) {
        return J2EEProjectUtilities.getJ2EEProjectType(project);
    }

    /**
     * Returns the component type
     * @param component
     * @return
     */
    public static String getComponentType(IVirtualComponent component) {
        return getComponentType(component.getProject());
    }

    /**
     * Returns WebModule Deployable of the <code>project</code> as an
     * <code>IDeployable</code>, or null if the project has no Web nature.
     * 
     * @param project
     *            The project.
     * @return WebModule Deployable of the <code>project</code> or null if the
     *         project has no Web nature.
     */
    public static IModule getModule(IProject project) {
        return ServerUtil.getModule(project);
    }

    // Workaround for 113621 
    //public static IModule getModule(IProject project) {
    //   IModule[] modules = ServerUtil.getModules(project);
    //   if (modules!=null && modules.length!=0) {
    //      return modules[0];
    //   }
    //   return null;
    //}

    /**
     * Returns the build output location of the <code>project</code> as an
     * <code>IPath</code>, or null if the project has no Java nature.
     * i.e. WP\.deployables\webModule\WEB-INF\classes
     * @param project
     *            The project.
     * @return The build output location of the <code>project</code> or null
     *         if the project has no Java nature.
     */
    public static IPath getJavaOutputLocation(IProject project) {
        IPath outputLocation = null;
        try {
            IJavaProject javaProject = JavaCore.create(project);
            if (javaProject != null) {
                outputLocation = javaProject.getOutputLocation();
            }
        } catch (JavaModelException e) {
        }
        ILog log = EnvironmentService.getEclipseLog();
        log.log(ILog.INFO, 5032, ResourceUtils.class, "getJavaOutputLocation",
                "project=" + project + ",outputLocation=" + outputLocation);

        return outputLocation;
    }

    /**
     * Returns a build source location of the <code>project</code> as an
     * <code>IPath</code>, or null if the project either has no Java nature
     * or if the project's build classpath contains no folders local to the
     * project. If the project has more than one of its own folders on the build
     * classpath, then one of them is chosen arbitrarily as the build source
     * location. To work with all entries on the build classpath, use
     * {@link #getJavaPackageFragmentRoots getJavaPackageFragmentRoots()}or
     * {@link #getJavaClasspath getJavaClasspath()}.
     * 
     * @param project
     *            The project.
     * @return A build source location of the <code>project</code> or null if
     *         the project has no Java nature or if the project's build
     *         classpath contains no folders local to the project.
     */

    public static IPath getJavaSourceLocation(IProject project) {
        IPath sourceLocation = null;
        IPackageFragmentRoot[] fragmentRoots = getJavaPackageFragmentRoots(project);
        for (int i = 0; i < fragmentRoots.length && sourceLocation == null; i++) {
            try {
                IResource fragmentRoot = fragmentRoots[i].getCorrespondingResource();
                if (fragmentRoot != null && (fragmentRoot.getProject().equals(project))
                        && (fragmentRoot.getType() != IResource.FILE)) {
                    sourceLocation = fragmentRoot.getFullPath();
                }
            } catch (JavaModelException e) {
            }
        }

        ILog log = EnvironmentService.getEclipseLog();
        log.log(ILog.INFO, 5030, ResourceUtils.class, "getJavaSourceLocation",
                "project=" + project + ",sourceLocation=" + sourceLocation);

        return sourceLocation;
    }

    /**
     * Returns the "JavaSource" folder
     * @param project
     * @return
     */
    /*
    public static IPath getJavaSourceLocation(IProject project){
      IVirtualComponent component = ComponentCore.createComponent(project);
      return getJavaSourceLocation(component);         
    }
    */
    /**
     * Returns the JavaSource location folder
     * @param comp
     * @return
     */
    public static IPath getJavaSourceLocation(IVirtualComponent comp) {
        if (comp != null) {
            IVirtualFolder folder = comp.getRootFolder().getFolder(new Path("/WEB-INF/classes"));
            return folder.getWorkspaceRelativePath();
        }
        return null;
    }

    /**
     * Returns the JavaSource locations in each project
     * @param project
     * @return
     */
    public static IPath[] getAllJavaSourceLocations(IProject project) {
        Vector pathVector = new Vector();
        IPackageFragmentRoot[] fragmentRoots = getJavaPackageFragmentRoots(project);

        for (int i = 0; i < fragmentRoots.length; i++) {
            try {
                IResource fragmentRoot = fragmentRoots[i].getCorrespondingResource();
                if (fragmentRoot != null && (fragmentRoot.getProject().equals(project))
                        && (fragmentRoot.getType() != IResource.FILE)) {
                    pathVector.add(fragmentRoot.getFullPath());
                }
            } catch (JavaModelException e) {
            }
        }
        return (IPath[]) pathVector.toArray(new Path[pathVector.size()]);
    }

    public static IPath[] getAllJavaSourceLocations(IVirtualComponent[] components) {

        if (components != null) {
            List javaSourcePaths = new ArrayList();
            for (int i = 0; i < components.length; i++) {
                IPath path = getJavaSourceLocation(components[i]);
                javaSourcePaths.add(path);
            }
            return (IPath[]) javaSourcePaths.toArray(new IPath[0]);
        }
        return null;
    }

    /**
     * Returns a build source package fragment root of the <code>project</code>
     * as an <code>IPackageFragmentRoot</code>, or null if the project either
     * has no Java nature or if the project's build classpath contains no
     * folders local to the project. If the project has more than one of its own
     * folders on the build classpath, then one of them is chosen arbitrarily as
     * the build source location.
     * 
     * @param project
     *            The project.
     * @return A build source package fragment root of the <code>project</code>
     *         or null if the project has no Java nature or if the project's
     *         build classpath contains no folders local to the project.
     *         
     * @deprecated not used
     */
    public static IPackageFragmentRoot getJavaSourcePackageFragmentRoot(IProject project) {
        IPackageFragmentRoot packageFragmentRoot = null;
        IPath javaSourceLocation = getJavaSourceLocation(project);
        try {
            IJavaProject javaProject = JavaCore.create(project);
            if (javaProject != null) {
                packageFragmentRoot = javaProject.findPackageFragmentRoot(javaSourceLocation);
            }
        } catch (JavaModelException e) {
        }
        return packageFragmentRoot;
    }

    /**
     * Returns the package fragment roots of the <code>project</code> as an
     * array of <code>IPackageFragmentRoot</code> objects. If the project has
     * no Java nature then the returned array will be of length zero.
     * 
     * @param project
     *            The project.
     * @return The package fragment roots of the <code>project</code>.
     */
    public static IPackageFragmentRoot[] getJavaPackageFragmentRoots(IProject project) {
        try {
            IJavaProject javaProject = JavaCore.create(project);
            if (javaProject != null) {
                IPackageFragmentRoot[] packageFragmentRoots = javaProject.getPackageFragmentRoots();
                return packageFragmentRoots;
            }
        } catch (JavaModelException e) {
        }
        return new IPackageFragmentRoot[0];
    }

    /**
     * Returns the build classpath entries of the <code>project</code> as an
     * array of <code>IClasspathEntry</code> objects. If the project has no
     * Java nature then the returned array will be of length zero.
     * 
     * @param project
     *            The project.
     * @return The classpath entries of the <code>project</code>.
     * 
     * @deprecated not used
     */
    public static IClasspathEntry[] getJavaClasspath(IProject project) {
        try {
            IJavaProject javaProject = JavaCore.create(project);
            if (javaProject != null) {
                IClasspathEntry[] classpathEntries = javaProject.getRawClasspath();
                return classpathEntries;
            }
        } catch (JavaModelException e) {
        }
        return new IClasspathEntry[0];
    }

    /**
     * 
     * @param project
     * @return
     */
    public static IFolder getWebComponentServerRoot(IProject project) {

        IFolder webModuleServerRoot = null;
        IVirtualComponent vc = ComponentCore.createComponent(project);
        if (vc.exists())
            webModuleServerRoot = J2EEUtils.getOutputContainerRoot(vc);

        return webModuleServerRoot;
    }

    /**
     * 
     * @param project
     * @return
     */
    public static IPath getWebComponentServerRootPath(IProject project) {

        IContainer webModuleServerRoot = null;
        IVirtualComponent vc = ComponentCore.createComponent(project);
        if (vc != null && vc.exists()) {
            IContainer[] containers = J2EEProjectUtilities.getOutputContainers(project.getProject());
            if (containers.length > 0)
                webModuleServerRoot = containers[0];
        }

        if (webModuleServerRoot != null)
            return webModuleServerRoot.getFullPath();
        return null;
    }

    /**
     * Returns the URL string corresponding to the web server module root of the
     * project in a server instance or null if the project has no Web nature or
     * has no association to a server instance.
     * 
     * @param project
     *            The project.
     * @return The web server module root URL or null if the project has no Web
     *         nature or has no association to a server instance.
     * @deprecated use getWebComponentURL(..) which belongs in ServerUtils
     */
    public static String getWebProjectURL(IProject project, String serverFactoryId, IServer server) {

        String webProjectURL = null;
        IModule module = getModule(project);
        if (module != null) {
            IServer serverInstance = ServerUtils.getServerForModule(module, serverFactoryId, server, true,
                    new NullProgressMonitor());
            if (serverInstance != null) {
                //            URL url = ((IURLProvider) serverInstance.getDelegate()).getModuleRootURL(module);
                URL url = ((IURLProvider) serverInstance.getAdapter(IURLProvider.class)).getModuleRootURL(module);
                if (url != null) {
                    String s = url.toString();
                    webProjectURL = (s.endsWith("/") ? s.substring(0, s.length() - 1) : s);
                }
            }
        }

        ILog log = EnvironmentService.getEclipseLog();
        log.log(ILog.INFO, 5036, ResourceUtils.class, "getWebProjectURL",
                "project=" + project + ",webProjectURL=" + webProjectURL);

        return webProjectURL;
    }

    /**
     * Returns the forged URL string corresponding to the web server module root
     * of the project in a server instance or null if the project has no Web
     * nature or has no association to a server instance.
     * 
     * @param project
     * @return The web server module root URL or null if the project has no Web
     *         nature or has no association to a server instance.
     * @deprecated  not used
     */
    //   public static String getForgedWebProjectURL(IProject project, String serverFactoryId, IServer server){
    //     
    //     String webProjectURL = null;
    //     IModule module = getModule(project);
    //     if (module != null)
    //     {
    //        //IServer serverInstance = ServerUtils.getServerForModule(module,
    //        // serverFactoryId, server, true, new NullProgressMonitor());
    //        if (server != null)
    //        {
    //           String hostname = server.getHost();
    //
    //           // get ServerPort
    //           int portNumber = 0;
    //
    //               ServerPort[] ports = server.getServerPorts(null);
    //               ServerPort port = null;
    //               for (int it = 0; it<ports.length; it++)
    //               {
    //                 ServerPort p = ports[it];
    //                 String protocol = p.getProtocol();
    //                 if (protocol != null && protocol.trim().toLowerCase().equals("http"))
    //                 {
    //                   port = p;
    //                   portNumber = p.getPort();
    //                   break;
    //                 }
    //               }
    //               
    //             
    //             
    //             URL url = null;
    //             try {
    //                url = new URL("http", hostname, portNumber, "");
    //             }
    //             catch(Exception e){
    //                e.printStackTrace();
    //             }
    //
    //             
    //           //URL url = ((IURLProvider) serverInstance.getDelegate()).getModuleRootURL(module);
    //           
    //           if (url != null)
    //           {
    //              String s = url.toString();
    //              webProjectURL = s + "/"+project.getName();
    //              //webProjectURL = (s.endsWith("/") ? s.substring(0,s.length()-1) : s);
    //           }
    //        }
    //     }
    //    ILog log = new EclipseLog();
    //    log.log(ILog.INFO, 5036, ResourceUtils.class, "getWebProjectURL", "project="+project+",webProjectURL="+webProjectURL);
    //     return webProjectURL;     
    //  }
    /**
     * Returns the URL string corresponding to the web server module root of the
     * project in a server instance or null if the project has no Web nature or
     * has no association to a server instance.
     * 
     * @param project
     *            The project.
     * @return The web server module root URL or null if the project has no Web
     *         nature or has no association to a server instance.
     * @deprecated belongs in ServerUtils
     *
     */
    public static String getWebProjectURL(IProject project) {
        String webProjectURL = null;
        IModule module = getModule(project);
        if (module != null) {
            IServer serverInstance = ServerUtils.getServerForModule(module);
            if (serverInstance != null) {
                URL url = ((IURLProvider) serverInstance.getAdapter(IURLProvider.class)).getModuleRootURL(module);
                if (url != null) {
                    String s = url.toString();
                    webProjectURL = (s.endsWith("/") ? s.substring(0, s.length() - 1) : s);
                }
            }
        }
        ILog log = EnvironmentService.getEclipseLog();
        log.log(ILog.INFO, 5037, ResourceUtils.class, "getWebProjectURL",
                "project=" + project + ",webProjectURL=" + webProjectURL);

        return webProjectURL;
    }

    /**
     * 
     * @param project
     * @return
     * 
     * @deprecated should be in ServerUtils
     */
    public static String getEncodedWebProjectURL(IProject project) {
        String url = getWebProjectURL(project);
        if (url != null) {
            int index = url.lastIndexOf('/');
            if (index != -1) {
                StringBuffer encodedURL = new StringBuffer();
                encodedURL.append(url.substring(0, index + 1));
                try {
                    String ctxtRoot = URLEncoder.encode(url.substring(index + 1, url.length()), "UTF-8");
                    int plusIndex = ctxtRoot.indexOf('+');
                    while (plusIndex != -1) {
                        StringBuffer sb = new StringBuffer();
                        sb.append(ctxtRoot.substring(0, plusIndex));
                        sb.append("%20");
                        sb.append(ctxtRoot.substring(plusIndex + 1, ctxtRoot.length()));
                        ctxtRoot = sb.toString();
                        plusIndex = ctxtRoot.indexOf('+');
                    }
                    encodedURL.append(ctxtRoot);
                } catch (IOException io) {
                    //handler exception
                }
                url = encodedURL.toString();
            }
        }
        return url;
    }

    /**
     * Given the <code>absolutePath</code> of a Java resource, returns the
     * package name of the resource or null if the resource is not properly
     * located in a project or folder on the build classpath or that is the
     * build output path.
     * 
     * @param absolutePath
     *            The absolute path of the Java resource.
     * @return the package name of the Java resource.
     */
    public static String getJavaResourcePackageName(IPath absolutePath) {
        try {
            IPath javaFolderPath = absolutePath.removeLastSegments(1);
            IProject project = getProjectOf(absolutePath);
            IJavaProject javaProject = JavaCore.create(project);
            if (javaProject != null) {
                IPackageFragment fragment = javaProject.findPackageFragment(javaFolderPath);
                if (fragment != null) {
                    return fragment.getElementName();
                }
                IPath outputPath = getJavaOutputLocation(project);
                if (outputPath.isPrefixOf(javaFolderPath)) {
                    IPath javaPackagePath = javaFolderPath.removeFirstSegments(outputPath.segmentCount());
                    return javaPackagePath.isEmpty() ? null
                            : javaPackagePath.toString().replace(IPath.SEPARATOR, '.');
                }
            }
        } catch (JavaModelException e) {
        }
        return null;
    }

    /**
     * Given the <code>absolutePath</code> of a Java resource, returns the
     * package name of the resource as a relative pathname or null if the
     * resource is not properly located in a project or folder on the build
     * classpath.
     * 
     * @param absolutePath
     *            The absolute path of the Java resource.
     * @return the package name of the Java resource as a relative path.
     */
    public static IPath getJavaResourcePackagePath(IPath absolutePath) {
        String packageName = ResourceUtils.getJavaResourcePackageName(absolutePath);
        return (packageName == null ? null : new Path(packageName.replace('.', IPath.SEPARATOR)));
    }

    /**
     * Given the <code>absolutePath</code> of a Java resource, returns the
     * absolute path of the project or folder that is on the build classpath or
     * is the build output path and that contains the fully qualified Java
     * resource, or null if no such project or folder exists.
     * 
     * @param absolutePath
     *            The absolute path of the Java resource.
     * @return The absolute path of the project or folder containing the fully
     *         qualified Java resource.
     * @deprecated not used
     */
    public static IPath getJavaResourceRootPath(IPath absolutePath) {
        try {
            IProject project = getProjectOf(absolutePath);
            IJavaProject javaProject = JavaCore.create(project);
            if (javaProject != null) {
                IPackageFragmentRoot[] pfrs = javaProject.getPackageFragmentRoots();
                for (int i = 0; i < pfrs.length; i++) {
                    IResource fragmentRoot = pfrs[i].getCorrespondingResource();
                    if (fragmentRoot != null) {
                        IPath fragmentPath = fragmentRoot.getFullPath();
                        if (fragmentPath.isPrefixOf(absolutePath)) {
                            return fragmentPath;
                        }
                    }
                }
                IPath outputPath = getJavaOutputLocation(project);
                if (outputPath.isPrefixOf(absolutePath)) {
                    return outputPath;
                }
            }
        } catch (JavaModelException e) {
        }
        return null;
    }

    /**
     * Determines an URL (HTTP or FILE) to an Eclipse resource, returning the
     * URL string if successful and false otherwise. A value of null will
     * definitely be returned if any of the following conditions are not met:
     * <ol>
     * <li>The absolute path begins with a Web Project.
     * <li>The leading portion of the absolute path matches the path of the
     * container returned by {#link #getWebModuleServerRoot
     * getWebModuleServerRoot} for the project.
     * <li>The path does not lead to the WEB-INF folder or any descendent
     * thereof.
     * <li>The Web Project is associated with an explicit or default server
     * instance.
     * </ol>
     * 
     * @param absolutePath
     *            The absolute path of the resource.
     * @return The URL of the file, or null if no URL can be determined.
     * @deprecated not used
     */
    //   public static String getURLFromPath(IPath absolutePath,
    //         String serverFactoryId, IServer server) {
    //      return getURLFromPath(absolutePath, getWebProjectURL(
    //            getProjectOf(absolutePath), serverFactoryId, server));
    //   }

    /**
     * 
     * @param absolutePath
     * @param webProjectURL
     * @return
     * @deprecated not used
     */
    //   public static String getURLFromPath(IPath absolutePath, String webProjectURL) {
    //      StringBuffer url = new StringBuffer();
    //      IProject project = getProjectOf(absolutePath);
    //      IContainer webModuleServerRoot = getWebModuleServerRoot(project);
    //      if (webModuleServerRoot != null) {
    //         IPath webModuleServerRootPath = webModuleServerRoot.getFullPath();
    //         if (webModuleServerRootPath.isPrefixOf(absolutePath)) {
    //            int numSegment = webModuleServerRootPath.segmentCount();
    //            int numSegmentFromPath = absolutePath.segmentCount();
    //            if (numSegmentFromPath > numSegment) {
    //               String nextSegment = absolutePath.segment(numSegment);
    //               // check if the segment after the WebModuleServerRoot is
    //               // WEB-INF (ignoring case)
    //               if (nextSegment != null   && !nextSegment.equalsIgnoreCase("WEB-INF")) {
    //                  IPath relativePath = absolutePath.removeFirstSegments(numSegment);
    //                  if (webProjectURL != null)
    //                     url.append(webProjectURL).append(IPath.SEPARATOR).append(relativePath.toString());
    //               }
    //            } else if (numSegmentFromPath == numSegment)
    //               url.append(webProjectURL);
    //         }
    //      }
    //      if (url.length() < 1) {
    //         IWorkspaceRoot workspace = getWorkspaceRoot();
    //         url.append(getResourceURI(workspace.getFile(absolutePath)));
    //      }
    //      ILog log = new EclipseLog();
    //      log.log(ILog.INFO, 5038, ResourceUtils.class, "getURLFromPath",
    //            "absolutePath=" + absolutePath + ",url=" + url);
    //
    //      return url.toString();
    //   }

    /**
     * Copies a set of files from a plugin's installation location to a native
     * directory. The files are named in an index file located relative to the
     * plugin's installation location.
     * 
     * @param plugin
     *            The plugin containing the files to copy. Must not be null.
     * @param sourcePath
     *            The path, relative to the <code>plugin</code> install
     *            location, containing the files to copy. If null, then the
     *            plugin install location is the source path (ie. null is
     *            equivalent to ".").
     * @param indexPathname
     *            A file containing a whitespace-delimitted list of pathnames of
     *            the files to copy. The pathnames are relative to the
     *            <code>plugin sourcePath</code>. Must not be null.
     * @param targetPath
     *            The absolute path of the native directory to which the files
     *            will be copied. The relative pathnames of the files named in
     *            the <code>indexPathname</code> file are preserved. Must not
     *            be null.
     * @param progressMonitor
     *            The progress monitor for the operation, or null.
     * @throws IOException
     *             An exception indicating an IO error has occured.
     */
    static public void copyIndexedFilesToOS(Plugin plugin, IPath sourcePath, IPath indexPathname, IPath targetPath,
            IProgressMonitor progressMonitor) throws IOException {
        InputStream input = plugin.openStream(indexPathname);
        Enumeration filenames = StringUtils.parseFilenamesFromStream(input);
        copyEnumeratedFilesToOS(plugin, sourcePath, filenames, targetPath, progressMonitor);
    }

    /**
     * Copies a set of files from a plugin's installation location to a native
     * directory. The files are named in an enumeration.
     * 
     * @param plugin
     *            The plugin containing the files to copy. Must not be null.
     * @param sourcePath
     *            The path, relative to the <code>plugin</code> install
     *            location, containing the files to copy. If null, then the
     *            plugin install location is the source path (ie. null is
     *            equivalent to ".").
     * @param pathnames
     *            An enumeration of pathnames of the files to copy. The
     *            pathnames are relative to the <code>plugin sourcePath</code>.
     *            Must not be null.
     * @param targetPath
     *            The absolute path of the native directory to which the files
     *            will be copied. The relative pathnames of the files named in
     *            the <code>pathnames</code> enumeration are preserved. Must
     *            not be null.
     * @param progressMonitor
     *            The progress monitor for the operation, or null.
     * @throws IOException
     *             An exception indicating an IO error has occured.
     */
    static public void copyEnumeratedFilesToOS(Plugin plugin, IPath sourcePath, Enumeration pathnames,
            IPath targetPath, IProgressMonitor progressMonitor) throws IOException {
        while (pathnames.hasMoreElements()) {
            String filename = (String) pathnames.nextElement();
            copyFileToOS(plugin, sourcePath, new Path(filename), targetPath, progressMonitor);
        }
    }

    /**
     * Copies a file from a plugin's installation location to a native
     * directory.
     * 
     * @param plugin
     *            The plugin containing the files to copy. Must not be null.
     * @param sourcePath
     *            The path, relative to the <code>plugin</code> install
     *            location, containing the files to copy. If null, then the
     *            plugin install location is the source path (ie. null is
     *            equivalent to ".").
     * @param pathname
     *            The pathname of the file to copy. The pathname is relative to
     *            the <code>plugin sourcePath</code>. Must not be null.
     * @param targetPath
     *            The absolute path of the native directory to which the file
     *            will be copied. The relative pathname of the file is
     *            preserved. Must not be null.
     * @param progressMonitor
     *            The progress monitor for the operation, or null.
     * @throws IOException
     *             An exception indicating an IO error has occured.
     */
    static public void copyFileToOS(Plugin plugin, IPath sourcePath, IPath pathname, IPath targetPath,
            IProgressMonitor progressMonitor) throws IOException {
        IPath target = targetPath.append(pathname);
        IPath source = sourcePath == null ? pathname : sourcePath.append(pathname);
        InputStream input = plugin.openStream(source);
        OutputStream output = new FileOutputStream(target.toOSString());
        copyStream(input, output);
        input.close();
        output.close();
    }

    /**
     * Copies data from one stream to another.
     * 
     * @param input
     *            The input stream.
     * @param output
     *            The output stream.
     * @return The number of bytes copied.
     * @throws IOException
     *             An exception if an error occurs while processing either of
     *             the streams.
     */
    static public int copyStream(InputStream input, OutputStream output) throws IOException {
        int t = 0;
        byte[] buffer = new byte[1024];
        int n = input.read(buffer);
        while (n >= 0) {
            output.write(buffer, 0, n);
            t += n;
            n = input.read(buffer);
        }
        return t;
    }

    /**
     * Creates a native directory path equal to the parent portion of the given
     * <code>pathname</code>. If the directory already exists, then no action
     * is taken.
     * 
     * @param pathname
     *            The pathname to the file whose parent directory should be
     *            created.
     * @throws IOException
     *             An exception if an IO error occurs.
     */
    static public void createParentDirectoryFor(String pathname) throws IOException {
        File file = new File(pathname);
        File parent = file.getParentFile();
        if (parent != null) {
            parent.mkdirs();
        }
    }

    /**
     * Returns the IResource represented by the given selection.
     * 
     * @param object
     *            The selection
     * @return IResource if the selection represents an IResource. Returns null
     *         otherwise.
     * @throws CoreException
     */
    static public IResource getResourceFromSelection(Object obj) throws CoreException {
        IResource res = null;
        if (obj != null) {
            if (obj instanceof IResource) {
                res = (IResource) obj;
            } else if (obj instanceof IJavaElement) {
                IJavaElement javaElement = (IJavaElement) obj;
                res = javaElement.getCorrespondingResource();
            } else if (obj instanceof EnterpriseBean) {
                EnterpriseBean ejbBean = (EnterpriseBean) obj;
                IProject ejbProject = ProjectUtilities.getProject(ejbBean);
                if (ejbProject != null)
                    res = ejbProject;
            } else if (obj instanceof SessionBean) {
                SessionBean JEE5Bean = (SessionBean) obj;
                IProject ejbProject = ProjectUtilities.getProject(JEE5Bean);
                if (ejbProject != null)
                    res = ejbProject;
            }

        }

        return res;
    }

    //----------------------------------------------------------------------
    // Naughty bits...
    //----------------------------------------------------------------------

    //
    // Creates a path of folders.
    // Do not call with an absolutePath of less than one segment.
    //
    //  private static IContainer makeFolderPath (
    //        ResourceContext resourceContext,
    //    IPath absolutePath,
    //    IProgressMonitor progressMonitor,
    //    StatusMonitor statusMonitor
    //  )
    //  throws CoreException
    //  {
    //    if (absolutePath.segmentCount() <= 1)
    //    {
    //      return getWorkspaceRoot().getProject(absolutePath.segment(0));
    //    }
    //    else
    //    {
    //      IContainer parent = makeFolderPath(resourceContext,
    // absolutePath.removeLastSegments(1), progressMonitor, statusMonitor);
    //      String folderName = absolutePath.lastSegment();
    //      return makeFolder(resourceContext, parent,folderName, progressMonitor ,
    // statusMonitor);
    //    }
    //  }
    //
    // Creates a folder under a container.
    // The container must already exist.
    //
    // private static IFolder makeFolder (
    //        ResourceContext resourceContext,
    //    IContainer parent,
    //    String folderName,
    //    IProgressMonitor progressMonitor,
    //    StatusMonitor statusMonitor
    //  )
    //  throws CoreException
    //  {
    //    IResource child = parent.findMember(folderName);
    //    if (child == null)
    //    {
    //      if (!resourceContext.isCreateFoldersEnabled()) {
    //        int result = statusMonitor.reportStatus(new
    // Status(IStatus.WARNING,WebServicePlugin.ID,0,
    //                                                         WebServicePlugin.getMessage("%MSG_ERROR_FOLDER_CREATION_DISABLED",
    //                                                         new Object[] {parent.getFullPath().toString(),folderName}),null),
    // getThreeStateFileOptions());
    //        if (result == IStatusDialogConstants.CANCEL_ID)
    //                        return null;
    //
    //          if ( result == IStatusDialogConstants.YES_TO_ALL_ID)
    //                        resourceContext.setCreateFoldersEnabled(true);
    //
    //      }
    //      IFolder folder = parent.getFolder(new Path(folderName));
    //      folder.create(true,true,progressMonitor);
    //      return folder;
    //    }
    //    else if (child.getType() == IResource.FOLDER)
    //    {
    //      return (IFolder)child;
    //    }
    //    else
    //    {
    //      throw new CoreException(new
    // Status(IStatus.ERROR,WebServicePlugin.ID,0,WebServicePlugin.getMessage("%MSG_ERROR_RESOURCE_NOT_FOLDER",new
    // Object[] {parent.getFullPath().append(folderName).toString()}),null));
    //    }
    //  }

    //
    // Creates a file under a container.
    // The container must already exist.
    //
    // private static IFile makeFile (
    //    ResourceContext resourceContext,
    //    IContainer parent,
    //    String fileName,
    //    InputStream inputStream,
    //    IProgressMonitor progressMonitor,
    //    StatusMonitor statusMonitor
    //  )
    //  throws CoreException
    //  {
    //    IResource child = parent.findMember(fileName);
    //    if (child != null)
    //    {
    //      if (child.getType() == IResource.FILE)
    //      {
    //        if (!resourceContext.isOverwriteFilesEnabled()) {
    //          int result = statusMonitor.reportStatus( new
    // Status(IStatus.WARNING,WebServicePlugin.ID,0,
    //                                                         WebServicePlugin.getMessage("%MSG_ERROR_FILE_OVERWRITE_DISABLED",
    //                                                         new Object[] {parent.getFullPath().toString(),fileName}),null),
    // getThreeStateFileOptions());
    //
    //          if (result == IStatusDialogConstants.CANCEL_ID)
    //                        return null;
    //
    //          if ( result == IStatusDialogConstants.YES_TO_ALL_ID)
    //                        resourceContext.setOverwriteFilesEnabled(true);
    //        }
    //        //We have permission to overwrite so check if file is read-only
    //        if (child.isReadOnly())
    //        {
    //          if (!resourceContext.isCheckoutFilesEnabled()) {
    //
    //            int result = statusMonitor.reportStatus( new
    // Status(IStatus.WARNING,WebServicePlugin.ID,0,
    //                                                         WebServicePlugin.getMessage("%MSG_ERROR_FILE_CHECKOUT_DISABLED",
    //                                                         new Object[] {parent.getFullPath().toString(),fileName}),null),
    // getThreeStateFileOptions());
    //
    //            if (result == IStatusDialogConstants.CANCEL_ID)
    //                        return null;
    //
    //            if ( result == IStatusDialogConstants.YES_TO_ALL_ID)
    //                        resourceContext.setCheckoutFilesEnabled(true);
    //          }
    //
    //          IFile[] files = new IFile[1];
    //          files[0] = (IFile)child;
    //
    //          if (
    // !statusMonitor.reportStatus(getWorkspace().validateEdit(files,null)))
    //                                return null;
    //        }
    //
    //        //Change the contents of the existing file.
    //            IFile file = parent.getFile(new Path(fileName));
    //        file.setContents(inputStream,true,true,progressMonitor);
    //        return file;
    //
    //      }
    //      else
    //      {
    //        throw new CoreException(new
    // Status(IStatus.ERROR,WebServicePlugin.ID,0,WebServicePlugin.getMessage("%MSG_ERROR_RESOURCE_NOT_FILE",new
    // Object[] {parent.getFullPath().append(fileName)}),null));
    //      }
    //    }
    //    else
    //    {
    //        //Create a new file.
    //        IFile file = parent.getFile(new Path(fileName));
    //        file.create(inputStream,true,progressMonitor);
    //        return file;
    //    }
    //  }

    /**
     * Deletes a file under a container. The container must already exist.
     * 
     * @param file -
     *            the IFile to be deleted
     * @param progressMonitor
     * @param statusMonitor
     * @return True if the file does not exist or if it exists and is
     *         successfully deleted. False otherwise.
     */
    //  public static boolean deleteFile (
    //        ResourceContext resourceContext,
    //    IFile file,
    //    IProgressMonitor progressMonitor,
    //    StatusMonitor statusMonitor )
    //    throws CoreException
    //    {
    //        if (file.exists())
    //        {
    //                if (!resourceContext.isOverwriteFilesEnabled()) {
    //                        int result = statusMonitor.reportStatus( new
    // Status(IStatus.WARNING,WebServicePlugin.ID,0,
    //                                                                 WebServicePlugin.getMessage("%MSG_ERROR_FILE_OVERWRITE_DISABLED",
    //                                                                 new Object[]
    // {file.getParent().getFullPath().toString(),file.getName()}),null),
    // getThreeStateFileOptions());
    //
    //                            if (result == IStatusDialogConstants.CANCEL_ID)
    //                        return false;
    //
    //                if ( result == IStatusDialogConstants.YES_TO_ALL_ID)
    //                                resourceContext.setOverwriteFilesEnabled(true);
    //                        }
    //                //We have permission to overwrite so check if file is read-only
    //                if (file.isReadOnly())
    //                {
    //                        if (!resourceContext.isCheckoutFilesEnabled()) {
    //                                        int result = statusMonitor.reportStatus( new
    // Status(IStatus.WARNING,WebServicePlugin.ID,0,
    //                                                                 WebServicePlugin.getMessage("%MSG_ERROR_FILE_CHECKOUT_DISABLED",
    //                                                                 new Object[]
    // {file.getParent().getFullPath().toString(),file.getName()}),null),
    // getThreeStateFileOptions());
    //                        if (result == IStatusDialogConstants.CANCEL_ID)
    //                        return false;
    //
    //                        if ( result == IStatusDialogConstants.YES_TO_ALL_ID)
    //                                resourceContext.setCheckoutFilesEnabled(true);
    //
    //                                }
    //                        IFile[] files = new IFile[1];
    //                        files[0] = file;
    //
    //                        if (
    // !statusMonitor.reportStatus(getWorkspace().validateEdit(files,null)))
    //                                            return false;
    //                }
    //                file.delete(true,progressMonitor);
    //                }
    //        //At this point, either the file did not exist or we successfully deleted
    // it. Return success.
    //        return true;
    //  }
    /**
     * Deletes a folder under a container.
     * 
     * @param folder -
     *            the IFolder to be deleted
     * @param progressMonitor
     * @param statusMonitor
     * @return True if the folder does not exist or if it exists and is
     *         successfully deleted along with its members. False otherwise.
     */
    //  public static boolean deleteFolder (
    //    ResourceContext resourceContext,
    //    IFolder folder,
    //    IProgressMonitor progressMonitor,
    //    StatusMonitor statusMonitor
    //  )
    //  throws CoreException
    //  {
    //    if (!folder.exists()) return true;
    //
    //    boolean deleted = true;
    //    IResource[] resources = folder.members();
    //    for (int i=0; i<resources.length; i++)
    //    {
    //      IResource resource = resources[i];
    //      if (resource instanceof IFile)
    //      {
    //        deleted = deleteFile(resourceContext, (IFile)resource, progressMonitor,
    // statusMonitor);
    //      }
    //      if (resource instanceof IFolder)
    //      {
    //        deleted = deleteFolder( resourceContext, (IFolder)resource,
    // progressMonitor, statusMonitor);
    //      }
    //
    //      if (!deleted) break;
    //    }
    //    if (deleted) {
    //      folder.delete(true, true, progressMonitor);
    //      return true;
    //    }
    //    else
    //      return false;
    //
    //  }
    /**
     * Deletes a set of files that are named in an index file located relative
     * to the plugin's installation location.
     * 
     * @param plugin
     *            The plugin containing the indexed file Must not be null.
     * @param sourcePath -
     *            relative path of the indexed file passing a null in has the
     *            same effect as passing a "." in
     * @param indexFilePath -
     *            the indexed filename Must not be null
     * @param targetPath -
     *            path containing the files named in the indexed file Must not
     *            be null, this path must end with a trailing separator
     * @param progressMonitor
     */

    //  public static void deleteIndexFilesFromOS (
    //    Plugin plugin,
    //    IPath indexFilePath,
    //    IPath targetPath
    //  )
    //  throws IOException {
    //    InputStream input = plugin.openStream(indexFilePath);
    //    Enumeration filenames = StringUtils.parseFilenamesFromStream(input);
    //    while (filenames.hasMoreElements()) {
    //      File targetFile =
    // targetPath.append((String)filenames.nextElement()).toFile();
    //      if (targetFile.exists())
    //        targetFile.delete();
    //    }
    //  }
    /**
     * Returns a URI reference to the given Eclipse resource, or null if no such
     * reference can be determined (for example, if the resource does not exist
     * in the underlying filesystem).
     * 
     * @param resource
     *            The resource.
     * @return The URI as a string, or null if there is no URI to the resource.
     */
    public static String getResourceURI(IResource resource) {
        String uri = null;
        IPath location = resource.getLocation();
        if (location != null) {
            uri = "file:" + location.toString();
        }
        return uri;
    }

    /**
     * Returns a URI reference to the given Eclipse resource using the
     * "platform:" protocol, or null if no such reference can be determined (for
     * example, if the resource does not exist in the underlying filesystem).
     * 
     * @param resource
     *            The resource.
     * @return The URI as a string, or null if there is no URI to the resource.
     */
    public static String getPlatformResourceURI(IResource resource) {
        String uri = null;
        IPath location = resource.getFullPath();
        if (location != null) {
            uri = "platform:/resource" + location.toString();
        }
        return uri;
    }

    /**
     * Returns the default binding namespace string given a Java bean name
     * (using the convention used by CTC in GM). e.g. Java bean MyClass result
     * in binding namespace of
     * "http://www.myclass.com/definitions/MyClassRemoteInterface"
     * 
     * @param beanName
     *            The java bean.
     * @return The binding namespace as a string.
     */
    public static String getBindingNamespace(String beanName) {
        return "http://www." + beanName.toLowerCase() + ".com/definitions/" + beanName + "RemoteInterface";
    }

    /**
     * Returns the default schema namespace string given a Java bean name (using
     * the convention used by CTC in GM). e.g. Java bean MyClass result in
     * schema namespace of
     * "http://www.myclass.com/schemas/MyClassRemoteInterface"
     * 
     * @param beanName
     *            The java bean.
     * @return The schemas namespace as a string.
     */
    public static String getSchemaNamespace(String beanName) {
        return "http://www." + beanName.toLowerCase() + ".com/schemas/" + beanName + "RemoteInterface";
    }

    //  public static Vector getThreeStateFileOptions() {
    //        Vector options = new Vector();
    //    options.add(new
    // StatusOption(IStatusDialogConstants.YES_ID,IStatusDialogConstants.YES_LABEL,"",""));
    //    options.add(new
    // StatusOption(IStatusDialogConstants.YES_TO_ALL_ID,IStatusDialogConstants.YES_TO_ALL_LABEL,"",""));
    //    options.add(new
    // StatusOption(IStatusDialogConstants.CANCEL_ID,IStatusDialogConstants.CANCEL_LABEL,"",""));
    //    return options;
    //  }

    //----------------------------------------------------------------------

    /**
     * Gets the SOAP rpcrouter servlet URL for the service project
     * 
     * @param project
     *            The project.
     * @param serverFactoryId
     *            The server factory id
     * @param server
     *            The server
     * @return The URL, possibly null.
     */

    public static String getServletURL(IProject project, String serverFactoryId, IServer server) {
        return getServletURL(getWebProjectURL(project, serverFactoryId, server));
    }

    public static String getServletURL(String webProjectURL) {
        if (webProjectURL == null)
            return null;
        else
            return webProjectURL + SERVLET_EXT;
    }

    /**
     * Gets the client Web project name
     * 
     * @param projectName
     *            The project name to base on.
     * @param typeId the webservice type id.
     * @return The client Web project name.
     * 
     * @deprecated
     */
    public static String getClientWebProjectName(String projectName, String typeId) {
        String baseClientWebProjectName = projectName + DEFAULT_CLIENT_WEB_PROJECT_EXT;
        IPath projectPath;
        IProject project;
        boolean foundWebProject = false;
        int i = 1;

        if (isSkeletonEJBType(typeId)) {
            // For the skeleton EJB scenario we need to create a slightly different
            // base name.  When the EJB project is created another project
            // is created with "Client" tacked onto the end.  We will
            // add "WS" to our client so we don't collide with the other
            // client project.
            baseClientWebProjectName = projectName + "WS" + DEFAULT_CLIENT_WEB_PROJECT_EXT;
        }

        String clientWebProjectName = baseClientWebProjectName;

        while (!foundWebProject) {
            projectPath = new Path(clientWebProjectName).makeAbsolute();
            project = ResourceUtils.getProjectOf(projectPath);

            if (project.exists() && !ResourceUtils.isWebProject(project)) {
                clientWebProjectName = baseClientWebProjectName + i;
                i++;
            } else {
                foundWebProject = true;
            }
        }

        return clientWebProjectName;
    }

    public static String[] getClientProjectComponentName(String projectName, String componentName, boolean isEJB) {
        String clientProjectName = null;
        String clientComponentName = null;
        if (isEJB) {
            clientProjectName = projectName + DEFAULT_CLIENT_EJB_PROJECT_EXT;
            clientComponentName = componentName + DEFAULT_CLIENT_EJB_PROJECT_EXT;
        } else {
            clientProjectName = projectName + DEFAULT_CLIENT_WEB_PROJECT_EXT;
            //      String baseName = clientProjectName;
            clientComponentName = componentName + DEFAULT_CLIENT_WEB_PROJECT_EXT;
            //      String baseCompName = clientComponentName;
        }

        //TODO we may want to remove this if statement once defect 103366 is resolved.
        //TODO:  Defect 107997 - Revisit prject and module creation logic
        //    if( !FlexibleJavaProjectPreferenceUtil.getMultipleModulesPerProjectProp() )
        //    {
        //      clientComponentName = clientProjectName;   
        //    }

        //    boolean  foundWebProject     = false;
        //    int      i                   = 1;
        //    
        //    while (!foundWebProject) 
        //    {
        //      IPath projectPath = new Path(clientProjectName).makeAbsolute();
        //      IProject project = ResourceUtils.getProjectOf(projectPath);
        //      
        //      if (project.exists()) 
        //      {
        //        clientProjectName = baseName + i;
        //        clientComponentName = baseCompName + i;
        //        i++;
        //      }
        //      else 
        //      {
        //        foundWebProject = true;
        //      }
        //    }

        return new String[] { clientProjectName, clientComponentName };
    }

    /**
     * 
     * @param typeID
     * @return
     * 
     * @deprecated
     */
    public static boolean isSkeletonEJBType(String typeID) {
        return typeID.equals("org.eclipse.jst.ws.type.wsdl.ejb");
    }

    public static String getDefaultEJBProjectName() {
        return DEFAULT_EJB_PROJECT_NAME;
    }

    public static String getDefaultEJBComponentName() {
        return DEFAULT_EJB_COMPONENT_NAME;
    }

    public static String getDefaultWebProjectName() {
        return DEFAULT_WEB_PROJECT_NAME;
    }

    public static String getDefaultWebComponentName() {
        return DEFAULT_WEB_COMPONENT_NAME;
    }

    public static String getDefaultClientExtension() {
        return DEFAULT_CLIENT_WEB_PROJECT_EXT;
    }

    /**
     * 
     * @param projectName
     * @return
     * 
     */
    public static String getRouterProjectName(String projectName) {
        return projectName + DEFAULT_ROUTER_PROJECT_EXT;
    }

    public static String getDefaultServiceEARProjectName() {
        return DEFAULT_SERVICE_EAR_PROJECT_NAME;
    }

    public static String getDefaultServiceEARComponentName() {
        return DEFAULT_SERVICE_EAR_COMPONENT_NAME;
    }

    public static String getDefaultClientEARProjectName() {
        return DEFAULT_CLIENT_EAR_PROJECT_NAME;
    }

    public static String getDefaultClientEARComponentName() {
        return DEFAULT_CLIENT_EAR_COMPONENT_NAME;
    }

    public static String getDefaultEARExtension() {
        return DEFAULT_EAR_EXT;
    }
}