in.cypal.studio.gwt.core.common.Util.java Source code

Java tutorial

Introduction

Here is the source code for in.cypal.studio.gwt.core.common.Util.java

Source

/*
 * Copyright 2006 - 2008 Cypal Solutions (tools@cypal.in)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package in.cypal.studio.gwt.core.common;

import in.cypal.studio.gwt.core.Activator;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
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.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
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;

/**
 * @author Prakash G.R.
 * 
 */
public class Util {

    public static final String SRC_FOLDER = "src";
    public static final String BIN_FOLDER = "bin";
    public static final IStatus okStatus = Status.OK_STATUS;
    public static final IStatus errorStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, "Error", null);

    public static IPath getGwtUserLibPath() {
        return new Path(Constants.GWT_HOME_CPE).append("gwt-user.jar");//$NON-NLS-1$
    }

    public static IPath getGwtServletLibPath() {
        return new Path(Constants.GWT_HOME_CPE).append("gwt-servlet.jar");//$NON-NLS-1$
    }

    public static IPath getGwtDevLibPath() {
        IPath gwtHome = JavaCore.getClasspathVariable(Constants.GWT_HOME_CPE);
        IPath devLibPath;
        if (Platform.getOS().equals(Platform.OS_MACOSX))
            devLibPath = gwtHome.append("gwt-dev-mac.jar");//$NON-NLS-1$
        else if (Platform.getOS().equals(Platform.OS_WIN32))
            devLibPath = gwtHome.append("gwt-dev-windows.jar");//$NON-NLS-1$
        else
            // the default is linux
            devLibPath = gwtHome.append("gwt-dev-linux.jar"); //$NON-NLS-1$
        return devLibPath;
    }

    public static boolean isModuleXml(IResource resource) {

        boolean isModuleXml;
        if (resource != null && resource instanceof IFile && resource.getName().endsWith("gwt.xml"))//$NON-NLS-1$
            isModuleXml = true;
        else
            isModuleXml = false;

        return isModuleXml;
    }

    public static IJavaProject[] getGwtProjects() {

        IJavaProject[] gwtProjects = new IJavaProject[0];
        try {
            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
            IJavaModel javaModel = JavaCore.create(root);
            gwtProjects = filterGwtProjects(javaModel.getJavaProjects());
        } catch (JavaModelException e) {
            Activator.logException(e);
        }
        return gwtProjects;
    }

    public static IJavaProject[] filterGwtProjects(IJavaProject[] javaProjects) {

        List gwtProjects = new ArrayList(javaProjects.length);

        for (int i = 0; i < javaProjects.length; i++) {

            try {
                if (javaProjects[i].getProject().hasNature(Constants.NATURE_ID)) {
                    gwtProjects.add(javaProjects[i]);
                }
            } catch (CoreException e) {
                Activator.logException(e);
            }
        }

        return (IJavaProject[]) gwtProjects.toArray(new IJavaProject[gwtProjects.size()]);

    }

    public static String getOutputLocation(String projectName, String moduleName) {

        return getOutputLocation(Util.getProject(projectName), moduleName);
    }

    private static String getOutputLocation(IProject project, String moduleName) {

        IPath outputDir = project.getLocation().append(getGwtOutputFolder());
        return outputDir.toPortableString();
    }

    public static boolean hasGwtNature(IProject project) {

        boolean hasGwtNature;
        try {
            hasGwtNature = project.isAccessible() && project.hasNature(Constants.NATURE_ID);
        } catch (Exception e) {
            Activator.logException(e);
            hasGwtNature = false;
        }
        return hasGwtNature;
    }

    public static boolean hasGwtNature(IJavaProject javaProject) {

        boolean hasGwtNature = false;
        try {
            if (javaProject != null) {
                hasGwtNature = hasGwtNature(javaProject.getProject());
            }
        } catch (Exception e) {
            Activator.logException(e);
        }
        return hasGwtNature;
    }

    public static IProgressMonitor getNonNullMonitor(IProgressMonitor monitor) {

        if (monitor == null)
            monitor = new NullProgressMonitor();

        return monitor;
    }

    public static List findModules(IJavaProject javaProject) throws CoreException {

        List moduleFiles = new ArrayList();

        for (int i = 0; i < javaProject.getPackageFragmentRoots().length; i++) {

            IPackageFragmentRoot aRoot = javaProject.getPackageFragmentRoots()[i];
            // check only in source folders. Skip others
            if (aRoot.getKind() != IPackageFragmentRoot.K_SOURCE) {
                continue;
            }

            for (int j = 0; j < aRoot.getChildren().length; j++) {
                IJavaElement aPackage = aRoot.getChildren()[j];
                // look only for packages. Skip others
                if (!(aPackage instanceof IPackageFragment)) {
                    continue;
                }
                Object[] nonJavaResources = ((IPackageFragment) aPackage).getNonJavaResources();
                for (int k = 0; k < nonJavaResources.length; k++) {

                    Object aResource = nonJavaResources[k];
                    // look only files. Skip others
                    if (!(aResource instanceof IFile)) {
                        continue;
                    }

                    IFile aFile = (IFile) aResource;
                    if (aFile.getName().endsWith(Constants.GWT_XML_EXT)) {
                        moduleFiles.add(aFile);
                    }
                }
            }
        }
        return moduleFiles;
    }

    public static List findRemoteServices(IJavaProject javaProject) throws CoreException {

        List remoteServiceFiles = new ArrayList();

        IPackageFragmentRoot[] packageFragmentRoots = javaProject.getPackageFragmentRoots();
        for (int i = 0; i < packageFragmentRoots.length; i++) {
            IPackageFragmentRoot aRoot = packageFragmentRoots[i];
            // check only in source folders. Skip others
            if (aRoot.getKind() != IPackageFragmentRoot.K_SOURCE) {
                continue;
            }

            IJavaElement[] children = aRoot.getChildren();
            for (int j = 0; j < children.length; j++) {

                IJavaElement aPackage = children[j];
                // look only for packages. Skip others
                if (!(aPackage instanceof IPackageFragment)) {
                    continue;
                }

                ICompilationUnit[] compilationUnits = ((IPackageFragment) aPackage).getCompilationUnits();
                for (int k = 0; k < compilationUnits.length; k++) {

                    ICompilationUnit cu = compilationUnits[k];

                    IResource resource = cu.getCorrespondingResource();
                    if (aPackage.getResource().getName().equals(Constants.CLIENT_PACKAGE)
                            && resource instanceof IFile && resource.getName().endsWith(".java")) {//$NON-NLS-1$
                        // java file. Check whether its a remote service ...

                        // for every type declared in the java file
                        IType[] types = cu.getTypes();
                        for (int l = 0; l < types.length; l++) {
                            IType someType = types[l];
                            // for every interface implemented by that type

                            String[] superInterfaceNames = someType.getSuperInterfaceNames();
                            for (int m = 0; m < superInterfaceNames.length; m++) {
                                String aSuperInterface = superInterfaceNames[m];
                                if (aSuperInterface.equals(Constants.REMOTE_SERVICE_CLASS)) {
                                    remoteServiceFiles.add(resource);
                                }
                            }
                        }
                    }
                }
            }
        }
        return remoteServiceFiles;
    }

    public static boolean isRemoteService(IResource resource) throws JavaModelException {

        boolean isRemoteService = false;
        if (resource != null && resource instanceof IFile && resource.getName().endsWith(".java")) {//$NON-NLS-1$

            ICompilationUnit cu = (ICompilationUnit) JavaCore.create(resource);
            isRemoteService = isRemoteService(cu);
        }

        return isRemoteService;
    }

    public static boolean isRemoteService(ICompilationUnit cu) throws JavaModelException {

        boolean isRemoteService = false;
        if (cu != null) {
            IType[] types = cu.getTypes();
            for (int i = 0; i < types.length; i++) {
                IType someType = types[i];
                // for every interface implemented by that type
                String[] superInterfaceNames = someType.getSuperInterfaceNames();
                for (int j = 0; j < superInterfaceNames.length; j++) {
                    String aSuperInterface = superInterfaceNames[j];
                    if (aSuperInterface.equals(Constants.REMOTE_SERVICE_CLASS)) {
                        isRemoteService = true;
                    }
                }
            }
        }
        return isRemoteService;
    }

    public static boolean isGwtModuleFile(IFile file) {

        boolean isGwtModuleFile;
        if (file != null && file.getName().endsWith(Constants.GWT_XML_EXT)) {
            isGwtModuleFile = true;
        } else {
            isGwtModuleFile = false;
        }

        return isGwtModuleFile;
    }

    public static String getSimpleName(IFile file) {

        String simpleName = "";//$NON-NLS-1$
        if (file != null) {
            simpleName = file.getName();
            int index = simpleName.indexOf(Constants.GWT_XML_EXT);
            simpleName = simpleName.substring(0, index - 1);
        }
        return simpleName;
    }

    public static String getQualifiedName(IFile file) {

        String qualifiedName = "";//$NON-NLS-1$
        if (file != null) {
            StringBuilder builder = new StringBuilder();

            String[] segments = getSegmentsFromSourceFolder(file);
            for (int i = 0; i < segments.length; i++) {
                builder.append(segments[i]);
                builder.append('.');
            }
            qualifiedName = builder.substring(0, builder.length() - Constants.GWT_XML_EXT.length() - 2);
        }
        return qualifiedName;

    }

    /**
     * @param file
     * @return
     */
    private static String[] getSegmentsFromSourceFolder(IFile file) {

        int removeCount = 1;// by default, just remove the source folder;
        try {
            IJavaProject javaProject = JavaCore.create(file.getProject());
            IClasspathEntry[] classpathEntries = javaProject.getRawClasspath();
            for (int i = 0; i < classpathEntries.length; i++) {

                if (classpathEntries[i].getEntryKind() != IClasspathEntry.CPE_SOURCE)
                    continue;// we are interested only in source folders
                IPath path = classpathEntries[i].getPath();
                if (path.isPrefixOf(file.getFullPath())) {
                    removeCount = path.segmentCount() - 1;
                }

            }
        } catch (Throwable e) {
            Activator.logException(new Exception(e));
        }

        IPath filePath = file.getProjectRelativePath().removeFirstSegments(removeCount);
        return filePath.segments();
    }

    public static String getGwtOutputFolder() {
        return Preferences.getString(Constants.GWT_OUTPUT_PREFERENCE);

    }

    public static boolean isGwtHomeSet() {

        boolean set = false;
        if (JavaCore.getClasspathVariable(Constants.GWT_HOME_CPE) != null) {
            File gwtUserJar = new File(Preferences.getString(Constants.GWT_HOME_PREFERENCE) + "/gwt-user.jar");
            set = gwtUserJar.exists();
        }
        return set;
    }

    public static IProject getProject(String name) {
        return ResourcesPlugin.getWorkspace().getRoot().getProject(name);
    }

    public static IStatus getErrorStatus(String errorMessage) {
        return new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.OK, errorMessage, null);
    }

    public static void deleteModules(IProject project) throws CoreException {

    }

    public static void createModuleEntry(IProject project, String moduleName) throws CoreException {

        IVirtualComponent component = ComponentCore.createComponent(project);
        IVirtualFolder folder = component.getRootFolder().getFolder("/");
        IContainer[] underlyingFolders = folder.getUnderlyingFolders();
        IResource[] underlyingResources = folder.getUnderlyingResources();
        IVirtualResource[] members = folder.members();
        // IVirtualResource[] members = folder.members();
        // IVirtualFolder folder2 = folder.getFolder(new
        // Path(getGwtOutputFolder()).append(moduleName));
        // IContainer[] underlyingFolders = folder.getUnderlyingFolders();
        IVirtualFolder moduleOutputFolder = component.getRootFolder().getFolder("/"); //$NON-NLS-1$
        moduleOutputFolder.createLink(new Path(getGwtOutputFolder()).append(moduleName), IResource.FORCE, null);

    }
}