Package org.objectstyle.wolips.locate.result

Source Code of org.objectstyle.wolips.locate.result.LocalizedComponentsLocateResult

/* ====================================================================
*
* The ObjectStyle Group Software License, Version 1.0
*
* Copyright (c) 2005 - 2006 The ObjectStyle Group,
* and individual authors of the software.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in
*    the documentation and/or other materials provided with the
*    distribution.
*
* 3. The end-user documentation included with the redistribution, if
*    any, must include the following acknowlegement:
*       "This product includes software developed by the
*        ObjectStyle Group (http://objectstyle.org/)."
*    Alternately, this acknowlegement may appear in the software itself,
*    if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "ObjectStyle Group" and "Cayenne"
*    must not be used to endorse or promote products derived
*    from this software without prior written permission. For written
*    permission, please contact andrus@objectstyle.org.
*
* 5. Products derived from this software may not be called "ObjectStyle"
*    nor may "ObjectStyle" appear in their names without prior written
*    permission of the ObjectStyle Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED.  IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the ObjectStyle Group.  For more
* information on the ObjectStyle Group, please see
* <http://objectstyle.org/>.
*
*/
package org.objectstyle.wolips.locate.result;

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.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeHierarchy;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.objectstyle.wolips.locate.LocateException;
import org.objectstyle.wolips.locate.LocatePlugin;

public class LocalizedComponentsLocateResult extends AbstractLocateResult {
  private List<IFolder> components = new ArrayList<IFolder>();

  private IFile dotJava;

  private IFile dotGroovy;

  // private IType dotJavaType;

  private IFile dotApi;

  private String[] superclasses = new String[] { "com.webobjects.appserver.WOElement" };

  public LocalizedComponentsLocateResult() {
    super();
  }
 
  public String getName() {
    String name = null;
    IFile javaFile = getDotJava();
    if (javaFile != null) {
      name = LocatePlugin.getDefault().fileNameWithoutExtension(javaFile);
    }
    else {
      IFolder[] componentFolders = getComponents();
      if (componentFolders != null) {
        for (IFolder componentFolder : componentFolders) {
          name = LocatePlugin.getDefault().fileNameWithoutExtension(componentFolder);
          break;
        }
      }
      if (name == null) {
        IFile apiFile = getDotApi();
        if (apiFile != null) {
          name = LocatePlugin.getDefault().fileNameWithoutExtension(javaFile);
        }
      }
    }
    if (name == null) {
      name = "Unknown Component";
    }
    return name;
  }

  public void add(IResource resource) throws LocateException {
    super.add(resource);
    if (resource.getType() == IResource.FOLDER) {
      components.add((IFolder) resource);
    } else if (resource.getType() == IResource.FILE) {
      IFile file = (IFile) resource;
      String extension = resource.getFileExtension();
      if (extension.equals("java")) {
        if (dotJava != null) {
          IJavaElement javaElement = JavaCore.create(file);
          try {
            IJavaProject javaProject = javaElement.getJavaProject();
            if (javaProject != null && javaProject.isOnClasspath(javaElement)) {
              if (!isValidSubclass(javaElement)) {
                file = null;
              }
            } else {
              file = null;
            }
          } catch (JavaModelException e) {
            file = null;
            LocatePlugin.getDefault().log(e);
          }
        }
        if (file != null && dotJava != null) {
          IJavaElement javaElement = JavaCore.create(dotJava);
          try {
            IJavaProject javaProject = javaElement.getJavaProject();
            if (javaProject != null && javaProject.isOnClasspath(javaElement)) {
              if (!isValidSubclass(javaElement)) {
                dotJava = null;
              }
            } else {
              dotJava = null;
            }
          } catch (JavaModelException e) {
            dotJava = null;
            LocatePlugin.getDefault().log(e);
          }
        }
        if (file != null && dotJava != null) {
          String message = "Duplicate located: " + dotJava + " " + file;
          alert(message);
          throw new LocateException(message);
        }
        if (file != null) {
          dotJava = file;
        }
      } else if (extension.equals("groovy")) {
        if (dotGroovy != null) {
          String message = "Duplicate located: " + dotGroovy + " " + file;
          alert(message);
          throw new LocateException(message);
        }
        dotGroovy = file;
      } else if (extension.equals("api")) {
        if (dotApi != null) {
          String message = "Duplicate located: " + dotApi + " " + file;
          alert(message);
          //throw new LocateException(message);
        } else {
          dotApi = file;
        }
      } else {
        String message = "unknown extension on " + file;
        alert(message);
        throw new LocateException(message);
      }

    } else {
      String message = "unsupported type " + resource;
      alert(message);
      throw new LocateException(message);
    }
  }

  private void alert(final String message) {
    Display.getDefault().asyncExec(new Runnable() {

      public void run() {
        MessageDialog.openError(null, "", message);
      }

    });
  }

  public IFolder[] getComponents() {
    return components.toArray(new IFolder[components.size()]);
  }

  public IFile getDotApi() {
    return dotApi;
  }

