Hi Right, I'd think so, if a deployment.mf exists, then bundles are valid thus no conversion is needed. However, the actual code seems to be different.
Lin On Tue, Jul 6, 2010 at 3:05 PM, Alasdair Nottingham <[email protected]> wrote: > Hi, > > It should means that if a deployment manifest exists the content must be > valid bundles. It does not mean you need a deployment.mf. > > Alasdair Nottingham > > On 6 Jul 2010, at 19:46, Lin Sun <[email protected]> wrote: > >> Hi >> >> Quick question, does this mean if the aries application contains a >> deployment.mf, the createApplication will fail with >> ManagementException? >> >> >>> + } else if (deploymentMetadata != null) { >>> + throw new ManagementException >>> (MessageUtil.getMessage("APPMANAGEMENT0003E", f.getName(), >>> ebaFile.getName())); >>> + } >> >> Also, I don't see anywhere we set the deploymentMetadata (which I >> might have missed it) to a value other than null in this method. >> >> Thx >> >> Lin >> >> On Tue, Jul 6, 2010 at 6:51 AM, <[email protected]> wrote: >>> Author: mnuttall >>> Date: Tue Jul 6 10:51:12 2010 >>> New Revision: 960866 >>> >>> URL: http://svn.apache.org/viewvc?rev=960866&view=rev >>> Log: >>> ARIES-192: Convert bundles before generating the application content. From >>> a patch submitted by Emily Jiang. >>> >>> Added: >>> >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/ >>> >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/MANIFEST.MF >>> >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/ >>> >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.jar/ >>> >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.jar/META-INF/ >>> >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.jar/META-INF/MANIFEST.MF >>> >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.war/ >>> >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.war/WEB-INF/ >>> >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.war/WEB-INF/web.xml >>> Modified: >>> incubator/aries/trunk/application/application-api/pom.xml >>> incubator/aries/trunk/application/application-management/ (props >>> changed) >>> >>> incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java >>> >>> incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java >>> incubator/aries/trunk/application/application-utils/pom.xml >>> >>> Modified: incubator/aries/trunk/application/application-api/pom.xml >>> URL: >>> http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-api/pom.xml?rev=960866&r1=960865&r2=960866&view=diff >>> ============================================================================== >>> --- incubator/aries/trunk/application/application-api/pom.xml (original) >>> +++ incubator/aries/trunk/application/application-api/pom.xml Tue Jul 6 >>> 10:51:12 2010 >>> @@ -43,7 +43,7 @@ >>> <dependency> >>> <groupId>org.osgi</groupId> >>> <artifactId>org.osgi.core</artifactId> >>> - <version>4.0.0</version> >>> + <version>4.2.0</version> >>> <scope>provided</scope> >>> </dependency> >>> </dependencies> >>> >>> Propchange: incubator/aries/trunk/application/application-management/ >>> ------------------------------------------------------------------------------ >>> --- svn:ignore (original) >>> +++ svn:ignore Tue Jul 6 10:51:12 2010 >>> @@ -2,3 +2,5 @@ target >>> .classpath >>> .project >>> .settings >>> +ariesApplicationManagerImplTest >>> +unittest >>> >>> 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=960866&r1=960865&r2=960866&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 >>> Tue Jul 6 10:51:12 2010 >>> @@ -114,10 +114,66 @@ public class AriesApplicationManagerImpl >>> AriesApplicationImpl application = null; >>> >>> try { >>> - Manifest applicationManifest = parseApplicationManifest (ebaFile); >>> - ManifestDefaultsInjector.updateManifest(applicationManifest, >>> ebaFile.getName(), ebaFile); >>> + >>> + /* We require that all other .jar and .war files included by-value >>> be valid bundles >>> + * because a DEPLOYMENT.MF has been provided. If no DEPLOYMENT.MF, >>> migrate >>> + * wars to wabs, plain jars to bundles >>> + */ >>> + >>> + Set<BundleInfo> extraBundlesInfo = new HashSet<BundleInfo>(); >>> + for (IFile f : ebaFile) { >>> + if (f.isDirectory()) { >>> + continue; >>> + } >>> + >>> + BundleManifest bm = getBundleManifest (f); >>> + if (bm != null) { >>> + if (bm.isValid()) { >>> + extraBundlesInfo.add(new >>> SimpleBundleInfo(_applicationMetadataFactory, bm, >>> f.toURL().toExternalForm())); >>> + } else if (deploymentMetadata != null) { >>> + throw new ManagementException >>> (MessageUtil.getMessage("APPMANAGEMENT0003E", f.getName(), >>> ebaFile.getName())); >>> + } else { >>> + // We have a jar that needs converting to a bundle, or a war >>> to migrate to a WAB >>> + BundleConversion convertedBinary = null; >>> + Iterator<BundleConverter> converters = >>> _bundleConverters.iterator(); >>> + List<ConversionException> conversionExceptions = >>> Collections.emptyList(); >>> + while (converters.hasNext() && convertedBinary == null) { >>> + try { >>> + convertedBinary = converters.next().convert(ebaFile, f); >>> + } catch (ServiceException sx) { >>> + // We'll get this if our optional BundleConverter has >>> not been injected. >>> + } catch (ConversionException cx) { >>> + conversionExceptions.add(cx); >>> + } >>> + } >>> + if (conversionExceptions.size() > 0) { >>> + for (ConversionException cx : conversionExceptions) { >>> + _logger.error("APPMANAGEMENT0004E", new >>> Object[]{f.getName(), ebaFile.getName(), cx}); >>> + } >>> + throw new ManagementException >>> (MessageUtil.getMessage("APPMANAGEMENT0005E", ebaFile.getName())); >>> + } >>> + if (convertedBinary != null) { >>> + modifiedBundles.put (f.getName(), convertedBinary); >>> + bm = BundleManifest.fromBundle(f); >>> + extraBundlesInfo.add(new >>> SimpleBundleInfo(_applicationMetadataFactory, bm, f.getName())); >>> + } >>> + } >>> + } >>> + } >>> + Manifest applicationManifest = parseApplicationManifest (ebaFile); >>> + String appName = ebaFile.getName(); >>> + //If the application name is null, we will try to get the file name. >>> + if ((appName == null) || (appName.isEmpty())) { >>> + String fullPath = ebaFile.toString(); >>> + if (fullPath.endsWith("/")) >>> + fullPath = fullPath.substring(0, fullPath.length() -1); >>> + int last_slash = fullPath.lastIndexOf("/"); >>> + appName = fullPath.substring(last_slash + 1, fullPath.length()); >>> + } >>> + >>> + >>> + ManifestDefaultsInjector.updateManifest(applicationManifest, >>> appName, ebaFile); >>> applicationMetadata = >>> _applicationMetadataFactory.createApplicationMetadata(applicationManifest); >>> - >>> IFile deploymentManifest = >>> ebaFile.getFile(AppConstants.DEPLOYMENT_MF); >>> if (deploymentManifest != null) { >>> deploymentMetadata = >>> _deploymentMetadataFactory.createDeploymentMetadata(deploymentManifest); >>> @@ -130,51 +186,7 @@ public class AriesApplicationManagerImpl >>> } >>> } >>> >>> - /* We require that all other .jar and .war files included by-value >>> be valid bundles >>> - * because a DEPLOYMENT.MF has been provided. If no DEPLOYMENT.MF, >>> migrate >>> - * wars to wabs, plain jars to bundles >>> - */ >>> - >>> - Set<BundleInfo> extraBundlesInfo = new HashSet<BundleInfo>(); >>> - for (IFile f : ebaFile) { >>> - if (f.isDirectory()) { >>> - continue; >>> - } >>> - >>> - BundleManifest bm = getBundleManifest (f); >>> - if (bm != null) { >>> - if (bm.isValid()) { >>> - extraBundlesInfo.add(new >>> SimpleBundleInfo(_applicationMetadataFactory, bm, >>> f.toURL().toExternalForm())); >>> - } else if (deploymentMetadata != null) { >>> - throw new ManagementException >>> (MessageUtil.getMessage("APPMANAGEMENT0003E", f.getName(), >>> ebaFile.getName())); >>> - } else { >>> - // We have a jar that needs converting to a bundle, or a war >>> to migrate to a WAB >>> - BundleConversion convertedBinary = null; >>> - Iterator<BundleConverter> converters = >>> _bundleConverters.iterator(); >>> - List<ConversionException> conversionExceptions = >>> Collections.emptyList(); >>> - while (converters.hasNext() && convertedBinary == null) { >>> - try { >>> - convertedBinary = converters.next().convert(ebaFile, f); >>> - } catch (ServiceException sx) { >>> - // We'll get this if our optional BundleConverter has not >>> been injected. >>> - } catch (ConversionException cx) { >>> - conversionExceptions.add(cx); >>> - } >>> - } >>> - if (conversionExceptions.size() > 0) { >>> - for (ConversionException cx : conversionExceptions) { >>> - _logger.error("APPMANAGEMENT0004E", new >>> Object[]{f.getName(), ebaFile.getName(), cx}); >>> - } >>> - throw new ManagementException >>> (MessageUtil.getMessage("APPMANAGEMENT0005E", ebaFile.getName())); >>> - } >>> - if (convertedBinary != null) { >>> - modifiedBundles.put (f.getName(), convertedBinary); >>> - bm = BundleManifest.fromBundle(f); >>> - extraBundlesInfo.add(new >>> SimpleBundleInfo(_applicationMetadataFactory, bm, f.getName())); >>> - } >>> - } >>> - } >>> - } >>> + >>> >>> application = new AriesApplicationImpl (applicationMetadata, >>> extraBundlesInfo, _localPlatform); >>> application.setDeploymentMetadata(deploymentMetadata); >>> >>> Modified: >>> 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=960866&r1=960865&r2=960866&view=diff >>> ============================================================================== >>> --- >>> incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java >>> (original) >>> +++ >>> incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java >>> Tue Jul 6 10:51:12 2010 >>> @@ -24,12 +24,15 @@ import static org.junit.Assert.assertNot >>> import static org.junit.Assert.assertTrue; >>> >>> import java.io.File; >>> +import java.io.FileInputStream; >>> import java.io.IOException; >>> +import java.io.InputStream; >>> import java.lang.reflect.Field; >>> import java.util.ArrayList; >>> import java.util.HashSet; >>> import java.util.List; >>> import java.util.Set; >>> +import java.util.jar.Manifest; >>> >>> import org.apache.aries.application.ApplicationMetadata; >>> import org.apache.aries.application.ApplicationMetadataFactory; >>> @@ -45,13 +48,14 @@ import org.apache.aries.application.impl >>> 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.BundleConversion; >>> import org.apache.aries.application.management.BundleConverter; >>> import org.apache.aries.application.management.BundleInfo; >>> +import org.apache.aries.application.management.ConversionException; >>> import org.apache.aries.application.management.LocalPlatform; >>> import org.apache.aries.application.management.ManagementException; >>> import org.apache.aries.application.management.ResolveConstraint; >>> import org.apache.aries.application.management.ResolverException; >>> -import >>> org.apache.aries.application.management.impl.AriesApplicationManagerImpl; >>> import org.apache.aries.application.utils.filesystem.FileSystem; >>> import org.apache.aries.application.utils.filesystem.IOUtils; >>> import org.apache.aries.application.utils.management.SimpleBundleInfo; >>> @@ -98,31 +102,79 @@ public class AriesApplicationManagerImpl >>> return File.createTempFile("ebaTmp", null); >>> } >>> } >>> + >>> + static class DummyConverter implements BundleConverter { >>> >>> - static final String TEST_EBA = >>> "./ariesApplicationManagerImplTest/test.eba"; >>> + public BundleConversion convert(IDirectory parentEba, IFile >>> toBeConverted) >>> + throws ConversionException { >>> + if (toBeConverted.getName().equals("helloWorld.war")) { >>> + InputStream is = null; >>> + try { >>> + is = new FileInputStream(new >>> File("../src/test/resources/conversion/MANIFEST.MF")); >>> + Manifest warManifest = new Manifest(is); >>> + IOUtils.jarUp(new >>> File("../src/test/resources/conversion/conversion.eba/helloWorld.war"), new >>> File("./ariesApplicationManagerImplTest/conversion/helloWorld.war"), >>> warManifest); >>> + IOUtils.zipUp(new >>> File("../src/test/resources/conversion/conversion.eba/helloWorld.jar"), new >>> File("./ariesApplicationManagerImplTest/conversion/helloWorld.jar")); >>> + >>> + IOUtils.zipUp(new >>> File("./ariesApplicationManagerImplTest/conversion"), new >>> File("./ariesApplicationManagerImplTest/conversion.eba")); >>> + final InputStream jarIs = new FileInputStream(new >>> File("./ariesApplicationManagerImplTest/conversion.eba")); >>> + final String location = toBeConverted.toString(); >>> + return new BundleConversion() { >>> + >>> + public BundleInfo >>> getBundleInfo(ApplicationMetadataFactory amf) throws IOException { >>> + return new >>> SimpleBundleInfo(amf, BundleManifest.fromBundle(jarIs), location); >>> + } >>> + >>> + public InputStream getInputStream() >>> throws IOException { >>> + return jarIs; >>> + } >>> + >>> + }; >>> + } catch (IOException e) { >>> + e.printStackTrace(); >>> + } finally { >>> + try { >>> + if (is != null) >>> + is.close(); >>> + } catch (Exception e) { >>> + e.printStackTrace(); >>> + } >>> + } >>> + } >>> + >>> + return null; >>> + } >>> + >>> + >>> + } >>> >>> + >>> + >>> + static final String TEST_EBA = >>> "./ariesApplicationManagerImplTest/test.eba"; >>> + static final String CONVERSION_EBA = >>> "./ariesApplicationManagerImplTest/conversion.eba"; >>> @BeforeClass >>> public static void preTest() throws Exception { >>> - new File("ariesApplicationManagerImplTest").mkdir(); >>> + new File("ariesApplicationManagerImplTest/conversion").mkdirs(); >>> EbaUnitTestUtils.createEba("../src/test/resources/bundles/test.eba", >>> TEST_EBA); >>> 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); >>> + >>> EbaUnitTestUtils.createEba("../src/test/resources/conversion/conversion.eba", >>> CONVERSION_EBA); >>> } >>> >>> AriesApplicationManagerImpl _appMgr; >>> ApplicationMetadataFactory _appMetaFactory; >>> DummyResolver _resolver; >>> - >>> + DummyConverter _converter; >>> @Before >>> public void setup() { >>> _appMgr = new AriesApplicationManagerImpl (); >>> _appMetaFactory = new ApplicationMetadataFactoryImpl (); >>> >>> DeploymentMetadataFactory dmf = new DeploymentMetadataFactoryImpl(); >>> + _converter = new DummyConverter(); >>> List<BundleConverter> bundleConverters = new >>> ArrayList<BundleConverter>(); >>> - _resolver = new DummyResolver(); >>> - >>> + bundleConverters.add(_converter); >>> + _resolver = new DummyResolver(); >>> _appMgr.setApplicationMetadataFactory(_appMetaFactory); >>> _appMgr.setDeploymentMetadataFactory(dmf); >>> _appMgr.setBundleConverters(bundleConverters); >>> @@ -163,6 +215,36 @@ public class AriesApplicationManagerImpl >>> } >>> >>> @Test >>> + public void testCreateAndConversion() throws Exception { >>> + AriesApplication app = createApplication (CONVERSION_EBA); >>> + ApplicationMetadata appMeta = app.getApplicationMetadata(); >>> + assertEquals (appMeta.getApplicationName(), "conversion.eba"); >>> + assertEquals (appMeta.getApplicationSymbolicName(), >>> "conversion.eba"); >>> + assertEquals (appMeta.getApplicationVersion(), new >>> Version("0.0")); >>> + List<Content> appContent = appMeta.getApplicationContents(); >>> + assertEquals (appContent.size(), 2); >>> + Content fbw = new >>> ContentImpl("hello.world.jar;version=\"[1.1.0, 1.1.0]\""); >>> + Content mbl = new ContentImpl("helloWorld.war;version=\"[0.0.0, >>> 0.0.0]\""); >>> + assertTrue (appContent.contains(fbw)); >>> + assertTrue (appContent.contains(mbl)); >>> + >>> + DeploymentMetadata dm = app.getDeploymentMetadata(); >>> + List<DeploymentContent> dcList = >>> dm.getApplicationDeploymentContents(); >>> + >>> + assertEquals (2, dcList.size()); >>> + DeploymentContent dc1 = new DeploymentContentImpl >>> ("hello.world.jar;deployed-version=1.1.0"); >>> + DeploymentContent dc2 = new DeploymentContentImpl >>> ("helloWorld.war;deployed-version=0.0.0"); >>> + DeploymentContent dc3 = new DeploymentContentImpl >>> ("a.handy.persistence.library;deployed-version=1.1.0"); >>> + assertTrue (dcList.contains(dc1)); >>> + assertTrue (dcList.contains(dc2)); >>> + >>> + dcList = dm.getApplicationProvisionBundles(); >>> + >>> + assertEquals(1, dcList.size()); >>> + assertTrue (dcList.contains(dc3)); >>> + } >>> + >>> + �...@test >>> public void testStoreAndReload() throws Exception { >>> AriesApplication app = createApplication (TEST_EBA); >>> File dest = new File ("ariesApplicationManagerImplTest/stored.eba"); >>> @@ -211,7 +293,7 @@ public class AriesApplicationManagerImpl >>> nextResolverResult.add(resolvedPersistenceLibrary); >>> _resolver.setNextResult(nextResolverResult); >>> >>> - IDirectory testEba = FileSystem.getFSRoot(new File(TEST_EBA)); >>> + IDirectory testEba = FileSystem.getFSRoot(new File(fileName)); >>> AriesApplication app = _appMgr.createApplication(testEba); >>> app = _appMgr.resolve(app); >>> return app; >>> >>> Added: >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/MANIFEST.MF >>> URL: >>> http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/resources/conversion/MANIFEST.MF?rev=960866&view=auto >>> ============================================================================== >>> --- >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/MANIFEST.MF >>> (added) >>> +++ >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/MANIFEST.MF >>> Tue Jul 6 10:51:12 2010 >>> @@ -0,0 +1,11 @@ >>> +Manifest-Version: 1.0 >>> +Bundle-ManifestVersion: 2 >>> +Bundle-Name: helloWorld.war >>> +Bundle-SymbolicName: helloWorld.war >>> +Bundle-Version: 0.0.0 >>> +Bundle-Vendor: Apache.org >>> +Bundle-ContextPath: /test >>> +Export-Package: apache.org.helloWorldWar >>> + >>> + >>> + >>> >>> Added: >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.jar/META-INF/MANIFEST.MF >>> URL: >>> http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.jar/META-INF/MANIFEST.MF?rev=960866&view=auto >>> ============================================================================== >>> --- >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.jar/META-INF/MANIFEST.MF >>> (added) >>> +++ >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.jar/META-INF/MANIFEST.MF >>> Tue Jul 6 10:51:12 2010 >>> @@ -0,0 +1,9 @@ >>> +Manifest-Version: 1.0 >>> +Bundle-ManifestVersion: 2 >>> +Bundle-Name: HelloWorldJar >>> +Bundle-SymbolicName: hello.world.jar >>> +Bundle-Version: 1.1.0 >>> +Bundle-Vendor: Apache.org >>> +Export-Package: apache.org.helloWorldJar >>> + >>> + >>> >>> Added: >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.war/WEB-INF/web.xml >>> URL: >>> http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.war/WEB-INF/web.xml?rev=960866&view=auto >>> ============================================================================== >>> --- >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.war/WEB-INF/web.xml >>> (added) >>> +++ >>> incubator/aries/trunk/application/application-management/src/test/resources/conversion/conversion.eba/helloWorld.war/WEB-INF/web.xml >>> Tue Jul 6 10:51:12 2010 >>> @@ -0,0 +1,3 @@ >>> +<web-app> >>> +<display-name>Hello World</display-name> >>> +</web-app> >>> \ No newline at end of file >>> >>> Modified: incubator/aries/trunk/application/application-utils/pom.xml >>> URL: >>> http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/pom.xml?rev=960866&r1=960865&r2=960866&view=diff >>> ============================================================================== >>> --- incubator/aries/trunk/application/application-utils/pom.xml (original) >>> +++ incubator/aries/trunk/application/application-utils/pom.xml Tue Jul 6 >>> 10:51:12 2010 >>> @@ -67,7 +67,7 @@ >>> <dependency> >>> <groupId>org.osgi</groupId> >>> <artifactId>org.osgi.core</artifactId> >>> - <version>4.0.0</version> >>> + <version>4.2.0</version> >>> <scope>provided</scope> >>> </dependency> >>> <dependency> >>> >>> >>> >
