/* Copyright (c) Jython Developers */ package org.python.core; import java.io.IOException; import java.io.InputStream; import java.util.Map; import org.python.core.util.importer; import org.python.expose.ExposedMethod; import org.python.expose.ExposedNew; import org.python.expose.ExposedType; import org.python.util.Generic; @ExposedType(name="ClasspathPyImporter") public class ClasspathPyImporter extends importer<String> { public static final String PYCLASSPATH_PREFIX = "__pyclasspath__/"; public static final PyType TYPE = PyType.fromClass(ClasspathPyImporter.class); public ClasspathPyImporter(PyType subType) { super(subType); } public ClasspathPyImporter() { super(); } @ExposedNew @ExposedMethod final void ClasspathPyImporter___init__(PyObject[] args, String[] kwds) { ArgParser ap = new ArgParser("__init__", args, kwds, new String[] {"path"}); String path = ap.getString(0); if (path == null || !path.startsWith(PYCLASSPATH_PREFIX)) { throw Py.ImportError("path isn't for classpath importer"); } if (!path.endsWith("/")) { path += "/"; } this.path = path; } /** * Find the module for the fully qualified name. * * @param fullname the fully qualified name of the module * @param path if not installed on the meta-path None or a module path * @return a loader instance if this importer can load the module, None * otherwise */ @ExposedMethod(defaults = "null") final PyObject ClasspathPyImporter_find_module(String fullname, String path) { return importer_find_module(fullname, path); } /** * Load a module for the fully qualified name. * * @param fullname the fully qualified name of the module * @return a loaded PyModule */ @ExposedMethod final PyObject ClasspathPyImporter_load_module(String fullname) { return importer_load_module(fullname); } @Override protected long getSourceMtime(String path) { // Can't determine this easily return -1; } @Override protected Bundle makeBundle(String fullFilename, String entry) { InputStream is = entries.remove(entry); return new Bundle(is) { @Override public void close() { try { inputStream.close(); } catch (IOException e) { throw Py.JavaError(e); } } }; } @Override protected String makeEntry(String filename) { if (entries.containsKey(filename)) { return filename; } InputStream is; if (Py.getSystemState().getClassLoader() != null) { is = tryClassLoader(filename, Py.getSystemState().getClassLoader(), "sys"); } else { is = tryClassLoader(filename, imp.getParentClassLoader(), "parent"); } if (is != null) { entries.put(filename, is); return filename; } return null; } private InputStream tryClassLoader(String fullFilename, ClassLoader loader, String name) { if (loader != null) { Py.writeDebug("import", "trying " + fullFilename + " in " + name + " class loader"); return loader.getResourceAsStream(fullFilename); } return null; } @Override protected String makeFilename(String fullname) { return path.replace(PYCLASSPATH_PREFIX, "") + fullname.replace('.', '/'); } @Override protected String makeFilePath(String fullname) { return path + fullname.replace('.', '/'); } @Override protected String makePackagePath(String fullname) { return path; } @Override protected String getSeparator() { return "/"; } private Map<String, InputStream> entries = Generic.map(); private String path; }