Sync bnd code

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1412393 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundleplugin/src/main/java/aQute/bnd/osgi/Analyzer.java b/bundleplugin/src/main/java/aQute/bnd/osgi/Analyzer.java
index fbbf4fa..7548f51 100755
--- a/bundleplugin/src/main/java/aQute/bnd/osgi/Analyzer.java
+++ b/bundleplugin/src/main/java/aQute/bnd/osgi/Analyzer.java
@@ -2008,7 +2008,7 @@
 
 	private static String removeLeadingZeroes(String group) {
 		if (group == null)
-			return null;
+			return "0";
 
 		int n = 0;
 		while (n < group.length() - 1 && group.charAt(n) == '0')
diff --git a/bundleplugin/src/main/java/aQute/bnd/osgi/Domain.java b/bundleplugin/src/main/java/aQute/bnd/osgi/Domain.java
index 1b17aaf..e904aa8 100644
--- a/bundleplugin/src/main/java/aQute/bnd/osgi/Domain.java
+++ b/bundleplugin/src/main/java/aQute/bnd/osgi/Domain.java
@@ -2,6 +2,7 @@
 
 import static aQute.bnd.osgi.Constants.*;
 
+import java.io.*;
 import java.util.*;
 import java.util.Map.Entry;
 import java.util.jar.*;
@@ -17,6 +18,7 @@
  * provides convenient methods to access these properties via semantic methods.
  */
 public abstract class Domain implements Iterable<String> {
+	final Properties	translation	= new Properties();
 
 	public abstract String get(String key);
 
@@ -27,6 +29,23 @@
 		return deflt;
 	}
 
+	public String translate(String key) {
+		return translate(key, null);
+	}
+	
+	
+	public String translate(String key, String deflt) {
+		String value = get(key);
+		if ( value == null)
+			return deflt;
+		
+		if ( value.indexOf('%')>=0) {
+			value = value.trim().substring(1);
+			return translation.getProperty(value,value);
+		}
+		return null;
+	}
+
 	public abstract void set(String key, String value);
 
 	public abstract Iterator<String> iterator();
@@ -147,6 +166,13 @@
 	public Parameters getParameters(String key, String deflt, Reporter reporter) {
 		return new Parameters(get(key, deflt), reporter);
 	}
+	
+	
+	public Parameters getRequireBundle() {
+		return getParameters(Constants.REQUIRE_BUNDLE);
+	}
+
+
 
 	public Parameters getImportPackage() {
 		return getParameters(IMPORT_PACKAGE);
@@ -244,6 +270,13 @@
 		return p.entrySet().iterator().next();
 	}
 
+	public Map.Entry<String,Attrs> getFragmentHost() {
+		Parameters p = getParameters(FRAGMENT_HOST);
+		if (p.isEmpty())
+			return null;
+		return p.entrySet().iterator().next();
+	}
+
 	public void setBundleSymbolicName(String s) {
 		set(BUNDLE_SYMBOLICNAME, s);
 	}
@@ -307,4 +340,37 @@
 		set(CONDITIONAL_PACKAGE, string);
 
 	}
+
+	public void setTranslation(Jar jar) throws Exception {
+
+		Manifest m = jar.getManifest();
+		if (m == null)
+			return;
+
+		String path = m.getMainAttributes().getValue(Constants.BUNDLE_LOCALIZATION);
+		if (path == null)
+			path = org.osgi.framework.Constants.BUNDLE_LOCALIZATION_DEFAULT_BASENAME;
+
+		path += ".properties";
+
+		Resource propsResource = jar.getResource(path);
+		if (propsResource != null) {
+			InputStream in = propsResource.openInputStream();
+			try {
+				translation.load(in);
+			}
+			finally {
+				in.close();
+			}
+		}
+	}
+
+	public Parameters getRequireCapability() {
+		return getParameters(Constants.REQUIRE_CAPABILITY);
+	}
+
+	public Parameters getProvideCapability() {
+		return getParameters(Constants.PROVIDE_CAPABILITY);
+	}
+
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/osgi/Macro.java b/bundleplugin/src/main/java/aQute/bnd/osgi/Macro.java
index be1a4c8..6146a00 100755
--- a/bundleplugin/src/main/java/aQute/bnd/osgi/Macro.java
+++ b/bundleplugin/src/main/java/aQute/bnd/osgi/Macro.java
@@ -220,9 +220,10 @@
 				Method m = target.getClass().getMethod(cname, new Class[] {
 					String[].class
 				});
