You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2009/12/17 22:36:03 UTC

svn commit: r891926 - in /geronimo/server/trunk/framework/modules/geronimo-kernel/src: main/java/org/apache/geronimo/kernel/osgi/ test/java/org/apache/geronimo/kernel/osgi/

Author: gawor
Date: Thu Dec 17 21:36:02 2009
New Revision: 891926

URL: http://svn.apache.org/viewvc?rev=891926&view=rev
Log:
Improved API for parsing Import/Export-Package headers. VersionRange class taken from Felix

Added:
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/VersionRange.java   (with props)
Modified:
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleClassLoader.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleDescription.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/HeaderParser.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/BundleDescriptionTest.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/HeaderParserTest.java

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleClassLoader.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleClassLoader.java?rev=891926&r1=891925&r2=891926&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleClassLoader.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleClassLoader.java Thu Dec 17 21:36:02 2009
@@ -135,7 +135,7 @@
         BundleDescription description = new BundleDescription(bundle.getHeaders());
         
         // handle static wire via Import-Package
-        List<BundleDescription.Package> imports = description.getExternalImports();
+        List<BundleDescription.ImportPackage> imports = description.getExternalImports();
         LinkedHashSet<Bundle> wiredBundles = new LinkedHashSet<Bundle>();
         for (BundleDescription.Package packageImport : imports) {
             ExportedPackage[] exports = packageAdmin.getExportedPackages(packageImport.getName());

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleDescription.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleDescription.java?rev=891926&r1=891925&r2=891926&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleDescription.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleDescription.java Thu Dec 17 21:36:02 2009
@@ -25,6 +25,7 @@
 
 import org.apache.geronimo.kernel.osgi.HeaderParser.HeaderElement;
 import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
 
 /**
  * @version $Rev$, $Date$
@@ -44,12 +45,12 @@
     /**
      * Returns a list of packages that are listed in <i>Import-Package</i> header.
      */
-    public List<Package> getImportPackage() {
+    public List<ImportPackage> getImportPackage() {
         String headerValue = (String) headers.get(Constants.IMPORT_PACKAGE);
-        List<Package> imports = new ArrayList<Package>();
+        List<ImportPackage> imports = new ArrayList<ImportPackage>();
         List<HeaderElement> elements = HeaderParser.parseHeader(headerValue);
         for (HeaderElement element : elements) {
-            Package p = new Package(element.getName(), element.getAttributes(), element.getDirectives());
+            ImportPackage p = new ImportPackage(element.getName(), element.getAttributes(), element.getDirectives());
             imports.add(p);
         }
         return imports;
@@ -58,15 +59,15 @@
     /**
      * Returns a list of packages that are listed in <i>Export-Package</i> header.
      */
-    public List<Package> getExportPackage() {
+    public List<ExportPackage> getExportPackage() {
         String headerValue = (String) headers.get(Constants.EXPORT_PACKAGE);
-        List<Package> imports = new ArrayList<Package>();
+        List<ExportPackage> exports = new ArrayList<ExportPackage>();
         List<HeaderElement> elements = HeaderParser.parseHeader(headerValue);
         for (HeaderElement element : elements) {
-            Package p = new Package(element.getName(), element.getAttributes(), element.getDirectives());
-            imports.add(p);
+            ExportPackage p = new ExportPackage(element.getName(), element.getAttributes(), element.getDirectives());
+            exports.add(p);
         }
-        return imports;
+        return exports;
         
     }
     
@@ -74,11 +75,11 @@
      * Returns a list of packages that are listed in <i>Import-Package</i> header
      * and are <b>not</b> listed in <i>Export-Package</i> header.
      */
-    public List<Package> getExternalImports() {
-        List<Package> imports = getImportPackage();
-        List<Package> exports = getExportPackage();
-        List<Package> realImports = new ArrayList<Package>();
-        for (Package p : imports) {
+    public List<ImportPackage> getExternalImports() {
+        List<ImportPackage> imports = getImportPackage();
+        List<ExportPackage> exports = getExportPackage();
+        List<ImportPackage> realImports = new ArrayList<ImportPackage>();
+        for (ImportPackage p : imports) {
             if (!isExported(exports, p)) {
                 realImports.add(p);
             }
@@ -86,7 +87,7 @@
         return realImports;
     }
     
-    private static boolean isExported(List<Package> exports, Package p) {
+    private static boolean isExported(List<ExportPackage> exports, Package p) {
         for (Package export : exports) {
             if (export.getName().equals(p.getName())) {
                 return true;
@@ -119,13 +120,23 @@
         return imports;
     }
     
+    public String getSymbolicName() {
+        return (String) headers.get(Constants.BUNDLE_SYMBOLICNAME);
+    }
+    
+    public Map getHeaders() {
+        return headers;
+    }
+    
     public static class Package {
     
         private String name;
         private Map<String, String> attributes;
         private Map<String, String> directives;
         
-        public Package(String name, Map<String, String> attributes, Map<String, String> directives) {
+        public Package(String name, 
+                       Map<String, String> attributes, 
+                       Map<String, String> directives) {
             this.name = name;
             this.attributes = attributes;
             this.directives = directives;
@@ -150,6 +161,58 @@
             builder.append(", Directives: ").append(directives);
             return builder.toString();
         }
+        
+        protected VersionRange getVersionRange() {
+            String version = attributes.get(Constants.VERSION_ATTRIBUTE);
+            if (version == null) {
+                version = "0.0.0";
+            }
+            return VersionRange.parse(version);
+        }
+    }
+    
+    public class ExportPackage extends Package {
+
+        private Version version;
+        
+        public ExportPackage(String name,
+                             Map<String, String> attributes,
+                             Map<String, String> directives) {
+            super(name, attributes, directives);
+            version = getVersionRange().getLow();
+        }
+        
+        public Version getVersion() {
+            return version;
+        }
     }
         
+    public class ImportPackage extends Package {
+
+        private boolean optional;
+        private VersionRange versionRange;
+        
+        public ImportPackage(String name,
+                             Map<String, String> attributes,
+                             Map<String, String> directives) {
+            super(name, attributes, directives);
+            
+            String resolution = directives.get(Constants.RESOLUTION_DIRECTIVE);
+            optional = Constants.RESOLUTION_OPTIONAL.equals(resolution);
+            
+            versionRange = super.getVersionRange();
+        }
+        
+        public boolean isOptional() {
+            return optional;
+        }
+        
+        public boolean isMandatory() {
+            return !optional;
+        }
+        
+        public VersionRange getVersionRange() {
+            return versionRange;
+        }
+    }
 }

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/HeaderParser.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/HeaderParser.java?rev=891926&r1=891925&r2=891926&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/HeaderParser.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/HeaderParser.java Thu Dec 17 21:36:02 2009
@@ -41,7 +41,7 @@
         if (header == null || header.trim().length() == 0) {
             return elements;
         }
-        List<String> clauses = parseDelimitedString(header, ",");
+        List<String> clauses = parseDelimitedString(header, ",", false);
         for (String clause : clauses) {
             String[] tokens = clause.split(";");
             if (tokens.length < 1) {
@@ -70,7 +70,7 @@
         return elements;
     }
 
-    private static List<String> parseDelimitedString(String value, String delim) {   
+    private static List<String> parseDelimitedString(String value, String delim, boolean includeQuotes) {   
         if (value == null) {       
             value = "";
         }
@@ -96,11 +96,15 @@
                 list.add(sb.toString().trim());
                 sb.delete(0, sb.length());
                 expecting = (CHAR | DELIMITER | STARTQUOTE);
-            } else if (isQuote && ((expecting & STARTQUOTE) > 0)) {            
-                sb.append(c);
+            } else if (isQuote && ((expecting & STARTQUOTE) > 0)) { 
+                if (includeQuotes) {
+                    sb.append(c);
+                }
                 expecting = CHAR | ENDQUOTE;
-            } else if (isQuote && ((expecting & ENDQUOTE) > 0)) {           
-                sb.append(c);
+            } else if (isQuote && ((expecting & ENDQUOTE) > 0)) {    
+                if (includeQuotes) {
+                    sb.append(c);
+                }
                 expecting = (CHAR | STARTQUOTE | DELIMITER);
             } else if ((expecting & CHAR) > 0) {            
                 sb.append(c);

Added: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/VersionRange.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/VersionRange.java?rev=891926&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/VersionRange.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/VersionRange.java Thu Dec 17 21:36:02 2009
@@ -0,0 +1,96 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.geronimo.kernel.osgi;
+
+import org.osgi.framework.Version;
+
+public class VersionRange {
+
+    private Version low = null;
+    private boolean isLowInclusive = false;
+    private Version high = null;
+    private boolean isHighInclusive = false;
+    
+    public static final VersionRange infiniteRange = new VersionRange(Version.emptyVersion, true, null, true);
+
+    public VersionRange(Version low, boolean isLowInclusive, Version high, boolean isHighInclusive) {
+        this.low = low;
+        this.isLowInclusive = isLowInclusive;
+        this.high = high;
+        this.isHighInclusive = isHighInclusive;
+    }
+
+    public Version getLow() {   
+        return low;
+    }
+
+    public boolean isLowInclusive() {   
+        return isLowInclusive;
+    }
+
+    public Version getHigh() {   
+        return high;
+    }
+
+    public boolean isHighInclusive() {   
+        return isHighInclusive;
+    }
+
+    public boolean isInRange(Version version) {   
+        // We might not have an upper end to the range.
+        if (high == null) {       
+            return (version.compareTo(low) >= 0);
+        } else if (isLowInclusive() && isHighInclusive()) {       
+            return (version.compareTo(low) >= 0) && (version.compareTo(high) <= 0);
+        } else if (isHighInclusive()) {
+            return (version.compareTo(low) > 0) && (version.compareTo(high) <= 0);
+        } else if (isLowInclusive()) {
+            return (version.compareTo(low) >= 0) && (version.compareTo(high) < 0);
+        }
+        return (version.compareTo(low) > 0) && (version.compareTo(high) < 0);
+    }
+
+    public static VersionRange parse(String range) {   
+        // Check if the version is an interval. 
+        if (range.indexOf(',') >= 0) {       
+            String s = range.substring(1, range.length() - 1);
+            String vlo = s.substring(0, s.indexOf(',')).trim();
+            String vhi = s.substring(s.indexOf(',') + 1, s.length()).trim();
+            return new VersionRange (
+                new Version(vlo), (range.charAt(0) == '['),
+                new Version(vhi), (range.charAt(range.length() - 1) == ']'));
+        } else {
+            return new VersionRange(new Version(range), true, null, false);
+        }
+    }
+
+    public String toString() {    
+        if (high != null) {
+            StringBuffer sb = new StringBuffer();
+            sb.append(isLowInclusive ? '[' : '(');
+            sb.append(low.toString());
+            sb.append(',');
+            sb.append(high.toString());
+            sb.append(isHighInclusive ? ']' : ')');
+            return sb.toString();
+        } else {
+            return low.toString();
+        }
+    }
+}

Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/VersionRange.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/VersionRange.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/VersionRange.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/BundleDescriptionTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/BundleDescriptionTest.java?rev=891926&r1=891925&r2=891926&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/BundleDescriptionTest.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/BundleDescriptionTest.java Thu Dec 17 21:36:02 2009
@@ -23,6 +23,7 @@
 import java.util.Map;
 
 import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
 
 import junit.framework.TestCase;
 
@@ -37,23 +38,24 @@
         
         BundleDescription desc = new BundleDescription(headers);
         
-        List<BundleDescription.Package> imports = desc.getImportPackage();
+        List<BundleDescription.ImportPackage> imports = desc.getImportPackage();
         assertEquals(3, imports.size());
         assertEquals("com.thoughtworks.xstream", imports.get(0).getName());
-        assertEquals("\"1.3\"", imports.get(0).getAttributes().get("version"));
+        assertEquals("1.3", imports.get(0).getAttributes().get("version"));
+        assertEquals(Version.parseVersion("1.3"), imports.get(0).getVersionRange().getLow());
         assertEquals("com.thoughtworks.xstream.converters", imports.get(1).getName());
         assertEquals("org.apache.geronimo.kernel.proxy", imports.get(2).getName());
                 
-        List<BundleDescription.Package> exports = desc.getExportPackage();
+        List<BundleDescription.ExportPackage> exports = desc.getExportPackage();
         assertEquals(2, exports.size());
         assertEquals("org.apache.geronimo.kernel.rmi", exports.get(0).getName());
-        assertEquals("\"javax.rmi.ssl,org.apache.geronimo.gbean,org.slf4j\"", exports.get(0).getDirectives().get("uses"));
+        assertEquals("javax.rmi.ssl,org.apache.geronimo.gbean,org.slf4j", exports.get(0).getDirectives().get("uses"));
         assertEquals("org.apache.geronimo.kernel.proxy", exports.get(1).getName());
         
-        List<BundleDescription.Package> externalImports = desc.getExternalImports();
+        List<BundleDescription.ImportPackage> externalImports = desc.getExternalImports();
         assertEquals(2, externalImports.size());
         assertEquals("com.thoughtworks.xstream", externalImports.get(0).getName());
-        assertEquals("\"1.3\"", externalImports.get(0).getAttributes().get("version"));
+        assertEquals("1.3", externalImports.get(0).getAttributes().get("version"));
         assertEquals("com.thoughtworks.xstream.converters", externalImports.get(1).getName());        
     }
 }

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/HeaderParserTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/HeaderParserTest.java?rev=891926&r1=891925&r2=891926&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/HeaderParserTest.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/osgi/HeaderParserTest.java Thu Dec 17 21:36:02 2009
@@ -77,7 +77,7 @@
         assertEquals("org.apache.geronimo.kernel.rmi", paths.get(0).getName());
         assertEquals(0, paths.get(0).getAttributes().size());
         assertEquals(1, paths.get(0).getDirectives().size());
-        assertEquals("\"javax.rmi.ssl,org.apache.geronimo.gbean,org.slf4j\"", paths.get(0).getDirective("uses"));
+        assertEquals("javax.rmi.ssl,org.apache.geronimo.gbean,org.slf4j", paths.get(0).getDirective("uses"));
         
         assertEquals("org.apache.geronimo.kernel.proxy", paths.get(1).getName());
         assertEquals(0, paths.get(1).getAttributes().size());
@@ -90,7 +90,7 @@
         
         assertEquals("com.thoughtworks.xstream", paths.get(0).getName());
         assertEquals(1, paths.get(0).getAttributes().size());
-        assertEquals("\"1.3\"", paths.get(0).getAttribute("version"));
+        assertEquals("1.3", paths.get(0).getAttribute("version"));
         assertEquals(0, paths.get(0).getDirectives().size());
         
         assertEquals("com.thoughtworks.xstream.converters", paths.get(1).getName());