/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.aries.web.converter.impl; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Map; import java.util.StringTokenizer; import java.util.jar.Manifest; public class ClassPathBuilder { private Map<String, Manifest> manifests; /** * This class takes a map of <jarFileName, manifest> pairs which are contained in * a particular jar file. * The updatePath method then uses this list to analyse the contents of the manifests * and looks for any dependencies in the other manifests in the jar. * @param manifests */ public ClassPathBuilder(Map<String, Manifest> manifests) { this.manifests = manifests; } /** * We take a full qualified jar file name and search its manifest for any other classpath * dependencies within the other manifest in the parent jar file. * @param jarFile * @param classPath * @return * @throws IOException */ public ArrayList<String> updatePath(String jarFile, ArrayList<String> classPath) throws IOException { // Get the classpath entries from this manifest and merge them into ours Manifest manifest = manifests.get(jarFile); if (manifest == null) return classPath; String dependencies = manifest.getMainAttributes().getValue("Class-Path"); if (dependencies == null) dependencies = manifest.getMainAttributes().getValue("Class-path"); if (dependencies != null) { // Search through the entries in the classpath StringTokenizer tok = new StringTokenizer(dependencies, ";"); while (tok.hasMoreTokens()) { String path = jarFile.substring(0, jarFile.lastIndexOf('/'));; String entry = tok.nextToken(); // Resolve the path to its canonical form path = new File("/"+path+"/"+entry).getCanonicalPath().replace('\\','/'); path = path.substring(path.indexOf('/')+1); // If we havent already located this dependency before then we add this to our // list of dependencies if (entry.endsWith(".jar") && manifests.keySet().contains(path) && !classPath.contains(path) && !path.startsWith("WEB-INF/lib/")) { classPath.add(path); // Recursively search the new classpath entry for more dependencies classPath = updatePath(path, classPath); } } } return classPath; } }