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();