Author: not
Date: Mon Dec  7 11:32:47 2009
New Revision: 887889

URL: http://svn.apache.org/viewvc?rev=887889&view=rev
Log:
ARIES-52 improvements to manifest tests and bug fixes for parsing

Added:
    
incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ApplicationMetadataImplTest.java
    
incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION2.MF
    
incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION3.MF
Modified:
    
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/ApplicationMetadataManager.java
    
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataImpl.java
    
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerImpl.java
    
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerServiceImpl.java
    
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ContentImpl.java
    
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestProcessor.java
    
incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ManifestProcessorTest.java

Modified: 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/ApplicationMetadataManager.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/ApplicationMetadataManager.java?rev=887889&r1=887888&r2=887889&view=diff
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/ApplicationMetadataManager.java
 (original)
+++ 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/ApplicationMetadataManager.java
 Mon Dec  7 11:32:47 2009
@@ -40,6 +40,8 @@
    * @throws IOException if an IOException occurs reading from the stream.
    */
   public ApplicationMetadata parseApplication(InputStream in) throws 
IOException;
+  public Content parseContent(String content);
+  public VersionRange parseVersionRange(String versionRange);
   /**
    * Create the application metadata from the provided Manifest. This is 
provided
    * so application metadata can be created from within the JVM. When reading
@@ -71,4 +73,13 @@
    * @return    true if the application was registered, false otherwise.
    */
   public boolean registerApplication(ApplicationMetadata app);
+  
+  /**
+   * This method is used to remove a previously registered application. An
+   * application can only be removed by the bundle that registered the 
application.
+   * 
+   * @param app the application to remove.
+   * @return    true if the application was removed, false otherwise.
+   */
+  public boolean unregisterApplication(ApplicationMetadata app);
 }
\ No newline at end of file

Modified: 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataImpl.java?rev=887889&r1=887888&r2=887889&view=diff
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataImpl.java
 (original)
+++ 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataImpl.java
 Mon Dec  7 11:32:47 2009
@@ -40,11 +40,12 @@
  * Implementation of ApplicationMetadata and DeploymentMetadata
  *
  */
