You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by mn...@apache.org on 2010/01/06 16:50:25 UTC

svn commit: r896491 - in /incubator/aries/trunk/application: application-api/src/main/java/org/apache/aries/application/ application-api/src/main/java/org/apache/aries/application/management/ application-management/src/main/java/org/apache/aries/applic...

Author: mnuttall
Date: Wed Jan  6 15:50:22 2010
New Revision: 896491

URL: http://svn.apache.org/viewvc?rev=896491&view=rev
Log:
ARIES-89: Implement application support: AriesApplicationManager.createApplication now functional enough for some initial unit tests. 

Added:
    incubator/aries/trunk/application/application-management/src/test/
    incubator/aries/trunk/application/application-management/src/test/java/
    incubator/aries/trunk/application/application-management/src/test/java/org/
    incubator/aries/trunk/application/application-management/src/test/java/org/apache/
    incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/
    incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/
    incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/
    incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/
    incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java
    incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/unittest/
    incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/unittest/utils/
    incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/unittest/utils/EbaUnitTestUtils.java
    incubator/aries/trunk/application/application-management/src/test/resources/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/repository/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/repository/a.handy.persistence.library.jar/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/repository/a.handy.persistence.library.jar/META-INF/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/repository/a.handy.persistence.library.jar/META-INF/MANIFEST.MF
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/META-INF/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/META-INF/APPLICATION.MF
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/foo.bar.widgets.jar/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/foo.bar.widgets.jar/META-INF/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/foo.bar.widgets.jar/META-INF/MANIFEST.MF
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/my.business.logic.jar/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/my.business.logic.jar/META-INF/
    incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/my.business.logic.jar/META-INF/MANIFEST.MF
    incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/
    incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/ApplicationMetadataImplTest.java
      - copied, changed from r894900, incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ApplicationMetadataImplTest.java
    incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/DeploymentContentImplTest.java
    incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/VersionRangeTest.java
      - copied, changed from r894900, incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/VersionRangeTest.java
Removed:
    incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ApplicationMetadataImplTest.java
    incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/VersionRangeTest.java
Modified:
    incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/Content.java
    incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java
    incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java
    incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/BundleInfoImpl.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/impl/DeploymentContentImpl.java
    incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/DeploymentMetadataImpl.java
    incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/AppConstants.java
    incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestProcessor.java

Modified: incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/Content.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/Content.java?rev=896491&r1=896490&r2=896491&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/Content.java (original)
+++ incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/Content.java Wed Jan  6 15:50:22 2010
@@ -65,4 +65,10 @@
    * ASK ALASDAIR: should we return default version 0.0.0 instead of null?
    */
   public VersionRange getVersion();
+  
+  /**
+   * get the attribute and directive info in NameValueMap
+   * @return namevalueMap that contains attribute and directive info
+   */
+  public Map<String, String> getNameValueMap();
 }

Modified: incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java?rev=896491&r1=896490&r2=896491&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java (original)
+++ incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java Wed Jan  6 15:50:22 2010
@@ -20,16 +20,17 @@
 
 package org.apache.aries.application.management;
 
-import java.io.File;
 import java.net.URL;
 import java.util.Set;
 
