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, <[email protected]> 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 > > >
