Java tutorial
/******************************************************************************* * Copyright (c) 2006, 2010 EclipseGuru 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: * EclipseGuru - initial API and implementation *******************************************************************************/ package org.eclipseguru.gwt.core; import org.eclipseguru.gwt.core.preferences.GwtCorePreferenceConstants; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IStorage; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ProjectScope; 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.Path; import org.eclipse.core.runtime.preferences.IEclipsePreferences; 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.JavaCore; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; /** * A GWT Project */ public class GwtProject extends GwtElement { /** * Adds the GWT nature to the project. * * @param project * the project * @param monitor * the progress monitor */ public static void addGwtNature(final IProject project, final IProgressMonitor monitor) throws CoreException { // get description and old natures final IProjectDescription description = project.getDescription(); final String[] prevNatures = description.getNatureIds(); // create array for new natures final String[] newNatures = new String[prevNatures.length + 1]; System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length); // add GWT nature newNatures[prevNatures.length] = GwtCore.NATURE_ID; // set new natures description.setNatureIds(newNatures); // make writable if (project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME).isReadOnly()) { ResourcesPlugin.getWorkspace() .validateEdit(new IFile[] { project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME) }, null); } // save description project.setDescription(description, IResource.FORCE, null); } /** * Indicates if the project is a valid GWT project, i.e. has the GWT nature * attached and enabled. * * @param project * @return <code>true</code> if the project nature is attached an enabled, * <code>false</code> otherwise */ public static boolean hasGwtNature(final IProject project) { if (!project.isAccessible()) { return false; } try { return project.isNatureEnabled(GwtCore.NATURE_ID); } catch (final CoreException e) { // project is closed or does not exists return false; } } /** project */ private final IProject project; /** javaProject */ private final IJavaProject javaProject; /** modules */ private GwtModule[] modules; /** includedModules */ private GwtModule[] includedModules; /** * Creates a new instance. * * @param parent */ GwtProject(final IProject project, final GwtModel parent) { super(parent); if (null == project) { throw new IllegalArgumentException("project cannot be null"); } this.project = project; javaProject = JavaCore.create(project); } /** * Creates a binary module. * * @param moduleDescriptor * @param packageFragment * @return */ GwtModule createBinaryModule(final IStorage moduleDescriptor, final IPackageFragment packageFragment) { return new GwtModule(moduleDescriptor, packageFragment, this); } /** * Creates a GWT module for the specified module descriptor. * * @param file * @return */ GwtModule createModule(final IFile moduleDescriptor) { return new GwtModule(moduleDescriptor, this); } /** * Indicates if the project exists. * * @return <code>true</code> if the project exists */ public boolean exists() { return project.exists(); } /** * Finds all included modules. * * @return */ protected GwtModule[] findIncludedModules() { final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); final GwtModel model = (GwtModel) getParent(); final IEclipsePreferences preferences = new ProjectScope(project).getNode(GwtCore.PLUGIN_ID); final List<GwtModule> modules = new ArrayList<GwtModule>(5); final String includedModulesString = preferences.get(GwtCorePreferenceConstants.PREF_INCLUDED_MODULES, null); if (null != includedModulesString) { final StringTokenizer includedModulesTokenizer = new StringTokenizer(includedModulesString, ";"); while (includedModulesTokenizer.hasMoreTokens()) { final String token = includedModulesTokenizer.nextToken(); final IPath path = Path.fromPortableString(token); if (root.getWorkspace().validatePath(path.toString(), IResource.FILE).isOK()) { final IFile file = root.getFile(path); if (file.isAccessible() && GwtUtil.isModuleDescriptor(file)) { final GwtProject project = model.createProject(file); modules.add(project.createModule(file)); } } } } return modules.toArray(new GwtModule[modules.size()]); } /** * @param project * @return * @throws CoreException */ protected GwtModule[] findModules() throws CoreException { final IJavaProject javaProject = getJavaProject(); final List<GwtModule> moduleFiles = new ArrayList<GwtModule>(); for (final IPackageFragmentRoot aRoot : javaProject.getPackageFragmentRoots()) { // check only in source folders. Skip others if (aRoot.getKind() != IPackageFragmentRoot.K_SOURCE) { continue; } for (final IJavaElement aPackage : aRoot.getChildren()) { // look only for packages. Skip others if (aPackage.getElementType() != IJavaElement.PACKAGE_FRAGMENT) { continue; } for (final Object aResource : ((IPackageFragment) aPackage).getNonJavaResources()) { // look only files. Skip others if (!(aResource instanceof IFile)) { continue; } final IFile aFile = (IFile) aResource; if (GwtUtil.isModuleDescriptor(aFile)) { moduleFiles.add(createModule(aFile)); } } } } return moduleFiles.toArray(new GwtModule[moduleFiles.size()]); } /** * Returns the list of included modules. * * @param project * @return the list of included modules */ public GwtModule[] getIncludedModules() { if (null == includedModules) { includedModules = findIncludedModules(); } return includedModules; } /** * Returns the {@link IJavaProject}. * * @return the Java project */ public IJavaProject getJavaProject() { return javaProject; } /** * Returns the module with the specified id, returns <code>null</code> if no * such module could be found in this project. * * @param moduleId * @return the module with the specified id or <code>null</code> if no such * module could be found in this project. * @throws GwtModelException * if an error occured while accessing the project */ public GwtModule getModule(final String moduleId) throws GwtModelException { final GwtModule[] modules = getModules(); for (final GwtModule module : modules) { if (module.getModuleId().equals(moduleId)) { return module; } } return null; } /** * Returns the modules of this project. * * @return the modules * @throws GwtModelException * if an error occured while accessing the project */ public GwtModule[] getModules() throws GwtModelException { if (null == modules) { try { modules = findModules(); } catch (final CoreException e) { throw newGwtModelException(e); } } return modules; } /** * Returns the project name. * * @return the project name */ @Override public String getName() { return project.getName(); } /** * Returns the project preferences. * <p> * Returns <code>null</code> if the project is not a valid GWT project. * </p> * * @return the project preferences (maybe <code>null</code>) */ public IEclipsePreferences getProjectPreferences() { if (!hasGwtNature(project)) { return null; } return new ProjectScope(project).getNode(GwtCore.PLUGIN_ID); } /** * Returns the {@link IProject}. * * @return the project resource */ public IProject getProjectResource() { return project; } /* * (non-Javadoc) * @see org.eclipseguru.gwt.core.GwtElement#getType() */ @Override public int getType() { return GWT_PROJECT; } /** * Sets the included modules for the specified project. * * @param project */ public void setIncludedModules(final List modules) { final IEclipsePreferences projectPreferences = new ProjectScope(project).getNode(GwtCore.PLUGIN_ID); final StringBuilder builder = new StringBuilder(); for (int i = 0; i < modules.size(); i++) { final GwtModule module = (GwtModule) modules.get(i); if (i > 0) { builder.append(';'); } builder.append(module.getModuleDescriptor().getFullPath().toPortableString()); } if (builder.length() > 0) { projectPreferences.put(GwtCorePreferenceConstants.PREF_INCLUDED_MODULES, builder.toString()); } else { projectPreferences.remove(GwtCorePreferenceConstants.PREF_INCLUDED_MODULES); } } }