Another bnd code refresh

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1360983 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java b/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java
index b31be5c..152f326 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java
@@ -15,6 +15,7 @@
 import aQute.bnd.make.metatype.*;
 import aQute.bnd.maven.*;
 import aQute.bnd.service.*;
+import aQute.bnd.service.RepositoryPlugin.Strategy;
 import aQute.bnd.service.diff.*;
 import aQute.lib.collections.*;
 import aQute.lib.osgi.Descriptors.PackageRef;
@@ -1504,23 +1505,17 @@
 
 		System.err.printf("baseline %s%n", diffs);
 
+		Jar other = getBaselineJar();
+		if (other == null) {
+			return;
+		}
 		Baseline baseline = new Baseline(this, differ);
-
-		for (Entry<String,Attrs> entry : diffs.entrySet()) {
-			String path = entry.getKey();
-			File file = getFile(path);
-			if (!file.isFile()) {
-				error("Diffing against %s that is not a file", file);
-				continue;
-			}
-			Jar other = new Jar(file);
-			Set<Info> infos = baseline.baseline(dot, other, null);
-			for (Info info : infos) {
-				if (info.mismatch) {
-					error("%s %-50s %-10s %-10s %-10s %-10s %-10s\n", info.mismatch ? '*' : ' ', info.packageName,
-							info.packageDiff.getDelta(), info.newerVersion, info.olderVersion, info.suggestedVersion,
-							info.suggestedIfProviders == null ? "-" : info.suggestedIfProviders);
-				}
+		Set<Info> infos = baseline.baseline(dot, other, null);
+		for (Info info : infos) {
+			if (info.mismatch) {
+				error("%s %-50s %-10s %-10s %-10s %-10s %-10s\n", info.mismatch ? '*' : ' ', info.packageName,
+						info.packageDiff.getDelta(), info.newerVersion, info.olderVersion, info.suggestedVersion,
+						info.suggestedIfProviders == null ? "-" : info.suggestedIfProviders);
 			}
 		}
 	}
@@ -1531,4 +1526,50 @@
 		}
 	}
 
+	public Jar getBaselineJar() throws Exception {
+
+		List<RepositoryPlugin> repos = getPlugins(RepositoryPlugin.class);
+
+		Parameters diffs = parseHeader(getProperty("-baseline"));
+		File baselineFile = null;
+		if (diffs.isEmpty()) {
+			String repoName = getProperty("-baseline-repo");
+			if (repoName == null) {
+				return null;
+			}
+			for (RepositoryPlugin repo : repos) {
+				if (repoName.equals(repo.getName())) {
+					baselineFile = repo.get(getBsn(), null, Strategy.HIGHEST, null);
+					break;
+				}
+			}
+		} else {
+
+			String bsn = null;
+			String version = null;
+			for (Entry<String,Attrs> entry : diffs.entrySet()) {
+				bsn = entry.getKey();
+				if ("@".equals(bsn)) {
+					bsn = getBsn();
+				}
+				version = entry.getValue().get(Constants.VERSION_ATTRIBUTE);
+				break;
+			}
+	
+			for (RepositoryPlugin repo : repos) {
+				if (version == null) {
+					baselineFile = repo.get(bsn, null, Strategy.HIGHEST, null);
+				} else {
+					baselineFile = repo.get(bsn, version, Strategy.EXACT, null);
+				}
+				if (baselineFile != null) {
+					break;
+				}
+			}
+		}
+		if (baselineFile == null) {
+			return new Jar(".");
+		}
+		return new Jar(baselineFile);
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java b/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java
index 7454087..767e516 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java
@@ -110,6 +110,16 @@
 	String							RUNSYSTEMPACKAGES							= "-runsystempackages";
 	String							RUNBUNDLES									= "-runbundles";
 	String							RUNREPOS									= "-runrepos";
+
+	/**
+	 * @deprecated This is for support of the legacy OBR requirement format, use {@link #RUNREQUIRES} for new format.
+	 */
+	@Deprecated
+	String							RUNREQUIRE									= "-runrequire";
+	
+	String							RUNREQUIRES									= "-runrequires";
+	
+	String							RUNEE										= "-runee";
 	String							RUNPATH										= "-runpath";
 	String							RUNSTORAGE									= "-runstorage";
 	String							RUNBUILDS									= "-runbuilds";
@@ -250,7 +260,6 @@
 	Charset							DEFAULT_CHARSET								= Charset.forName("UTF8");
 	String							VERSION_FILTER								= "version";
 	String							PROVIDER_TYPE_DIRECTIVE						= "x-provider-type:";
-
 	/**
 	 * Component constants
 	 */
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java b/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java
index 3e109d6..8730b69 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java
@@ -854,7 +854,7 @@
 				if (patterns[i] != null) {
 					Matcher m = patterns[i].matcher(args[i]);
 					if (!m.matches())
-						message += String.format("Argument %s (%s) does not match %s\n", i, args[i],
+						message += String.format("Argument %s (%s) does not match %s%n", i, args[i],
 								patterns[i].pattern());
 				}
 			}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Processor.java b/bundleplugin/src/main/java/aQute/lib/osgi/Processor.java
index c6b5dd9..ef4013f 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Processor.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Processor.java
@@ -1254,15 +1254,15 @@
 
 	protected void report(Appendable out) throws IOException {
 		if (errors.size() > 0) {
-			out.append("-----------------\nErrors\n");
+			out.append(String.format("-----------------%nErrors%n"));
 			for (int i = 0; i < errors.size(); i++) {
-				out.append(String.format("%03d: %s\n", i, errors.get(i)));
+				out.append(String.format("%03d: %s%n", i, errors.get(i)));
 			}
 		}
 		if (warnings.size() > 0) {
-			out.append(String.format("-----------------\nWarnings\n"));
+			out.append(String.format("-----------------%nWarnings%n"));
 			for (int i = 0; i < warnings.size(); i++) {
-				out.append(String.format("%03d: %s\n", i, warnings.get(i)));
+				out.append(String.format("%03d: %s%n", i, warnings.get(i)));
 			}
 		}
 	}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReq.java b/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReq.java
index 3f07825..c175060 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReq.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReq.java
@@ -5,6 +5,7 @@
 import java.util.Map;
 
 import org.osgi.resource.Capability;
+import org.osgi.resource.Namespace;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
 
@@ -90,8 +91,18 @@
 
 	@Override
 	public String toString() {
-		return mode + " [namespace=" + namespace + ", resource=" + System.identityHashCode(resource) + ", directives="
-				+ directives + ", attributes=" + attributes + "]";
+		StringBuilder builder = new StringBuilder();
+		if (mode == MODE.Capability) {
+			Object value = attributes.get(namespace);
+			builder.append(namespace).append('=').append(value);
+		} else {
+			String filter = directives.get(Namespace.REQUIREMENT_FILTER_DIRECTIVE);
+			builder.append(filter);
+			if (Namespace.RESOLUTION_OPTIONAL.equals(directives.get(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE))) {
+				builder.append("%OPT");
+			}
+		}
+		return builder.toString();
 	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReqBuilder.java b/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReqBuilder.java
index 654c7de..1e259c9 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReqBuilder.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReqBuilder.java
@@ -26,6 +26,20 @@
 		this.namespace = namespace;
 	}
 	
+	public static CapReqBuilder clone(Capability capability) {
+		CapReqBuilder builder = new CapReqBuilder(capability.getNamespace());
+		builder.addAttributes(capability.getAttributes());
+		builder.addDirectives(capability.getDirectives());
+		return builder;
+	}
+	
+	public static CapReqBuilder clone(Requirement requirement) {
+		CapReqBuilder builder = new CapReqBuilder(requirement.getNamespace());
+		builder.addAttributes(requirement.getAttributes());
+		builder.addDirectives(requirement.getDirectives());
+		return builder;
+	}
+	
 	public String getNamespace() {
 		return namespace;
 	}
@@ -39,12 +53,22 @@
 		attributes.put(name, value);
 		return this;
 	}
