In which case I think we should change those tests to use a different constant!
Regards Tim Ward ------------------- Apache Aries PMC member & Enterprise OSGi advocate Enterprise OSGi in Action (http://www.manning.com/cummins) ------------------- > From: [email protected] > Date: Thu, 1 Dec 2011 13:59:31 +0000 > Subject: Re: svn commit: r1204471 - in /aries/trunk/util/util-r42/src: > main/java/org/apache/aries/util/manifest/ManifestHeaderProcessor.java > test/java/org/apache/aries/util/manifest/ManifestHeaderProcessorTest.java > To: [email protected] > > On 25 November 2011 18:36, Timothy Ward <[email protected]> wrote: > > > > Having just updated to this commit and looked through the new code, is it > > possible that this component is no longer buildable on Java 5? > > > >> + @Test > >> + public void testCapabilityHeader() throws Exception { > >> + String s = > >> + "com.acme.dictionary; effective:=resolve; from:String=nl; > >> to=de; version:Version=3.4.0.test;somedir:=test, " + > >> + "com.acme.dictionary; > >> filter:=\"(&(width>=1000)(height>=1000))\", " + > >> > > + > > "com.acme.ip2location;country:List<String>=\"nl,be,fr,uk\";version:Version=1.3;long:Long=" > > + Long.MAX_VALUE + ";d:Double=\"2.2250738585072012e-308\""; > >> + > >> + List<GenericMetadata> capabilities = > >> ManifestHeaderProcessor.parseCapabilityString(s); > >> + testCapabilitiesOrRequirements(capabilities); > >> + } > > > > Isn't d:Double=\"2.2250738585072012e-308\"" going to send Java 5 into an > > infinite loop when it tries to parse that double, or am I remembering the > > magic number wrong? I don't have a Java 5 to test with, but I think it will > > break... > > Yes. That's what it does for me (on an old level of java 6 without the fix). > > > > > Regards, > > > > Tim Ward > > ------------------- > > Apache Aries PMC member & Enterprise OSGi advocate > > Enterprise OSGi in Action (http://www.manning.com/cummins) > > ------------------- > > > > > >> Subject: svn commit: r1204471 - in /aries/trunk/util/util-r42/src: > >> main/java/org/apache/aries/util/manifest/ManifestHeaderProcessor.java > >> test/java/org/apache/aries/util/manifest/ManifestHeaderProcessorTest.java > >> Date: Mon, 21 Nov 2011 12:35:04 +0000 > >> To: [email protected] > >> From: [email protected] > >> > >> Author: davidb > >> Date: Mon Nov 21 12:35:04 2011 > >> New Revision: 1204471 > >> > >> URL: http://svn.apache.org/viewvc?rev=1204471&view=rev > >> Log: > >> Enhance ManifestHeaderProcessor to support Provide-Capability and > >> Require-Capability style headers. The functionality can be found in: > >> ManifestHeaderProcessor.parseCapabilityString() > >> ManifestHeaderProcessor.parseRequirementString() > >> Currently the implementation of both is exactly the same under the hood, > >> but I introduced them as separate methods to make make usage feel more > >> naturally. It will also allow fixes to them individually in the future if > >> needed. > >> > >> Modified: > >> > >> aries/trunk/util/util-r42/src/main/java/org/apache/aries/util/manifest/ManifestHeaderProcessor.java > >> > >> aries/trunk/util/util-r42/src/test/java/org/apache/aries/util/manifest/ManifestHeaderProcessorTest.java > >> > >> Modified: > >> aries/trunk/util/util-r42/src/main/java/org/apache/aries/util/manifest/ManifestHeaderProcessor.java > >> URL: > >> http://svn.apache.org/viewvc/aries/trunk/util/util-r42/src/main/java/org/apache/aries/util/manifest/ManifestHeaderProcessor.java?rev=1204471&r1=1204470&r2=1204471&view=diff > >> ============================================================================== > >> --- > >> aries/trunk/util/util-r42/src/main/java/org/apache/aries/util/manifest/ManifestHeaderProcessor.java > >> (original) > >> +++ > >> aries/trunk/util/util-r42/src/main/java/org/apache/aries/util/manifest/ManifestHeaderProcessor.java > >> Mon Nov 21 12:35:04 2011 > >> @@ -31,6 +31,7 @@ import java.util.regex.Pattern; > >> import org.apache.aries.util.ManifestHeaderUtils; > >> import org.apache.aries.util.VersionRange; > >> import org.osgi.framework.Constants; > >> +import org.osgi.framework.Version; > >> > >> > >> public class ManifestHeaderProcessor > >> @@ -41,6 +42,31 @@ public class ManifestHeaderProcessor > >> private static final String GREATER_EQ_OP = ">="; > >> > >> /** > >> + * A GenericMetadata is either a Generic Capability or a Generic > >> Requirement > >> + */ > >> + public static class GenericMetadata { > >> + private final String namespace; > >> + private final Map<String, Object> attributes = new HashMap<String, > >> Object>(); > >> + private final Map<String, String> directives = new HashMap<String, > >> String>(); > >> + > >> + public GenericMetadata(String namespace) { > >> + this.namespace = namespace; > >> + } > >> + > >> + public String getNamespace() { > >> + return namespace; > >> + } > >> + > >> + public Map<String, Object> getAttributes() { > >> + return attributes; > >> + } > >> + > >> + public Map<String, String> getDirectives() { > >> + return directives; > >> + } > >> + } > >> + > >> + /** > >> * A simple class to associate two types. > >> * > >> * @param <N> The type for the 'Name' > >> @@ -49,7 +75,7 @@ public class ManifestHeaderProcessor > >> public static class NameValuePair { > >> private String name; > >> private Map<String,String> attributes; > >> - > >> + > >> public NameValuePair(String name, Map<String,String> value) > >> { > >> this.name = name; > >> @@ -63,7 +89,7 @@ public class ManifestHeaderProcessor > >> { > >> this.name = name; > >> } > >> - > >> + > >> public Map<String,String> getAttributes() > >> { > >> return attributes; > >> @@ -72,7 +98,7 @@ public class ManifestHeaderProcessor > >> { > >> this.attributes = value; > >> } > >> - > >> + > >> @Override > >> public String toString(){ > >> return "{"+name.toString()+"::"+attributes.toString()+"}"; > >> @@ -102,9 +128,9 @@ public class ManifestHeaderProcessor > >> return true; > >> } > >> } > >> - > >> + > >> /** > >> - * Intended to provide a standard way to add Name/Value's to > >> + * Intended to provide a standard way to add Name/Value's to > >> * aggregations of Name/Value's. > >> * > >> * @param <N> Type of 'Name' > >> @@ -121,17 +147,17 @@ public class ManifestHeaderProcessor > >> > >> /** > >> * Map of Name -> Value. > >> - * > >> + * > >> * @param <N> Type of 'Name' > >> * @param <V> Type of 'Value' > >> */ > >> public static class NameValueMap extends HashMap<String, > >> Map<String,String>> implements NameValueCollection, Map<String, > >> Map<String,String>>{ > >> private static final long serialVersionUID = -6446338858542599141L; > >> - > >> + > >> public void addToCollection(String n, Map<String,String> v){ > >> this.put(n,v); > >> } > >> - > >> + > >> @Override > >> public String toString(){ > >> StringBuilder sb = new StringBuilder(); > >> @@ -146,19 +172,19 @@ public class ManifestHeaderProcessor > >> return sb.toString(); > >> } > >> } > >> - > >> + > >> /** > >> * List of Name/Value > >> * > >> * @param <N> Type of 'Name' > >> * @param <V> Type of 'Value' > >> */ > >> - public static class NameValueList extends ArrayList<NameValuePair> > >> implements NameValueCollection, List<NameValuePair> { > >> + public static class NameValueList extends ArrayList<NameValuePair> > >> implements NameValueCollection, List<NameValuePair> { > >> private static final long serialVersionUID = 1808636823825029983L; > >> - > >> + > >> public void addToCollection(String n, Map<String,String> v){ > >> this.add(new NameValuePair(n,v)); > >> - } > >> + } > >> @Override > >> public String toString(){ > >> StringBuffer sb = new StringBuffer(); > >> @@ -167,18 +193,18 @@ public class ManifestHeaderProcessor > >> for(NameValuePair nvp : this){ > >> if(!first)sb.append(","); > >> first=false; > >> - sb.append(nvp.toString()); > >> + sb.append(nvp.toString()); > >> } > >> sb.append("}"); > >> return sb.toString(); > >> } > >> } > >> - > >> + > >> /** > >> - * > >> + * > >> * Splits a delimiter separated string, tolerating presence of non > >> separator commas > >> * within double quoted segments. > >> - * > >> + * > >> * Eg. > >> * com.ibm.ws.eba.helloWorldService;version="[1.0.0, 1.0.0]" & > >> * com.ibm.ws.eba.helloWorldService;version="1.0.0" > >> @@ -191,23 +217,23 @@ public class ManifestHeaderProcessor > >> public static List<String> split(String value, String delimiter) > >> { > >> return ManifestHeaderUtils.split(value, delimiter); > >> - } > >> - > >> - > >> + } > >> + > >> + > >> /** > >> * Internal method to parse headers with the format<p> > >> - * [Name](;[Name])*(;[attribute-name]=[attribute-value])*<br> > >> + * [Name](;[Name])*(;[attribute-name]=[attribute-value])*<br> > >> * Eg.<br> > >> * rumplestiltskin;thing=value;other=something<br> > >> * littleredridinghood > >> * bundle1;bundle2;other=things > >> * bundle1;bundle2 > >> - * > >> + * > >> * @param s data to parse > >> - * @return a list of NameValuePair, with the Name being the name > >> component, > >> - * and the Value being a NameValueMap of key->value mappings. > >> + * @return a list of NameValuePair, with the Name being the name > >> component, > >> + * and the Value being a NameValueMap of key->value mappings. > >> */ > >> - private static List<NameValuePair> > >> genericNameWithNameValuePairProcess(String s){ > >> + private static List<NameValuePair> > >> genericNameWithNameValuePairProcess(String s){ > >> String name; > >> Map<String,String> params = null; > >> List<NameValuePair> nameValues = new ArrayList<NameValuePair>(); > >> @@ -217,19 +243,19 @@ public class ManifestHeaderProcessor > >> name = s; > >> params = new HashMap<String, String>(); > >> pkgs.add(name); > >> - }else{ > >> + }else{ > >> name = s.substring(0,index).trim(); > >> String tail = s.substring(index+1).trim(); > >> - > >> + > >> pkgs.add(name); // add the first package > >> StringBuilder parameters = new StringBuilder(); > >> - > >> - > >> + > >> + > >> // take into consideration of multiple packages separated by ';' > >> // while they share the same attributes or directives > >> List<String> tailParts = split(tail, ";"); > >> boolean firstParameter =false; > >> - > >> + > >> for (String part : tailParts) { > >> // if it is not a parameter and no parameter appears in front of > >> it, it must a package > >> if (!!!(part.contains("="))) { > >> @@ -238,30 +264,30 @@ public class ManifestHeaderProcessor > >> if (!!!(firstParameter)) > >> pkgs.add(part); > >> } else { > >> - if (!!!(firstParameter)) > >> + if (!!!(firstParameter)) > >> firstParameter = true; > >> > >> parameters.append(part + ";"); > >> } > >> - } > >> - > >> + } > >> + > >> if (parameters.length() != 0) { > >> //remove the final ';' if there is one > >> if (parameters.toString().endsWith(";")) { > >> - > >> + > >> parameters = parameters.deleteCharAt(parameters.length() -1); > >> - } > >> - > >> + } > >> + > >> params = genericNameValueProcess(parameters.toString()); > >> } > >> - > >> + > >> } > >> for (String pkg : pkgs) { > >> nameValues.add(new NameValuePair(pkg,params)); > >> - } > >> - > >> + } > >> + > >> return nameValues; > >> - > >> + > >> } > >> > >> /** > >> @@ -271,68 +297,68 @@ public class ManifestHeaderProcessor > >> * thing=value;other=something<br> > >> * <p> > >> * Note. Directives (name:=value) are represented in the map with name > >> suffixed by ':' > >> - * > >> + * > >> * @param s data to parse > >> * @return a NameValueMap, with attribute-name -> attribute-value. > >> */ > >> private static Map<String,String> genericNameValueProcess(String s){ > >> - Map<String,String> params = new HashMap<String,String>(); > >> + Map<String,String> params = new HashMap<String,String>(); > >> List<String> parameters = split(s, ";"); > >> for(String parameter : parameters) { > >> List<String> parts = split(parameter,"="); > >> - // do a check, otherwise we might get NPE > >> + // do a check, otherwise we might get NPE > >> if (parts.size() ==2) { > >> String second = parts.get(1).trim(); > >> if (second.startsWith("\"") && second.endsWith("\"")) > >> second = second.substring(1,second.length()-1); > >> - > >> + > >> String first = parts.get(0).trim(); > >> - > >> - // make sure for directives we clear out any space as in > >> "directive :=value" > >> + > >> + // make sure for directives we clear out any space as in > >> "directive :=value" > >> if (first.endsWith(":")) { > >> first = first.substring(0, first.length()-1).trim()+":"; > >> } > >> - > >> + > >> params.put(first, second); > >> } > >> } > >> > >> return params; > >> } > >> - > >> + > >> /** > >> - * Processes an import/export style header.. <p> > >> + * Processes an import/export style header.. <p> > >> * pkg1;attrib=value;attrib=value,pkg2;attrib=value,pkg3;attrib=value > >> - * > >> + * > >> * @param out The collection to add each package name + attrib map to. > >> * @param s The data to parse > >> */ > >> private static void genericImportExportProcess(NameValueCollection out, > >> String s){ > >> List<String> packages = split(s, ","); > >> - for(String pkg : packages){ > >> + for(String pkg : packages){ > >> List<NameValuePair> ps = genericNameWithNameValuePairProcess(pkg); > >> for (NameValuePair p : ps) { > >> out.addToCollection(p.getName(), p.getAttributes()); > >> } > >> - } > >> + } > >> } > >> - > >> + > >> /** > >> * Parse an export style header.<p> > >> * pkg1;attrib=value;attrib=value,pkg2;attrib=value,pkg3;attrib=value2 > >> * <p> > >> * Result is returned as a list, as export does allow duplicate package > >> exports. > >> - * > >> + * > >> * @param list The data to parse. > >> - * @return List of NameValuePairs, where each Name in the list is an > >> exported package, > >> - * with its associated Value being a NameValueMap of any > >> attributes declared. > >> + * @return List of NameValuePairs, where each Name in the list is an > >> exported package, > >> + * with its associated Value being a NameValueMap of any > >> attributes declared. > >> */ > >> public static List<NameValuePair> parseExportString(String s){ > >> NameValueList retval = new NameValueList(); > >> genericImportExportProcess(retval, s); > >> return retval; > >> } > >> - > >> + > >> /** > >> * Parse an export style header in a list.<p> > >> * pkg1;attrib=value;attrib=value > >> @@ -340,54 +366,144 @@ public class ManifestHeaderProcessor > >> * pkg3;attrib=value2 > >> * <p> > >> * Result is returned as a list, as export does allow duplicate package > >> exports. > >> - * > >> + * > >> * @param list The data to parse. > >> - * @return List of NameValuePairs, where each Name in the list is an > >> exported package, > >> - * with its associated Value being a NameValueMap of any > >> attributes declared. > >> + * @return List of NameValuePairs, where each Name in the list is an > >> exported package, > >> + * with its associated Value being a NameValueMap of any > >> attributes declared. > >> */ > >> public static List<NameValuePair> parseExportList(List<String> list){ > >> NameValueList retval = new NameValueList(); > >> - for(String pkg : list){ > >> + for(String pkg : list){ > >> List<NameValuePair> ps = genericNameWithNameValuePairProcess(pkg); > >> for (NameValuePair p : ps) { > >> retval.addToCollection(p.getName(), p.getAttributes()); > >> } > >> - } > >> + } > >> return retval; > >> } > >> - > >> + > >> /** > >> * Parse an import style header.<p> > >> * pkg1;attrib=value;attrib=value,pkg2;attrib=value,pkg3;attrib=value > >> * <p> > >> * Result is returned as a set, as import does not allow duplicate > >> package imports. > >> - * > >> + * > >> * @param s The data to parse. > >> - * @return Map of NameValuePairs, where each Key in the Map is an > >> imported package, > >> - * with its associated Value being a NameValueMap of any > >> attributes declared. > >> - */ > >> + * @return Map of NameValuePairs, where each Key in the Map is an > >> imported package, > >> + * with its associated Value being a NameValueMap of any > >> attributes declared. > >> + */ > >> public static Map<String, Map<String, String>> parseImportString(String > >> s){ > >> NameValueMap retval = new NameValueMap(); > >> genericImportExportProcess(retval, s); > >> - return retval; > >> + return retval; > >> + } > >> + > >> + /** > >> + * Parse a generic capability header. For example<br/> > >> + * > >> com.acme.myns;mylist:List<String>="nl,be,fr,uk";myver:Version=1.3;long:Long="1234";d:Double="3.14";myattr=xyz, > >> + * com.acme.myns;myattr=abc > >> + * @param s The header to be parsed > >> + * @return A list of GenericMetadata objects each representing an > >> individual capability. The values in the attribute map > >> + * are of the specified datatype. > >> + */ > >> + public static List<GenericMetadata> parseCapabilityString(String s) { > >> + return parseGenericMetadata(s); > >> } > >> - > >> + > >> + /** > >> + * Parse a generic capability header. For example<br/> > >> + * > >> com.acme.myns;mylist:List<String>="nl,be,fr,uk";myver:Version=1.3;long:Long="1234";d:Double="3.14";myattr=xyz, > >> + * com.acme.myns;myattr=abc > >> + * @param s The header to be parsed > >> + * @return A list of GenericMetadata objects each representing an > >> individual capability. The values in the attribute map > >> + * are of the specified datatype. > >> + */ > >> + public static List<GenericMetadata> parseRequirementString(String s) { > >> + return parseGenericMetadata(s); > >> + } > >> + > >> + private static List<GenericMetadata> parseGenericMetadata(String s) { > >> + List<GenericMetadata> capabilities = new ArrayList<GenericMetadata>(); > >> + > >> + List<String> entries = split(s, ","); > >> + for(String e : entries){ > >> + List<NameValuePair> nvpList = > >> genericNameWithNameValuePairProcess(e); > >> + > >> + for(NameValuePair nvp : nvpList) { > >> + String namespace = nvp.getName(); > >> + GenericMetadata cap = new GenericMetadata(namespace); > >> + capabilities.add(cap); > >> + > >> + Map<String, String> attrMap = nvp.getAttributes(); > >> + for (Map.Entry<String, String> entry : attrMap.entrySet()) { > >> + String k = entry.getKey(); > >> + String v = entry.getValue(); > >> + if (k.contains(":")) { > >> + if (k.endsWith(":")) { > >> + // a directive > >> + cap.getDirectives().put(k.substring(0, k.length() - 1), v); > >> + } else { > >> + // an attribute with its datatype specified > >> + parseTypedAttribute(k, v, cap); > >> + } > >> + } else { > >> + // ordinary (String) attribute > >> + cap.getAttributes().put(k, v); > >> + } > >> + } > >> + } > >> + } > >> + > >> + return capabilities; > >> + } > >> + > >> + private static void parseTypedAttribute(String k, String v, > >> GenericMetadata cap) { > >> + int idx = k.indexOf(':'); > >> + String name = k.substring(0, idx); > >> + String type = k.substring(idx + 1); > >> + > >> + if (type.startsWith("List<") && type.endsWith(">")) { > >> + String subtype = type.substring("List<".length(), type.length() - > >> 1).trim(); > >> + List<Object> l = new ArrayList<Object>(); > >> + for (String s : v.split(",")) { > >> + l.add(getTypedValue(k, subtype, s)); > >> + } > >> + cap.getAttributes().put(name, l); > >> + } else { > >> + cap.getAttributes().put(name, getTypedValue(k, type.trim(), v)); > >> + } > >> + } > >> + > >> + private static Object getTypedValue(String k, String type, String v) { > >> + if ("String".equals(type)) { > >> + return v; > >> + } else if ("Long".equals(type)) { > >> + return Long.parseLong(v); > >> + } else if ("Double".equals(type)) { > >> + return Double.parseDouble(v); > >> + } else if ("Version".equals(type)) { > >> + return Version.parseVersion(v); > >> + } > >> + throw new IllegalArgumentException(k + "=" + v); > >> + } > >> + > >> + > >> /** > >> * Parse a bundle symbolic name.<p> > >> * bundlesymbolicname;attrib=value;attrib=value > >> * <p> > >> - * > >> + * > >> * @param s The data to parse. > >> - * @return NameValuePair with Name being the BundleSymbolicName, > >> - * and Value being any attribs declared for the name. > >> - */ > >> + * @return NameValuePair with Name being the BundleSymbolicName, > >> + * and Value being any attribs declared for the name. > >> + */ > >> public static NameValuePair parseBundleSymbolicName(String s){ > >> return genericNameWithNameValuePairProcess(s).get(0); // should just > >> return the first one > >> } > >> - > >> + > >> /** > >> - * Parse a version range.. > >> - * > >> + * Parse a version range.. > >> + * > >> * @param s > >> * @return VersionRange object. > >> * @throws IllegalArgumentException if the String could not be parsed > >> as a VersionRange > >> @@ -395,10 +511,10 @@ public class ManifestHeaderProcessor > >> public static VersionRange parseVersionRange(String s) throws > >> IllegalArgumentException{ > >> return new VersionRange(s); > >> } > >> - > >> + > >> /** > >> - * Parse a version range and indicate if the version is an exact version > >> - * > >> + * Parse a version range and indicate if the version is an exact version > >> + * > >> * @param s > >> * @param exactVersion > >> * @return VersionRange object. > >> @@ -415,7 +531,7 @@ public class ManifestHeaderProcessor > >> * Filter strings generated by this method will therefore tend to > >> break the > >> * standard OSGi Filter class. The OBR stanza can be stripped out > >> later if > >> * required. > >> - * > >> + * > >> * @param attribs > >> * @return filter string > >> */ > >> @@ -537,10 +653,10 @@ public class ManifestHeaderProcessor > >> * include a stanza of the form, (mandatory:<*mandatoryAttribute) Filter > >> * strings generated by this method will therefore tend to break the > >> standard > >> * OSGi Filter class. The OBR stanza can be stripped out later if > >> required. > >> - * > >> + * > >> * We may wish to consider relocating this method since VersionRange > >> has its > >> * own top level class. > >> - * > >> + * > >> * @param type > >> * @param name > >> * @param attribs > >> @@ -655,8 +771,8 @@ public class ManifestHeaderProcessor > >> > >> return result; > >> } > >> - > >> - public static Map<String,String> parseFilter(String filter) > >> + > >> + public static Map<String,String> parseFilter(String filter) > >> { > >> Map<String,String> result; > >> if (filter.startsWith("(&")) { > >> @@ -666,6 +782,5 @@ public class ManifestHeaderProcessor > >> } > >> return result; > >> } > >> - > >> } > >> > >> > >> Modified: > >> aries/trunk/util/util-r42/src/test/java/org/apache/aries/util/manifest/ManifestHeaderProcessorTest.java > >> URL: > >> http://svn.apache.org/viewvc/aries/trunk/util/util-r42/src/test/java/org/apache/aries/util/manifest/ManifestHeaderProcessorTest.java?rev=1204471&r1=1204470&r2=1204471&view=diff > >> ============================================================================== > >> --- > >> aries/trunk/util/util-r42/src/test/java/org/apache/aries/util/manifest/ManifestHeaderProcessorTest.java > >> (original) > >> +++ > >> aries/trunk/util/util-r42/src/test/java/org/apache/aries/util/manifest/ManifestHeaderProcessorTest.java > >> Mon Nov 21 12:35:04 2011 > >> @@ -27,15 +27,16 @@ import static org.junit.Assert.assertTru > >> import static org.junit.Assert.fail; > >> > >> import java.util.ArrayList; > >> +import java.util.Arrays; > >> import java.util.HashMap; > >> import java.util.List; > >> import java.util.Map; > >> > >> import org.apache.aries.util.VersionRange; > >> -import org.apache.aries.util.manifest.ManifestHeaderProcessor; > >> -import > >> org.apache.aries.util.manifest.ManifestHeaderProcessor.NameValueMap; > >> +import > >> org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata; > >> import > >> org.apache.aries.util.manifest.ManifestHeaderProcessor.NameValuePair; > >> import org.junit.Test; > >> +import org.osgi.framework.Version; > >> > >> public class ManifestHeaderProcessorTest > >> { > >> @@ -44,10 +45,10 @@ public class ManifestHeaderProcessorTest > >> HashMap<String, String> attrs = new HashMap<String, String>(); > >> attrs.put("some", "value"); > >> NameValuePair nvp = new NameValuePair("key", attrs); > >> - > >> + > >> assertEquals("The name value pair is not set properly.", > >> nvp.getName(), "key"); > >> assertEquals("The value is not set properly.", > >> nvp.getAttributes().get("some"), "value"); > >> - > >> + > >> attrs = new HashMap<String, String>(); > >> attrs.put("some", "value"); > >> NameValuePair anotherNvp = new NameValuePair("key", attrs); > >> @@ -59,58 +60,58 @@ public class ManifestHeaderProcessorTest > >> nvp.setAttributes(attrs); > >> assertEquals("The name value pair is not set properly.", > >> nvp.getName(), "newKey"); > >> assertEquals("The value is not set properly.", > >> nvp.getAttributes().get("some"), "newValue"); > >> - > >> + > >> Map<String,String> nvm1 = new HashMap<String,String>(); > >> nvm1.put("a","b"); > >> nvm1.put("c","d"); > >> - > >> + > >> Map<String,String> nvm2 = new HashMap<String,String>(); > >> nvm2.put("c","d"); > >> nvm2.put("a","b"); > >> assertEquals("The maps are not equal.", nvm1, nvm2); > >> nvm2.put("e","f"); > >> assertNotSame("The maps are the same.", nvm1, nvm2); > >> - > >> + > >> NameValuePair nvp1 = new NameValuePair("one",nvm1); > >> NameValuePair nvp2 = new NameValuePair("one",nvm2); > >> - > >> + > >> assertNotSame("The pairs are identical ",nvp1,nvp2); > >> nvm1.put("e","f"); > >> assertEquals("The pairs are not equal.", nvp1,nvp2); > >> - > >> + > >> List<NameValuePair> bundleInfoList1 = new ArrayList<NameValuePair>(); > >> bundleInfoList1.add(nvp1); > >> > >> List<NameValuePair> bundleInfoList2 = new ArrayList<NameValuePair>(); > >> bundleInfoList2.add(nvp1); > >> - > >> + > >> bundleInfoList1.removeAll(bundleInfoList2); > >> assertEquals("The List should be empty", bundleInfoList1.isEmpty(), > >> true); > >> - > >> - > >> + > >> + > >> assertNotSame("The two objects of NameValuePair is not equal.", nvp, > >> anotherNvp); > >> } > >> > >> - > >> + > >> /** > >> * Test the Bundle manifest header entry of > >> * Bundle-SymbolicName: com.acme.foo;singleton:=true > >> */ > >> @Test > >> - public void testParseBundleSymbolicName() > >> + public void testParseBundleSymbolicName() > >> { > >> String bundleSymbolicNameEntry = > >> "com.acme.foo;singleton:=true;fragment-attachment:=always"; > >> NameValuePair nvp = > >> ManifestHeaderProcessor.parseBundleSymbolicName(bundleSymbolicNameEntry); > >> assertEquals("The symbolic name is wrong.", nvp.getName(), > >> "com.acme.foo"); > >> assertEquals("The value is wrong.", "true", > >> nvp.getAttributes().get("singleton:") ); > >> assertEquals("The directive is wrong.", "always", > >> nvp.getAttributes().get("fragment-attachment:") ); > >> - > >> + > >> String bundleSymbolicNameEntry2 = "com.acme.foo"; > >> NameValuePair nvp2 = > >> ManifestHeaderProcessor.parseBundleSymbolicName(bundleSymbolicNameEntry2); > >> assertEquals("The symbolic name is wrong.", nvp2.getName(), > >> "com.acme.foo"); > >> } > >> - > >> - > >> + > >> + > >> > >> /** > >> * Test the import package and import service > >> @@ -120,9 +121,9 @@ public class ManifestHeaderProcessorTest > >> public void testParseImportString() > >> { > >> String importPackage = > >> "com.acme.foo,come.acm.e.bar;version=\"[1.23,1.24.5]\";resolution:=mandatory;company=\"ACME\",a.b.c;version=1.2.3;company=com"; > >> - > >> + > >> Map<String, Map<String, String>> importPackageReturn = > >> ManifestHeaderProcessor.parseImportString(importPackage); > >> - > >> + > >> assertTrue("The package is not set.", > >> importPackageReturn.containsKey("com.acme.foo")); > >> assertTrue("The package is not set.", > >> importPackageReturn.containsKey("come.acm.e.bar")); > >> assertTrue("The package is not set.", > >> importPackageReturn.containsKey("come.acm.e.bar")); > >> @@ -133,12 +134,12 @@ public class ManifestHeaderProcessorTest > >> assertEquals("The directive is not set correctly.", "ACME", > >> importPackageReturn.get("come.acm.e.bar").get("company")); > >> assertEquals("The directive is not set correctly.", "1.2.3", > >> importPackageReturn.get("a.b.c").get("version")); > >> assertEquals("The directive is not set correctly.", "com", > >> importPackageReturn.get("a.b.c").get("company")); > >> - > >> + > >> importPackage="com.acme.foo"; > >> - > >> + > >> assertTrue("The package is not set.", > >> importPackageReturn.containsKey("com.acme.foo")); > >> assertTrue("The package should not contain any attributes.", > >> importPackageReturn.get("com.acme.foo").isEmpty()); > >> - > >> + > >> importPackage="com.acme.foo;com.acme.bar;version=2"; > >> Map<String, Map<String, String>> importPackageReturn2 = > >> ManifestHeaderProcessor.parseImportString(importPackage); > >> assertTrue("The package is not set.", > >> importPackageReturn2.containsKey("com.acme.foo")); > >> @@ -146,31 +147,31 @@ public class ManifestHeaderProcessorTest > >> assertEquals("The directive is not set correctly.", "2", > >> importPackageReturn2.get("com.acme.foo").get("version")); > >> assertEquals("The directive is not set correctly.", "2", > >> importPackageReturn2.get("com.acme.bar").get("version")); > >> } > >> - > >> + > >> @Test > >> public void testParseExportString() > >> { > >> String exportPackage = > >> "com.acme.foo,com.acme.bar;version=1,com.acme.bar;version=2;uses:=\"a.b.c,d.e.f\";security=false;mandatory:=security"; > >> - > >> + > >> List<NameValuePair> exportPackageReturn = > >> ManifestHeaderProcessor.parseExportString(exportPackage); > >> - > >> + > >> int i =0; > >> assertEquals("The number of the packages is wrong.", 3, > >> exportPackageReturn.size()); > >> for (NameValuePair nvp : exportPackageReturn) { > >> if (nvp.getName().equals("com.acme.foo")) { > >> i++; > >> - > >> + > >> assertTrue("The directive or attribute should not be set.", > >> nvp.getAttributes().isEmpty() ); > >> } else if ((nvp.getName().equals("com.acme.bar")) && > >> ("2".equals(nvp.getAttributes().get("version")))) { > >> - > >> - > >> + > >> + > >> i++; > >> assertEquals("The directive is wrong.", "a.b.c,d.e.f", > >> nvp.getAttributes().get("uses:")); > >> assertEquals("The directive is wrong.", "false", > >> nvp.getAttributes().get("security")); > >> assertEquals("The directive is wrong.", "security", > >> nvp.getAttributes().get("mandatory:")); > >> } else if ((nvp.getName().equals("com.acme.bar")) && > >> ("1".equals(nvp.getAttributes().get("version")))) { > >> i++; > >> - > >> + > >> assertNull("The directive is wrong.", > >> nvp.getAttributes().get("uses:")); > >> assertNull("The directive is wrong.", > >> nvp.getAttributes().get("security")); > >> assertNull("The directive is wrong.", > >> nvp.getAttributes().get("mandatory:")); > >> @@ -178,90 +179,90 @@ public class ManifestHeaderProcessorTest > >> } > >> // make sure all three packages stored > >> assertEquals("The names of the packages are wrong.", 3, i); > >> - > >> + > >> exportPackage = "com.acme.foo"; > >> - > >> + > >> exportPackageReturn = > >> ManifestHeaderProcessor.parseExportString(exportPackage); > >> - > >> + > >> int k =0; > >> assertEquals("The number of the packages is wrong.", 1, > >> exportPackageReturn.size()); > >> for (NameValuePair nvp : exportPackageReturn) { > >> if (nvp.getName().equals("com.acme.foo")) { > >> k++; > >> - > >> + > >> assertTrue("The directive or attribute should not be set.", > >> nvp.getAttributes().isEmpty() ); > >> - } > >> + } > >> } > >> assertEquals("The names of the packages are wrong.", 1, k); > >> - > >> + > >> // test multiple packages separated by ; > >> - > >> + > >> exportPackage = > >> "com.acme.foo;com.acme.bar;version=\"2\";resolution:=optional"; > >> - > >> + > >> exportPackageReturn = > >> ManifestHeaderProcessor.parseExportString(exportPackage); > >> - > >> + > >> k =0; > >> assertEquals("The number of the packages is wrong.", 2, > >> exportPackageReturn.size()); > >> for (NameValuePair nvp : exportPackageReturn) { > >> if (nvp.getName().equals("com.acme.foo")) { > >> k++; > >> - > >> + > >> assertEquals("The attribute is wrong.", "2", > >> nvp.getAttributes().get("version") ); > >> assertEquals("The attribute is wrong.", "optional", > >> nvp.getAttributes().get("resolution:")); > >> } else if (nvp.getName().equals("com.acme.bar")) { > >> k++; > >> - > >> + > >> assertEquals("The attribute is wrong.", "2", > >> nvp.getAttributes().get("version") ); > >> assertEquals("The attribute is wrong.", "optional", > >> nvp.getAttributes().get("resolution:")); > >> } > >> } > >> assertEquals("The names of the packages are wrong.", 2, k); > >> - > >> + > >> exportPackageReturn = > >> ManifestHeaderProcessor.parseExportString("some.export.with.space.in;directive > >> := spacey"); > >> assertEquals(exportPackageReturn.toString(), "spacey", > >> exportPackageReturn.get(0).getAttributes().get("directive:")); > >> } > >> - > >> + > >> @Test > >> public void testExportMandatoryAttributes() { > >> String exportPackage = > >> "com.acme.foo,com.acme.bar;version=2;company=dodo;security=false;mandatory:=\"security,company\""; > >> - > >> + > >> List<NameValuePair> exportPackageReturn = > >> ManifestHeaderProcessor.parseExportString(exportPackage); > >> - > >> + > >> int i =0; > >> assertEquals("The number of the packages is wrong.", 2, > >> exportPackageReturn.size()); > >> for (NameValuePair nvp : exportPackageReturn) { > >> if (nvp.getName().equals("com.acme.foo")) { > >> i++; > >> - > >> + > >> assertTrue("The directive or attribute should not be set.", > >> nvp.getAttributes().isEmpty() ); > >> } else if ((nvp.getName().equals("com.acme.bar")) && > >> ("2".equals(nvp.getAttributes().get("version")))) { > >> - > >> - > >> + > >> + > >> i++; > >> assertEquals("The directive is wrong.", "dodo", > >> nvp.getAttributes().get("company")); > >> assertEquals("The directive is wrong.", "false", > >> nvp.getAttributes().get("security")); > >> assertEquals("The directive is wrong.", "security,company", > >> nvp.getAttributes().get("mandatory:")); > >> - } > >> + } > >> } > >> // make sure all three packages stored > >> assertEquals("The names of the packages are wrong.", 2, i); > >> - > >> + > >> } > >> - > >> + > >> private String createExpectedFilter(Map<String, String> values, > >> String ... parts) > >> { > >> StringBuilder builder = new StringBuilder(parts[0]); > >> - > >> + > >> for (Map.Entry<String, String> entry : values.entrySet()) { > >> if ("version".equals(entry.getKey())) builder.append(parts[2]); > >> else if ("company".equals(entry.getKey())) > >> builder.append(parts[1]); > >> } > >> - > >> + > >> builder.append(parts[3]); > >> - > >> + > >> return builder.toString(); > >> } > >> - > >> + > >> /** > >> * Test the filter generated correctly > >> * @throws Exception > >> @@ -275,49 +276,49 @@ public class ManifestHeaderProcessorTest > >> String filter = > >> ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", > >> valueMap); > >> String expected = createExpectedFilter(valueMap, > >> "(&(symbolic-name=com.ibm.foo)", "(company=com)", > >> "(version>=1.2.0)(version<=2.3.0)", "(mandatory:<*company))"); > >> assertEquals("The filter is wrong.", expected, filter ); > >> - > >> - > >> + > >> + > >> valueMap.clear(); > >> - > >> + > >> valueMap.put("version", "(1.2, 2.3]"); > >> valueMap.put("resulution:", "mandatory"); > >> valueMap.put("company", "com"); > >> filter = ManifestHeaderProcessor.generateFilter("symbolic-name", > >> "com.ibm.foo", valueMap); > >> expected = createExpectedFilter(valueMap, > >> "(&(symbolic-name=com.ibm.foo)", "(company=com)", > >> "(version>=1.2.0)(version<=2.3.0)(!(version=1.2.0))", > >> "(mandatory:<*company))"); > >> assertEquals("The filter is wrong.", expected, filter ); > >> - > >> + > >> valueMap.clear(); > >> - > >> + > >> valueMap.put("version", "(1.2, 2.3)"); > >> valueMap.put("resulution:", "mandatory"); > >> valueMap.put("company", "com"); > >> filter = ManifestHeaderProcessor.generateFilter("symbolic-name", > >> "com.ibm.foo", valueMap); > >> expected = createExpectedFilter(valueMap, > >> "(&(symbolic-name=com.ibm.foo)", "(company=com)", > >> "(version>=1.2.0)(version<=2.3.0)(!(version=1.2.0))(!(version=2.3.0))", > >> "(mandatory:<*company))"); > >> assertEquals("The filter is wrong.", expected, filter ); > >> - > >> + > >> valueMap.clear(); > >> - > >> + > >> valueMap.put("version", "1.2"); > >> valueMap.put("resulution:", "mandatory"); > >> valueMap.put("company", "com"); > >> filter = ManifestHeaderProcessor.generateFilter("symbolic-name", > >> "com.ibm.foo", valueMap); > >> expected = createExpectedFilter(valueMap, > >> "(&(symbolic-name=com.ibm.foo)", "(company=com)", "(version>=1.2.0)", > >> "(mandatory:<*company))"); > >> assertEquals("The filter is wrong.", expected, filter ); > >> - > >> + > >> valueMap.clear(); > >> - > >> + > >> valueMap.put("resulution:", "mandatory"); > >> valueMap.put("company", "com"); > >> filter = ManifestHeaderProcessor.generateFilter("symbolic-name", > >> "com.ibm.foo", valueMap); > >> expected = createExpectedFilter(valueMap, > >> "(&(symbolic-name=com.ibm.foo)", "(company=com)", "", > >> "(mandatory:<*company))"); > >> assertEquals("The filter is wrong.", expected, filter ); > >> } > >> - > >> + > >> /** > >> * Test the version range created correctly > >> * @throws Exception > >> */ > >> - > >> + > >> @Test > >> public void testVersionRange() throws Exception { > >> String version1 = "[1.2.3, 4.5.6]"; > >> @@ -332,51 +333,51 @@ public class ManifestHeaderProcessorTest > >> String version10=null; > >> String version11=""; > >> String version12="\"[1.2.3, 4.5.6]\""; > >> - > >> + > >> VersionRange vr = > >> ManifestHeaderProcessor.parseVersionRange(version1); > >> assertEquals("The value is wrong", "1.2.3", > >> vr.getMinimumVersion().toString()); > >> assertFalse("The value is wrong", vr.isMinimumExclusive()); > >> assertEquals("The value is wrong", "4.5.6", > >> vr.getMaximumVersion().toString()); > >> assertFalse("The value is wrong", vr.isMaximumExclusive()); > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange(version2); > >> assertEquals("The value is wrong", "1.0.0", > >> vr.getMinimumVersion().toString()); > >> assertTrue("The value is wrong", vr.isMinimumExclusive()); > >> assertEquals("The value is wrong", "2.0.0", > >> vr.getMaximumVersion().toString()); > >> assertFalse("The value is wrong", vr.isMaximumExclusive()); > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange(version3); > >> - > >> + > >> assertEquals("The value is wrong", "2.0.0", > >> vr.getMinimumVersion().toString()); > >> assertFalse("The value is wrong", vr.isMinimumExclusive()); > >> assertEquals("The value is wrong", "4.0.0", > >> vr.getMaximumVersion().toString()); > >> assertTrue("The value is wrong", vr.isMaximumExclusive()); > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange(version4); > >> - > >> + > >> assertEquals("The value is wrong", "1.0.0", > >> vr.getMinimumVersion().toString()); > >> assertTrue("The value is wrong", vr.isMinimumExclusive()); > >> assertEquals("The value is wrong", "2.0.0", > >> vr.getMaximumVersion().toString()); > >> assertTrue("The value is wrong", vr.isMaximumExclusive()); > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange(version5); > >> assertEquals("The value is wrong", "2.0.0", > >> vr.getMinimumVersion().toString()); > >> assertFalse("The value is wrong", vr.isMinimumExclusive()); > >> assertNull("The value is wrong", vr.getMaximumVersion()); > >> assertFalse("The value is wrong", vr.isMaximumExclusive()); > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange(version6); > >> assertEquals("The value is wrong", "2.3.0", > >> vr.getMinimumVersion().toString()); > >> assertFalse("The value is wrong", vr.isMinimumExclusive()); > >> assertNull("The value is wrong", vr.getMaximumVersion()); > >> assertFalse("The value is wrong", vr.isMaximumExclusive()); > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange(version7); > >> assertEquals("The value is wrong", "1.2.3.q", > >> vr.getMinimumVersion().toString()); > >> assertFalse("The value is wrong", vr.isMinimumExclusive()); > >> assertEquals("The value is wrong", "2.3.4.p", > >> vr.getMaximumVersion().toString()); > >> assertTrue("The value is wrong", vr.isMaximumExclusive()); > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange(version8); > >> assertEquals("The value is wrong", "1.2.2.5", > >> vr.getMinimumVersion().toString()); > >> assertFalse("The value is wrong", vr.isMinimumExclusive()); > >> @@ -388,7 +389,7 @@ public class ManifestHeaderProcessorTest > >> } catch (Exception e){ > >> exception = true; > >> } > >> - > >> + > >> assertTrue("The value is wrong", exception); > >> boolean exceptionNull = false; > >> try { > >> @@ -403,15 +404,15 @@ public class ManifestHeaderProcessorTest > >> assertFalse("The value is wrong", vr.isMinimumExclusive()); > >> assertNull("The value is wrong", vr.getMaximumVersion()); > >> assertFalse("The value is wrong", vr.isMaximumExclusive()); > >> - > >> - > >> + > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange(version12); > >> assertEquals("The value is wrong", "1.2.3", > >> vr.getMinimumVersion().toString()); > >> assertFalse("The value is wrong", vr.isMinimumExclusive()); > >> assertEquals("The value is wrong", "4.5.6", > >> vr.getMaximumVersion().toString()); > >> - assertFalse("The value is wrong", vr.isMaximumExclusive()); > >> + assertFalse("The value is wrong", vr.isMaximumExclusive()); > >> } > >> - > >> + > >> @Test > >> public void testInvalidVersions() throws Exception > >> { > >> @@ -421,7 +422,7 @@ public class ManifestHeaderProcessorTest > >> } catch (IllegalArgumentException e) { > >> // assertEquals(MessageUtil.getMessage("APPUTILS0009E", "a"), > >> e.getMessage()); > >> } > >> - > >> + > >> try { > >> ManifestHeaderProcessor.parseVersionRange("[1.0.0,1.0.1]", true); > >> assertTrue("Should have thrown an exception", false); > >> @@ -437,18 +438,18 @@ public class ManifestHeaderProcessorTest > >> List<String> result = ManifestHeaderProcessor.split(export, ","); > >> assertEquals("The result is wrong.", export, result.get(0)); > >> assertEquals("The result is wrong.", 1, result.size()); > >> - > >> + > >> String aString = > >> "com.acme.foo;weirdAttr=\"one;two;three\";weirdDir:=\"1;2;3\""; > >> result = ManifestHeaderProcessor.split(aString, ";"); > >> assertEquals("The result is wrong.", "com.acme.foo", result.get(0)); > >> assertEquals("The result is wrong.", "weirdAttr=\"one;two;three\"", > >> result.get(1)); > >> assertEquals("The result is wrong.", "weirdDir:=\"1;2;3\"", > >> result.get(2)); > >> - > >> + > >> assertEquals("The result is wrong.", 3, result.size()); > >> - > >> - > >> - > >> - > >> + > >> + > >> + > >> + > >> String pkg1 = > >> "com.ibm.ws.eba.example.helloIsolation;version=\"1.0.0\" "; > >> String pkg2 = > >> "com.ibm.ws.eba.helloWorldService;version=\"[1.0.0,1.0.0]\""; > >> String pkg3 = " com.ibm.ws.eba.helloWorldService;version=\"1.0.0\""; > >> @@ -459,47 +460,47 @@ public class ManifestHeaderProcessorTest > >> String appContent3 = pkg1 + ", " + pkg3 + ", " + pkg2; > >> String appContent4 = pkg1 + ", " + pkg3 + ", " + pkg4; > >> String appContent5 = pkg1 + ", " + pkg3 + ", " + pkg5; > >> - > >> + > >> List<String> splitList = ManifestHeaderProcessor.split(appContent1, > >> ","); > >> assertEquals(pkg1.trim(), splitList.get(0)); > >> assertEquals(pkg2.trim(), splitList.get(1)); > >> assertEquals(pkg3.trim(), splitList.get(2)); > >> - > >> + > >> splitList = ManifestHeaderProcessor.split(appContent2, ","); > >> assertEquals(pkg2.trim(), splitList.get(0)); > >> assertEquals(pkg1.trim(), splitList.get(1)); > >> assertEquals(pkg3.trim(), splitList.get(2)); > >> - > >> + > >> splitList = ManifestHeaderProcessor.split(appContent3, ","); > >> assertEquals(pkg1.trim(), splitList.get(0)); > >> assertEquals(pkg3.trim(), splitList.get(1)); > >> assertEquals(pkg2.trim(), splitList.get(2)); > >> - > >> + > >> splitList = ManifestHeaderProcessor.split(appContent4, ","); > >> assertEquals(pkg1.trim(), splitList.get(0)); > >> assertEquals(pkg3.trim(), splitList.get(1)); > >> assertEquals(pkg4.trim(), splitList.get(2)); > >> - > >> + > >> splitList = ManifestHeaderProcessor.split(appContent5, ","); > >> assertEquals(pkg1.trim(), splitList.get(0)); > >> assertEquals(pkg3.trim(), splitList.get(1)); > >> - assertEquals(pkg5.trim(), splitList.get(2)); > >> + assertEquals(pkg5.trim(), splitList.get(2)); > >> } > >> - > >> + > >> @Test > >> public void testParseFilter() > >> { > >> Map<String,String> attrs = > >> ManifestHeaderProcessor.parseFilter("(package=com.ibm.test)"); > >> assertEquals("com.ibm.test", attrs.get("package")); > >> - > >> + > >> attrs = > >> ManifestHeaderProcessor.parseFilter("(&(package=com.ibm.test)(attr=value))"); > >> assertEquals("com.ibm.test", attrs.get("package")); > >> assertEquals("value", attrs.get("attr")); > >> assertEquals(2, attrs.size()); > >> - > >> + > >> attrs = ManifestHeaderProcessor.parseFilter("(&(version>=1.0.0))"); > >> assertEquals("1.0.0", attrs.get("version")); > >> - > >> + > >> attrs = > >> ManifestHeaderProcessor.parseFilter("(&(version>=1.0.0)(version<=2.0.0))"); > >> assertEquals("[1.0.0,2.0.0]", attrs.get("version")); > >> > >> @@ -509,9 +510,9 @@ public class ManifestHeaderProcessorTest > >> attrs = > >> ManifestHeaderProcessor.parseFilter("(&(!(version=2.0.0))(!(version=1.0.0))(version>=1.0.0)(version<=2.0.0))"); > >> assertEquals("(1.0.0,2.0.0)", attrs.get("version")); > >> } > >> - > >> + > >> @Test > >> - public void testExactVersion() throws Exception > >> + public void testExactVersion() throws Exception > >> { > >> VersionRange vr; > >> try { > >> @@ -520,30 +521,102 @@ public class ManifestHeaderProcessorTest > >> } catch (IllegalArgumentException e) { > >> // expected > >> } > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 1.0.0]", > >> true); > >> assertTrue(vr.isExactVersion()); > >> - > >> + > >> try { > >> vr = ManifestHeaderProcessor.parseVersionRange("(1.0.0, 1.0.0]", > >> true); > >> fail("should not get here 2"); > >> } catch (IllegalArgumentException e) { > >> // expected > >> } > >> - > >> + > >> try { > >> vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 1.0.0)", > >> true); > >> fail("should not get here 3"); > >> } catch (IllegalArgumentException e) { > >> // expected > >> } > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 2.0.0]"); > >> assertFalse(vr.isExactVersion()); > >> - > >> + > >> vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 1.0.0]"); > >> assertTrue(vr.isExactVersion()); > >> - > >> - > >> + > >> + > >> + } > >> + > >> + @Test > >> + public void testCapabilityHeader() throws Exception { > >> + String s = > >> + "com.acme.dictionary; effective:=resolve; from:String=nl; > >> to=de; version:Version=3.4.0.test;somedir:=test, " + > >> + "com.acme.dictionary; > >> filter:=\"(&(width>=1000)(height>=1000))\", " + > >> + > >> "com.acme.ip2location;country:List<String>=\"nl,be,fr,uk\";version:Version=1.3;long:Long=" > >> + Long.MAX_VALUE + ";d:Double=\"2.2250738585072012e-308\""; > >> + > >> + List<GenericMetadata> capabilities = > >> ManifestHeaderProcessor.parseCapabilityString(s); > >> + testCapabilitiesOrRequirements(capabilities); > >> + } > >> + > >> + @Test > >> + public void testRequirementHeader() throws Exception { > >> + String s = > >> + "com.acme.dictionary; effective:=resolve; from:String=nl; > >> to=de; version:Version=3.4.0.test;somedir:=test, " + > >> + "com.acme.dictionary; > >> filter:=\"(&(width>=1000)(height>=1000))\", " + > >> + > >> "com.acme.ip2location;country:List<String>=\"nl,be,fr,uk\";version:Version=1.3;long:Long=" > >> + Long.MAX_VALUE + ";d:Double=\"2.2250738585072012e-308\""; > >> + > >> + List<GenericMetadata> capabilities = > >> ManifestHeaderProcessor.parseRequirementString(s); > >> + testCapabilitiesOrRequirements(capabilities); > >> + } > >> + > >> + private void testCapabilitiesOrRequirements(List<GenericMetadata> > >> metadata) { > >> + assertEquals(3, metadata.size()); > >> + > >> + boolean found1 = false, found2 = false, found3 = false; > >> + for (GenericMetadata cap : metadata) { > >> + if ("com.acme.dictionary".equals(cap.getNamespace()) && > >> cap.getDirectives().containsKey("effective")) { > >> + testDictionaryCapability1(cap); > >> + found1 = true; > >> + } else if ("com.acme.dictionary".equals(cap.getNamespace()) && > >> cap.getDirectives().containsKey("filter")) { > >> + testDictionaryCapability2(cap); > >> + found2 = true; > >> + } else if ("com.acme.ip2location".equals(cap.getNamespace())) { > >> + testIP2LocationCapability(cap); > >> + found3 = true; > >> + } > >> + } > >> + > >> + assertTrue(found1); > >> + assertTrue(found2); > >> + assertTrue(found3); > >> + } > >> + > >> + private void testDictionaryCapability1(GenericMetadata cap) { > >> + assertEquals(2, cap.getDirectives().size()); > >> + assertEquals("resolve", cap.getDirectives().get("effective")); > >> + assertEquals("test", cap.getDirectives().get("somedir")); > >> + > >> + assertEquals(3, cap.getAttributes().size()); > >> + assertEquals("nl", cap.getAttributes().get("from")); > >> + assertEquals("de", cap.getAttributes().get("to")); > >> + assertEquals(new Version(3, 4, 0, "test"), > >> cap.getAttributes().get("version")); > >> + } > >> + > >> + private void testDictionaryCapability2(GenericMetadata cap) { > >> + assertEquals(1, cap.getDirectives().size()); > >> + assertEquals("(&(width>=1000)(height>=1000))", > >> cap.getDirectives().get("filter")); > >> + > >> + assertEquals(0, cap.getAttributes().size()); > >> + } > >> + > >> + private void testIP2LocationCapability(GenericMetadata cap) { > >> + assertEquals(0, cap.getDirectives().size()); > >> + assertEquals(4, cap.getAttributes().size()); > >> + > >> + assertEquals(new Version(1, 3, 0), > >> cap.getAttributes().get("version")); > >> + assertEquals(Arrays.asList("nl", "be", "fr", "uk"), > >> cap.getAttributes().get("country")); > >> + assertEquals(Long.MAX_VALUE, cap.getAttributes().get("long")); > >> + assertEquals(0, new > >> Double("2.2250738585072012e-308").compareTo((Double) > >> cap.getAttributes().get("d"))); > >> } > >> } > >> > >> > >