-public class ApplicationMetadataImpl implements ApplicationMetadata
+public final class ApplicationMetadataImpl implements ApplicationMetadata
 {
   private String appSymbolicName;
   private Version appVersion;
   private String appName;
+  private String appScope;
   private List<Content> appContents;
   private List<ServiceDeclaration> importServices;
   private List<ServiceDeclaration> exportServices;
@@ -66,15 +67,15 @@
    * setup the application metadata from the appManifest
    * @param appManifest     application.mf manifest
    */
-  private void setup(Manifest appManifest) {
-
-    
+  private void setup(Manifest appManifest) 
+  {
     Map<String, String> appMap = readManifestIntoMap(appManifest);
     
     // configure the appSymbolicName and appVersion
-    this.appSymbolicName = 
appMap.get(AppConstants.APPLICATION_SYMBOLIC_NAME).trim();
-    this.appVersion = new 
Version(appMap.get(AppConstants.APPLICATION_VERSION).trim());
+    this.appSymbolicName = appMap.get(AppConstants.APPLICATION_SYMBOLIC_NAME);
+    this.appVersion = new 
Version(appMap.get(AppConstants.APPLICATION_VERSION));
     this.appName = appMap.get(AppConstants.APPLICATION_NAME);
+    this.appScope = this.appSymbolicName + "_" + this.appVersion.toString();
     
     if (this.appSymbolicName == null || this.appVersion == null) {
       throw new IllegalArgumentException("Failed to create 
ApplicationMetadataImpl object from Manifest " + appManifest);
@@ -143,11 +144,29 @@
     return this.appVersion;
   }
 
-  public String getApplicationName() {
+  public String getApplicationName() 
+  {
     return this.appName;
   }
   
-  public String getApplicationScope() {
-    return this.appSymbolicName + "_" + this.appVersion.toString();
+  public String getApplicationScope() 
+  {
+    return appScope;
+  }
+  
+  public boolean equals(Object other)
+  {
+    if (other == this) return true;
+    if (other == null) return false;
+    if (other instanceof ApplicationMetadataImpl) {
+      return appScope.equals(((ApplicationMetadataImpl)other).appScope);
+    }
+    
+    return false;
+  }
+  
+  public int hashCode()
+  {
+    return appScope.hashCode();
   }
-}
+}
\ No newline at end of file

Modified: 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerImpl.java?rev=887889&r1=887888&r2=887889&view=diff
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerImpl.java
 (original)
+++ 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerImpl.java
 Mon Dec  7 11:32:47 2009
@@ -26,6 +26,8 @@
 
 import org.apache.aries.application.ApplicationMetadata;
 import org.apache.aries.application.ApplicationMetadataManager;
+import org.apache.aries.application.Content;
+import org.apache.aries.application.VersionRange;
 import org.apache.aries.application.utils.manifest.ManifestProcessor;
 import org.osgi.framework.Version;
 
@@ -56,9 +58,7 @@
   
   public boolean registerApplication(ApplicationMetadata app)
   {
-    String key = app.getApplicationSymbolicName() + "_" + 
app.getApplicationVersion();
-    
-    ApplicationMetadata existingApp = applications.putIfAbsent(key, app);
+    ApplicationMetadata existingApp = 
applications.putIfAbsent(app.getApplicationScope(), app);
     
     return existingApp == null;
   }
@@ -68,16 +68,19 @@
     return new ApplicationMetadataImpl(man);
   }
   
-  /**
-   * This method is called by the service facade to remove applications when
-   * the client bundle releases the service. It is not public.
-   * 
-   * @param app the application to remove.
-   */
-  public void removeApplication(ApplicationMetadata app)
+  public boolean unregisterApplication(ApplicationMetadata app)
+  {
+    return applications.remove(app.getApplicationScope()) != null;
+  }
+
+  public Content parseContent(String content)
+  {
+    return new ContentImpl(content);
+  }
+
+  public VersionRange parseVersionRange(String versionRange)
   {
-    String key = app.getApplicationSymbolicName() + "_" + 
app.getApplicationVersion();
-    applications.remove(key);
+    return new VersionRangeImpl(versionRange);
   }
 
 }
\ No newline at end of file

Modified: 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerServiceImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerServiceImpl.java?rev=887889&r1=887888&r2=887889&view=diff
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerServiceImpl.java
 (original)
+++ 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ApplicationMetadataManagerServiceImpl.java
 Mon Dec  7 11:32:47 2009
@@ -20,12 +20,17 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.jar.Manifest;
 
 import org.apache.aries.application.ApplicationMetadata;
 import org.apache.aries.application.ApplicationMetadataManager;
+import org.apache.aries.application.Content;
+import org.apache.aries.application.VersionRange;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
 import org.osgi.framework.Version;
 
 /**
@@ -33,61 +38,103 @@
  * remove registered applications when the requesting bundle releases the 
service.
  * There is one instance of this class per requesting bundle.
  */
-public class ApplicationMetadataManagerServiceImpl implements 
ApplicationMetadataManager
+public class ApplicationMetadataManagerServiceImpl implements ServiceFactory
 {
-  /** The core application metadata manager */
-  private ApplicationMetadataManagerImpl manager;
-  /** A list of all applications registered via this service instance */
-  private List<ApplicationMetadata> appMetaData = new 
ArrayList<ApplicationMetadata>();
+  private static class RealApplicationMetadataManagerServiceImpl implements 
ApplicationMetadataManager
+  {
+    /** The core application metadata manager */
+    private ApplicationMetadataManager manager;
+    /** A list of all applications registered via this service instance */
+    private Set<ApplicationMetadata> appMetaData = new 
HashSet<ApplicationMetadata>();
+    
+    public 
RealApplicationMetadataManagerServiceImpl(ApplicationMetadataManager man)
+    {
+      manager = man;
+    }
+
+    public ApplicationMetadata getApplication(String applicationSymbolicName, 
Version version)
+    {
+      return manager.getApplication(applicationSymbolicName, version);
+    }
+  
+    public ApplicationMetadata parseApplication(InputStream in) throws 
IOException
+    {
+      return manager.parseApplication(in);
+    }
+  
+    public ApplicationMetadata createApplication(Manifest man)
+    {
+      return manager.createApplication(man);
+    }
+  
+    public boolean registerApplication(ApplicationMetadata app)
+    {
+      if (manager.registerApplication(app)) {
+        synchronized (appMetaData) {
+          appMetaData.add(app);
+        }
+        return true;
+      }
+      return false;
+    }
+    
+    public boolean unregisterApplication(ApplicationMetadata app)
+    {
+      boolean remove = false;
+      synchronized (appMetaData) {
+        remove = appMetaData.contains(app);
+      }
+      
+      if (remove) return manager.unregisterApplication(app);
+      
+      return false;
+    }
+    
+    /**
+     * This method is called by blueprint when the calling bundle releases the
+     * service. It removes all the registered applications from the core 
manager.
+     */
+    public void close()
+    {
+      synchronized (appMetaData) {
+        for (ApplicationMetadata app : appMetaData) {
+          manager.unregisterApplication(app);
+        }
+        
+        appMetaData.clear();
+      }
+    }
+  
+    public Content parseContent(String content)
+    {
+      return manager.parseContent(content);
+    }
   
+    public VersionRange parseVersionRange(String versionRange)
+    {
+      return manager.parseVersionRange(versionRange);
+    }
+  }
+
+  private ApplicationMetadataManager manager;
+
   /**
    * Called by blueprint.
    * 
    * @param appManager the core app metadata manager.
    */
-  public void setManager(ApplicationMetadataManagerImpl appManager)
+  public void setManager(ApplicationMetadataManager appManager)
   {
     manager = appManager;
   }
   
-  public ApplicationMetadata getApplication(String applicationSymbolicName, 
Version version)
+  public Object getService(Bundle bundle, ServiceRegistration registration)
   {
-    return manager.getApplication(applicationSymbolicName, version);
+    return new RealApplicationMetadataManagerServiceImpl(manager);
   }
 
-  public ApplicationMetadata parseApplication(InputStream in) throws 
IOException
+  public void ungetService(Bundle bundle, ServiceRegistration registration, 
Object service)
   {
-    return manager.parseApplication(in);
-  }
-
-  public ApplicationMetadata createApplication(Manifest man)
-  {
-    return manager.createApplication(man);
-  }
-
-  public boolean registerApplication(ApplicationMetadata app)
-  {
-    if (manager.registerApplication(app)) {
-      synchronized (appMetaData) {
-        appMetaData.add(app);
-      }
-      return true;
-    }
-    return false;
-  }
-  
-  /**
-   * This method is called by blueprint when the calling bundle releases the
-   * service. It removes all the registered applications from the core manager.
-   */
-  public void close()
-  {
-    synchronized (appMetaData) {
-      for (ApplicationMetadata app : appMetaData) {
-        manager.removeApplication(app);
-      }
-      
-      appMetaData.clear();
-    }
+    ((RealApplicationMetadataManagerServiceImpl)service).close();
   }
 }
\ No newline at end of file

Modified: 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ContentImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ContentImpl.java?rev=887889&r1=887888&r2=887889&view=diff
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ContentImpl.java
 (original)
+++ 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/ContentImpl.java
 Mon Dec  7 11:32:47 2009
@@ -24,13 +24,15 @@
 
 import org.apache.aries.application.Content;
 import org.apache.aries.application.VersionRange;
+import org.apache.aries.application.utils.AppConstants;
+import org.osgi.framework.Constants;
 
 
 /**
  * Implementation of Content 
  *
  */
-public class ContentImpl implements Content
+public final class ContentImpl implements Content
 {
   private String content;
   private String contentName;
@@ -46,6 +48,10 @@
     this.attributes = new HashMap<String, String>();
     this.directives = new HashMap<String, String>();
     setup(content, this.attributes, this.directives);
+    
+    if (!!!attributes.containsKey(Constants.VERSION_ATTRIBUTE)) {
+      attributes.put(Constants.VERSION_ATTRIBUTE, 
AppConstants.DEFAULT_VERSION);
+    }
   }
   
   public String getContent() {
@@ -100,6 +106,34 @@
     return vi;
   }
   
+  @Override
+  public String toString()
+  {
+    return content;
+  }
+  
+  @Override
+  public boolean equals(Object other)
+  {
+    if (other == this) return true;
+    if (other == null) return false;
+    
+    if (other instanceof ContentImpl) {
+      ContentImpl otherContent = (ContentImpl)other;
+      return contentName.equals(otherContent.contentName) && 
+             attributes.equals(otherContent.attributes) &&
+             directives.equals(otherContent.directives);
+    }
+    
+    return false;
+  }
+  
+  @Override
+  public int hashCode()
+  {
+    return contentName.hashCode();
+  }
+  
   /**
    * setup attributes and directives from the Application-Content or 
Import-Package
    * @param content
@@ -110,7 +144,7 @@
   {
     String[] tokens = content.split(";");
     if (tokens.length < 1) {
-      throw new IllegalArgumentException("Invalid header split: " + content);
+      throw new IllegalArgumentException("Invalid content: " + content);
     }
     this.contentName = tokens[0].trim();
     for (int i = 1; i < tokens.length; i++) {

Modified: 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestProcessor.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestProcessor.java?rev=887889&r1=887888&r2=887889&view=diff
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestProcessor.java
 (original)
+++ 
incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestProcessor.java
 Mon Dec  7 11:32:47 2009
@@ -87,50 +87,40 @@
     
     String namedAttribute = null;
     
-    while ((line = reader.readLine()) != null) {
-      String trimmedLine = line.trim();
+    do {
+      line = reader.readLine();
+
       // if we get a blank line skip to the next one
-      if (trimmedLine.length() == 0) continue;
-      if (line.charAt(0) == ' ' && attribute != null) {
+      if (line != null && line.trim().length() == 0) continue;
+      if (line != null && line.charAt(0) == ' ' && attribute != null) {
         // we have a continuation line, so add to the builder, ignoring the
         // first character
-        attribute.append(trimmedLine);
+        attribute.append(line.trim());
       } else if (attribute == null) {
-        attribute = new StringBuilder(trimmedLine);
+        attribute = new StringBuilder(line.trim());
       } else if (attribute != null) {
         // We have fully parsed an attribute
-        namedAttribute = setAttribute(man, namedAttribute, attribute);
+        int index = attribute.indexOf(":");
+        String attributeName = attribute.substring(0, index).trim();
+        // TODO cope with index + 1 being after the end of attribute
+        String attributeValue = attribute.substring(index + 1).trim();
         
-        attribute = new StringBuilder(trimmedLine);
-      }
-    }
-    
-    if (attribute != null) {
-        setAttribute(man, namedAttribute, attribute);
-    }
-    
-    return man;
-  }
-  
-  private static String setAttribute(Manifest man, String namedAttribute, 
StringBuilder attribute) 
-  {
-      int index = attribute.indexOf(":");
-      String attributeName = attribute.substring(0, index).trim();
-      // TODO cope with index + 1 being after the end of attribute
-      String attributeValue = attribute.substring(index + 1).trim();
-      
-      if ("Name".equals(attributeName)) {
-        man.getEntries().put(attributeValue, new Attributes());
-        namedAttribute = attributeValue;
-      } else {
-        if (namedAttribute == null) {
-          man.getMainAttributes().put(new Attributes.Name(attributeName), 
attributeValue);
+        if ("Name".equals(attributeName)) {
+          man.getEntries().put(attributeValue, new Attributes());
+          namedAttribute = attributeValue;
         } else {
-          man.getAttributes(namedAttribute).put(new 
Attributes.Name(attributeName), attributeValue);
+          if (namedAttribute == null) {
+            man.getMainAttributes().put(new Attributes.Name(attributeName), 
attributeValue);
+          } else {
+            man.getAttributes(namedAttribute).put(new 
Attributes.Name(attributeName), attributeValue);
+          }
         }
+        
+        if (line != null) attribute = new StringBuilder(line.trim());
       }
-      
-      return namedAttribute;
+    } while (line != null);
+    
+    return man;
   }
   
   /**

Added: 
incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ApplicationMetadataImplTest.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ApplicationMetadataImplTest.java?rev=887889&view=auto
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ApplicationMetadataImplTest.java
 (added)
+++ 
incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ApplicationMetadataImplTest.java
 Mon Dec  7 11:32:47 2009
@@ -0,0 +1,38 @@
+/*
+ * IBM Confidential
+ * 
+ * OCO Source Materials
+ * 
+ * Copyright IBM Corp. 2009
+ * 
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ * 
+ * Change activity:
+ * 
+ * Issue       Date        Name     Description
+ * ----------- ----------- -------- ------------------------------------
+ */
+package org.apache.aries.application.utils;
+
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+import org.apache.aries.application.ApplicationMetadata;
+import org.apache.aries.application.ApplicationMetadataManager;
+import org.apache.aries.application.impl.ApplicationMetadataManagerImpl;
+import org.junit.Test;
+
+public class ApplicationMetadataImplTest
+{
+  @Test
+  public void testBasicMetadataCreation() throws IOException
+  {
+    ApplicationMetadataManager manager = new ApplicationMetadataManagerImpl();
+    ApplicationMetadata app = 
manager.parseApplication(getClass().getResourceAsStream("/META-INF/APPLICATION.MF"));
+    
+    Assert.assertEquals("Travel Reservation", app.getApplicationName());
+  }
+}
\ No newline at end of file

Modified: 
incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ManifestProcessorTest.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ManifestProcessorTest.java?rev=887889&r1=887888&r2=887889&view=diff
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ManifestProcessorTest.java
 (original)
+++ 
incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ManifestProcessorTest.java
 Mon Dec  7 11:32:47 2009
@@ -18,75 +18,30 @@
  */
 package org.apache.aries.application.utils;
 
-import static org.apache.aries.application.utils.AppConstants.APPLICATION_MF;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.PrintWriter;
+import java.io.InputStream;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.jar.Manifest;
 
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.osgi.framework.Version;
-
 import org.apache.aries.application.ApplicationMetadata;
 import org.apache.aries.application.Content;
 import org.apache.aries.application.VersionRange;
 import org.apache.aries.application.impl.ApplicationMetadataManagerImpl;
 import org.apache.aries.application.utils.manifest.ManifestProcessor;
+import org.junit.Test;
+import org.osgi.framework.Version;
 
 public class ManifestProcessorTest
 {
 
-  private static Map<String,String> pairs = null;
-  
-  @Before
-  public void setUp() throws Exception{
-    
-    //enforce ordering of the keys
-    String[] keys = new String[]{
-        "Manifest-Version",
-        "Application-ManifestVersion",
-        "Application-Name",
-        "Application-SymbolicName",
-        "Application-Version",
-        "Application-Content",
-        "Export-Package",
-        "Import-Package",
-        "Application-Services"  
-    };
-    
-    String [] values = new String[]{
-        "1.0",
-        "1.0",
-        "Travel Reservation",
-        "com.travel.reservation",
-        "1.2",
-        
"com.travel.reservation.web;version=\"[1.1.0,1.2.0)\",com.travel.reservation.business",
-        "com.travel.reservation.api;version=1.2",
-        
"com.travel.flight.api;version=\"[2.1.1,3.0.0)\",com.travel.rail.api;version=\"[1.0.0,2.0.0)\"",
-        "services.xml"
-    };
-    
-    //the values of the manifest
-    //intentionally include a couple of long lines
-    pairs = new HashMap<String, String>();
-    int i = 0;
-    for (String key : keys){
-      pairs.put(key, values[i]);
-      i++;
-    }
-  }
- 
+  private String appName = "Travel Reservation";
+
   /**
    * Check a simple manifest can be read.
    * @throws Exception
@@ -94,49 +49,77 @@
   @Test
   public void testSimpleManifest() throws Exception
   {
-       Manifest mf = new 
Manifest(getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION.MF"));
-       checkManifest(mf);
+    //the values of the manifest
+    //intentionally include a couple of long lines
+    Map<String, String> pairs = new HashMap<String, String>();
+    pairs.put("Manifest-Version", "1.0");
+    pairs.put("Application-ManifestVersion", "1.0");
+    pairs.put("Application-Name", appName );
+    pairs.put("Application-SymbolicName", "com.travel.reservation");
+    pairs.put("Application-Version", "1.2");
+    pairs.put("Application-Content", 
"com.travel.reservation.web;version=\"[1.1.0,1.2.0)\",com.travel.reservation.business");
+    pairs.put("Export-Package", "com.travel.reservation.api;version=1.2");
+    pairs.put("Import-Package", 
"com.travel.flight.api;version=\"[2.1.1,3.0.0)\",com.travel.rail.api;version=\"[1.0.0,2.0.0)\"");
+    pairs.put("Application-Services", "services.xml");
+
+    InputStream in = 
getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION.MF");
+    Manifest mf = new Manifest(in);
+    Map<String, String> map = ManifestProcessor.readManifestIntoMap(mf);
+    assertNotNull(map);
+
+    //check all the expected keys and values
+    for (String key : pairs.keySet()){
+      assertTrue("Key: " + key + " was not found",map.containsKey(key));
+      String value = map.get(key);
+      assertNotNull("Value was not present for key: " + key ,value);
+      assertEquals("Value was not correct for key: " + key 
,pairs.get(key),value);
+    }
+    //check there aren't any extra entries in the map that weren't expected
+    assertEquals("The maps did not match",pairs,map);
   }
   
   /**
-   * Check a simple manifest can be parsed.
-   * @throws Exception
+   * Check metadata can be extracted from a simple manifest.
    */
   @Test
-  public void testParseManifest() throws Exception
-  {
-    Manifest mf = 
ManifestProcessor.parseManifest(getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION.MF"));
-    checkManifest(mf);
-  }
-  
-  private void checkManifest(Manifest mf) throws Exception 
+  public void testManifestMetadata() throws Exception
   {
-      Map<String, String> map = ManifestProcessor.readManifestIntoMap(mf);
-      assertNotNull(map);
+    ApplicationMetadataManagerImpl manager = new 
ApplicationMetadataManagerImpl();
+    InputStream in = 
getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION.MF");
+    ApplicationMetadata am = manager.parseApplication(in);
+    assertNotNull(am);
+
+    assertEquals(am.getApplicationName(),appName);
 
-      assertEquals("Unexpected number of manifest entires", pairs.size(), 
map.size());
-      
-      //check all the expected keys and values
-      for (String key : pairs.keySet()){
-        assertTrue("Key: " + key + " was not found",map.containsKey(key));
-        String value = map.get(key);
-        assertNotNull("Value was not present for key: " + key ,value);
-        assertEquals("Value was not correct for key: " + key 
,pairs.get(key),value);
-      }
-      //check there aren't any extra entries in the map that weren't expected
-      assertEquals("The maps did not match",pairs,map);  
+    
//"com.travel.reservation.web;version=\"[1.1.0,1.2.0)\",com.travel.reservation.business",
+    List<Content> contents = am.getApplicationContents();
+    for (Content content : contents){
+      if ("com.travel.reservation.web".equals(content.getContentName())){
+        VersionRange vr = content.getVersion();
+        assertEquals(vr.getMinimumVersion(),new Version("1.1.0"));
+        assertEquals(vr.getMaximumVersion(),new Version("1.2.0"));
+      } else 
if("com.travel.reservation.business".equals(content.getContentName())){
+        VersionRange vr = content.getVersion();
+        assertEquals(new Version(0,0,0), vr.getMinimumVersion());
+      } else 
+        fail("Unexepcted content name " + content.getContentName());
+    }
   }
+
   /**
-   * Check metadata can be extracted from a simple manifest.
+   * Check metadata can be extracted from a manifest that uses multiple lines
+   * for a single manifest attribute.
    */
   @Test
-  public void testManifestMetadata() throws Exception
+  public void testManifestMetadataWithMultiLineEntries() throws Exception
   {
     ApplicationMetadataManagerImpl manager = new 
ApplicationMetadataManagerImpl();
-    ApplicationMetadata am = 
manager.parseApplication(getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION.MF"));
+    
+    InputStream in = 
getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION2.MF");
+    
+    ApplicationMetadata am = manager.parseApplication(in);
     assertNotNull(am);
 
-    String appName = pairs.get("Application-Name");
     assertEquals(am.getApplicationName(),appName);
 
     
//"com.travel.reservation.web;version=\"[1.1.0,1.2.0)\",com.travel.reservation.business",
@@ -148,9 +131,23 @@
         assertEquals(vr.getMaximumVersion(),new Version("1.2.0"));
       } else 
if("com.travel.reservation.business".equals(content.getContentName())){
         VersionRange vr = content.getVersion();
-        assertNull(vr);
+        assertEquals(new Version(0,0,0), vr.getMinimumVersion());
       } else 
         fail("Unexepcted content name " + content.getContentName());
     }
   }
+  
+  @Test
+  public void testManifestWithoutEndingInNewLine() throws Exception
+  {
+    ApplicationMetadataManagerImpl manager = new 
ApplicationMetadataManagerImpl();
+    
+    InputStream in = 
getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION3.MF");
+    
+    ApplicationMetadata am = manager.parseApplication(in);
+    assertNotNull(am);
+
+    assertEquals("Wrong number of bundles are in the application", 1, 
am.getApplicationContents().size());
+    assertEquals("Wrong bundle name", 
"org.apache.aries.applications.test.bundle", 
am.getApplicationContents().get(0).getContentName());
+  }
 }
\ No newline at end of file

Added: 
incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION2.MF
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION2.MF?rev=887889&view=auto
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION2.MF
 (added)
+++ 
incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION2.MF
 Mon Dec  7 11:32:47 2009
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Application-ManifestVersion: 1.0
+Application-Name: Travel Reservation
+Application-SymbolicName: com.travel.reservation
+Application-Version: 1.2
+Application-Content: com.travel.reservation.web;version="[1.1.0,1.2.0)",
+                     com.travel.reservation.business,
+Export-Package: com.travel.reservation.api;version=1.2
+Import-Package: com.travel.flight.api;version="[2.1.1,3.0.0)",
+                com.travel.rail.api;version="[1.0.0,2.0.0)",
+                com.travel.credit.api;version="[2.1.0,2.1.0]",
+                com.travel.hotel.api;version="[1.5.0,2.0.0)"
+Application-Services: services.xml

Added: 
incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION3.MF
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION3.MF?rev=887889&view=auto
==============================================================================
--- 
incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION3.MF
 (added)
+++ 
incubator/aries/trunk/application/application-utils/src/test/resources/META-INF/APPLICATION3.MF
 Mon Dec  7 11:32:47 2009
@@ -0,0 +1,3 @@
+Application-SymbolicName: org.apache.aries.applications.test.app
+Application-Version: 1.4.0
+Application-Content: org.apache.aries.applications.test.bundle


Reply via email to