blob: fc78cec1ed26b39c5659da058a44e8fcfc7e9f6f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.xwt.css.tests.popup.actions;
import java.io.File;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
public class ClassLoaderHelper {
public static URL getResourceAsURL(IJavaProject javaProject, String name) {
if (javaProject == null)
return null;
Set<IJavaProject> visited = new HashSet<IJavaProject>();
URL url = findResourceURL(javaProject, visited, true, name);
if (url == null) {
IFile file = javaProject.getProject().getFile(name);
if (file.exists()) {
url = toURL(file.getLocation());
}
}
return url;
}
public static byte[] getClassContent(IJavaProject javaProject, String className) {
if (javaProject == null || !javaProject.exists())
return null;
String resourceName = className.replace('.', '/') + ".class";
try {
IPath outPath = javaProject.getProject().getLocation().removeLastSegments(1).append(javaProject.getOutputLocation());
outPath = outPath.addTrailingSeparator();
{
URL url = toURL(outPath.append(resourceName));
if (url != null) {
InputStream inputStream = url.openStream();
byte[] content = new byte[inputStream.available()];
inputStream.read(content);
return content;
}
for (IProject project : javaProject.getProject().getReferencedProjects()) {
if (!project.isOpen()) {
continue;
}
IJavaProject javaReferencedProject = JavaCore.create(project);
if (javaReferencedProject.exists()) {
byte[] content = getClassContent(javaReferencedProject, className);
if (content != null) {
return content;
}
}
}
}
IType type = javaProject.findType(className);
if (type != null && type.exists()) {
if (type.isBinary()) {
return type.getClassFile().getBytes();
} else {
IJavaProject typeProject = type.getJavaProject();
if (!javaProject.equals(typeProject)) {
return getClassContent(typeProject, className);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static URL[] getClasspathAsURLArray(IJavaProject javaProject) {
if (javaProject == null)
return null;
Set<IJavaProject> visited = new HashSet<IJavaProject>();
List<URL> urls = new ArrayList<URL>(20);
collectClasspathURLs(javaProject, urls, visited, true);
URL[] result = new URL[urls.size()];
urls.toArray(result);
return result;
}
private static URL findResourceURL(IJavaProject javaProject, Set<IJavaProject> visited, boolean isFirstProject, String name) {
if (visited.contains(javaProject))
return null;
visited.add(javaProject);
try {
IPath outPath = javaProject.getProject().getLocation().removeLastSegments(1).append(javaProject.getOutputLocation());
outPath = outPath.addTrailingSeparator();
{
URL url = toURL(outPath.append(name));
if (url != null) {
return url;
}
}
for (IPackageFragmentRoot fragment : javaProject.getPackageFragmentRoots()) {
if (fragment.getKind() == IPackageFragmentRoot.K_SOURCE) {
URL url = toURL(fragment.getResource().getLocation().append(name));
if (url != null) {
return url;
}
}
}
// urls.add(out);
IClasspathEntry[] entries = javaProject.getResolvedClasspath(true);
for (IClasspathEntry entry : entries) {
switch (entry.getEntryKind()) {
case IClasspathEntry.CPE_LIBRARY: {
// TODO
IClasspathEntry resolveEntry = JavaCore.getResolvedClasspathEntry(entry);
File file = resolveEntry.getPath().toFile();
IPath path = resolveEntry.getPath();
if (!file.exists()) {
String projectName = path.segment(0);
IProject project = javaProject.getProject().getWorkspace().getRoot().getProject(projectName);
path = project.getLocation().append(path.removeFirstSegments(1));
}
String spec = "jar:file:" + path.toString() + "!/" + name;
try {
URL url2 = new URL(spec);
url2.getContent();
return url2;
} catch (Exception e) {
}
}
break;
case IClasspathEntry.CPE_CONTAINER:
break;
case IClasspathEntry.CPE_VARIABLE: {
{
// TODO
URL url = toURL(outPath.append(name));
if (url != null) {
return url;
}
}
}
break;
case IClasspathEntry.CPE_PROJECT: {
if (isFirstProject || entry.isExported()) {
URL url = findResourceURL(getJavaProject(entry), visited, false, name);
if (url != null) {
return url;
}
}
break;
}
}
}
} catch (JavaModelException e) {
e.printStackTrace();
}
return null;
}
private static URL toURL(IPath outPath) {
File file = outPath.toFile();
if (file != null && file.exists()) {
try {
return file.toURI().toURL();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
return null;
}
private static void collectClasspathURLs(IJavaProject javaProject, List<URL> urls, Set<IJavaProject> visited, boolean isFirstProject) {
if (visited.contains(javaProject))
return;
visited.add(javaProject);
try {
IPath outPath = javaProject.getProject().getWorkspace().getRoot().getFullPath().append(javaProject.getOutputLocation());
outPath = outPath.addTrailingSeparator();
URL out = createFileURL(outPath);
urls.add(out);
IClasspathEntry[] entries = null;
entries = javaProject.getResolvedClasspath(true);
for (IClasspathEntry entry : entries) {
switch (entry.getEntryKind()) {
case IClasspathEntry.CPE_LIBRARY:
case IClasspathEntry.CPE_CONTAINER:
case IClasspathEntry.CPE_VARIABLE:
collectClasspathEntryURL(entry, urls);
break;
case IClasspathEntry.CPE_PROJECT: {
if (isFirstProject || entry.isExported())
collectClasspathURLs(getJavaProject(entry), urls, visited, false);
break;
}
}
}
} catch (JavaModelException e) {
return;
}
}
private static URL createFileURL(IPath path) {
URL url = null;
try {
url = new URL("file://" + path.toOSString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
return url;
}
private static void collectClasspathEntryURL(IClasspathEntry entry, List<URL> urls) {
URL url = createFileURL(entry.getPath());
if (url != null)
urls.add(url);
}
private static IJavaProject getJavaProject(IClasspathEntry entry) {
IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(entry.getPath().segment(0));
if (proj != null)
return JavaCore.create(proj);
return null;
}
}