org.crsh.lang.impl.java.ClasspathResolver Maven / Gradle / Ivy
The newest version!
/*
* Copyright (C) 2012 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.crsh.lang.impl.java;
import org.crsh.util.Utils;
import org.crsh.vfs.spi.url.Node;
import org.crsh.vfs.spi.url.Resource;
import org.crsh.vfs.spi.url.URLDriver;
import javax.tools.JavaFileObject;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/** @author Julien Viet */
class ClasspathResolver {
/** . */
final ClassLoader loader;
/** . */
final URLDriver driver;
public ClasspathResolver(ClassLoader loader) {
URLDriver driver = null;
try {
driver = new URLDriver();
driver.merge(loader);
}
catch (Exception e) {
e.printStackTrace();
}
//
this.loader = loader;
this.driver = driver;
}
private void resolve(List files, Node node, String binaryName, boolean recurse) throws IOException, URISyntaxException {
for (Node child : driver.children(node)) {
Iterator i = child.iterator();
if (i.hasNext()) {
if (child.name.endsWith(".class")) {
Resource r = i.next();
URI uri = r.url.toURI();
files.add(new NodeJavaFileObject(
binaryName + "." + child.name.substring(0, child.name.length() - ".class".length()),
uri,
r.streamFactory,
r.lastModified));
}
} else {
if (recurse) {
resolve(files, child, binaryName + "." + child.name, recurse);
}
}
}
}
public Iterable resolve(String pkg, boolean recurse) throws IOException, URISyntaxException {
Node current = driver.root();
String[] elts = Utils.split(pkg, '.');
for (String elt : elts) {
current = driver.child(current, elt);
if (current == null) {
return Collections.emptyList();
}
}
//
List files = new ArrayList();
resolve(files, current, pkg, recurse);
return files;
/*
String pkgName = pkg.replace('.', '/');
ArrayList ret = new ArrayList();
final Enumeration en = loader.getResources(pkgName);
while (en.hasMoreElements()) {
URL url = en.nextElement();
String protocol = url.getProtocol();
if (protocol.equals("file")) {
File root = new File(url.toURI());
resolve(pkgName, ret, root, recurse);
} else if ("jar".equals(protocol)) {
String path = url.getPath();
int index = path.lastIndexOf('!');
String containerURLs = path.substring(0, index);
URL containerURL = new URL(containerURLs);
ZipIterator i = ZipIterator.create(containerURL);
while (i.hasNext()) {
ZipEntry entry = i.next();
String name = entry.getName();
if (!entry.isDirectory() && name.startsWith(pkgName) && (name.indexOf('/', pkgName.length() + 1) == -1 || recurse)) {
String binaryName = name.substring(0, name.length() - ".class".length()).replace('/', '.');
URI entryURI = new URI("jar:" + containerURLs + "!/" + name);
ret.add(new URIJavaFileObject(binaryName, entryURI, i.getStreamFactory(), entry.getTime()));
}
}
} else {
throw new UnsupportedOperationException("Protocol for url " + url + " not supported");
}
}
return ret;
*/
}
/*
private void resolve(String pkgName, ArrayList ret, File file, boolean recurse) {
final File[] children = file.listFiles();
if (children != null) {
Arrays.sort(children);
for (final File child : children) {
if (child.isDirectory()) {
if (recurse) {
resolve(pkgName, ret, child, recurse);
}
} else {
String childName = child.getName();
if (childName.endsWith(".class")) {
String binaryName = pkgName + "." + childName.substring(0, childName.length() - ".class".length());
InputStreamFactory streamFactory = new InputStreamFactory() {
@Override
public InputStream open() throws IOException {
return new FileInputStream(child);
}
};
ret.add(new URIJavaFileObject(binaryName, child.toURI(), streamFactory, child.lastModified()));
}
}
}
}
}
*/
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy