Author: davidb
Date: Wed Apr  9 10:45:46 2014
New Revision: 1585928

URL: http://svn.apache.org/r1585928
Log:
[FELIX-4369] Additional work towards support for the OSGi Repository API

This commit contains logic around parsing of list attributes from the 
Repository XML.

Modified:
    
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixPropertyAdapter.java
    
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java

Modified: 
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixPropertyAdapter.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixPropertyAdapter.java?rev=1585928&r1=1585927&r2=1585928&view=diff
==============================================================================
--- 
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixPropertyAdapter.java
 (original)
+++ 
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixPropertyAdapter.java
 Wed Apr  9 10:45:46 2014
@@ -13,21 +13,14 @@
  */
 package org.apache.felix.bundlerepository.impl;
 
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import org.apache.felix.bundlerepository.Property;
 import org.osgi.framework.Version;
 
- class FelixPropertyAdapter implements Property
+class FelixPropertyAdapter implements Property
 {
-    private static Set<?> asSet(List<?> list)
-    {
-        return new HashSet<Object>(list);
-    }
-
     private final String name;
     private final Object value;
 
@@ -48,8 +41,6 @@ import org.osgi.framework.Version;
 
     public Object getConvertedValue()
     {
-        if (value instanceof List)
-            return asSet((List<?>) value);
         return value;
     }
 

Modified: 
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java?rev=1585928&r1=1585927&r2=1585928&view=diff
==============================================================================
--- 
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java
 (original)
+++ 
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java
 Wed Apr  9 10:45:46 2014
@@ -19,7 +19,9 @@
 package org.apache.felix.bundlerepository.impl;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.felix.bundlerepository.Capability;
@@ -200,7 +202,7 @@ public class SpecXMLPullParser
         PullParser.sanityCheckEndElement(reader, event, parentTag);
     }
 
-    private static Object getTypedValue(String type, String value)
+    private static Object getTypedValue(String type, String value) throws 
IOException
     {
         if (type == null)
             return value;
@@ -212,9 +214,87 @@ public class SpecXMLPullParser
             return Long.parseLong(value);
         else if ("Double".equals(type))
             return Double.parseDouble(value);
+        else if ("List<String>".equals(type))
+            return parseStringList(value);
+        else if ("List<Version>".equals(type))
+            return parseVersionList(value);
+        else if ("List<Long>".equals(type))
+            return parseLongList(value);
+        else if ("List<Double>".equals(type))
+            return parseDoubleList(value);
         return value;
     }
 
+    private static List<String> parseStringList(String value)
+    {
+        List<String> l = new ArrayList<String>();
+        StringBuilder sb = new StringBuilder();
+
+        boolean escaped = false;
+        for (char c : value.toCharArray())
+        {
+            if (escaped)
+            {
+                sb.append(c);
+                escaped = false;
+            }
+            else
+            {
+                switch (c)
+                {
+                    case '\\':
+                        escaped = true;
+                        break;
+                    case ',':
+                        l.add(sb.toString().trim());
+                        sb.setLength(0);
+                        break;
+                    default:
+                        sb.append(c);
+                }
+            }
+        }
+
+        if (sb.length() > 0)
+            l.add(sb.toString().trim());
+
+        return l;
+    }
+
+    private static List<Version> parseVersionList(String value)
+    {
+        List<Version> l = new ArrayList<Version>();
+
+        // Version strings cannot contain a comma, as it's not an allowed 
character in it anywhere
+        for (String v : value.split(","))
+        {
+            l.add(Version.parseVersion(v.trim()));
+        }
+        return l;
+    }
+
+    private static List<Long> parseLongList(String value)
+    {
+        List<Long> l = new ArrayList<Long>();
+
+        for (String x : value.split(","))
+        {
+            l.add(Long.parseLong(x.trim()));
+        }
+        return l;
+    }
+
+    private static List<Double> parseDoubleList(String value)
+    {
+        List<Double> l = new ArrayList<Double>();
+
+        for (String d : value.split(","))
+        {
+            l.add(Double.parseDouble(d.trim()));
+        }
+        return l;
+    }
+
     private static Requirement parseRequirement(XmlPullParser reader) throws 
Exception
     {
         RequirementImpl requirement = new RequirementImpl();


Reply via email to