Package org.objectstyle.wolips.launching.classpath

Source Code of org.objectstyle.wolips.launching.classpath.WORuntimeClasspathEntryResolver

package org.objectstyle.wolips.launching.classpath;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.launching.LaunchingMessages;
import org.eclipse.jdt.internal.launching.LaunchingPlugin;
import org.eclipse.jdt.internal.launching.RuntimeClasspathEntry;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
import org.eclipse.jdt.launching.IRuntimeClasspathEntryResolver2;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.JavaRuntime;
import org.objectstyle.wolips.core.resources.types.project.ProjectAdapter;
import org.objectstyle.wolips.jdt.classpath.WOFrameworkClasspathContainer;

/**
* Default resolver for a contributed classpath entry
*/
public class WORuntimeClasspathEntryResolver implements IRuntimeClasspathEntryResolver2 {
  /**
   * Performs default resolution for a container entry.
   * Delegates to the Java model.
   */
 
  public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(IRuntimeClasspathEntry entry, ILaunchConfiguration configuration) throws CoreException {
    IJavaProject project = entry.getJavaProject();
    if (project == null) {
      project = JavaRuntime.getJavaProject(configuration);
    }
    if (project == null || entry == null) {
      // cannot resolve without entry or project context
      return new IRuntimeClasspathEntry[0];
    }
    IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), project);
    if (container == null) {
      abort(MessageFormat.format(LaunchingMessages.JavaRuntime_Could_not_resolve_classpath_container___0__1, new Object[] { entry.getPath().toString() }), null);
      // execution will not reach here - exception will be thrown
      return null;
    }
    IClasspathEntry[] cpes = container.getClasspathEntries();
    int property = -1;
    switch (container.getKind()) {
    case IClasspathContainer.K_APPLICATION:
      property = IRuntimeClasspathEntry.USER_CLASSES;
      break;
    case IClasspathContainer.K_DEFAULT_SYSTEM:
      property = IRuntimeClasspathEntry.STANDARD_CLASSES;
      break;
    case IClasspathContainer.K_SYSTEM:
      property = IRuntimeClasspathEntry.BOOTSTRAP_CLASSES;
      break;
    }
    List<IRuntimeClasspathEntry> resolved = new ArrayList<IRuntimeClasspathEntry>(cpes.length);
    for (IClasspathEntry cpe : cpes) {
      if (cpe.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
        IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(cpe.getPath().segment(0));
        IJavaProject jp = JavaCore.create(p);
        IRuntimeClasspathEntry classpath = JavaRuntime.newDefaultProjectClasspathEntry(jp);
        IRuntimeClasspathEntry[] entries = JavaRuntime.resolveRuntimeClasspathEntry(classpath, jp);
        for (IRuntimeClasspathEntry e : entries) {
          if (!resolved.contains(e)) {
            resolved.add(e);
          }
        }
      } else {
        IRuntimeClasspathEntry e = new RuntimeClasspathEntry(cpe);
        if (!resolved.contains(e)) {
          resolved.add(e);
        }
      }
    }
    // set classpath property
    IRuntimeClasspathEntry[] result = new IRuntimeClasspathEntry[resolved.size()];
    for (int i = 0; i < result.length; i++) {
      result[i] = resolved.get(i);
      result[i].setClasspathProperty(property);
    }
    return result;  }

  public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(IRuntimeClasspathEntry entry, IJavaProject project) throws CoreException {
    if (project == null || entry == null) {
      // cannot resolve without entry or project context
      return new IRuntimeClasspathEntry[0];
    }
    ProjectAdapter projectAdapter = (ProjectAdapter)project.getProject().getAdapter(ProjectAdapter.class);
    IClasspathEntry cp = entry.getClasspathEntry();
    if (projectAdapter != null && projectAdapter.isFramework()) {
      if (cp != null && !cp.isExported() && cp.getPath() != null && cp.getPath().segmentCount() > 0 && WOFrameworkClasspathContainer.ID.equals(cp.getPath().segment(0))) {
        return new IRuntimeClasspathEntry[0];
      }
    }
    IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), project);
    if (container == null) {
      abort(MessageFormat.format(LaunchingMessages.JavaRuntime_Could_not_resolve_classpath_container___0__1, new Object[] { entry.getPath().toString() }), null);
      // execution will not reach here - exception will be thrown
      return null;
    }
    IClasspathEntry[] cpes = container.getClasspathEntries();
    int property = -1;
    switch (container.getKind()) {
    case IClasspathContainer.K_APPLICATION:
      property = IRuntimeClasspathEntry.USER_CLASSES;
      break;
    case IClasspathContainer.K_DEFAULT_SYSTEM:
      property = IRuntimeClasspathEntry.STANDARD_CLASSES;
      break;
    case IClasspathContainer.K_SYSTEM:
      property = IRuntimeClasspathEntry.BOOTSTRAP_CLASSES;
      break;
    }
    List<IRuntimeClasspathEntry> resolved = new ArrayList<IRuntimeClasspathEntry>(cpes.length);
    for (IClasspathEntry cpe : cpes) {
      if (cpe.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
        IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(cpe.getPath().segment(0));
        IJavaProject jp = JavaCore.create(p);
        IRuntimeClasspathEntry classpath = JavaRuntime.newDefaultProjectClasspathEntry(jp);
        IRuntimeClasspathEntry[] entries = JavaRuntime.resolveRuntimeClasspathEntry(classpath, jp);
        for (IRuntimeClasspathEntry e : entries) {
          if (!resolved.contains(e)) {
            resolved.add(e);
          }
        }
      } else {
        IRuntimeClasspathEntry e = new RuntimeClasspathEntry(cpe);
        if (!resolved.contains(e)) {
          resolved.add(e);
        }
      }
    }
    // set classpath property
    IRuntimeClasspathEntry[] result = new IRuntimeClasspathEntry[resolved.size()];
    for (int i = 0; i < result.length; i++) {
      result[i] = resolved.get(i);
      result[i].setClasspathProperty(property);
    }
    return result;
  }

  /**
   * Throws a core exception with an internal error status.
   *
   * @param message the status message
   * @param exception lower level exception associated with the
   *  error, or <code>null</code> if none
   */
  private void abort(String message, Throwable exception) throws CoreException {
    abort(message, IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, exception);
  }

  /**
   * Throws a core exception with an internal error status.
   *
   * @param message the status message
   * @param code status code
   * @param exception lower level exception associated with the
   *
   *  error, or <code>null</code> if none
   */
  private void abort(String message, int code, Throwable exception) throws CoreException {
    throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), code, message, exception));
  }

  public IVMInstall resolveVMInstall(IClasspathEntry entry) throws CoreException {
    return null;
  }

  public boolean isVMInstallReference(IClasspathEntry entry) {
    return false;
  }}
TOP

Related Classes of org.objectstyle.wolips.launching.classpath.WORuntimeClasspathEntryResolver

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.