  public IFile getDotApi(boolean guessIfMissing) throws CoreException {
    IFile apiFile = dotApi;
    if (apiFile == null && guessIfMissing) {
      IFile firstHtmlFile = getFirstHtmlFile();
      IContainer apiFolder = null;
      if (firstHtmlFile != null) {
        apiFolder = firstHtmlFile.getParent().getParent();
      }
      if (apiFolder != null) {
        apiFile = apiFolder.getFile(new Path(LocatePlugin.getDefault().fileNameWithoutExtension(firstHtmlFile) + ".api"));
      }
    }
    return apiFile;
  }

  public IFile getDotJava() {
    return dotJava;
  }

  public IType getDotJavaType() {
    IType dotJavaType = null;
    // MS: Don't hold onto java types
    // if (dotJavaType == null) {
    IFile javaFile = getDotJava();
    if (javaFile != null) {
      try {
          IJavaElement javaElement = JavaCore.create(javaFile);
          if (javaElement instanceof ICompilationUnit) {
            IType[] types = ((ICompilationUnit) javaElement).getTypes();
            // NTS: What do we do about multiple types in a file??
            if (types.length > 0) {
              dotJavaType = types[0];
            }
          }
      } catch (JavaModelException e) {
        LocatePlugin.getDefault().log(new RuntimeException(javaFile.getLocation() + " had a problem.", e));
      }
    }
    // }
    return dotJavaType;
  }

  public IFile getDotGroovy() {
    return dotGroovy;
  }

  public IFile getFirstHtmlFile() throws CoreException {
    IFile htmlFile;
    if (components.size() > 0) {
      IFolder componentFolder = components.get(0);
      htmlFile = LocalizedComponentsLocateResult.getHtml(componentFolder);
    } else {
      htmlFile = null;
    }
    return htmlFile;
  }

  public IFile getFirstWodFile() throws CoreException {
    IFile wodFile;
    if (components.size() > 0) {
      IFolder componentFolder = components.get(0);
      wodFile = LocalizedComponentsLocateResult.getWod(componentFolder);
    } else {
      wodFile = null;
    }
    return wodFile;
  }

  public IFile getFirstWooFile() throws CoreException {
    IFile wooFile;
    if (components.size() > 0) {
      IFolder componentFolder = components.get(0);
      wooFile = LocalizedComponentsLocateResult.getWoo(componentFolder);
    } else {
      wooFile = null;
    }
    return wooFile;
  }

  public boolean isValid() {
    boolean valid = true;

    for (IFolder component : components) {
      if (!component.exists()) {
        valid = false;
      }
    }

    if (dotApi == null) {
      try {
        IFile guessDotApi = getDotApi(true);
        if (guessDotApi != null && guessDotApi.exists()) {
          valid = false;
        }
      } catch (CoreException e) {
        e.printStackTrace();
      }
    } else if (!dotApi.exists()) {
      valid = false;
    }

    if (dotJava != null && !dotJava.exists()) {
      valid = false;
    }

    return valid;
  }

  public static IFile getHtml(IFolder component) throws CoreException {
    return LocalizedComponentsLocateResult.getMemberWithExtension(component, "html", true);
  }

  public static IFile getWod(IFolder component) throws CoreException {
    return LocalizedComponentsLocateResult.getMemberWithExtension(component, "wod", true);
  }

  public static IFile getWoo(IFolder component) throws CoreException {
    return LocalizedComponentsLocateResult.getMemberWithExtension(component, "woo", false);
  }

  private static IFile getMemberWithExtension(IFolder folder, String extension, boolean mustExist) throws CoreException {
    IResource[] member = folder.members();
    for (int i = 0; i < member.length; i++) {
      IResource resource = member[i];
      String fileExtension = resource.getFileExtension();
      if (resource.getType() == IResource.FILE && fileExtension != null && fileExtension.equalsIgnoreCase(extension)) {
        return (IFile) resource;
      }

    }
    if (!mustExist) {
      return folder.getFile(LocatePlugin.getDefault().fileNameWithoutExtension(folder.getName()) + "." + extension);
    }
    return null;
  }

  private boolean isValidSubclass(IJavaElement javaElement) throws JavaModelException {
    if (superclasses == null || superclasses.length == 0) {
      return true;
    }
    ICompilationUnit compilationUnit = (ICompilationUnit) javaElement;
    IType typeToCeck = compilationUnit.findPrimaryType();
    ITypeHierarchy typeHierarchy = typeToCeck.newSupertypeHierarchy(new NullProgressMonitor());
    IType[] types = typeHierarchy.getAllClasses();
    for (int i = 0; i < types.length; i++) {
      IType type = types[i];
      for (int j = 0; j < superclasses.length; j++) {
        String superclass = superclasses[j];
        if (type.getFullyQualifiedName().equals(superclass)) {
          return true;
        }

      }
    }
    return false;
  }
}
TOP

Related Classes of org.objectstyle.wolips.locate.result.LocalizedComponentsLocateResult

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.