You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@aries.apache.org by Lin Sun <li...@gmail.com> on 2009/12/07 15:26:51 UTC
Re: svn commit: r887889 - in /incubator/aries/trunk/application/application-utils/src:
main/java/org/apache/aries/application/ main/java/org/apache/aries/application/impl/
main/java/org/apache/aries/application/utils/manifest/ test/java/org/apache/ar
Hi Alasdair,
The newly added ApplicationMetadataImplTest file has an incompatible
license, could you update that?
Thx
Lin
On Mon, Dec 7, 2009 at 6:32 AM, <no...@apache.org> wrote:
> 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
>
>
>
Re: svn commit: r887889 - in /incubator/aries/trunk/application/application-utils/src:
main/java/org/apache/aries/application/ main/java/org/apache/aries/application/impl/
main/java/org/apache/aries/application/utils/manifest/ test/java/org/apache/ar
Posted by Alasdair Nottingham <no...@apache.org>.
Oops,
2009/12/7 Lin Sun <li...@gmail.com>:
> Hi Alasdair,
>
> The newly added ApplicationMetadataImplTest file has an incompatible
> license, could you update that?
>
> Thx
>
> Lin
>
> On Mon, Dec 7, 2009 at 6:32 AM, <no...@apache.org> wrote:
>> 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
>>
>>
>>
>
--
Alasdair Nottingham
not@apache.org