Remove bnd modification. (FELIX-2176)


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1030992 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundleplugin/pom.xml b/bundleplugin/pom.xml
index 20c4c5d..2a626db 100644
--- a/bundleplugin/pom.xml
+++ b/bundleplugin/pom.xml
@@ -56,7 +56,7 @@
   <dependency>
     <groupId>biz.aQute</groupId>
     <artifactId>bndlib</artifactId>
-    <version>1.10.0</version>
+    <version>1.15.0</version>
   </dependency>
   <dependency>
     <groupId>net.sf.kxml</groupId>
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java b/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java
deleted file mode 100644
index 11c8863..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java
+++ /dev/null
@@ -1,1115 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.util.*;
-import java.util.jar.*;
-import java.util.zip.*;
-
-import aQute.bnd.make.*;
-import aQute.bnd.maven.*;
-import aQute.bnd.service.*;
-
-/**
- * Include-Resource: ( [name '=' ] file )+
- *
- * Private-Package: package-decl ( ',' package-decl )*
- *
- * Export-Package: package-decl ( ',' package-decl )*
- *
- * Import-Package: package-decl ( ',' package-decl )*
- *
- * @version $Revision: 1.27 $
- */
-public class Builder extends Analyzer {
-	private static final int	SPLIT_MERGE_LAST	= 1;
-	private static final int	SPLIT_MERGE_FIRST	= 2;
-	private static final int	SPLIT_ERROR			= 3;
-	private static final int	SPLIT_FIRST			= 4;
-	private static final int	SPLIT_DEFAULT		= 0;
-
-	List<File>					sourcePath			= new ArrayList<File>();
-
-	Make						make				= new Make(this);
-
-	public Builder(Processor parent) {
-		super(parent);
-	}
-
-	public Builder() {
-	}
-
-    public Map<String, Clazz> analyzeBundleClasspath(Jar dot,
-			Map<String, Map<String, String>> bundleClasspath,
-			Map<String, Map<String, String>> contained,
-			Map<String, Map<String, String>> referred,
-			Map<String, Set<String>> uses) throws IOException {
-        return super.analyzeBundleClasspath(dot, bundleClasspath, contained, referred, uses);
-    }
-
-    public Jar build() throws Exception {
-		init();
-		if (isTrue(getProperty(NOBUNDLES)))
-			return null;
-
-		if (getProperty(CONDUIT) != null)
-			error("Specified " + CONDUIT
-					+ " but calls build() instead of builds() (might be a programmer error");
-
-		dot = new Jar("dot");
-		addClose(dot);
-		try {
-			long modified = Long.parseLong(getProperty("base.modified"));
-			dot.updateModified(modified, "Base modified");
-		} catch (Exception e) {
-		}
-
-		doExpand(dot);
-		doIncludeResources(dot);
-		doConditional(dot);
-		dot = doWab(dot);
-
-		// NEW!
-		// Check if we override the calculation of the
-		// manifest. We still need to calculated it because
-		// we need to have analyzed the classpath.
-
-		Manifest manifest = calcManifest();
-
-		String mf = getProperty(MANIFEST);
-		if (mf != null) {
-			File mff = getFile(mf);
-			if (mff.isFile()) {
-				try {
-					InputStream in = new FileInputStream(mff);
-					manifest = new Manifest(in);
-					in.close();
-				} catch (Exception e) {
-					error(MANIFEST + " while reading manifest file", e);
-				}
-			} else {
-				error(MANIFEST + ", no such file " + mf);
-			}
-		}
-
-		if (getProperty(NOMANIFEST) == null)
-			dot.setManifest(manifest);
-		else
-			dot.setDoNotTouchManifest();
-
-		// This must happen after we analyzed so
-		// we know what it is on the classpath
-		addSources(dot);
-
-		if (getProperty(POM) != null)
-			dot.putResource("pom.xml", new PomResource(dot.getManifest()));
-
-		if (!isNoBundle())
-			doVerify(dot);
-
-		if (dot.getResources().isEmpty())
-			error("The JAR is empty: " + dot.getName());
-
-		dot.updateModified(lastModified(), "Last Modified Processor");
-		dot.setName(getBsn());
-
-		sign(dot);
-
-		doSaveManifest(dot);
-		return dot;
-	}
-
-	/**
-	 * Allow any local initialization by subclasses before we build. Default is
-	 * do nothing.
-	 */
-	public void init() throws Exception {
-
-	}
-
-	/**
-	 * Turn this normal bundle in a web and add any resources.
-	 *
-	 * @throws Exception
-	 */
-	private Jar doWab(Jar dot) throws Exception {
-		String wab = getProperty(WAB);
-		String wablib = getProperty(WABLIB);
-		if (wab == null && wablib == null)
-			return dot;
-
-		setProperty(BUNDLE_CLASSPATH, append("WEB-INF/classes", getProperty(BUNDLE_CLASSPATH)));
-
-		Jar next = new Jar(dot.getName());
-		addClose(next);
-
-		for (Map.Entry<String, Resource> entry : dot.getResources().entrySet()) {
-			String path = entry.getKey();
-			if (path.indexOf('/') > 0 && !Character.isUpperCase(path.charAt(0))) {
-				trace("wab: moving: %s", path);
-				next.putResource("WEB-INF/classes/" + path, entry.getValue());
-			} else {
-				trace("wab: not moving: %s", path);
-				next.putResource(path, entry.getValue());
-			}
-		}
-
-		Map<String, Map<String, String>> clauses = parseHeader(getProperty(WABLIB));
-		for (String key : clauses.keySet()) {
-			File f = getFile(key);
-			addWabLib(next, f);
-		}
-		doIncludeResource(next, wab);
-		return next;
-	}
-
-	/**
-	 * Add a wab lib to the jar.
-	 *
-	 * @param f
-	 */
-	private void addWabLib(Jar dot, File f) throws Exception {
-		if (f.exists()) {
-			Jar jar = new Jar(f);
-			jar.setDoNotTouchManifest();
-			addClose(jar);
-			String path = "WEB-INF/lib/" + f.getName();
-			dot.putResource(path, new JarResource(jar));
-			setProperty(BUNDLE_CLASSPATH, append(getProperty(BUNDLE_CLASSPATH), path));
-
-			Manifest m = jar.getManifest();
-			String cp = m.getMainAttributes().getValue("Class-Path");
-			if (cp != null) {
-				Collection<String> parts = split(cp, ",");
-				for (String part : parts) {
-					File sub = getFile(f.getParentFile(), part);
-					if (!sub.exists() || !sub.getParentFile().equals(f.getParentFile())) {
-						warning(
-								"Invalid Class-Path entry %s in %s, must exist and must reside in same directory",
-								sub, f);
-					} else {
-						addWabLib(dot, sub);
-					}
-				}
-			}
-		} else {
-			error("WAB lib does not exist %s", f);
-		}
-	}
-
-	/**
-	 * Get the manifest and write it out separately if -savemanifest is set
-	 *
-	 * @param dot
-	 */
-	private void doSaveManifest(Jar dot) throws IOException {
-		String output = getProperty(SAVEMANIFEST);
-		if (output == null)
-			return;
-
-		File f = getFile(output);
-		if (f.isDirectory()) {
-			f = new File(f, "MANIFEST.MF");
-		}
-		f.delete();
-		f.getParentFile().mkdirs();
-		OutputStream out = new FileOutputStream(f);
-		try {
-			Jar.writeManifest(dot.getManifest(), out);
-		} finally {
-			out.close();
-		}
-		changedFile(f);
-	}
-
-	protected void changedFile(File f) {
-	}
-
-	/**
-	 * Sign the jar file.
-	 *
-	 * -sign : <alias> [ ';' 'password:=' <password> ] [ ';' 'keystore:='
-	 * <keystore> ] [ ';' 'sign-password:=' <pw> ] ( ',' ... )*
-	 *
-	 * @return
-	 */
-
-	void sign(Jar jar) throws Exception {
-		String signing = getProperty("-sign");
-		if (signing == null)
-			return;
-
-		trace("Signing %s, with %s", getBsn(), signing);
-		List<SignerPlugin> signers = getPlugins(SignerPlugin.class);
-
-		Map<String, Map<String, String>> infos = parseHeader(signing);
-		for (Map.Entry<String, Map<String, String>> entry : infos.entrySet()) {
-			for (SignerPlugin signer : signers) {
-				signer.sign(this, entry.getKey());
-			}
-		}
-	}
-
-	public boolean hasSources() {
-		return isTrue(getProperty(SOURCES));
-	}
-
-	protected String getImportPackages() {
-		String ip = super.getImportPackages();
-		if (ip != null)
-			return ip;
-
-		return "*";
-	}
-
-	private void doConditional(Jar dot) throws Exception {
-		Map<String, Map<String, String>> conditionals = getHeader(CONDITIONAL_PACKAGE);
-		if (conditionals.isEmpty())
-			return;
-
-		int size;
-		do {
-			size = dot.getDirectories().size();
-			analyze();
-			analyzed = false;
-			Map<String, Map<String, String>> imports = getImports();
-
-			// Match the packages specified in conditionals
-			// against the imports. Any match must become a
-			// Private-Package
-			Map<String, Map<String, String>> filtered = merge(CONDITIONAL_PACKAGE, conditionals,
-					imports, new HashSet<String>(), null);
-
-			// Imports can also specify a private import. These
-			// packages must also be copied to the bundle
-			for (Map.Entry<String, Map<String, String>> entry : getImports().entrySet()) {
-				String type = entry.getValue().get(IMPORT_DIRECTIVE);
-				if (type != null && type.equals("private"))
-					filtered.put(entry.getKey(), entry.getValue());
-			}
-
-			// remove existing packages to prevent merge errors
-			filtered.keySet().removeAll(dot.getPackages());
-			doExpand(dot, CONDITIONAL_PACKAGE + " Private imports", Instruction
-					.replaceWithInstruction(filtered), false);
-		} while (dot.getDirectories().size() > size);
-		analyzed = true;
-	}
-
-	/**
-	 * Intercept the call to analyze and cleanup versions after we have analyzed
-	 * the setup. We do not want to cleanup if we are going to verify.
-	 */
-
-	public void analyze() throws Exception {
-		super.analyze();
-		cleanupVersion(imports);
-		cleanupVersion(exports);
-		String version = getProperty(BUNDLE_VERSION);
-		if (version != null)
-			setProperty(BUNDLE_VERSION, cleanupVersion(version));
-	}
-
-	public void cleanupVersion(Map<String, Map<String, String>> mapOfMap) {
-		for (Iterator<Map.Entry<String, Map<String, String>>> e = mapOfMap.entrySet().iterator(); e
-				.hasNext();) {
-			Map.Entry<String, Map<String, String>> entry = e.next();
-			Map<String, String> attributes = entry.getValue();
-			if (attributes.containsKey("version")) {
-				attributes.put("version", cleanupVersion(attributes.get("version")));
-			}
-		}
-	}
-
-	/**
-     *
-     */
-	private void addSources(Jar dot) {
-		if (!hasSources())
-			return;
-
-		Set<String> packages = new HashSet<String>();
-
-		try {
-			ByteArrayOutputStream out = new ByteArrayOutputStream();
-			getProperties().store(out, "Generated by BND, at " + new Date());
-			dot.putResource("OSGI-OPT/bnd.bnd", new EmbeddedResource(out.toByteArray(), 0));
-			out.close();
-		} catch (Exception e) {
-			error("Can not embed bnd file in JAR: " + e);
-		}
-
-		for (Iterator<String> cpe = classspace.keySet().iterator(); cpe.hasNext();) {
-			String path = cpe.next();
-			path = path.substring(0, path.length() - ".class".length()) + ".java";
-			String pack = getPackage(path).replace('.', '/');
-			if (pack.length() > 1)
-				pack = pack + "/";
-			boolean found = false;
-			String[] fixed = { "packageinfo", "package.html", "module-info.java",
-					"package-info.java" };
-			for (Iterator<File> i = getSourcePath().iterator(); i.hasNext();) {
-				File root = i.next();
-				File f = getFile(root, path);
-				if (f.exists()) {
-					found = true;
-					if (!packages.contains(pack)) {
-						packages.add(pack);
-						File bdir = getFile(root, pack);
-						for (int j = 0; j < fixed.length; j++) {
-							File ff = getFile(bdir, fixed[j]);
-							if (ff.isFile()) {
-								dot.putResource("OSGI-OPT/src/" + pack + fixed[j],
-										new FileResource(ff));
-							}
-						}
-					}
-					dot.putResource("OSGI-OPT/src/" + path, new FileResource(f));
-				}
-			}
-			if (!found) {
-				for (Jar jar : classpath) {
-					Resource resource = jar.getResource(path);
-					if (resource != null) {
-						dot.putResource("OSGI-OPT/src", resource);
-					} else {
-						resource = jar.getResource("OSGI-OPT/src/" + path);
-						if (resource != null) {
-							dot.putResource("OSGI-OPT/src", resource);
-						}
-					}
-				}
-			}
-			if (getSourcePath().isEmpty())
-				warning("Including sources but " + SOURCEPATH
-						+ " does not contain any source directories ");
-			// TODO copy from the jars where they came from
-		}
-	}
-
-	boolean	firstUse	= true;
-
-	public Collection<File> getSourcePath() {
-		if (firstUse) {
-			firstUse = false;
-			String sp = getProperty(SOURCEPATH);
-			if (sp != null) {
-				Map<String, Map<String, String>> map = parseHeader(sp);
-				for (Iterator<String> i = map.keySet().iterator(); i.hasNext();) {
-					String file = i.next();
-					if (!isDuplicate(file)) {
-						File f = getFile(file);
-						if (!f.isDirectory()) {
-							error("Adding a sourcepath that is not a directory: " + f);
-						} else {
-							sourcePath.add(f);
-						}
-					}
-				}
-			}
-		}
-		return sourcePath;
-	}
-
-	private void doVerify(Jar dot) throws Exception {
-		Verifier verifier = new Verifier(dot, getProperties());
-		verifier.setPedantic(isPedantic());
-
-		// Give the verifier the benefit of our analysis
-		// prevents parsing the files twice
-		verifier.setClassSpace(classspace, contained, referred, uses);
-		verifier.verify();
-		getInfo(verifier);
-	}
-
-	private void doExpand(Jar jar) throws IOException {
-		if (getClasspath().size() == 0
-				&& (getProperty(EXPORT_PACKAGE) != null || getProperty(EXPORT_PACKAGE) != null || getProperty(PRIVATE_PACKAGE) != null))
-			warning("Classpath is empty. Private-Package and Export-Package can only expand from the classpath when there is one");
-
-		Map<Instruction, Map<String, String>> privateMap = Instruction
-				.replaceWithInstruction(getHeader(PRIVATE_PACKAGE));
-		Map<Instruction, Map<String, String>> exportMap = Instruction
-				.replaceWithInstruction(getHeader(EXPORT_PACKAGE));
-
-		if (isTrue(getProperty(Constants.UNDERTEST))) {
-			privateMap.putAll(Instruction.replaceWithInstruction(parseHeader(getProperty(
-					Constants.TESTPACKAGES, "test;presence:=optional"))));
-		}
-		if (!privateMap.isEmpty())
-			doExpand(jar, "Private-Package, or -testpackages", privateMap, true);
-
-		if (!exportMap.isEmpty() ) {
-			Jar exports = new Jar("exports");
-			doExpand(exports, EXPORT_PACKAGE, exportMap, true);
-			jar.addAll(exports);
-			exports.close();
-		}
-
-		if (!isNoBundle()) {
-			if (privateMap.isEmpty() && exportMap.isEmpty() && !isResourceOnly()
-					&& getProperty(EXPORT_CONTENTS) == null) {
-				warning("None of Export-Package, Provide-Package, Private-Package, -testpackages, or -exportcontents is set, therefore no packages will be included");
-			}
-		}
-	}
-
-	/**
-	 *
-	 * @param jar
-	 * @param name
-	 * @param instructions
-	 */
-	private void doExpand(Jar jar, String name, Map<Instruction, Map<String, String>> instructions,
-			boolean mandatory) {
-		Set<Instruction> superfluous = removeMarkedDuplicates(instructions.keySet());
-
-		for (Iterator<Jar> c = getClasspath().iterator(); c.hasNext();) {
-			Jar now = c.next();
-			doExpand(jar, instructions, now, superfluous);
-		}
-
-		if (mandatory && superfluous.size() > 0) {
-			StringBuilder sb = new StringBuilder();
-			String del = "Instructions in " + name + " that are never used: ";
-			for (Iterator<Instruction> i = superfluous.iterator(); i.hasNext();) {
-				Instruction p = i.next();
-				sb.append(del);
-				sb.append(p.toString());
-				del = "\n                ";
-			}
-			sb.append("\nClasspath: ");
-			sb.append(Processor.join(getClasspath()));
-			sb.append("\n");
-
-			warning(sb.toString());
-			if (isPedantic())
-				diagnostics = true;
-		}
-	}
-
-	/**
-	 * Iterate over each directory in the class path entry and check if that
-	 * directory is a desired package.
-	 *
-	 * @param included
-	 * @param classpathEntry
-	 */
-	private void doExpand(Jar jar, Map<Instruction, Map<String, String>> included,
-			Jar classpathEntry, Set<Instruction> superfluous) {
-
-		loop: for (Map.Entry<String, Map<String, Resource>> directory : classpathEntry
-				.getDirectories().entrySet()) {
-			String path = directory.getKey();
-
-			if (doNotCopy.matcher(getName(path)).matches())
-				continue;
-
-			if (directory.getValue() == null)
-				continue;
-
-			String pack = path.replace('/', '.');
-			Instruction instr = matches(included.keySet(), pack, superfluous);
-			if (instr != null) {
-				// System.out.println("Pattern match: " + pack + " " +
-				// instr.getPattern() + " " + instr.isNegated());
-				if (!instr.isNegated()) {
-					Map<String, Resource> contents = directory.getValue();
-
-					// What to do with split packages? Well if this
-					// directory already exists, we will check the strategy
-					// and react accordingly.
-					boolean overwriteResource = true;
-					if (jar.hasDirectory(path)) {
-						Map<String, String> directives = included.get(instr);
-
-						switch (getSplitStrategy((String) directives.get(SPLIT_PACKAGE_DIRECTIVE))) {
-						case SPLIT_MERGE_LAST:
-							overwriteResource = true;
-							break;
-
-						case SPLIT_MERGE_FIRST:
-							overwriteResource = false;
-							break;
-
-						case SPLIT_ERROR:
-							error(diagnostic(pack, getClasspath(), classpathEntry.source));
-							continue loop;
-
-						case SPLIT_FIRST:
-							continue loop;
-
-						default:
-							warning(diagnostic(pack, getClasspath(), classpathEntry.source));
-							overwriteResource = false;
-							break;
-						}
-					}
-
-					jar.addDirectory(contents, overwriteResource);
-
-					String key = path + "/bnd.info";
-					Resource r = jar.getResource(key);
-					if (r != null)
-						jar.putResource(key, new PreprocessResource(this, r));
-
-					if (hasSources()) {
-						String srcPath = "OSGI-OPT/src/" + path;
-						Map<String, Resource> srcContents = classpathEntry.getDirectories().get(
-								srcPath);
-						if (srcContents != null) {
-							jar.addDirectory(srcContents, overwriteResource);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Analyze the classpath for a split package
-	 *
-	 * @param pack
-	 * @param classpath
-	 * @param source
-	 * @return
-	 */
-	private String diagnostic(String pack, List<Jar> classpath, File source) {
-		// Default is like merge-first, but with a warning
-		// Find the culprits
-		pack = pack.replace('.', '/');
-		List<Jar> culprits = new ArrayList<Jar>();
-		for (Iterator<Jar> i = classpath.iterator(); i.hasNext();) {
-			Jar culprit = (Jar) i.next();
-			if (culprit.getDirectories().containsKey(pack)) {
-				culprits.add(culprit);
-			}
-		}
-		return "Split package "
-				+ pack
-				+ "\nUse directive -split-package:=(merge-first|merge-last|error|first) on Export/Private Package instruction to get rid of this warning\n"
-				+ "Package found in   " + culprits + "\n" + "Reference from     " + source + "\n"
-				+ "Classpath          " + classpath;
-	}
-
-	private int getSplitStrategy(String type) {
-		if (type == null)
-			return SPLIT_DEFAULT;
-
-		if (type.equals("merge-last"))
-			return SPLIT_MERGE_LAST;
-
-		if (type.equals("merge-first"))
-			return SPLIT_MERGE_FIRST;
-
-		if (type.equals("error"))
-			return SPLIT_ERROR;
-
-		if (type.equals("first"))
-			return SPLIT_FIRST;
-
-		error("Invalid strategy for split-package: " + type);
-		return SPLIT_DEFAULT;
-	}
-
-	private Instruction matches(Collection<Instruction> instructions, String pack,
-			Set<Instruction> superfluousPatterns) {
-		for (Instruction pattern : instructions) {
-			if (pattern.matches(pack)) {
-				if (superfluousPatterns != null)
-					superfluousPatterns.remove(pattern);
-				return pattern;
-			}
-		}
-		return null;
-	}
-
-	private Map<String, Map<String, String>> getHeader(String string) {
-		if (string == null)
-			return Collections.emptyMap();
-		return parseHeader(getProperty(string));
-	}
-
-	/**
-	 * Parse the Bundle-Includes header. Files in the bundles Include header are
-	 * included in the jar. The source can be a directory or a file.
-	 *
-	 * @throws IOException
-	 * @throws FileNotFoundException
-	 */
-	private void doIncludeResources(Jar jar) throws Exception {
-		String includes = getProperty("Bundle-Includes");
-		if (includes == null) {
-			includes = getProperty(INCLUDERESOURCE);
-			if (includes == null || includes.length() == 0)
-				includes = getProperty("Include-Resource");
-		} else
-			warning("Please use -includeresource instead of Bundle-Includes");
-
-		doIncludeResource(jar, includes);
-
-	}
-
-	private void doIncludeResource(Jar jar, String includes) throws Exception {
-		Map<String, Map<String, String>> clauses = parseHeader(includes);
-		doIncludeResource(jar, clauses);
-	}
-
-	private void doIncludeResource(Jar jar, Map<String, Map<String, String>> clauses)
-			throws ZipException, IOException, Exception {
-		for (Map.Entry<String, Map<String, String>> entry : clauses.entrySet()) {
-			doIncludeResource(jar, entry.getKey(), entry.getValue());
-		}
-	}
-
-	private void doIncludeResource(Jar jar, String name, Map<String, String> extra)
-			throws ZipException, IOException, Exception {
-		boolean preprocess = false;
-		if (name.startsWith("{") && name.endsWith("}")) {
-			preprocess = true;
-			name = name.substring(1, name.length() - 1).trim();
-		}
-
-		String parts[] = name.split("\\s*=\\s*");
-		String source = parts[0];
-		String destination = parts[0];
-		if (parts.length == 2)
-			source = parts[1];
-
-		if (source.startsWith("@")) {
-			extractFromJar(jar, source.substring(1), parts.length == 1 ? "" : destination);
-		} else if (extra.containsKey("literal")) {
-			String literal = (String) extra.get("literal");
-			Resource r = new EmbeddedResource(literal.getBytes("UTF-8"), 0);
-			String x = (String) extra.get("extra");
-			if (x != null)
-				r.setExtra(x);
-			jar.putResource(name, r);
-		} else {
-			File sourceFile;
-			String destinationPath;
-
-			sourceFile = getFile(source);
-			if (parts.length == 1) {
-				// Directories should be copied to the root
-				// but files to their file name ...
-				if (sourceFile.isDirectory())
-					destinationPath = "";
-				else
-					destinationPath = sourceFile.getName();
-			} else {
-				destinationPath = parts[0];
-			}
-			// Handle directories
-			if (sourceFile.isDirectory()) {
-				destinationPath = doResourceDirectory(jar, extra, preprocess, sourceFile,
-						destinationPath);
-				return;
-			}
-
-			// destinationPath = checkDestinationPath(destinationPath);
-
-			if (!sourceFile.exists()) {
-				noSuchFile(jar, name, extra, source, destinationPath);
-			} else
-				copy(jar, destinationPath, sourceFile, preprocess, extra);
-		}
-	}
-
-	private String doResourceDirectory(Jar jar, Map<String, String> extra, boolean preprocess,
-			File sourceFile, String destinationPath) throws Exception {
-		String filter = extra.get("filter:");
-		boolean flatten = isTrue(extra.get("flatten:"));
-		boolean recursive = true;
-		String directive = extra.get("recursive:");
-		if (directive != null) {
-			recursive = isTrue(directive);
-		}
-
-		InstructionFilter iFilter = null;
-		if (filter != null) {
-			iFilter = new InstructionFilter(Instruction.getPattern(filter), recursive);
-		} else {
-			iFilter = new InstructionFilter(null, recursive);
-		}
-
-		Map<String, File> files = newMap();
-		resolveFiles(sourceFile, iFilter, recursive, destinationPath, files, flatten);
-
-		for (Map.Entry<String, File> entry : files.entrySet()) {
-			copy(jar, entry.getKey(), entry.getValue(), preprocess, extra);
-		}
-		return destinationPath;
-	}
-
-	private void resolveFiles(File dir, FileFilter filter, boolean recursive, String path,
-			Map<String, File> files, boolean flatten) {
-
-		if (Analyzer.doNotCopy.matcher(dir.getName()).matches()) {
-			return;
-		}
-
-		File[] fs = dir.listFiles(filter);
-		for (File file : fs) {
-			if (file.isDirectory()) {
-				if (recursive) {
-					String nextPath;
-					if (flatten)
-						nextPath = path;
-					else
-						nextPath = appendPath(path, file.getName());
-
-					resolveFiles(file, filter, recursive, nextPath, files, flatten);
-				}
-				// Directories are ignored otherwise
-			} else {
-				String p = appendPath(path, file.getName());
-				if (files.containsKey(p))
-					warning("Include-Resource overwrites entry %s from file %s", p, file);
-				files.put(p, file);
-			}
-		}
-	}
-
-	private void noSuchFile(Jar jar, String clause, Map<String, String> extra, String source,
-			String destinationPath) throws Exception {
-		Jar src = getJarFromName(source, "Include-Resource " + source);
-		if (src != null) {
-			JarResource jarResource = new JarResource(src);
-			jar.putResource(destinationPath, jarResource);
-		} else {
-			Resource lastChance = make.process(source);
-			if (lastChance != null) {
-				String x = extra.get("extra");
-				if (x != null)
-					lastChance.setExtra(x);
-				jar.putResource(destinationPath, lastChance);
-			} else
-				error("Input file does not exist: " + source);
-		}
-	}
-
-	/**
-	 * Extra resources from a Jar and add them to the given jar. The clause is
-	 * the
-	 *
-	 * @param jar
-	 * @param clauses
-	 * @param i
-	 * @throws ZipException
-	 * @throws IOException
-	 */
-	private void extractFromJar(Jar jar, String source, String destination) throws ZipException,
-			IOException {
-		// Inline all resources and classes from another jar
-		// optionally appended with a modified regular expression
-		// like @zip.jar!/META-INF/MANIFEST.MF
-		int n = source.lastIndexOf("!/");
-		Instruction instr = null;
-		if (n > 0) {
-			instr = Instruction.getPattern(source.substring(n + 2));
-			source = source.substring(0, n);
-		}
-
-		// Pattern filter = null;
-		// if (n > 0) {
-		// String fstring = source.substring(n + 2);
-		// source = source.substring(0, n);
-		// filter = wildcard(fstring);
-		// }
-		Jar sub = getJarFromName(source, "extract from jar");
-		if (sub == null)
-			error("Can not find JAR file " + source);
-		else {
-			jar.addAll(sub, instr, destination);
-		}
-	}
-
-	private void copy(Jar jar, String path, File from, boolean preprocess, Map<String, String> extra)
-			throws Exception {
-		if (doNotCopy.matcher(from.getName()).matches())
-			return;
-
-		if (from.isDirectory()) {
-
-			File files[] = from.listFiles();
-			for (int i = 0; i < files.length; i++) {
-				copy(jar, appendPath(path, files[i].getName()), files[i], preprocess, extra);
-			}
-		} else {
-			if (from.exists()) {
-				Resource resource = new FileResource(from);
-				if (preprocess) {
-					resource = new PreprocessResource(this, resource);
-				}
-				String x = extra.get("extra");
-				if (x != null)
-					resource.setExtra(x);
-				if (path.endsWith("/"))
-					path = path + from.getName();
-				jar.putResource(path, resource);
-
-				if (isTrue(extra.get(LIB_DIRECTIVE))) {
-					setProperty(BUNDLE_CLASSPATH, append(getProperty(BUNDLE_CLASSPATH), path));
-				}
-			} else {
-				error("Input file does not exist: " + from);
-			}
-		}
-	}
-
-	private String getName(String where) {
-		int n = where.lastIndexOf('/');
-		if (n < 0)
-			return where;
-
-		return where.substring(n + 1);
-	}
-
-	public void setSourcepath(File[] files) {
-		for (int i = 0; i < files.length; i++)
-			addSourcepath(files[i]);
-	}
-
-	public void addSourcepath(File cp) {
-		if (!cp.exists())
-			warning("File on sourcepath that does not exist: " + cp);
-
-		sourcePath.add(cp);
-	}
-
-	public void close() {
-		super.close();
-	}
-
-	/**
-	 * Build Multiple jars. If the -sub command is set, we filter the file with
-	 * the given patterns.
-	 *
-	 * @return
-	 * @throws Exception
-	 */
-	public Jar[] builds() throws Exception {
-		begin();
-
-		// Are we acting as a conduit for another JAR?
-		String conduit = getProperty(CONDUIT);
-		if (conduit != null) {
-			Map<String, Map<String, String>> map = parseHeader(conduit);
-			Jar[] result = new Jar[map.size()];
-			int n = 0;
-			for (String file : map.keySet()) {
-				Jar c = new Jar(getFile(file));
-				addClose(c);
-				String name = map.get(file).get("name");
-				if (name != null)
-					c.setName(name);
-
-				result[n++] = c;
-			}
-			return result;
-		}
-
-		List<Jar> result = new ArrayList<Jar>();
-		List<Builder> builders;
-
-		builders = getSubBuilders();
-
-		for (Builder builder : builders) {
-			try {
-				Jar jar = builder.build();
-				jar.setName(builder.getBsn());
-				result.add(jar);
-			} catch (Exception e) {
-				error("Sub Building " + builder.getBsn(), e);
-			}
-			if (builder != this)
-				getInfo(builder, builder.getBsn() + ": ");
-		}
-		return result.toArray(new Jar[result.size()]);
-	}
-
-	/**
-	 * Answer a list of builders that represent this file or a list of files
-	 * specified in -sub. This list can be empty. These builders represents to
-	 * be created artifacts and are each scoped to such an artifacts. The
-	 * builders can be used to build the bundles or they can be used to find out
-	 * information about the to be generated bundles.
-	 *
-	 * @return List of 0..n builders representing artifacts.
-	 * @throws Exception
-	 */
-	public List<Builder> getSubBuilders() throws Exception {
-		String sub = (String) getProperty(SUB);
-		if (sub == null || sub.trim().length() == 0 || EMPTY_HEADER.equals(sub))
-			return Arrays.asList(this);
-
-		List<Builder> builders = new ArrayList<Builder>();
-		if (isTrue(getProperty(NOBUNDLES)))
-			return builders;
-
-		Set<Instruction> subs = Instruction.replaceWithInstruction(parseHeader(sub)).keySet();
-
-		List<File> members = new ArrayList<File>(Arrays.asList(getBase().listFiles()));
-
-		nextFile: while (members.size() > 0) {
-
-			File file = members.remove(0);
-
-			// Check if the file is one of our parents
-			Processor p = this;
-			while (p != null) {
-				if (file.equals(p.getPropertiesFile()))
-					continue nextFile;
-				p = p.getParent();
-			}
-
-			// if
-			// (file.getCanonicalFile().equals(getPropertiesFile().getCanonicalFile()))
-			// continue nextFile;
-
-			for (Iterator<Instruction> i = subs.iterator(); i.hasNext();) {
-
-				Instruction instruction = i.next();
-				if (instruction.matches(file.getName())) {
-
-					if (!instruction.isNegated()) {
-
-						Builder builder = getSubBuilder();
-						if (builder != null) {
-							builder.setProperties(file);
-							addClose(builder);
-							builders.add(builder);
-						}
-					}
-
-					// Because we matched (even though we could be negated)
-					// we skip any remaining searches
-					continue nextFile;
-				}
-			}
-		}
-		return builders;
-	}
-
-	public Builder getSubBuilder() throws Exception {
-		Builder builder = new Builder(this);
-		builder.setBase(getBase());
-
-		for (Jar file : getClasspath()) {
-			builder.addClasspath(file);
-		}
-
-		return builder;
-	}
-
-	/**
-	 * A macro to convert a maven version to an OSGi version
-	 */
-
-	public String _maven_version(String args[]) {
-		if (args.length > 2)
-			error("${maven_version} macro receives too many arguments " + Arrays.toString(args));
-		else if (args.length < 2)
-			error("${maven_version} macro has no arguments, use ${maven_version;1.2.3-SNAPSHOT}");
-		else {
-			return cleanupVersion(args[1]);
-		}
-		return null;
-	}
-
-	public String _permissions(String args[]) throws IOException {
-		StringBuilder sb = new StringBuilder();
-
-		for (String arg : args) {
-			if ("packages".equals(arg) || "all".equals(arg)) {
-				for (String imp : getImports().keySet()) {
-					if (!imp.startsWith("java.")) {
-						sb.append("(org.osgi.framework.PackagePermission \"");
-						sb.append(imp);
-						sb.append("\" \"import\")\r\n");
-					}
-				}
-				for (String exp : getExports().keySet()) {
-					sb.append("(org.osgi.framework.PackagePermission \"");
-					sb.append(exp);
-					sb.append("\" \"export\")\r\n");
-				}
-			} else if ("admin".equals(arg) || "all".equals(arg)) {
-				sb.append("(org.osgi.framework.AdminPermission)");
-			} else if ("permissions".equals(arg))
-				;
-			else
-				error("Invalid option in ${permissions}: %s", arg);
-		}
-		return sb.toString();
-	}
-
-	/**
-     *
-     */
-	public void removeBundleSpecificHeaders() {
-		Set<String> set = new HashSet<String>(Arrays.asList(BUNDLE_SPECIFIC_HEADERS));
-		setForceLocal(set);
-	}
-
-	/**
-	 * Check if the given resource is in scope of this bundle. That is, it
-	 * checks if the Include-Resource includes this resource or if it is a class
-	 * file it is on the class path and the Export-Pacakge or Private-Package
-	 * include this resource.
-	 *
-	 * For now, include resources are skipped.
-	 *
-	 * @param f
-	 * @return
-	 */
-	public boolean isInScope(Collection<File> resources) throws Exception {
-		Map<String, Map<String, String>> clauses = parseHeader(getProperty(Constants.EXPORT_PACKAGE));
-		clauses.putAll(parseHeader(getProperty(Constants.PRIVATE_PACKAGE)));
-		if (isTrue(getProperty(Constants.UNDERTEST))) {
-			clauses.putAll(parseHeader(getProperty(Constants.TESTPACKAGES,
-					"test;presence:=optional")));
-		}
-		Collection<Instruction> instructions = Instruction.replaceWithInstruction(clauses).keySet();
-
-		for (File r : resources) {
-			String cpEntry = getClasspathEntrySuffix(r);
-			if (cpEntry != null) {
-				String pack = Clazz.getPackage(cpEntry);
-				Instruction i = matches(instructions, pack, null);
-				if (i != null)
-					return !i.isNegated();
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Answer the string of the resource that it has in the container.
-	 *
-	 * @param resource
-	 *            The resource to look for
-	 * @return
-	 * @throws Exception
-	 */
-	public String getClasspathEntrySuffix(File resource) throws Exception {
-		for (Jar jar : getClasspath()) {
-			File source = jar.getSource();
-			if (source != null) {
-				source = source.getCanonicalFile();
-				String sourcePath = source.getAbsolutePath();
-				String resourcePath = resource.getAbsolutePath();
-
-				if (resourcePath.startsWith(sourcePath)) {
-					// Make sure that the path name is translated correctly
-					// i.e. on Windows the \ must be translated to /
-					String filePath = resourcePath.substring(sourcePath.length() + 1);
-
-					return filePath.replace(File.separatorChar, '/');
-				}
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestPlugin.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestPlugin.java
index 5a136cd..f427003 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestPlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestPlugin.java
@@ -167,7 +167,8 @@
         properties.putAll( getDefaultProperties( project ) );
         properties.putAll( transformDirectives( instructions ) );
 
-        PackageVersionAnalyzer analyzer = new PackageVersionAnalyzer();
+//        PackageVersionAnalyzer analyzer = new PackageVersionAnalyzer();
+        Builder analyzer = new Builder();
 
         if ( project.getBasedir() != null )
             analyzer.setBase( project.getBasedir() );
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/PackageVersionAnalyzer.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/PackageVersionAnalyzer.java
index 33fb8c4..7273e02 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/PackageVersionAnalyzer.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/PackageVersionAnalyzer.java
@@ -37,6 +37,7 @@
     /*
      * Remove META-INF subfolders from exports and set package versions to bundle version.
      */
+/*
     public Map analyzeBundleClasspath( Jar dot, Map bundleClasspath, Map contained, Map referred, Map uses )
         throws IOException
     {
@@ -46,14 +47,14 @@
         {
             Map.Entry entry = ( Map.Entry ) it.next();
 
-            /* remove packages under META-INF */
+            // remove packages under META-INF
             String packageName = ( String ) entry.getKey();
             if ( packageName.startsWith( "META-INF." ) )
             {
                 it.remove();
             }
 
-            /* set package versions to bundle version values */
+            // set package versions to bundle version values
             if ( bundleVersion != null )
             {
                 Map values = ( Map ) entry.getValue();
@@ -65,4 +66,5 @@
         }
         return classSpace;
     }
+*/
 }
diff --git a/bundleplugin/src/test/java/org/apache/felix/bundleplugin/BundlePluginTest.java b/bundleplugin/src/test/java/org/apache/felix/bundleplugin/BundlePluginTest.java
index e968e0e..0851e44 100644
--- a/bundleplugin/src/test/java/org/apache/felix/bundleplugin/BundlePluginTest.java
+++ b/bundleplugin/src/test/java/org/apache/felix/bundleplugin/BundlePluginTest.java
@@ -113,7 +113,8 @@
         project.setArtifactId( "artifact" );
         project.setVersion( "1.1.0.0" );
 
-        PackageVersionAnalyzer analyzer = new PackageVersionAnalyzer();
+//        PackageVersionAnalyzer analyzer = new PackageVersionAnalyzer();
+        Builder analyzer = new Builder();
         Jar jar = new Jar( "name", osgiBundleFile );
         analyzer.setJar( jar );
         analyzer.setClasspath( new Jar[]