+	
+	public CapReqBuilder addAttributes(Map<? extends String, ? extends Object> attributes) {
+		this.attributes.putAll(attributes);
+		return this;
+	}
 
 	public CapReqBuilder addDirective(String name, String value) {
 		directives.put(name, value);
 		return this;
 	}
 	
+	public CapReqBuilder addDirectives(Map<? extends String, ? extends String> directives) {
+		this.directives.putAll(directives);
+		return this;
+	}
+	
 	public Capability buildCapability() {
 		// TODO check the thrown exception
 		if (resource == null) throw new IllegalStateException("Cannot build Capability with null Resource.");
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceBuilder.java b/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceBuilder.java
index cd9b982..9e9cde3 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceBuilder.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceBuilder.java
@@ -15,6 +15,11 @@
 
 	private boolean					built			= false;
 
+	public ResourceBuilder addCapability(Capability capability) {
+		CapReqBuilder builder = CapReqBuilder.clone(capability);
+		return addCapability(builder);
+	}
+	
 	public ResourceBuilder addCapability(CapReqBuilder builder) {
 		if (built)
 			throw new IllegalStateException("Resource already built");
@@ -24,7 +29,12 @@
 
 		return this;
 	}
-
+	
+	public ResourceBuilder addRequirement(Requirement requirement) {
+		CapReqBuilder builder = CapReqBuilder.clone(requirement);
+		return addRequirement(builder);
+	}
+	
 	public ResourceBuilder addRequirement(CapReqBuilder builder) {
 		if (built)
 			throw new IllegalStateException("Resource already built");
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceImpl.java b/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceImpl.java
index 3fa6218..7305148 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceImpl.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceImpl.java
@@ -5,6 +5,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
@@ -55,12 +56,22 @@
 
 	@Override
 	public String toString() {
-		StringBuilder builder = new StringBuilder();
-		builder.append("ResourceImpl [caps=");
-		builder.append(allCapabilities);
-		builder.append(", reqs=");
-		builder.append(allRequirements);
-		builder.append("]");
+		final StringBuilder builder = new StringBuilder();
+		List<Capability> identities = getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE);
+		if (identities != null && identities.size() == 1) {
+			Capability idCap = identities.get(0);
+			Object id = idCap.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE);
+			Object version = idCap.getAttributes().get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE);
+			
+			builder.append(id).append(" ver=").append(version);
+		} else {
+			// Generic toString
+			builder.append("ResourceImpl [caps=");
+			builder.append(allCapabilities);
+			builder.append(", reqs=");
+			builder.append(allRequirements);
+			builder.append("]");
+		}
 		return builder.toString();
 	}