+import org.apache.aries.application.filesystem.IDirectory;
+
 /**
  * Create, install and uninstall applications via this service. 
  */
 public interface AriesApplicationManager
 {
-  public AriesApplication createApplication(File f) throws ManagementException;
+  public AriesApplication createApplication(IDirectory source) throws ManagementException;
   public AriesApplication createApplication(URL url) throws ManagementException;
   public Set<ApplicationContext> getApplicationContexts();
   public ApplicationContext getApplicationContext(AriesApplication app);

Modified: incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java?rev=896491&r1=896490&r2=896491&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java (original)
+++ incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java Wed Jan  6 15:50:22 2010
@@ -78,14 +78,10 @@
   
   
   /**
-   * Create an AriesApplication from a .eba file
+   * Create an AriesApplication from a .eba file: a zip file with a '.eba' extension
+   * as per http://incubator.apache.org/aries/applications.html 
    */
-  public AriesApplication createApplication(File ebaFile) throws ManagementException {
-    /* 
-     * ebaFile should be a zip file with a '.eba' extension 
-     * as per http://incubator.apache.org/aries/applications.html
-     */    
-
+  public AriesApplication createApplication(IDirectory ebaFile) throws ManagementException {
     ApplicationMetadata applicationMetadata;
     DeploymentMetadata deploymentMetadata;
     Map<String, InputStream> modifiedBundles = new HashMap<String, InputStream>();
@@ -93,11 +89,6 @@
     boolean manifestChanged = false;
     
     try { 
-      if (!ebaFile.isFile()) { 
-        // TODO: NLS this, and implement create-from-directory
-        throw new ManagementException ("Cannot create .eba from directory yet");
-      }
-      
       // Locate META-INF/APPLICATION.MF and ensure that the 
       // manifest has the necessary fields set 
       Manifest applicationManifest = parseManifest (ebaFile, AppConstants.APPLICATION_MF);
@@ -109,14 +100,18 @@
         // If there's a deployment.mf present, check it matches applicationManifest, and if so, use it
       } else { 
         //  -- Process any other files in the .eba, i.e. migrate wars to wabs, plain jars to bundles
-        IDirectory eba = FileSystem.getFSRoot(ebaFile);
         
-        Set<BundleInfo> bundleInfo = new HashSet<BundleInfo>();
-        for (IFile f : eba) { 
+        Set<BundleInfo> extraBundlesInfo = new HashSet<BundleInfo>();
+        for (IFile f : ebaFile) { 
+          if (f.isDirectory()) { 
+            continue;
+          }
+          System.out.println ("Call getBundleManifest on " + f.getName());
+          
           BundleManifest bm = getBundleManifest (f);
           if (bm != null) {
             if (bm.isValid()) {
-              bundleInfo.add(new BundleInfoImpl(bm, null));
+              extraBundlesInfo.add(new BundleInfoImpl(bm, null));
             } else { 
               // We have a jar that needs converting to a bundle, or a war to migrate to a WAB
               InputStream is = null;
@@ -128,7 +123,7 @@
                   try { 
                     // WarToWabConverter can extract application.xml via
                     // eba.getFile(AppConstants.APPLICATION_XML);
-                    convertedBinary = converters.next().convert(is, eba);
+                    convertedBinary = converters.next().convert(is, ebaFile);
                   } catch (ServiceException sx) {
                     // We'll get this if our optional BundleConverter has not been injected. 
                   }
@@ -136,7 +131,7 @@
                 if (convertedBinary != null) { 
                   modifiedBundles.put (f.getName(), convertedBinary); 
                   bm = BundleManifest.fromBundle(is);
-                  bundleInfo.add(new BundleInfoImpl(bm, null));
+                  extraBundlesInfo.add(new BundleInfoImpl(bm, null));
                 }
               } finally { 
                 try { 
@@ -146,7 +141,8 @@
             }
           } 
         }
-        application = new AriesApplicationImpl (applicationMetadata, bundleInfo);
+               
+        application = new AriesApplicationImpl (applicationMetadata, extraBundlesInfo);
         Set<BundleInfo> additionalBundlesRequired = _resolver.resolve(application);
         deploymentMetadata = _deploymentMetadataFactory.createDeploymentMetadata(application, additionalBundlesRequired);
         application.setDeploymentMetadata(deploymentMetadata);
@@ -167,6 +163,8 @@
   }
 
   public AriesApplication createApplication(URL url) throws ManagementException {
+    // If URL isn't file://, we need to download the asset from that url and 
+    // then call createApplication(File)
     return null;
   }
 
@@ -208,26 +206,22 @@
    * @return parsed manifest, or null
    * @throws IOException
    */
-  private Manifest parseManifest (File ebaFile, String fileName) throws IOException {
+  private Manifest parseManifest (IDirectory source, String fileName) throws IOException {
     Manifest result = null;
-    IDirectory eba = FileSystem.getFSRoot(ebaFile);
-    List<IFile> files = eba.listFiles();
-    for (IFile f : files) { 
-      if (f.getName().equalsIgnoreCase(fileName)) {
-        InputStream is = null;
+    IFile f = source.getFile(fileName);
+    if (f != null) { 
+      InputStream is = null;
+      try { 
+        is = f.open();
+        result = ManifestProcessor.parseManifest(is);
+        is.close();
+      } catch (IOException iox) { 
+        // TODO: log error
+        throw iox;
+      } finally { 
         try { 
-          is = f.open();
-          result = ManifestProcessor.parseManifest(is);
-          is.close();
-        } catch (IOException iox) { 
-          // TODO: log error
-          throw iox;
-        } finally { 
-          try { 
-            if (is != null) is.close();
-          } catch (IOException iox) {}
-        }
-        break;
+          if (is != null) is.close();
+        } catch (IOException iox) {}
       }
     }
     return result;

Modified: incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/BundleInfoImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/BundleInfoImpl.java?rev=896491&r1=896490&r2=896491&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/BundleInfoImpl.java (original)
+++ incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/BundleInfoImpl.java Wed Jan  6 15:50:22 2010
@@ -36,16 +36,17 @@
 import org.osgi.framework.Version;
 
 public class BundleInfoImpl implements BundleInfo {
-
-  private BundleManifest _bundleManifest;
+  private String _symbolicName;
+  private Version _version;
   private Attributes _attributes;
   private Set<Content> _exportPackages = null;
   private Set<Content> _importPackages = null;
   private String _location;
   
   public BundleInfoImpl (BundleManifest bm, String location) { 
-    _bundleManifest = bm;
-    _attributes = _bundleManifest.getRawAttributes();
+    _symbolicName = bm.getSymbolicName();
+    _version = bm.getVersion();
+    _attributes = bm.getRawAttributes();
     _location = location;
   }
   
@@ -79,11 +80,11 @@
   }
 
   public String getSymbolicName() {
-    return _bundleManifest.getSymbolicName();
+    return _symbolicName;
   }
 
   public Version getVersion() {
-    return _bundleManifest.getVersion();
+    return _version;
   }
 
   private Set<Content> getContentSetFromHeader (Attributes attributes, String key) { 

Added: incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java?rev=896491&view=auto
==============================================================================
--- incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java (added)
+++ incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java Wed Jan  6 15:50:22 2010
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.aries.application.management.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.aries.application.ApplicationMetadata;
+import org.apache.aries.application.ApplicationMetadataManager;
+import org.apache.aries.application.Content;
+import org.apache.aries.application.DeploymentContent;
+import org.apache.aries.application.DeploymentMetadata;
+import org.apache.aries.application.DeploymentMetadataFactory;
+import org.apache.aries.application.filesystem.IDirectory;
+import org.apache.aries.application.impl.ApplicationMetadataManagerImpl;
+import org.apache.aries.application.impl.ContentImpl;
+import org.apache.aries.application.impl.DeploymentContentImpl;
+import org.apache.aries.application.impl.DeploymentMetadataFactoryImpl;
+import org.apache.aries.application.management.AriesApplication;
+import org.apache.aries.application.management.AriesApplicationResolver;
+import org.apache.aries.application.management.BundleConverter;
+import org.apache.aries.application.management.BundleInfo;
+import org.apache.aries.application.utils.filesystem.FileSystem;
+import org.apache.aries.application.utils.filesystem.IOUtils;
+import org.apache.aries.application.utils.manifest.BundleManifest;
+import org.apache.aries.unittest.utils.EbaUnitTestUtils;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class AriesApplicationManagerImplTest {
+  
+  class DummyResolver implements AriesApplicationResolver {
+
+    Set<BundleInfo> nextResult;
+    public Set<BundleInfo> resolve(AriesApplication app) {
+      return nextResult;
+    } 
+    
+    void setNextResult (Set<BundleInfo> r) { 
+      nextResult = r;
+    }
+    
+  }
+
+  static String _testEba = "./ariesApplicationManagerImplTest/test.eba";
+  
+  @BeforeClass 
+  public static void setup() throws Exception { 
+    EbaUnitTestUtils.createEba("../src/test/resources/bundles/test.eba", _testEba);
+    File src = new File ("../src/test/resources/bundles/repository/a.handy.persistence.library.jar");
+    File dest = new File ("ariesApplicationManagerImplTest/a.handy.persistence.library.jar");
+    IOUtils.zipUp(src, dest);
+  }
+  
+  @Test
+  public void testCreate() throws Exception { 
+    AriesApplicationManagerImpl appMgr = new AriesApplicationManagerImpl ();
+    ApplicationMetadataManager appMetaMgr = new ApplicationMetadataManagerImpl ();
+    DeploymentMetadataFactory dmf = new DeploymentMetadataFactoryImpl();
+    List<BundleConverter> bundleConverters = new ArrayList<BundleConverter>();
+    DummyResolver resolver = new DummyResolver();
+    
+    appMgr.setApplicationMetadataManager(appMetaMgr);
+    appMgr.setDeploymentMetadataFactory(dmf);
+    appMgr.setBundleConverters(bundleConverters);
+    appMgr.setResolver(resolver);
+    
+    // This next block is a very long winded way of constructing a BundleInfoImpl
+    // against the existing (BundleManifest bm, String location) constructor. If we 
+    // find we need a String-based BundleInfoImpl constructor for other reasons, 
+    // we could change to using it here. 
+    Set<BundleInfo> nextResolverResult = new HashSet<BundleInfo>();
+    String persistenceLibraryLocation = "../src/test/resources/bundles/repository/a.handy.persistence.library.jar";
+    File persistenceLibrary = new File (persistenceLibraryLocation);
+    BundleManifest mf = BundleManifest.fromBundle(persistenceLibrary);
+    BundleInfo resolvedPersistenceLibrary = new BundleInfoImpl(mf, persistenceLibraryLocation); 
+    Field v = BundleInfoImpl.class.getDeclaredField("_version");
+    v.setAccessible(true);
+    v.set(resolvedPersistenceLibrary, new Version("1.1.0"));
+    nextResolverResult.add(resolvedPersistenceLibrary);
+    resolver.setNextResult(nextResolverResult);
+    
+    IDirectory testEba = FileSystem.getFSRoot(new File(_testEba));
+    AriesApplication app = appMgr.createApplication(testEba);
+    
+    ApplicationMetadata appMeta = app.getApplicationMetadata();
+    assertEquals (appMeta.getApplicationName(), "Test application");
+    assertEquals (appMeta.getApplicationSymbolicName(), "org.apache.aries.application.management.test");
+    assertEquals (appMeta.getApplicationVersion(), new Version("1.0"));
+    List<Content> appContent = appMeta.getApplicationContents();
+    assertEquals (appContent.size(), 2);
+    Content fbw = new ContentImpl("foo.bar.widgets;version=1.0.0");
+    Content mbl = new ContentImpl("my.business.logic;version=1.0.0");
+    assertTrue (appContent.contains(fbw));
+    assertTrue (appContent.contains(mbl));
+    
+    DeploymentMetadata dm = app.getDeploymentMetadata();
+    List<DeploymentContent> dcList = dm.getApplicationDeploymentContents();
+    
+    assertEquals (dcList.size(), 3);
+    DeploymentContent dc1 = new DeploymentContentImpl ("foo.bar.widgets;deployed-version=1.0.0");
+    DeploymentContent dc2 = new DeploymentContentImpl ("my.business.logic;deployed-version=1.0.0");
+    DeploymentContent dc3 = new DeploymentContentImpl ("a.handy.persistence.library;deployed-version=1.1.0");
+    assertTrue (dcList.contains(dc1));
+    assertTrue (dcList.contains(dc2));
+    assertTrue (dcList.contains(dc3));
+  
+  }
+}

Added: incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/unittest/utils/EbaUnitTestUtils.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/unittest/utils/EbaUnitTestUtils.java?rev=896491&view=auto
==============================================================================
--- incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/unittest/utils/EbaUnitTestUtils.java (added)
+++ incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/unittest/utils/EbaUnitTestUtils.java Wed Jan  6 15:50:22 2010
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.aries.unittest.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import org.apache.aries.application.utils.filesystem.IOUtils;
+
+public class EbaUnitTestUtils {
+
+private static final String TEMP_DIR = "unittest/tmpEbaContent";
+  
+  public static void createEba(String rootFolder, String outputFile) throws IOException
+  {
+    File tempDir = new File(TEMP_DIR);
+    tempDir.mkdirs();
+    
+    createEbaRecursive(new File(rootFolder), tempDir, "");
+    IOUtils.zipUp(tempDir, new File(outputFile));
+    IOUtils.deleteRecursive(tempDir);
+  }
+  
+  private static void createEbaRecursive(File folder, File tempDir, String prefix) throws IOException
+  {
+    for (File f : folder.listFiles())
+    {
+      if ((f.getName().endsWith(".jar") || f.getName().endsWith(".war")) && f.isDirectory())
+      {
+        File manifestFile = new File(f, "META-INF/MANIFEST.MF");
+        Manifest m;
+        
+        if (manifestFile.isFile())
+          m = new Manifest(new FileInputStream(manifestFile));
+        else
+        {
+          m = new Manifest();
+          m.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
+        }
+          
+        File jarFile = new File(tempDir, prefix + f.getName());
+        jarFile.getParentFile().mkdirs();
+        
+        IOUtils.jarUp(f, jarFile, m); 
+      }
+      else if (f.isFile())
+      {
+        IOUtils.writeOut(tempDir, prefix + f.getName(), new FileInputStream(f));
+      }
+      else if (f.isDirectory())
+      {
+        createEbaRecursive(f, tempDir, prefix + f.getName() + File.separator);
+      }
+    }
+  }
+  
+  public static void cleanupEba(String outputFile)
+  {
+    new File(outputFile).delete();
+  }
+}

Added: incubator/aries/trunk/application/application-management/src/test/resources/bundles/repository/a.handy.persistence.library.jar/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/resources/bundles/repository/a.handy.persistence.library.jar/META-INF/MANIFEST.MF?rev=896491&view=auto
==============================================================================
--- incubator/aries/trunk/application/application-management/src/test/resources/bundles/repository/a.handy.persistence.library.jar/META-INF/MANIFEST.MF (added)
+++ incubator/aries/trunk/application/application-management/src/test/resources/bundles/repository/a.handy.persistence.library.jar/META-INF/MANIFEST.MF Wed Jan  6 15:50:22 2010
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: HandyPersistenceLibrary
+Bundle-SymbolicName: a.handy.persistence.library
+Bundle-Version: 1.1
+Bundle-Vendor: Apache.org
+Export-Package: org.apache.handy.persistence
+

Added: incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/META-INF/APPLICATION.MF
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/META-INF/APPLICATION.MF?rev=896491&view=auto
==============================================================================
--- incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/META-INF/APPLICATION.MF (added)
+++ incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/META-INF/APPLICATION.MF Wed Jan  6 15:50:22 2010
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Application-ManifestVersion: 1.0
+Application-Name: Test application
+Application-SymbolicName: org.apache.aries.application.management.test
+Application-Version: 1.0
+Application-Content: foo.bar.widgets;version=1.0.0,
+ my.business.logic;version=1.0.0
+

Added: incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/foo.bar.widgets.jar/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/foo.bar.widgets.jar/META-INF/MANIFEST.MF?rev=896491&view=auto
==============================================================================
--- incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/foo.bar.widgets.jar/META-INF/MANIFEST.MF (added)
+++ incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/foo.bar.widgets.jar/META-INF/MANIFEST.MF Wed Jan  6 15:50:22 2010
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: FooBarWidgets
+Bundle-SymbolicName: foo.bar.widgets
+Bundle-Version: 1.1
+Bundle-Vendor: Apache.org
+Export-Package: foo.bar.widgets
+
+

Added: incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/my.business.logic.jar/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/my.business.logic.jar/META-INF/MANIFEST.MF?rev=896491&view=auto
==============================================================================
--- incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/my.business.logic.jar/META-INF/MANIFEST.MF (added)
+++ incubator/aries/trunk/application/application-management/src/test/resources/bundles/test.eba/my.business.logic.jar/META-INF/MANIFEST.MF Wed Jan  6 15:50:22 2010
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: MyBusinessLogic
+Bundle-SymbolicName: my.business.logic
+Bundle-Version: 1.1
+Bundle-Vendor: Apache.org
+Export-Package: my.business.logic

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=896491&r1=896490&r2=896491&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 Wed Jan  6 15:50:22 2010
@@ -108,6 +108,14 @@
     return toReturn;
   }
   
+  public NameValueMap<String, String> getNameValueMap() {
+    NameValueMap<String, String> nvm = new NameValueMap<String, String>();
+    for (String key : this.nameValueMap.keySet()) {
+      nvm.addToCollection(key, this.nameValueMap.get(key));
+    }
+    return nvm;
+  }
+  
   /**
    * add key value to the directives map
    * @param key

Modified: incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/DeploymentContentImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/DeploymentContentImpl.java?rev=896491&r1=896490&r2=896491&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/DeploymentContentImpl.java (original)
+++ incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/DeploymentContentImpl.java Wed Jan  6 15:50:22 2010
@@ -23,20 +23,37 @@
 
 import org.apache.aries.application.DeploymentContent;
 import org.apache.aries.application.VersionRange;
+import org.apache.aries.application.utils.AppConstants;
+import org.apache.aries.application.utils.manifest.ManifestHeaderProcessor;
+import org.apache.aries.application.utils.manifest.ManifestHeaderProcessor.NameValueMap;
 import org.osgi.framework.Version;
 
-public class DeploymentContentImpl implements DeploymentContent {
+public final class DeploymentContentImpl implements DeploymentContent {
   
   private ContentImpl _content;
   
-  public DeploymentContentImpl (String content) { 
-    _content = new ContentImpl (content);
+  /**
+   * DeploymentContent relates to a bundle at a particular version. 
+   * We can therefore assume that the Version passed into this 
+   * constructor is the exact version in question. 
+   * @param bundleSymbolicName
+   * @param version
+   */
+  public DeploymentContentImpl (String bundleSymbolicName, Version version) {
+    NameValueMap<String, String> nvMap = new NameValueMap<String, String>();
+    nvMap.put(AppConstants.DEPLOYMENT_BUNDLE_VERSION, version.toString());
+    _content = new ContentImpl (bundleSymbolicName, nvMap);
   }
   
-  public DeploymentContentImpl (String bundleSymbolicName, Version version) { 
-    _content = new ContentImpl (bundleSymbolicName, version);
+  /**
+   * Construct a DeploymentContent from a string of the form, 
+   *   bundle.symbolic.name;deployedContent="1.2.3"
+   * @param deployedContent
+   */
+  public DeploymentContentImpl (String deployedContent) {
+    _content = new ContentImpl (deployedContent);
   }
-
+  
   public Version getExactVersion() {
     return getVersion().getExactVersion();
   }
@@ -62,7 +79,28 @@
   }
 
   public VersionRange getVersion() {
-    return _content.getVersion();
+    String deployedVersion = _content.getAttribute(AppConstants.DEPLOYMENT_BUNDLE_VERSION);
+    VersionRange vr = null;
+    if (deployedVersion != null && deployedVersion.length() > 0) {
+      vr = ManifestHeaderProcessor.parseVersionRange(deployedVersion, true);
+    }
+    return vr;
+  }
+
+  @Override
+  public boolean equals(Object other) { 
+    if (other == null) 
+      return false;
+    if (this == other) 
+      return true;
+    if (other instanceof DeploymentContentImpl) {
+      return _content.equals(((DeploymentContentImpl) other)._content);
+    } else { 
+      return false;
+    }
   }
 
+  public Map<String, String> getNameValueMap() {
+    return _content.getNameValueMap();
+  }
 }

Modified: incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/DeploymentMetadataImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/DeploymentMetadataImpl.java?rev=896491&r1=896490&r2=896491&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/DeploymentMetadataImpl.java (original)
+++ incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/impl/DeploymentMetadataImpl.java Wed Jan  6 15:50:22 2010
@@ -24,11 +24,14 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.aries.application.ApplicationMetadata;
+import org.apache.aries.application.Content;
 import org.apache.aries.application.DeploymentContent;
 import org.apache.aries.application.DeploymentMetadata;
+import org.apache.aries.application.VersionRange;
 import org.apache.aries.application.management.AriesApplication;
 import org.apache.aries.application.management.BundleInfo;
 import org.osgi.framework.Version;
@@ -41,6 +44,12 @@
   public DeploymentMetadataImpl (AriesApplication app, Set<BundleInfo> additionalBundlesRequired) {
     _applicationMetadata = app.getApplicationMetadata();
     _deploymentContent = new ArrayList<DeploymentContent>();
+    
+    // DeploymentContent needs to list everything in the application content
+    // plus all the bundles in additonalBundlesRequired
+    for (Content c: _applicationMetadata.getApplicationContents()) { 
+      _deploymentContent.add(new DeploymentContentImpl(c.getContentName(), c.getVersion().getMinimumVersion()));
+    }
     for (BundleInfo bundleInfo : additionalBundlesRequired) { 
       DeploymentContentImpl dci = new DeploymentContentImpl(bundleInfo.getSymbolicName(), 
           bundleInfo.getVersion()); 

Modified: incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/AppConstants.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/AppConstants.java?rev=896491&r1=896490&r2=896491&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/AppConstants.java (original)
+++ incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/AppConstants.java Wed Jan  6 15:50:22 2010
@@ -51,6 +51,10 @@
   public static final String LOWER_CASE_JAR_SUFFIX = ".jar";
   /** The expected lower case suffix of a war file */
   public static final String LOWER_CASE_WAR_SUFFIX = ".war";
+  /** The attribute used to record the deployed version of a bundle */
+  public static final String DEPLOYMENT_BUNDLE_VERSION = "deployed-version";
+  /** The name of the bundle manifest */
+  public static final String MANIFEST_MF = "META-INF/MANIFEST.MF";
   
   public static final String MANIFEST_VERSION="1.0";
 }

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=896491&r1=896490&r2=896491&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 Wed Jan  6 15:50:22 2010
@@ -31,6 +31,9 @@
 import java.util.jar.Attributes;
 import java.util.jar.Manifest;
 
+import org.apache.aries.application.filesystem.IDirectory;
+import org.apache.aries.application.filesystem.IFile;
+
 /**
  * This class contains utilities for parsing manifests. It provides methods to
  * parse the manifest, read a manifest into a map and to split an manifest
@@ -124,6 +127,24 @@
   }
   
   /**
+   * Obtain a manifest from an IDirectory. 
+   * 
+   * @param appDir
+   * @param manifestName the name of manifest
+   * @return Manifest, or null if none found.
+   * @throws IOException
+   */
+  public static Manifest obtainManifestFromAppDir(IDirectory appDir, String manifestName) throws IOException{
+    IFile manifestFile = appDir.getFile(manifestName);
+    Manifest man = null;
+    if (manifestFile != null) {
+      man = parseManifest(manifestFile.open());
+    }
+    return man;
+  }
+
+  
+  /**
    * 
    * Splits a delimiter separated string, tolerating presence of non separator commas
    * within double quoted segments.

Copied: incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/ApplicationMetadataImplTest.java (from r894900, 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/impl/ApplicationMetadataImplTest.java?p2=incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/ApplicationMetadataImplTest.java&p1=incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ApplicationMetadataImplTest.java&r1=894900&r2=896491&rev=896491&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/ApplicationMetadataImplTest.java (original)
+++ incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/ApplicationMetadataImplTest.java Wed Jan  6 15:50:22 2010
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.application.utils;
+package org.apache.aries.application.impl;
 
 import java.io.IOException;
 

Added: incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/DeploymentContentImplTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/DeploymentContentImplTest.java?rev=896491&view=auto
==============================================================================
--- incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/DeploymentContentImplTest.java (added)
+++ incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/DeploymentContentImplTest.java Wed Jan  6 15:50:22 2010
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.aries.application.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.aries.application.VersionRange;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class DeploymentContentImplTest {
+  
+  @Test
+  public void testDeploymentContent001() throws Exception {
+    DeploymentContentImpl dc = new DeploymentContentImpl("com.travel.reservation.web;deployed-version=\"1.1.0\"");
+    assertEquals("1.1.0", dc.getAttribute("deployed-version"));
+    VersionRange vi = dc.getVersion();
+    assertTrue(vi.isExactVersion());
+    assertEquals(new Version("1.1.0"), dc.getExactVersion());
+    assertEquals("com.travel.reservation.web", dc.getContentName());
+    assertEquals("{deployed-version->1.1.0}", dc.getNameValueMap().toString());
+  }
+  
+  @Test
+  public void testDeploymentContent002() throws Exception {
+    DeploymentContentImpl dc = new DeploymentContentImpl("com.travel.reservation.business;deployed-version=2.0");
+    assertEquals("2.0", dc.getAttribute("deployed-version"));
+    VersionRange vi = dc.getVersion();
+    assertTrue(vi.isExactVersion());
+    assertEquals(new Version("2.0"), dc.getExactVersion());
+    assertEquals("com.travel.reservation.business", dc.getContentName());
+    assertEquals("{deployed-version->2.0}", dc.getNameValueMap().toString());
+  }
+  
+  
+  @Test
+  public void testDeploymentContent003() throws Exception {
+    DeploymentContentImpl dc = new DeploymentContentImpl("com.travel.reservation.data;deployed-version=2.1.1");
+    assertEquals("2.1.1", dc.getAttribute("deployed-version"));
+    VersionRange vi = dc.getVersion();
+    assertTrue(vi.isExactVersion());
+    assertEquals(new Version("2.1.1"), dc.getExactVersion());
+    assertEquals("com.travel.reservation.data", dc.getContentName());
+    assertEquals("{deployed-version->2.1.1}", dc.getNameValueMap().toString());
+  }
+}
+

Copied: incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/VersionRangeTest.java (from r894900, incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/VersionRangeTest.java)
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/VersionRangeTest.java?p2=incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/VersionRangeTest.java&p1=incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/VersionRangeTest.java&r1=894900&r2=896491&rev=896491&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/utils/VersionRangeTest.java (original)
+++ incubator/aries/trunk/application/application-utils/src/test/java/org/apache/aries/application/impl/VersionRangeTest.java Wed Jan  6 15:50:22 2010
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.application.utils;
+package org.apache.aries.application.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;