List<ResourceProxy> handleJarResource(File jarResource) throws Exception { List<ResourceProxy> jarResources = new ArrayList<ResourceProxy>(); String frontRelativePath = jarResource.getName(); frontRelativePath = frontRelativePath.replaceAll(JAR_EXTENSION, ""); // $NON-NLS-1$ frontRelativePath += JAR_RESOURCE_SUFFIX; InputStream input = new FileInputStream(jarResource); JarInputStream zipInput = new JarInputStream(input); ZipEntry zipEntry = zipInput.getNextEntry(); while (zipEntry != null) { String resourceEntryName = zipEntry.getName(); resourceEntryName = resourceEntryName.replace("\\", SLASH); // $NON-NLS-1$ if (isValidResource(resourceEntryName) && (!resourceEntryName.contains(META_INF_DIR_NAME))) { String relativePath = frontRelativePath + File.separator + resourceEntryName; relativePath = relativePath.replace("\\", File.separator); // $NON-NLS-1$ relativePath = relativePath.replace(SLASH, File.separator); jarResources.add( new ResourceProxy( new File(jarResource.getAbsolutePath() + SLASH + resourceEntryName), relativePath)); //$NON-NLS-1$ //$NON-NLS-2$ } zipEntry = zipInput.getNextEntry(); } return jarResources; }
/** * Returns a list which contains the pathes of all files which are included in the given url. This * method expects as the url param a jar. * * @param url url of the jar file * @return full qualified paths of the contained files * @throws Exception */ private List getContainedFilePaths(URL url) throws Exception { JarInputStream jis = new JarInputStream(url.openStream()); ZipEntry zentry = null; ArrayList fullNames = new ArrayList(); while ((zentry = jis.getNextEntry()) != null) { String name = zentry.getName(); // Add only files, no directory entries. if (!zentry.isDirectory()) fullNames.add(name); } jis.close(); return (fullNames); }
protected void analyzeJar(Resource res) throws BuildException { log("Analyze jar file " + res, Project.MSG_VERBOSE); try { final JarInputStream jarStream = new JarInputStream(res.getInputStream()); ZipEntry ze = jarStream.getNextEntry(); while (null != ze) { final String fileName = ze.getName(); if (fileName.endsWith(".class")) { log("Analyze jar class file " + fileName, Project.MSG_VERBOSE); asmAnalyser.analyseClass(jarStream, fileName); } ze = jarStream.getNextEntry(); } } catch (final Exception e) { e.printStackTrace(); throw new BuildException( "Failed to analyze class-file " + res + ", exception=" + e, getLocation()); } }
public static byte[] addJarEntry(byte[] jarToUpdate, String entryName, byte[] entryContent) throws IOException { ByteArrayOutputStream out = null; ByteArrayInputStream bais = null; JarOutputStream jos = null; JarInputStream jis = null; byte[] buffer = new byte[4096]; try { bais = new ByteArrayInputStream(jarToUpdate); jis = new JarInputStream(bais); out = new ByteArrayOutputStream(); jos = new JarOutputStream(out); JarEntry inEntry; while ((inEntry = (JarEntry) jis.getNextEntry()) != null) { if (!inEntry.getName().equals(entryName)) { jos.putNextEntry(new JarEntry(inEntry)); } else { throw new IllegalArgumentException( "Jar entry " + entryName + " already exists in jar to update"); } int len; while ((len = jis.read(buffer)) > 0) { jos.write(buffer, 0, len); } jos.flush(); } JarEntry entry = new JarEntry(entryName); jos.putNextEntry(entry); jos.write(entryContent); jos.closeEntry(); jos.finish(); out.flush(); return out.toByteArray(); } finally { if (jos != null) { jos.close(); } if (out != null) { out.close(); } if (jis != null) { jis.close(); } } }
/* Parses a <properties entry="<url>"/> and then reads a property specified by <url> */ private static void setProperties(Config compConf, XmlPullParser parser, Bundle declaringBundle) throws IllegalXMLException, XmlPullParserException, IOException { String entry = null; for (int i = 0; i < parser.getAttributeCount(); i++) { if (parser.getAttributeName(i).equals("entry")) { entry = parser.getAttributeValue(i); } else { unrecognizedAttr(parser, i); // throws exception } } if (entry == null) { missingAttr(parser, "entry"); // throws exception } // read a property-file and adds it contents to conf's properties. Properties dict = new Properties(); String bundleLocation = declaringBundle.getLocation(); JarInputStream jis = new JarInputStream(new URL(bundleLocation).openStream()); ZipEntry zipEntry; while ((zipEntry = jis.getNextEntry()) != null && !zipEntry.getName().equals(entry)) /* skip */ ; if (zipEntry == null) { throw new IOException("Did not find requested entry " + entry); } dict.load(jis); for (Enumeration e = dict.keys(); e.hasMoreElements(); ) { Object key = e.nextElement(); compConf.setProperty((String) key, dict.get(key)); } // done reading file. skip(parser); }
/** * Returns the qualified class name for the given class. This method expects as the url param a * jar file which contains the given class. It scans the zip entries of the jar file. * * @param url url of the jar file which contains the class * @param className short name of the class for which the full name should be resolved * @return full qualified class name * @throws Exception */ private String getFullClassName(URL url, String className) throws Exception { JarInputStream jis = new JarInputStream(url.openStream()); ZipEntry zentry = null; while ((zentry = jis.getNextEntry()) != null) { String name = zentry.getName(); int lastPos = name.lastIndexOf(".class"); if (lastPos < 0) { continue; // No class file. } name = name.replace('/', '.'); int pos = -1; if (className != null) { pos = name.indexOf(className); } if (name.length() == pos + className.length() + 6) // "Main" class // found { jis.close(); return (name.substring(0, lastPos)); } } jis.close(); return (null); }
/** * Extract a kar from a given URI into a repository dir and resource dir and populate * shouldInstallFeatures and featureRepos * * @param repoDir directory to write the repository contents of the kar to * @param resourceDir directory to write the resource contents of the kar to */ public void extract(File repoDir, File resourceDir) { InputStream is = null; JarInputStream zipIs = null; FeatureDetector featureDetector = new FeatureDetector(); this.featureRepos = new ArrayList<URI>(); this.shouldInstallFeatures = true; try { is = karUri.toURL().openStream(); repoDir.mkdirs(); if (!repoDir.isDirectory()) { throw new RuntimeException("The KAR file " + karUri + " is already installed"); } LOGGER.debug("Uncompress the KAR file {} into directory {}", karUri, repoDir); zipIs = new JarInputStream(is); boolean scanForRepos = true; Manifest manifest = zipIs.getManifest(); if (manifest != null) { Attributes attr = manifest.getMainAttributes(); String featureStartSt = (String) attr.get(new Attributes.Name(MANIFEST_ATTR_KARAF_FEATURE_START)); if ("false".equals(featureStartSt)) { shouldInstallFeatures = false; } String featureReposAttr = (String) attr.get(new Attributes.Name(MANIFEST_ATTR_KARAF_FEATURE_REPOS)); if (featureReposAttr != null) { featureRepos.add(new URI(featureReposAttr)); scanForRepos = false; } } ZipEntry entry = zipIs.getNextEntry(); while (entry != null) { if (entry.getName().startsWith("repository")) { String path = entry.getName().substring("repository/".length()); File destFile = new File(repoDir, path); extract(zipIs, entry, destFile); if (scanForRepos && featureDetector.isFeaturesRepository(destFile)) { Map map = new HashMap<>(); String uri = Parser.pathToMaven(path, map); if (map.get("classifier") != null && ((String) map.get("classifier")).equalsIgnoreCase("features")) featureRepos.add(URI.create(uri)); else featureRepos.add(destFile.toURI()); } } if (entry.getName().startsWith("resource")) { String path = entry.getName().substring("resource/".length()); File destFile = new File(resourceDir, path); extract(zipIs, entry, destFile); } entry = zipIs.getNextEntry(); } } catch (Exception e) { throw new RuntimeException( "Error extracting kar file " + karUri + " into dir " + repoDir + ": " + e.getMessage(), e); } finally { closeStream(zipIs); closeStream(is); } }
private void enumeratePathArchive(final String archive) throws IOException { final boolean trace1 = m_trace1; final File fullArchive = new File(m_currentPathDir, archive); JarInputStream in = null; try { // note: Sun's JarFile uses native code and has been known to // crash the JVM in some builds; however, it uses random file // access and can find "bad" manifests that are not the first // entries in their archives (which JarInputStream can't do); // [bugs: 4263225, 4696354, 4338238] // // there is really no good solution here but as a compromise // I try to read the manifest again via a JarFile if the stream // returns null for it: in = new JarInputStream( new BufferedInputStream(new FileInputStream(fullArchive), 32 * 1024)); final IPathHandler handler = m_handler; Manifest manifest = in.getManifest(); // can be null if (manifest == null) manifest = readManifestViaJarFile(fullArchive); // can be null handler.handleArchiveStart(m_currentPathDir, new File(archive), manifest); // note: this loop does not skip over the manifest-related // entries [the handler needs to be smart about that] for (ZipEntry entry; (entry = in.getNextEntry()) != null; ) { // TODO: handle nested archives if (trace1) m_log.trace1( "enumeratePathArchive", "processing archive entry [" + entry.getName() + "] ..."); handler.handleArchiveEntry(in, entry); in.closeEntry(); } // TODO: this needs major testing if (m_processManifest) { // note: JarInputStream only reads the manifest if it the // first jar entry if (manifest == null) manifest = in.getManifest(); if (manifest != null) { final Attributes attributes = manifest.getMainAttributes(); if (attributes != null) { // note: Sun's documentation says that multiple Class-Path: // entries are merged sequentially // (http://java.sun.com/products/jdk/1.2/docs/guide/extensions/spec.html) // however, their own code does not implement this final String jarClassPath = attributes.getValue(Attributes.Name.CLASS_PATH); if (jarClassPath != null) { final StringTokenizer tokenizer = new StringTokenizer(jarClassPath); for (int p = 1; tokenizer.hasMoreTokens(); ) { final String relPath = tokenizer.nextToken(); final File archiveParent = fullArchive.getParentFile(); final File path = archiveParent != null ? new File(archiveParent, relPath) : new File(relPath); final String fullPath = m_canonical ? Files.canonicalizePathname(path.getPath()) : path.getPath(); if (m_pathSet.add(fullPath)) { if (m_verbose) m_log.verbose(" added manifest Class-Path entry [" + path + "]"); m_path.add( m_pathIndex + (p++), path); // insert after the current m_path entry } } } } } } } catch (FileNotFoundException fnfe) // ignore: this should not happen { if ($assert.ENABLED) throw fnfe; } finally { if (in != null) try { in.close(); } catch (Exception ignore) { } } }