Author: mcculls
Date: Thu Nov 22 00:42:55 2012
New Revision: 1412393

URL: http://svn.apache.org/viewvc?rev=1412393&view=rev
Log:
Sync bnd code

Added:
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/obr/
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/obr/OBRFragment.java   
(with props)
Modified:
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/build/ProjectBuilder.java
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/help/Syntax.java
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Analyzer.java
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Domain.java
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Macro.java
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Verifier.java
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/packageinfo
    
felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/CapReqBuilder.java
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/packageinfo
    felix/trunk/bundleplugin/src/main/java/aQute/bnd/version/Version.java
    felix/trunk/bundleplugin/src/main/java/aQute/lib/io/IO.java
    felix/trunk/bundleplugin/src/main/java/aQute/libg/tuple/Pair.java
    felix/trunk/bundleplugin/src/main/resources/aQute/lib/spring/extract.xsl

Modified: 
felix/trunk/bundleplugin/src/main/java/aQute/bnd/build/ProjectBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/build/ProjectBuilder.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/build/ProjectBuilder.java 
(original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/build/ProjectBuilder.java 
Thu Nov 22 00:42:55 2012
@@ -116,37 +116,23 @@ public class ProjectBuilder extends Buil
                }
        }
 
-       protected Jar getBaselineJar(boolean fallback) throws Exception {
+       public Jar getBaselineJar(boolean fallback) throws Exception {
 
                String baseline = getProperty(Constants.BASELINE);
-               if ((baseline == null || baseline.trim().length() == 0) && 
!fallback)
+               String baselineRepo = getProperty(Constants.BASELINEREPO);
+               if ((baseline == null || baseline.trim().length() == 0) 
+                               && (baselineRepo == null || 
baselineRepo.trim().length() == 0) && !fallback)
                        return null;
 
-               trace("baseline %s", baseline);
-
                File baselineFile = null;
-               if ((baseline == null || baseline.trim().length() == 0) && 
fallback) {
-
-                       String repoName = getProperty(Constants.BASELINEREPO);
-                       if (repoName == null) {
-                               repoName = getProperty(Constants.RELEASEREPO);
-                               if (repoName == null) {
-                                       return null;
-                               }
-                       }
-
-                       List<RepositoryPlugin> repos = 
getPlugins(RepositoryPlugin.class);
-                       for (RepositoryPlugin repo : repos) {
-                               if (repoName.equals(repo.getName())) {
-                                       SortedSet<Version> versions = 
repo.versions(getBsn());
-                                       if (!versions.isEmpty()) {
-                                               baselineFile = 
repo.get(getBsn(), versions.last(), null);
-                                       }
-                                       break;
-                               }
-                       }
+               if ((baseline == null || baseline.trim().length() == 0)) {
+                       baselineFile = getBaselineFromRepo(fallback);
+                       if (baselineFile != null)
+                               trace("baseline %s", baselineFile.getName());
                } else {
 
+                       trace("baseline %s", baseline);
+
                        Collection<Container> bundles = 
project.getBundles(Strategy.LOWEST, baseline);
                        for (Container c : bundles) {
 
@@ -165,6 +151,32 @@ public class ProjectBuilder extends Buil
                return new Jar(baselineFile);
        }
 
+       private File getBaselineFromRepo(boolean fallback) throws Exception {
+               String repoName = getProperty(Constants.BASELINEREPO);
+               if (repoName == null && !fallback)
+                       return null;
+
+               if (repoName == null) {
+                       repoName = getProperty(Constants.RELEASEREPO);
+                       if (repoName == null) {
+                               return null;
+                       }
+               }
+
+               List<RepositoryPlugin> repos = 
getPlugins(RepositoryPlugin.class);
+               for (RepositoryPlugin repo : repos) {
+                       if (repoName.equals(repo.getName())) {
+                               SortedSet<Version> versions = 
repo.versions(getBsn());
+                               if (!versions.isEmpty()) {
+                                       return repo.get(getBsn(), 
versions.last(), null);
+                               }
+                               break;
+                       }
+               }
+               return null;
+
+       }
+
        /** 
         * Gets the baseline Jar. 
         * 

Modified: felix/trunk/bundleplugin/src/main/java/aQute/bnd/help/Syntax.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/help/Syntax.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/help/Syntax.java (original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/help/Syntax.java Thu Nov 
22 00:42:55 2012
@@ -38,7 +38,7 @@ public class Syntax implements Constants
                                                                                
                                                                                
                        + Verifier.VERSIONRANGE
                                                                                
                                                                                
                                        .toString()));
 
-       static Syntax[]                                                 
syntaxes                                = new Syntax[] {
+       static final Syntax[]                                   syntaxes        
                        = new Syntax[] {
                        new Syntax(
                                        BUNDLE_ACTIVATIONPOLICY,
                                        "The " + BUNDLE_ACTIVATIONPOLICY + " 
header specifies how the framework should activate the bundle once started.",

Added: felix/trunk/bundleplugin/src/main/java/aQute/bnd/obr/OBRFragment.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/obr/OBRFragment.java?rev=1412393&view=auto
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/obr/OBRFragment.java 
(added)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/obr/OBRFragment.java Thu 
Nov 22 00:42:55 2012
@@ -0,0 +1,300 @@
+package aQute.bnd.obr;
+
+import java.io.*;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.jar.*;
+import java.util.regex.*;
+
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+import org.osgi.framework.namespace.*;
+import org.osgi.namespace.service.*;
+import org.osgi.resource.*;
+import org.osgi.service.repository.*;
+
+import aQute.bnd.header.*;
+import aQute.bnd.osgi.*;
+import aQute.bnd.osgi.resource.*;
+import aQute.bnd.version.*;
+import aQute.libg.cryptography.*;
+import aQute.libg.map.*;
+import aQute.service.reporter.*;
+
+public class OBRFragment {
+
+       // The mime-type of an OSGi bundle
+       static final String     MIME_TYPE_OSGI_BUNDLE   = 
"application/vnd.osgi.bundle";
+static Pattern EE_PATTERN = 
Pattern.compile("[^.]-([\\d]+(?:\\.[\\d]+(?:\\.[\\d]+(?:\\.)?)?)?)");
+
+       @SuppressWarnings("deprecation")
+       public static Reporter parse(Jar jar, ResourceBuilder resource) throws 
Exception {
+               Manifest m = jar.getManifest();
+               if (m == null)
+                       return null;
+
+               Domain d = Domain.domain(m);
+               d.setTranslation(jar);
+               Entry<String,Attrs> bundleSymbolicName = 
d.getBundleSymbolicName();
+
+               if (bundleSymbolicName == null)
+                       return null;
+
+               boolean singleton = 
"true".equals(bundleSymbolicName.getValue().get(Constants.SINGLETON_DIRECTIVE + 
":"));
+               boolean isFragment = d.get(Constants.FRAGMENT_HOST) != null;
+               Version version = d.getBundleVersion() == null ? 
Version.emptyVersion : new Version(d.getBundleVersion());
+               
+               CapReqBuilder identity = new 
CapReqBuilder(IdentityNamespace.IDENTITY_NAMESPACE);
+               identity.addAttribute(IdentityNamespace.IDENTITY_NAMESPACE, 
bundleSymbolicName.getKey());
+               
identity.addAttribute(IdentityNamespace.CAPABILITY_COPYRIGHT_ATTRIBUTE, 
d.translate(Constants.BUNDLE_COPYRIGHT));
+               
identity.addAttribute(IdentityNamespace.CAPABILITY_DESCRIPTION_ATTRIBUTE,
+                               d.translate(Constants.BUNDLE_DESCRIPTION));
+               
identity.addAttribute(IdentityNamespace.CAPABILITY_DOCUMENTATION_ATTRIBUTE,
+                               d.translate(Constants.BUNDLE_DOCURL));
+               
identity.addAttribute(IdentityNamespace.CAPABILITY_LICENSE_ATTRIBUTE, 
d.translate("Bundle-License"));
+               if (singleton)
+                       
identity.addAttribute(IdentityNamespace.CAPABILITY_SINGLETON_DIRECTIVE, "true");
+               
identity.addAttribute(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE,
+                               isFragment ? IdentityNamespace.TYPE_FRAGMENT
+                                               : 
IdentityNamespace.TYPE_BUNDLE);
+               
identity.addAttribute(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE, new 
Version(d.getBundleVersion()));
+
+               resource.addCapability(identity);
+
+               
+               if ( isFragment ) {
+                       
+                       //
+                       // Fragment-Host
+                       //
+
+                       Entry<String,Attrs> fragmentHost = d.getFragmentHost();
+                       CapReqBuilder fragment = new 
CapReqBuilder(HostNamespace.HOST_NAMESPACE);
+                       String v = fragmentHost.getValue().get("version");
+                       if ( v == null)
+                               v = "0";
+                       Version fragmentVersion = new Version(v);
+                       String filter = 
filter(PackageNamespace.PACKAGE_NAMESPACE, fragmentHost.getKey(), 
fragmentHost.getValue());
+                       
fragment.addDirective(HostNamespace.REQUIREMENT_FILTER_DIRECTIVE, 
filter.toString());
+                       resource.addRequirement(fragment);
+               } else {
+                       
+                       //
+                       // Bundle-SymbolicName
+                       //
+                       
+                       CapReqBuilder bundle = new 
CapReqBuilder(BundleNamespace.BUNDLE_NAMESPACE);
+                       CapReqBuilder host = new 
CapReqBuilder(HostNamespace.HOST_NAMESPACE);
+                       
+                       bundle.addAttribute("version", version);
+                       host.addAttribute("version", version);
+                       
+                       for (Entry<String,String> e : 
bundleSymbolicName.getValue().entrySet()) {
+                               String key = e.getKey();
+                               if (key.endsWith(":")) {
+                                       String directive = key.substring(0, 
key.length() - 1);
+                                       if 
(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE.equalsIgnoreCase(directive)) {
+                                               if 
(Constants.FRAGMENT_ATTACHMENT_NEVER.equalsIgnoreCase(e.getValue()))
+                                                       host = null;
+                                               
+                                       } else if 
(!Constants.SINGLETON_DIRECTIVE.equalsIgnoreCase(directive)) {
+                                               bundle.addDirective(directive, 
e.getValue());
+                                       }
+                                       if ( host != null )
+                                               host.addDirective(directive, 
e.getValue());
+                                       bundle.addDirective(directive, 
e.getValue());                                   
+                               } else {
+                                       if ( host != null )
+                                               host.addAttribute(key, 
e.getValue());
+                                       bundle.addAttribute(key, e.getValue());
+                               }
+                       }
+                       if ( host != null)
+                               resource.addCapability(host);
+                       resource.addCapability(bundle);
+               }               
+               
+               //
+               // Export-Package
+               //
+               
+               Parameters exports = d.getExportPackage();              
+               for (Entry<String,Attrs> entry : exports.entrySet()) {
+                       CapReqBuilder exported = new 
CapReqBuilder(PackageNamespace.PACKAGE_NAMESPACE);
+
+                       String pkgName = 
Processor.removeDuplicateMarker(entry.getKey());
+                       
exported.addAttribute(PackageNamespace.PACKAGE_NAMESPACE, pkgName);
+
+                       String versionStr = 
entry.getValue().get(Constants.VERSION_ATTRIBUTE);
+                       Version v = 
Version.parseVersion(entry.getValue().get("version"));
+                       
+                       
exported.addAttribute(PackageNamespace.CAPABILITY_VERSION_ATTRIBUTE, version);
+
+                       for (Entry<String,String> attribEntry : 
entry.getValue().entrySet()) {
+                               String key = attribEntry.getKey();
+                               if (key.endsWith(":")) {
+                                       String directive = key.substring(0, 
key.length()-1);
+                                       exported.addDirective(directive, 
attribEntry.getValue());
+                               } else {
+                                       if ( 
key.equals("specification-version") || key.equals("version"))
+                                               
exported.addAttribute("version",  Version.parseVersion(attribEntry.getValue()));
+                                       else
+                                               exported.addAttribute(key, 
attribEntry.getValue());
+                               }
+                       }
+
+                       
exported.addAttribute(PackageNamespace.CAPABILITY_BUNDLE_SYMBOLICNAME_ATTRIBUTE,
 bundleSymbolicName.getKey());
+                       
exported.addAttribute(PackageNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE, 
version);
+
+                       resource.addCapability(exported);
+               }
+
+               //
+               // Import-Package
+               //
+               
+               Parameters imports = d.getImportPackage();              
+               for (Entry<String,Attrs> entry : imports.entrySet()) {
+                       CapReqBuilder imported = new 
CapReqBuilder(PackageNamespace.PACKAGE_NAMESPACE);
+                       String name = 
Processor.removeDuplicateMarker(entry.getKey());
+                       String filter = 
filter(PackageNamespace.PACKAGE_NAMESPACE, 
Processor.removeDuplicateMarker(entry.getKey()), entry.getValue());
+                       
imported.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, filter);          
        
+                       resource.addRequirement(imported);
+               }
+
+               //
+               // Require-Bundle
+               //
+               
+               Parameters requires = d.getRequireBundle();
+               for (Entry<String,Attrs> entry : requires.entrySet()) {
+                       CapReqBuilder req = new 
CapReqBuilder(BundleNamespace.BUNDLE_NAMESPACE);
+                       String bsn = 
Processor.removeDuplicateMarker(entry.getKey());
+                       String filter = 
filter(BundleNamespace.BUNDLE_NAMESPACE, bsn, entry.getValue());
+                       
req.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, filter);               
        
+                       resource.addRequirement(req);
+               }
+
+               //
+               // Bundle-RequiredExecutionEnvironment
+               //
+               
+               Parameters brees = d.getBundleRequiredExecutionEnvironment();
+               Formatter formatter = new Formatter();
+                       formatter.format("(|");
+               
+               for ( Entry<String,Attrs> bree : brees.entrySet()       ) {
+                       String name = 
Processor.removeDuplicateMarker(bree.getKey());
+                       Matcher matcher = EE_PATTERN.matcher(name);
+                       if ( matcher.matches()) {
+                               name = matcher.group(1);
+                               Version v = 
Version.parseVersion(matcher.group(2));
+                               formatter.format("%s", 
filter(ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE, name, 
MAP.$("version", v.toString())));
+                       }
+               }
+               formatter.format(")");
+               
+               CapReqBuilder breeReq = new 
CapReqBuilder(ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE);
+               breeReq.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, 
formatter.toString());
+
+               //
+               // Export-Service (deprecated)
+               //
+               
+               for (Entry<String,Attrs> export : 
d.getParameters(Constants.EXPORT_SERVICE).entrySet()) {
+                       CapReqBuilder   exportedService = new 
CapReqBuilder(ServiceNamespace.SERVICE_NAMESPACE);
+                       String service = 
Processor.removeDuplicateMarker(export.getKey());
+                       
exportedService.addAttribute(ServiceNamespace.SERVICE_NAMESPACE, service);
+                       
exportedService.addAttribute(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE, 
export.getValue().get("objectclass"));
+                       resource.addCapability(exportedService);
+               }
+               
+               //
+               // Import-Service (deprecated)
+               //
+               
+               for (Entry<String,Attrs> imported : 
d.getParameters(Constants.IMPORT_SERVICE).entrySet()) {
+                       CapReqBuilder   importedService = new 
CapReqBuilder(ServiceNamespace.SERVICE_NAMESPACE);
+                       String service = 
Processor.removeDuplicateMarker(imported.getKey());
+                       
importedService.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, 
filter(ServiceNamespace.SERVICE_NAMESPACE, service, imported.getValue()));
+                       resource.addRequirement(importedService);
+               }
+               
+               //
+               // Provide-Capability
+               //
+               
+               for ( Entry<String,Attrs> rc : 
d.getProvideCapability().entrySet()) {
+                       resource.addCapability( toCapability(rc.getKey(), 
rc.getValue()));
+               }
+               
+               //
+               // Require-Capability
+               //
+
+               for ( Entry<String,Attrs> rc : 
d.getRequireCapability().entrySet()) {
+                       resource.addCapability( toRequirement(rc.getKey(), 
rc.getValue()));
+               }
+               
+               
+               return null;
+       }
+
+       private static Capability toRequirement(String key, Attrs value) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       private static Capability toCapability(String key, Attrs value) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       public static Reporter parse(File file, ResourceBuilder resource, 
String base) throws Exception {
+               Jar jar = new Jar(file);
+               try {
+                       Reporter reporter = parse(jar, resource);
+                       if (!reporter.isOk())
+                               return reporter;
+
+                       CapReqBuilder content = new 
CapReqBuilder(ContentNamespace.CONTENT_NAMESPACE);
+                       String sha = SHA1.digest(file).asHex();
+                       
content.addAttribute(ContentNamespace.CONTENT_NAMESPACE, sha);
+                       
content.addAttribute(ContentNamespace.CAPABILITY_SIZE_ATTRIBUTE, (long) 
file.length());
+                       
content.addAttribute(ContentNamespace.CAPABILITY_MIME_ATTRIBUTE, 
MIME_TYPE_OSGI_BUNDLE);
+
+                       if (base != null) {
+                               String path = file.getAbsolutePath();
+                               if (base.startsWith(path)) {
+                                       
content.addAttribute(ContentNamespace.CAPABILITY_URL_ATTRIBUTE, 
path.substring(base.length())
+                                                       
.replace(File.separatorChar, '/'));
+                               } else {
+                                       reporter.error("Base path %s is not 
parent of file path: %s", base, file.getAbsolutePath());
+                               }
+                       }
+
+                       resource.addCapability(content);
+                       return reporter;
+               }
+               finally {
+                       jar.close();
+               }
+       }
+       
+       // TODO finish
+       private static String filter(String ns, String primary, 
Map<String,String> value) {
+               Formatter f = new Formatter();
+               f.format("(&(%s=%s)", ns, primary);
+               for ( String key : value.keySet()) {
+                       if ( key.equals("version") || 
key.equals("bundle-version")) {
+                               VersionRange vr = new 
VersionRange(value.get(key));
+                       } else {
+                               f.format("(%s=%s)", key, value.get(key));
+                       }
+               }
+               
+               f.format(")");
+               return null;
+       }
+
+}

Propchange: 
felix/trunk/bundleplugin/src/main/java/aQute/bnd/obr/OBRFragment.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
felix/trunk/bundleplugin/src/main/java/aQute/bnd/obr/OBRFragment.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Analyzer.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Analyzer.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Analyzer.java 
(original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Analyzer.java Thu Nov 
22 00:42:55 2012
@@ -2008,7 +2008,7 @@ public class Analyzer extends Processor 
 
        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')

Modified: felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Domain.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Domain.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Domain.java (original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Domain.java Thu Nov 
22 00:42:55 2012
@@ -2,6 +2,7 @@ package aQute.bnd.osgi;
 
 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 @@ import aQute.service.reporter.*;
  * 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 @@ public abstract class Domain implements 
                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 abstract class Domain implements 
        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 @@ public abstract class Domain implements 
                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 @@ public abstract class Domain implements 
                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);
+       }
+
 }

Modified: felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Macro.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Macro.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Macro.java (original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Macro.java Thu Nov 22 
00:42:55 2012
@@ -220,9 +220,10 @@ public class Macro {
                                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

Modified: felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Verifier.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Verifier.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Verifier.java 
(original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/Verifier.java Thu Nov 
22 00:42:55 2012
@@ -78,7 +78,7 @@ public class Verifier extends Processor 
        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("((\\(|\\[)"

Modified: felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/packageinfo
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/packageinfo?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/packageinfo (original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/packageinfo Thu Nov 
22 00:42:55 2012
@@ -1 +1 @@
-version 2.0.0
+version 2.1.0

Modified: 
felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/CapReqBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/CapReqBuilder.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- 
felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/CapReqBuilder.java
 (original)
+++ 
felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/CapReqBuilder.java
 Thu Nov 22 00:42:55 2012
@@ -18,74 +18,80 @@ public class CapReqBuilder {
        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());
        }
 }

Modified: 
felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/packageinfo
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/packageinfo?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/packageinfo 
(original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/osgi/resource/packageinfo 
Thu Nov 22 00:42:55 2012
@@ -1 +1 @@
-version 1.0
\ No newline at end of file
+version 1.1.0
\ No newline at end of file

Modified: felix/trunk/bundleplugin/src/main/java/aQute/bnd/version/Version.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/bnd/version/Version.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/bnd/version/Version.java 
(original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/bnd/version/Version.java Thu 
Nov 22 00:42:55 2012
@@ -7,7 +7,7 @@ public class Version implements Comparab
        final int                                       minor;
        final int                                       micro;
        final String                            qualifier;
-       public final static String      VERSION_STRING  = 
"(\\d+)(\\.(\\d+)(\\.(\\d+)(\\.([-_\\da-zA-Z]+))?)?)?";
+       public final static String      VERSION_STRING  = 
"(\\d{1,9})(\\.(\\d{1,9})(\\.(\\d{1,9})(\\.([-_\\da-zA-Z]+))?)?)?";
        public final static Pattern     VERSION                 = 
Pattern.compile(VERSION_STRING);
        public final static Version     LOWEST                  = new Version();
        public final static Version     HIGHEST                 = new 
Version(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE,

Modified: felix/trunk/bundleplugin/src/main/java/aQute/lib/io/IO.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/lib/io/IO.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/lib/io/IO.java (original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/lib/io/IO.java Thu Nov 22 
00:42:55 2012
@@ -7,8 +7,8 @@ import java.security.*;
 import java.util.*;
 
 public class IO {
-       static public File      work    = new 
File(System.getProperty("user.dir"));
-       static public File      home    = new 
File(System.getProperty("user.home"));
+       static final public File        work    = new 
File(System.getProperty("user.dir"));
+       static final public File        home    = new 
File(System.getProperty("user.home"));
 
        public static void copy(Reader r, Writer w) throws IOException {
                try {

Modified: felix/trunk/bundleplugin/src/main/java/aQute/libg/tuple/Pair.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/java/aQute/libg/tuple/Pair.java?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/java/aQute/libg/tuple/Pair.java (original)
+++ felix/trunk/bundleplugin/src/main/java/aQute/libg/tuple/Pair.java Thu Nov 
22 00:42:55 2012
@@ -2,7 +2,7 @@ package aQute.libg.tuple;
 
 import java.io.Serializable;
 
-public class Pair<A, B> implements Serializable {
+public class Pair<A, B> implements Serializable, Cloneable {
 
        private static final long       serialVersionUID        = 1L;
 

Modified: 
felix/trunk/bundleplugin/src/main/resources/aQute/lib/spring/extract.xsl
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundleplugin/src/main/resources/aQute/lib/spring/extract.xsl?rev=1412393&r1=1412392&r2=1412393&view=diff
==============================================================================
--- felix/trunk/bundleplugin/src/main/resources/aQute/lib/spring/extract.xsl 
(original)
+++ felix/trunk/bundleplugin/src/main/resources/aQute/lib/spring/extract.xsl 
Thu Nov 22 00:42:55 2012
@@ -1,6 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
xmlns:beans="http://www.springframework.org/schema/beans"; 
xmlns:aop="http://www.springframework.org/schema/aop"; 
xmlns:context="http://www.springframework.org/schema/context"; 
xmlns:jee="http://www.springframework.org/schema/jee"; 
xmlns:jms="http://www.springframework.org/schema/jms"; 
xmlns:lang="http://www.springframework.org/schema/lang"; 
xmlns:osgi-compendium="http://www.springframework.org/schema/osgi-compendium"; 
xmlns:osgi="http://www.springframework.org/schema/osgi"; 
xmlns:tool="http://www.springframework.org/schema/tool"; 
xmlns:tx="http://www.springframework.org/schema/tx"; 
xmlns:util="http://www.springframework.org/schema/util"; 
xmlns:webflow-config="http://www.springframework.org/schema/webflow-config"; 
xmlns:blueprint="http://www.eclipse.org/gemini/blueprint/schema/blueprint";>
+<xsl:stylesheet version="1.0" 
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
+       xmlns:beans="http://www.springframework.org/schema/beans"; 
+       xmlns:aop="http://www.springframework.org/schema/aop"; 
+       xmlns:context="http://www.springframework.org/schema/context"; 
+       xmlns:jee="http://www.springframework.org/schema/jee"; 
+       xmlns:jms="http://www.springframework.org/schema/jms"; 
+       xmlns:lang="http://www.springframework.org/schema/lang"; 
+       
xmlns:osgi-compendium="http://www.springframework.org/schema/osgi-compendium"; 
+       xmlns:osgi="http://www.springframework.org/schema/osgi"; 
+       xmlns:tool="http://www.springframework.org/schema/tool"; 
+       xmlns:tx="http://www.springframework.org/schema/tx"; 
+       xmlns:util="http://www.springframework.org/schema/util"; 
+       
xmlns:webflow-config="http://www.springframework.org/schema/webflow-config"; 
+       
xmlns:gemini-blueprint="http://www.eclipse.org/gemini/blueprint/schema/blueprint";
+       xmlns:blueprint="http://www.osgi.org/xmlns/blueprint/v1.0.0";>
        <xsl:output method="text" />
 
        <xsl:template match="/">
@@ -20,7 +35,9 @@
                        |       //jee:*/@business-interface
                        |       //lang:*/@script-interfaces
                        |       //osgi:*/@interface
-                       |       //blueprint:*/@interface
+                       |       //gemini-blueprint:*/@interface
+                       |   //blueprint:*/@interface
+                       |   //blueprint:*/@class
                        |       //util:list/@list-class
                        |       //util:set/@set-class
                        |       //util:map/@map-class


Reply via email to