package org.jboss.tools.smooks.configuration.editors.utils; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; 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.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; /** * This class code comes from HibernateSynchronizer * * @author Dart Peng * * @CreateTime Jul 21, 2008 */ public class ProjectClassLoader extends URLClassLoader { public ProjectClassLoader(IJavaProject project) throws JavaModelException { super(getURLSFromProject(project, null, true), Thread.currentThread() .getContextClassLoader()); } public ProjectClassLoader(IJavaProject project, URL[] extraUrls) throws JavaModelException { super(getURLSFromProject(project, extraUrls, true), Thread .currentThread().getContextClassLoader()); } private static URL[] getURLSFromProject(IJavaProject project, URL[] extraUrls, boolean cludeRequiredProject) throws JavaModelException { if(project == null || !project.exists()){ return new URL[]{}; } List<URL> list = new ArrayList<URL>(); if (null != extraUrls) { for (int i = 0; i < extraUrls.length; i++) { list.add(extraUrls[i]); } } IPackageFragmentRoot[] roots = project.getAllPackageFragmentRoots(); if (cludeRequiredProject) { String[] requiredProjectNames = project.getRequiredProjectNames(); for (int i = 0; i < requiredProjectNames.length; i++) { String requiredProjectName = requiredProjectNames[i]; IProject requiredProject = ResourcesPlugin.getWorkspace() .getRoot().getProject(requiredProjectName); if (requiredProject != null && requiredProject.isOpen()) { IJavaProject jp = JavaCore.create(requiredProject); if (jp == null) continue; URL[] requeiredURL = getURLSFromProject(jp, extraUrls, false); if (requeiredURL == null) continue; for (int j = 0; j < requeiredURL.length; j++) { list.add(requeiredURL[j]); } } } } IPath installPath = ResourcesPlugin.getWorkspace().getRoot() .getLocation(); for (int i = 0; i < roots.length; i++) { try { if (roots[i].isArchive()) { File f = new File(FileLocator.resolve( installPath.append(roots[i].getPath()).toFile() .toURL()).getFile()); if (!f.exists()) { f = new File(FileLocator.resolve( roots[i].getPath().makeAbsolute().toFile() .toURL()).getFile()); } if (!f.exists()) { IJavaElement javaElement = roots[i].getPrimaryElement(); String jarName = javaElement.getElementName(); IResource jarResource = project.getProject().findMember(jarName); if(jarResource != null) { f = jarResource.getRawLocation().toFile(); } } list.add(f.toURL()); } else { IPath path = roots[i].getJavaProject().getOutputLocation(); if (path.segmentCount() > 1) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace() .getRoot(); path = root.getFolder(path).getLocation(); list.add(path.toFile().toURL()); } else { path = roots[i].getJavaProject().getProject() .getLocation(); list.add(path.toFile().toURL()); } } } catch (Exception e) { e.printStackTrace(); } } URL[] urls = new URL[list.size()]; int index = 0; for (Iterator<?> i = list.iterator(); i.hasNext(); index++) { urls[index] = (URL) i.next(); } return urls; } }