Return-Path: Delivered-To: apmail-aries-commits-archive@www.apache.org Received: (qmail 11015 invoked from network); 27 Feb 2011 18:54:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 27 Feb 2011 18:54:00 -0000 Received: (qmail 33509 invoked by uid 500); 27 Feb 2011 18:54:00 -0000 Delivered-To: apmail-aries-commits-archive@aries.apache.org Received: (qmail 33424 invoked by uid 500); 27 Feb 2011 18:53:59 -0000 Mailing-List: contact commits-help@aries.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@aries.apache.org Delivered-To: mailing list commits@aries.apache.org Received: (qmail 33416 invoked by uid 99); 27 Feb 2011 18:53:59 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 27 Feb 2011 18:53:59 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 27 Feb 2011 18:53:53 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 4A8942388C14; Sun, 27 Feb 2011 18:53:08 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1075118 [7/7] - in /aries/tags/application-0.2-incubating: ./ application-api/ application-api/src/ application-api/src/main/ application-api/src/main/java/ application-api/src/main/java/org/ application-api/src/main/java/org/apache/ appli... Date: Sun, 27 Feb 2011 18:53:06 -0000 To: commits@aries.apache.org From: zoe@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110227185308.4A8942388C14@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Added: aries/tags/application-0.2-incubating/application-utils/src/test/java/org/apache/aries/application/utils/manifest/ManifestHeaderProcessorTest.java URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/java/org/apache/aries/application/utils/manifest/ManifestHeaderProcessorTest.java?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/java/org/apache/aries/application/utils/manifest/ManifestHeaderProcessorTest.java (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/java/org/apache/aries/application/utils/manifest/ManifestHeaderProcessorTest.java Sun Feb 27 18:52:58 2011 @@ -0,0 +1,541 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.aries.application.utils.manifest; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.aries.application.VersionRange; +import org.apache.aries.application.utils.internal.MessageUtil; +import org.apache.aries.application.utils.manifest.ManifestHeaderProcessor.NameValueMap; +import org.apache.aries.application.utils.manifest.ManifestHeaderProcessor.NameValuePair; +import org.junit.Test; + +public class ManifestHeaderProcessorTest +{ + @Test + public void testNameValuePair() throws Exception { + NameValuePair nvp = new NameValuePair("key", "value"); + assertEquals("The name value pair is not set properly.", nvp.getName(), "key"); + assertEquals("The value is not set properly.", nvp.getValue(), "value"); + NameValuePair anotherNvp = new NameValuePair("key", "value"); + assertEquals("The two objects of NameValuePair is not equal.", nvp, anotherNvp); + nvp.setName("newKey"); + nvp.setValue("newValue"); + assertEquals("The name value pair is not set properly.", nvp.getName(), "newKey"); + assertEquals("The value is not set properly.", nvp.getValue(), "newValue"); + + NameValueMap nvm1 = new NameValueMap(); + nvm1.put("a","b"); + nvm1.put("c","d"); + NameValueMap nvm2 = new NameValueMap(); + nvm2.put("c","d"); + nvm2.put("a","b"); + assertEquals("The maps are not equal.", nvm1, nvm2); + nvm2.put("e","f"); + assertNotSame("The maps are the same.", nvm1, nvm2); + + NameValuePair> nvp1 = new NameValuePair>("one",nvm1); + NameValuePair> nvp2 = new NameValuePair>("one",nvm2); + + assertNotSame("The pairs are identical ",nvp1,nvp2); + nvm1.put("e","f"); + assertEquals("The pairs are not equal.", nvp1,nvp2); + + List>> bundleInfoList1 = new ArrayList>>(); + bundleInfoList1.add(nvp1); + + List>> bundleInfoList2 = new ArrayList>>(); + bundleInfoList2.add(nvp1); + + bundleInfoList1.removeAll(bundleInfoList2); + assertEquals("The List should be empty", bundleInfoList1.isEmpty(), true); + + + assertNotSame("The two objects of NameValuePair is not equal.", nvp, anotherNvp); + } + + + /** + * Test the Bundle manifest header entry of + * Bundle-SymbolicName: com.acme.foo;singleton:=true + */ + @Test + public void testParseBundleSymbolicName() + { + String bundleSymbolicNameEntry = "com.acme.foo;singleton:=true;fragment-attachment:=always"; + NameValuePair> nvp = ManifestHeaderProcessor.parseBundleSymbolicName(bundleSymbolicNameEntry); + assertEquals("The symbolic name is wrong.", nvp.getName(), "com.acme.foo"); + assertEquals("The value is wrong.", "true", nvp.getValue().get("singleton:") ); + assertEquals("The directive is wrong.", "always", nvp.getValue().get("fragment-attachment:") ); + + String bundleSymbolicNameEntry2 = "com.acme.foo"; + NameValuePair> nvp2 = ManifestHeaderProcessor.parseBundleSymbolicName(bundleSymbolicNameEntry2); + assertEquals("The symbolic name is wrong.", nvp2.getName(), "com.acme.foo"); + + + + + } + + + + /** + * Test the import package and import service + * Import-Package: com.acme.foo;come.acm,e.bar;version="[1.23,1.24.5]";resolution:=mandatory + */ + @Test + public void testParseImportString() + { + String importPackage = "com.acme.foo,come.acm.e.bar;version=\"[1.23,1.24.5]\";resolution:=mandatory;company=\"ACME\",a.b.c;version=1.2.3;company=com"; + + Map> importPackageReturn = ManifestHeaderProcessor.parseImportString(importPackage); + + assertTrue("The package is not set.", importPackageReturn.containsKey("com.acme.foo")); + assertTrue("The package is not set.", importPackageReturn.containsKey("come.acm.e.bar")); + assertTrue("The package is not set.", importPackageReturn.containsKey("come.acm.e.bar")); + assertTrue("The package is not set.", importPackageReturn.containsKey("a.b.c")); + assertTrue("The package should not contain any attributes.", importPackageReturn.get("com.acme.foo").isEmpty()); + assertEquals("The directive is not set correctly.", "[1.23,1.24.5]", importPackageReturn.get("come.acm.e.bar").get("version")); + assertEquals("The directive is not set correctly.", "mandatory", importPackageReturn.get("come.acm.e.bar").get("resolution:")); + assertEquals("The directive is not set correctly.", "ACME", importPackageReturn.get("come.acm.e.bar").get("company")); + assertEquals("The directive is not set correctly.", "1.2.3", importPackageReturn.get("a.b.c").get("version")); + assertEquals("The directive is not set correctly.", "com", importPackageReturn.get("a.b.c").get("company")); + + importPackage="com.acme.foo"; + + assertTrue("The package is not set.", importPackageReturn.containsKey("com.acme.foo")); + assertTrue("The package should not contain any attributes.", importPackageReturn.get("com.acme.foo").isEmpty()); + + importPackage="com.acme.foo;com.acme.bar;version=2"; + Map> importPackageReturn2 = ManifestHeaderProcessor.parseImportString(importPackage); + assertTrue("The package is not set.", importPackageReturn2.containsKey("com.acme.foo")); + assertTrue("The package is not set.", importPackageReturn2.containsKey("com.acme.bar")); + assertEquals("The directive is not set correctly.", "2", importPackageReturn2.get("com.acme.foo").get("version")); + assertEquals("The directive is not set correctly.", "2", importPackageReturn2.get("com.acme.bar").get("version")); + } + @Test + public void testParseExportString() + { + String exportPackage = "com.acme.foo,com.acme.bar;version=1,com.acme.bar;version=2;uses:=\"a.b.c,d.e.f\";security=false;mandatory:=security"; + + List>> exportPackageReturn = ManifestHeaderProcessor.parseExportString(exportPackage); + + int i =0; + assertEquals("The number of the packages is wrong.", 3, exportPackageReturn.size()); + for (NameValuePair> nvp : exportPackageReturn) { + if (nvp.getName().equals("com.acme.foo")) { + i++; + + assertTrue("The directive or attribute should not be set.", nvp.getValue().isEmpty() ); + } else if ((nvp.getName().equals("com.acme.bar")) && ("2".equals(nvp.getValue().get("version")))) { + + + i++; + assertEquals("The directive is wrong.", "a.b.c,d.e.f", nvp.getValue().get("uses:")); + assertEquals("The directive is wrong.", "false", nvp.getValue().get("security")); + assertEquals("The directive is wrong.", "security", nvp.getValue().get("mandatory:")); + } else if ((nvp.getName().equals("com.acme.bar")) && ("1".equals(nvp.getValue().get("version")))) { + i++; + + assertNull("The directive is wrong.", nvp.getValue().get("uses:")); + assertNull("The directive is wrong.", nvp.getValue().get("security")); + assertNull("The directive is wrong.", nvp.getValue().get("mandatory:")); + } + } + // make sure all three packages stored + assertEquals("The names of the packages are wrong.", 3, i); + + exportPackage = "com.acme.foo"; + + exportPackageReturn = ManifestHeaderProcessor.parseExportString(exportPackage); + + int k =0; + assertEquals("The number of the packages is wrong.", 1, exportPackageReturn.size()); + for (NameValuePair> nvp : exportPackageReturn) { + if (nvp.getName().equals("com.acme.foo")) { + k++; + + assertTrue("The directive or attribute should not be set.", nvp.getValue().isEmpty() ); + } + } + assertEquals("The names of the packages are wrong.", 1, k); + + // test multiple packages separated by ; + + exportPackage = "com.acme.foo;com.acme.bar;version=\"2\";resolution:=optional"; + + exportPackageReturn = ManifestHeaderProcessor.parseExportString(exportPackage); + + k =0; + assertEquals("The number of the packages is wrong.", 2, exportPackageReturn.size()); + for (NameValuePair> nvp : exportPackageReturn) { + if (nvp.getName().equals("com.acme.foo")) { + k++; + + assertEquals("The attribute is wrong.", "2", nvp.getValue().get("version") ); + assertEquals("The attribute is wrong.", "optional", nvp.getValue().get("resolution:")); + } else if (nvp.getName().equals("com.acme.bar")) { + k++; + + assertEquals("The attribute is wrong.", "2", nvp.getValue().get("version") ); + assertEquals("The attribute is wrong.", "optional", nvp.getValue().get("resolution:")); + } + } + assertEquals("The names of the packages are wrong.", 2, k); + + + + } + + @Test + public void testExportMandatoryAttributes() { + String exportPackage = "com.acme.foo,com.acme.bar;version=2;company=dodo;security=false;mandatory:=\"security,company\""; + + List>> exportPackageReturn = ManifestHeaderProcessor.parseExportString(exportPackage); + + int i =0; + assertEquals("The number of the packages is wrong.", 2, exportPackageReturn.size()); + for (NameValuePair> nvp : exportPackageReturn) { + if (nvp.getName().equals("com.acme.foo")) { + i++; + + assertTrue("The directive or attribute should not be set.", nvp.getValue().isEmpty() ); + } else if ((nvp.getName().equals("com.acme.bar")) && ("2".equals(nvp.getValue().get("version")))) { + + + i++; + assertEquals("The directive is wrong.", "dodo", nvp.getValue().get("company")); + assertEquals("The directive is wrong.", "false", nvp.getValue().get("security")); + assertEquals("The directive is wrong.", "security,company", nvp.getValue().get("mandatory:")); + } + } + // make sure all three packages stored + assertEquals("The names of the packages are wrong.", 2, i); + + } + + private String createExpectedFilter(NameValueMap values, String ... parts) + { + StringBuilder builder = new StringBuilder(parts[0]); + + for (Map.Entry entry : values.entrySet()) { + if ("version".equals(entry.getKey())) builder.append(parts[2]); + else if ("company".equals(entry.getKey())) builder.append(parts[1]); + } + + builder.append(parts[3]); + + return builder.toString(); + } + + /** + * Test the filter generated correctly + * @throws Exception + */ + @Test + public void testGenerateFilter() throws Exception { + NameValueMap valueMap = new NameValueMap(); + valueMap.addToCollection("version", "[1.2, 2.3]"); + valueMap.addToCollection("resulution:", "mandatory"); + valueMap.addToCollection("company", "com"); + String filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap); + String expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "(version>=1.2.0)(version<=2.3.0)", "(mandatory:<*company))"); + assertEquals("The filter is wrong.", expected, filter ); + + + valueMap.clear(); + + valueMap.addToCollection("version", "(1.2, 2.3]"); + valueMap.addToCollection("resulution:", "mandatory"); + valueMap.addToCollection("company", "com"); + filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap); + expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "(version>=1.2.0)(version<=2.3.0)(!(version=1.2.0))", "(mandatory:<*company))"); + assertEquals("The filter is wrong.", expected, filter ); + + valueMap.clear(); + + valueMap.addToCollection("version", "(1.2, 2.3)"); + valueMap.addToCollection("resulution:", "mandatory"); + valueMap.addToCollection("company", "com"); + filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap); + expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "(version>=1.2.0)(version<=2.3.0)(!(version=1.2.0))(!(version=2.3.0))", "(mandatory:<*company))"); + assertEquals("The filter is wrong.", expected, filter ); + + valueMap.clear(); + + valueMap.addToCollection("version", "1.2"); + valueMap.addToCollection("resulution:", "mandatory"); + valueMap.addToCollection("company", "com"); + filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap); + expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "(version>=1.2.0)", "(mandatory:<*company))"); + assertEquals("The filter is wrong.", expected, filter ); + + valueMap.clear(); + + valueMap.addToCollection("resulution:", "mandatory"); + valueMap.addToCollection("company", "com"); + filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap); + expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "", "(mandatory:<*company))"); + assertEquals("The filter is wrong.", expected, filter ); + } + + /** + * Test the version range created correctly + * @throws Exception + */ + + @Test + public void testVersionRange() throws Exception { + String version1 = "[1.2.3, 4.5.6]"; + String version2="(1, 2]"; + String version3="[2,4)"; + String version4="(1,2)"; + String version5="2"; + String version6 = "2.3"; + String version7="[1.2.3.q, 2.3.4.p)"; + String version8="1.2.2.5"; + String version9="a.b.c"; + String version10=null; + String version11=""; + String version12="\"[1.2.3, 4.5.6]\""; + + VersionRange vr = ManifestHeaderProcessor.parseVersionRange(version1); + assertEquals("The value is wrong", "1.2.3", vr.getMinimumVersion().toString()); + assertFalse("The value is wrong", vr.isMinimumExclusive()); + assertEquals("The value is wrong", "4.5.6", vr.getMaximumVersion().toString()); + assertFalse("The value is wrong", vr.isMaximumExclusive()); + + vr = ManifestHeaderProcessor.parseVersionRange(version2); + assertEquals("The value is wrong", "1.0.0", vr.getMinimumVersion().toString()); + assertTrue("The value is wrong", vr.isMinimumExclusive()); + assertEquals("The value is wrong", "2.0.0", vr.getMaximumVersion().toString()); + assertFalse("The value is wrong", vr.isMaximumExclusive()); + + vr = ManifestHeaderProcessor.parseVersionRange(version3); + + assertEquals("The value is wrong", "2.0.0", vr.getMinimumVersion().toString()); + assertFalse("The value is wrong", vr.isMinimumExclusive()); + assertEquals("The value is wrong", "4.0.0", vr.getMaximumVersion().toString()); + assertTrue("The value is wrong", vr.isMaximumExclusive()); + + vr = ManifestHeaderProcessor.parseVersionRange(version4); + + assertEquals("The value is wrong", "1.0.0", vr.getMinimumVersion().toString()); + assertTrue("The value is wrong", vr.isMinimumExclusive()); + assertEquals("The value is wrong", "2.0.0", vr.getMaximumVersion().toString()); + assertTrue("The value is wrong", vr.isMaximumExclusive()); + + vr = ManifestHeaderProcessor.parseVersionRange(version5); + assertEquals("The value is wrong", "2.0.0", vr.getMinimumVersion().toString()); + assertFalse("The value is wrong", vr.isMinimumExclusive()); + assertNull("The value is wrong", vr.getMaximumVersion()); + assertFalse("The value is wrong", vr.isMaximumExclusive()); + + vr = ManifestHeaderProcessor.parseVersionRange(version6); + assertEquals("The value is wrong", "2.3.0", vr.getMinimumVersion().toString()); + assertFalse("The value is wrong", vr.isMinimumExclusive()); + assertNull("The value is wrong", vr.getMaximumVersion()); + assertFalse("The value is wrong", vr.isMaximumExclusive()); + + vr = ManifestHeaderProcessor.parseVersionRange(version7); + assertEquals("The value is wrong", "1.2.3.q", vr.getMinimumVersion().toString()); + assertFalse("The value is wrong", vr.isMinimumExclusive()); + assertEquals("The value is wrong", "2.3.4.p", vr.getMaximumVersion().toString()); + assertTrue("The value is wrong", vr.isMaximumExclusive()); + + vr = ManifestHeaderProcessor.parseVersionRange(version8); + assertEquals("The value is wrong", "1.2.2.5", vr.getMinimumVersion().toString()); + assertFalse("The value is wrong", vr.isMinimumExclusive()); + assertNull("The value is wrong", vr.getMaximumVersion()); + assertFalse("The value is wrong", vr.isMaximumExclusive()); + boolean exception = false; + try { + vr = ManifestHeaderProcessor.parseVersionRange(version9); + } catch (Exception e){ + exception = true; + } + + assertTrue("The value is wrong", exception); + boolean exceptionNull = false; + try { + vr = ManifestHeaderProcessor.parseVersionRange(version10); + } catch (Exception e){ + exceptionNull = true; + } + assertTrue("The value is wrong", exceptionNull); + // empty version should be defaulted to >=0.0.0 + vr = ManifestHeaderProcessor.parseVersionRange(version11); + assertEquals("The value is wrong", "0.0.0", vr.getMinimumVersion().toString()); + assertFalse("The value is wrong", vr.isMinimumExclusive()); + assertNull("The value is wrong", vr.getMaximumVersion()); + assertFalse("The value is wrong", vr.isMaximumExclusive()); + + + vr = ManifestHeaderProcessor.parseVersionRange(version12); + assertEquals("The value is wrong", "1.2.3", vr.getMinimumVersion().toString()); + assertFalse("The value is wrong", vr.isMinimumExclusive()); + assertEquals("The value is wrong", "4.5.6", vr.getMaximumVersion().toString()); + assertFalse("The value is wrong", vr.isMaximumExclusive()); + } + + @Test + public void testInvalidVersions() throws Exception + { + try { + ManifestHeaderProcessor.parseVersionRange("a"); + assertTrue("Should have thrown an exception", false); + } catch (IllegalArgumentException e) { + // assertEquals(MessageUtil.getMessage("APPUTILS0009E", "a"), e.getMessage()); + } + + try { + ManifestHeaderProcessor.parseVersionRange("[1.0.0,1.0.1]", true); + assertTrue("Should have thrown an exception", false); + } catch (IllegalArgumentException e) { + // assertEquals(MessageUtil.getMessage("APPUTILS0011E", "[1.0.0,1.0.1]"), e.getMessage()); + } + + } + + @Test + public void testSplit() throws Exception { + String export = "com.ibm.ws.eba.obr.fep.bundle122;version=\"3\";company=mood;local=yes;security=yes;mandatory:=\"mood,security\""; + List result = ManifestHeaderProcessor.split(export, ","); + assertEquals("The result is wrong.", export, result.get(0)); + assertEquals("The result is wrong.", 1, result.size()); + + String aString = "com.acme.foo;weirdAttr=\"one;two;three\";weirdDir:=\"1;2;3\""; + result = ManifestHeaderProcessor.split(aString, ";"); + assertEquals("The result is wrong.", "com.acme.foo", result.get(0)); + assertEquals("The result is wrong.", "weirdAttr=\"one;two;three\"", result.get(1)); + assertEquals("The result is wrong.", "weirdDir:=\"1;2;3\"", result.get(2)); + + assertEquals("The result is wrong.", 3, result.size()); + + + + + String pkg1 = "com.ibm.ws.eba.example.helloIsolation;version=\"1.0.0\" "; + String pkg2 = "com.ibm.ws.eba.helloWorldService;version=\"[1.0.0,1.0.0]\""; + String pkg3 = " com.ibm.ws.eba.helloWorldService;version=\"1.0.0\""; + String pkg4 = "com.ibm.ws.eba.helloWorldService;version=\"[1.0.0,1.0.0]\";sharing:=shared" ; + String pkg5 = "com.ibm.ws.eba.helloWorldService;sharing:=shared;version=\"[1.0.0,1.0.0]\""; + String appContent1 = pkg1 + ", " + pkg2 + ", " + pkg3; + String appContent2 = pkg2 + ", " + pkg1 + ", " + pkg3; + String appContent3 = pkg1 + ", " + pkg3 + ", " + pkg2; + String appContent4 = pkg1 + ", " + pkg3 + ", " + pkg4; + String appContent5 = pkg1 + ", " + pkg3 + ", " + pkg5; + + List splitList = ManifestHeaderProcessor.split(appContent1, ","); + assertEquals(pkg1.trim(), splitList.get(0)); + assertEquals(pkg2.trim(), splitList.get(1)); + assertEquals(pkg3.trim(), splitList.get(2)); + + splitList = ManifestHeaderProcessor.split(appContent2, ","); + assertEquals(pkg2.trim(), splitList.get(0)); + assertEquals(pkg1.trim(), splitList.get(1)); + assertEquals(pkg3.trim(), splitList.get(2)); + + splitList = ManifestHeaderProcessor.split(appContent3, ","); + assertEquals(pkg1.trim(), splitList.get(0)); + assertEquals(pkg3.trim(), splitList.get(1)); + assertEquals(pkg2.trim(), splitList.get(2)); + + splitList = ManifestHeaderProcessor.split(appContent4, ","); + assertEquals(pkg1.trim(), splitList.get(0)); + assertEquals(pkg3.trim(), splitList.get(1)); + assertEquals(pkg4.trim(), splitList.get(2)); + + splitList = ManifestHeaderProcessor.split(appContent5, ","); + assertEquals(pkg1.trim(), splitList.get(0)); + assertEquals(pkg3.trim(), splitList.get(1)); + assertEquals(pkg5.trim(), splitList.get(2)); + } + + @Test + public void testParseFilter() + { + Map attrs = ManifestHeaderProcessor.parseFilter("(package=com.ibm.test)"); + assertEquals("com.ibm.test", attrs.get("package")); + + attrs = ManifestHeaderProcessor.parseFilter("(&(package=com.ibm.test)(attr=value))"); + assertEquals("com.ibm.test", attrs.get("package")); + assertEquals("value", attrs.get("attr")); + assertEquals(2, attrs.size()); + + attrs = ManifestHeaderProcessor.parseFilter("(&(version>=1.0.0))"); + assertEquals("1.0.0", attrs.get("version")); + + attrs = ManifestHeaderProcessor.parseFilter("(&(version>=1.0.0)(version<=2.0.0))"); + assertEquals("[1.0.0,2.0.0]", attrs.get("version")); + + attrs = ManifestHeaderProcessor.parseFilter("(&(version>=1.0.0)(version<=2.0.0)(!(version=1.0.0)))"); + assertEquals("(1.0.0,2.0.0]", attrs.get("version")); + + attrs = ManifestHeaderProcessor.parseFilter("(&(!(version=2.0.0))(!(version=1.0.0))(version>=1.0.0)(version<=2.0.0))"); + assertEquals("(1.0.0,2.0.0)", attrs.get("version")); + } + + @Test + public void testExactVersion() throws Exception + { + VersionRange vr; + try { + vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 2.0.0]", true); + fail("should not get here 1"); + } catch (IllegalArgumentException e) { + // expected + } + + vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 1.0.0]", true); + assertTrue(vr.isExactVersion()); + + try { + vr = ManifestHeaderProcessor.parseVersionRange("(1.0.0, 1.0.0]", true); + fail("should not get here 2"); + } catch (IllegalArgumentException e) { + // expected + } + + try { + vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 1.0.0)", true); + fail("should not get here 3"); + } catch (IllegalArgumentException e) { + // expected + } + + vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 2.0.0]"); + assertFalse(vr.isExactVersion()); + + vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 1.0.0]"); + assertTrue(vr.isExactVersion()); + + + } +} Added: aries/tags/application-0.2-incubating/application-utils/src/test/java/org/apache/aries/application/utils/manifest/ManifestProcessorTest.java URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/java/org/apache/aries/application/utils/manifest/ManifestProcessorTest.java?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/java/org/apache/aries/application/utils/manifest/ManifestProcessorTest.java (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/java/org/apache/aries/application/utils/manifest/ManifestProcessorTest.java Sun Feb 27 18:52:58 2011 @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.aries.application.utils.manifest; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.jar.Manifest; + +import org.apache.aries.application.ApplicationMetadata; +import org.apache.aries.application.Content; +import org.apache.aries.application.VersionRange; +import org.apache.aries.application.impl.ApplicationMetadataFactoryImpl; +import org.apache.aries.application.utils.manifest.ManifestProcessor; +import org.junit.Test; +import org.osgi.framework.Version; + +public class ManifestProcessorTest +{ + + private String appName = "Travel Reservation"; + + /** + * Check a simple manifest can be read. + * @throws Exception + */ + @Test + public void testSimpleManifest() throws Exception + { + //the values of the manifest + //intentionally include a couple of long lines + Map pairs = new HashMap(); + 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 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 metadata can be extracted from a simple manifest. + */ + @Test + public void testManifestMetadata() throws Exception + { + ApplicationMetadataFactoryImpl manager = new ApplicationMetadataFactoryImpl(); + InputStream in = getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION.MF"); + ApplicationMetadata am = manager.parseApplicationMetadata(in); + assertNotNull(am); + + assertEquals(am.getApplicationName(),appName); + + //"com.travel.reservation.web;version=\"[1.1.0,1.2.0)\",com.travel.reservation.business", + List 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 manifest that uses multiple lines + * for a single manifest attribute. + */ + @Test + public void testManifestMetadataWithMultiLineEntries() throws Exception + { + ApplicationMetadataFactoryImpl manager = new ApplicationMetadataFactoryImpl(); + + InputStream in = getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION2.MF"); + + ApplicationMetadata am = manager.parseApplicationMetadata(in); + assertNotNull(am); + + assertEquals(am.getApplicationName(),appName); + + //"com.travel.reservation.web;version=\"[1.1.0,1.2.0)\",com.travel.reservation.business", + List 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()); + } + } + + @Test + public void testManifestWithoutEndingInNewLine() throws Exception + { + ApplicationMetadataFactoryImpl manager = new ApplicationMetadataFactoryImpl(); + + InputStream in = getClass().getClassLoader().getResourceAsStream("META-INF/APPLICATION3.MF"); + + ApplicationMetadata am = manager.parseApplicationMetadata(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: aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION.MF URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION.MF?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION.MF (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION.MF Sun Feb 27 18:52:58 2011 @@ -0,0 +1,10 @@ +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)" +Application-Services: services.xml Propchange: aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION.MF ------------------------------------------------------------------------------ svn:executable = * Added: aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION2.MF URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION2.MF?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION2.MF (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION2.MF Sun Feb 27 18:52:58 2011 @@ -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: aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION3.MF URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION3.MF?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION3.MF (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/resources/META-INF/APPLICATION3.MF Sun Feb 27 18:52:58 2011 @@ -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 Added: aries/tags/application-0.2-incubating/application-utils/src/test/resources/app1/META-INF/APPLICATION.MF URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/resources/app1/META-INF/APPLICATION.MF?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/resources/app1/META-INF/APPLICATION.MF (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/resources/app1/META-INF/APPLICATION.MF Sun Feb 27 18:52:58 2011 @@ -0,0 +1,16 @@ +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, + com.travel.reservation.data +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: aries/tags/application-0.2-incubating/application-utils/src/test/resources/app1/META-INF/DEPLOYMENT.MF URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/resources/app1/META-INF/DEPLOYMENT.MF?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/resources/app1/META-INF/DEPLOYMENT.MF (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/resources/app1/META-INF/DEPLOYMENT.MF Sun Feb 27 18:52:58 2011 @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Application-SymbolicName: com.travel.reservation +Application-Version: 1.2 +Deployed-Content: com.travel.reservation.web;deployed-version="1.1.0", + com.travel.reservation.business;deployed-version=2.0 + com.travel.reservation.data;deployed-version=2.1.1 Added: aries/tags/application-0.2-incubating/application-utils/src/test/resources/bundles/exploded.jar/META-INF/MANIFEST.MF URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/resources/bundles/exploded.jar/META-INF/MANIFEST.MF?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/resources/bundles/exploded.jar/META-INF/MANIFEST.MF (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/resources/bundles/exploded.jar/META-INF/MANIFEST.MF Sun Feb 27 18:52:58 2011 @@ -0,0 +1,2 @@ +Bundle-SymbolicName: com.ibm.test;singleton:=true +Bundle-Version: 1.0.0 Added: aries/tags/application-0.2-incubating/application-utils/src/test/resources/bundles/exploded.jar/META-INF/beforeManifest.file URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/resources/bundles/exploded.jar/META-INF/beforeManifest.file?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/resources/bundles/exploded.jar/META-INF/beforeManifest.file (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/resources/bundles/exploded.jar/META-INF/beforeManifest.file Sun Feb 27 18:52:58 2011 @@ -0,0 +1,19 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + Added: aries/tags/application-0.2-incubating/application-utils/src/test/resources/zip/file.txt URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/resources/zip/file.txt?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/resources/zip/file.txt (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/resources/zip/file.txt Sun Feb 27 18:52:58 2011 @@ -0,0 +1,19 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +abc \ No newline at end of file Added: aries/tags/application-0.2-incubating/application-utils/src/test/resources/zip/subdir/someFile.txt URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/application-utils/src/test/resources/zip/subdir/someFile.txt?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/application-utils/src/test/resources/zip/subdir/someFile.txt (added) +++ aries/tags/application-0.2-incubating/application-utils/src/test/resources/zip/subdir/someFile.txt Sun Feb 27 18:52:58 2011 @@ -0,0 +1,19 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +def \ No newline at end of file Added: aries/tags/application-0.2-incubating/pom.xml URL: http://svn.apache.org/viewvc/aries/tags/application-0.2-incubating/pom.xml?rev=1075118&view=auto ============================================================================== --- aries/tags/application-0.2-incubating/pom.xml (added) +++ aries/tags/application-0.2-incubating/pom.xml Sun Feb 27 18:52:58 2011 @@ -0,0 +1,184 @@ + + + + + + org.apache.aries + java5-parent + 0.2-incubating + + + 4.0.0 + org.apache.aries.application + application + Apache Aries Application + 0.2-incubating + pom + + + Application support for Aries + + + + scm:svn:http://svn.apache.org/repos/asf/incubator/aries/tags/application-0.2-incubating + scm:svn:https://svn.apache.org/repos/asf/incubator/aries/tags/application-0.2-incubating + http://svn.apache.org/viewvc/incubator/aries/tags/application-0.2-incubating + + + + + + asm + asm-all + 3.2 + + + org.apache.aries + org.apache.aries.util + 0.2-incubating + + + org.apache.aries.blueprint + org.apache.aries.blueprint + 0.2-incubating + + + org.apache.aries.testsupport + org.apache.aries.testsupport.unit + 0.2-incubating + + + org.apache.aries.web + org.apache.aries.web.urlhandler + 0.2-incubating + + + org.apache.felix + org.apache.felix.bundlerepository + 1.6.4 + + + org.apache.felix + org.apache.felix.configadmin + 1.2.4 + + + org.apache.felix + org.osgi.compendium + + + org.apache.felix + org.osgi.core + + + + + org.apache.felix + org.apache.felix.fileinstall + 2.0.8 + + + org.apache.felix + org.osgi.service.obr + + + org.apache.felix + org.osgi.core + + + 1.0.2 + + + + + org.apache.aries.application + org.apache.aries.application.api + ${project.version} + + + org.apache.aries.application + org.apache.aries.application.converters + ${project.version} + + + org.apache.aries.application + org.apache.aries.application.install + ${project.version} + + + org.apache.aries.application + org.apache.aries.application.management + ${project.version} + + + org.apache.aries.application + org.apache.aries.application.resolver.obr + ${project.version} + + + org.apache.aries.application + org.apache.aries.application.runtime + ${project.version} + + + org.apache.aries.application + org.apache.aries.application.runtime.itest.interfaces + ${project.version} + + + org.apache.aries.application + org.apache.aries.application.runtime.itests + ${project.version} + + + org.apache.aries.application + org.apache.aries.application.utils + ${project.version} + + + + + + application-utils + application-api + application-management + application-converters + application-runtime + application-itest-interface + application-itests + application-obr-resolver + application-install + application-bundle + + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.0 + + false + deploy + -Papache-release -DskipTests=true + + + + + +