aries-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Timothy Ward <timothyjw...@apache.org>
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
Date Fri, 25 Nov 2011 18:36:52 GMT

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...

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: commits@aries.apache.org
> From: davidb@apache.org
> 
> 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")));
>      }
>  }
> 
> 
 		 	   		  
Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message