-				return (String) m.invoke(target, new Object[] {
+				Object result = m.invoke(target, new Object[] {
 					args
 				});
+				return result == null ? null : result.toString();
 			}
 			catch (NoSuchMethodException e) {
 				// Ignore
diff --git a/bundleplugin/src/main/java/aQute/bnd/osgi/Verifier.java b/bundleplugin/src/main/java/aQute/bnd/osgi/Verifier.java
index b5bd72c..77b324d 100755
--- a/bundleplugin/src/main/java/aQute/bnd/osgi/Verifier.java
+++ b/bundleplugin/src/main/java/aQute/bnd/osgi/Verifier.java
@@ -78,7 +78,7 @@
 	public final static String	SYMBOLICNAME_STRING				= "[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)*";
 	public final static Pattern	SYMBOLICNAME					= Pattern.compile(SYMBOLICNAME_STRING);
 
-	public final static String	VERSION_STRING					= "[0-9]+(\\.[0-9]+(\\.[0-9]+(\\.[0-9A-Za-z_-]+)?)?)?";
+	public final static String	VERSION_STRING					= "[0-9]{1,9}(\\.[0-9]{1,9}(\\.[0-9]{1,9}(\\.[0-9A-Za-z_-]+)?)?)?";
 	public final static Pattern	VERSION							= Pattern.compile(VERSION_STRING);
 	final static Pattern		FILTEROP						= Pattern.compile("=|<=|>=|~=");
 	public final static Pattern	VERSIONRANGE					= Pattern.compile("((\\(|\\[)"
diff --git a/bundleplugin/src/main/java/aQute/bnd/osgi/packageinfo b/bundleplugin/src/main/java/aQute/bnd/osgi/packageinfo
index 084a0d4..a2afe57 100644
--- a/bundleplugin/src/main/java/aQute/bnd/osgi/packageinfo
+++ b/bundleplugin/src/main/java/aQute/bnd/osgi/packageinfo
@@ -1 +1 @@
-version 2.0.0
+version 2.1.0
diff --git a/bundleplugin/src/main/java/aQute/bnd/osgi/resource/CapReqBuilder.java b/bundleplugin/src/main/java/aQute/bnd/osgi/resource/CapReqBuilder.java
index b06f37a..593dd39 100644
--- a/bundleplugin/src/main/java/aQute/bnd/osgi/resource/CapReqBuilder.java
+++ b/bundleplugin/src/main/java/aQute/bnd/osgi/resource/CapReqBuilder.java
@@ -18,74 +18,80 @@
 	public CapReqBuilder(String namespace) {
 		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;
 	}
-	
+
 	public CapReqBuilder setResource(Resource resource) {
 		this.resource = resource;
 		return this;
 	}
 
 	public CapReqBuilder addAttribute(String name, Object value) {
-		attributes.put(name, value);
+		if (value != null)
+			attributes.put(name, value);
 		return this;
 	}
-	
-	public CapReqBuilder addAttributes(Map<? extends String, ? extends Object> attributes) {
+
+	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);
+		if (value != null)
+			directives.put(name, value);
 		return this;
 	}
-	
-	public CapReqBuilder addDirectives(Map<? extends String, ? extends String> directives) {
+
+	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.");
+		if (resource == null)
+			throw new IllegalStateException("Cannot build Capability with null Resource.");
 		return new CapReq(MODE.Capability, namespace, resource, directives, attributes);
 	}
-	
+
 	public Requirement buildRequirement() {
 		// TODO check the thrown exception
-		if (resource == null) throw new IllegalStateException("Cannot build Requirement with null Resource.");
+		if (resource == null)
+			throw new IllegalStateException("Cannot build Requirement with null Resource.");
 		return new CapReq(MODE.Requirement, namespace, resource, directives, attributes);
 	}
 
 	public Requirement buildSyntheticRequirement() {
 		return new CapReq(MODE.Requirement, namespace, null, directives, attributes);
 	}
-	
+
 	public static final CapReqBuilder createPackageRequirement(String pkgName, String range) {
 		Filter filter;
 		SimpleFilter pkgNameFilter = new SimpleFilter(PackageNamespace.PACKAGE_NAMESPACE, pkgName);
 		if (range != null)
-			filter = new AndFilter().addChild(pkgNameFilter).addChild(new LiteralFilter(Filters.fromVersionRange(range)));
+			filter = new AndFilter().addChild(pkgNameFilter).addChild(
+					new LiteralFilter(Filters.fromVersionRange(range)));
 		else
 			filter = pkgNameFilter;
-		
-		return new CapReqBuilder(PackageNamespace.PACKAGE_NAMESPACE).addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, filter.toString());
+
+		return new CapReqBuilder(PackageNamespace.PACKAGE_NAMESPACE).addDirective(
+				Namespace.REQUIREMENT_FILTER_DIRECTIVE, filter.toString());
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/osgi/resource/packageinfo b/bundleplugin/src/main/java/aQute/bnd/osgi/resource/packageinfo
index a4f1546..b1793a2 100644
--- a/bundleplugin/src/main/java/aQute/bnd/osgi/resource/packageinfo
+++ b/bundleplugin/src/main/java/aQute/bnd/osgi/resource/packageinfo
@@ -1 +1 @@
-version 1.0
\ No newline at end of file
+version 1.1.0
\ No newline at end of file