You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2014/10/07 21:52:17 UTC
svn commit: r1629971 - in /aries/trunk/subsystem/subsystem-itests: ./
src/test/bundles/blueprint/META-INF/
src/test/bundles/blueprint/org/apache/aries/subsystem/itests/blueprint/
src/test/bundles/core.fragment/META-INF/ src/test/java/org/apache/aries/s...
Author: cschneider
Date: Tue Oct 7 19:52:17 2014
New Revision: 1629971
URL: http://svn.apache.org/r1629971
Log:
ARIES-1258 Migrate corefragment and blueprint test
Added:
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemEventHandler.java
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/bundles/
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/bundles/blueprint/
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/bundles/blueprint/BPHelloImpl.java
- copied, changed from r1629842, aries/trunk/subsystem/subsystem-itests/src/test/bundles/blueprint/org/apache/aries/subsystem/itests/blueprint/BPHelloImpl.java
aries/trunk/subsystem/subsystem-itests/src/test/resources/blueprint/OSGI-INF/blueprint/
aries/trunk/subsystem/subsystem-itests/src/test/resources/blueprint/OSGI-INF/blueprint/blueprint.xml
- copied, changed from r1629842, aries/trunk/subsystem/subsystem-itests/src/test/resources/OSGI-INF/blueprint/blueprint.xml
Removed:
aries/trunk/subsystem/subsystem-itests/src/test/bundles/blueprint/META-INF/MANIFEST.MF
aries/trunk/subsystem/subsystem-itests/src/test/bundles/blueprint/org/apache/aries/subsystem/itests/blueprint/BPHelloImpl.java
aries/trunk/subsystem/subsystem-itests/src/test/bundles/core.fragment/META-INF/MANIFEST.MF
aries/trunk/subsystem/subsystem-itests/src/test/resources/META-INF/platform-equinox/definition-3.7.0.V20110110.xml
aries/trunk/subsystem/subsystem-itests/src/test/resources/META-INF/platform-equinox/definition-3.7.0.V20110221.xml
aries/trunk/subsystem/subsystem-itests/src/test/resources/META-INF/platform-equinox/definition-3.8.0-SNAPSHOT.xml
aries/trunk/subsystem/subsystem-itests/src/test/resources/META-INF/platform-equinox/definition-3.8.0.V20110621.xml
aries/trunk/subsystem/subsystem-itests/src/test/resources/META-INF/platform-equinox/definition-3.8.0.V20120529-1548.xml
aries/trunk/subsystem/subsystem-itests/src/test/resources/OSGI-INF/blueprint/blueprint.xml
Modified:
aries/trunk/subsystem/subsystem-itests/pom.xml
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BasicTest.java
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BlueprintTest.java
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java
Modified: aries/trunk/subsystem/subsystem-itests/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/pom.xml?rev=1629971&r1=1629970&r2=1629971&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/pom.xml (original)
+++ aries/trunk/subsystem/subsystem-itests/pom.xml Tue Oct 7 19:52:17 2014
@@ -340,24 +340,6 @@
<version>2.3</version>
<executions>
<execution>
- <id>core-fragment</id>
- <goals>
- <goal>jar</goal>
- </goals>
- <configuration>
- <archive>
- <manifestFile>src/test/bundles/core.fragment/META-INF/MANIFEST.MF</manifestFile>
- </archive>
- <excludes>
- <exclude>**/*</exclude>
- </excludes>
- <classesDirectory>${project.build.directory}/test-classes</classesDirectory>
- <outputDirectory>${project.build.directory}/test-classes/core.fragment</outputDirectory>
- <finalName>core.fragment</finalName>
- </configuration>
- <phase>process-test-classes</phase>
- </execution>
- <execution>
<id>tb1-application1</id>
<goals>
<goal>jar</goal>
@@ -509,26 +491,6 @@
<!-- End of new pom for hello tests, part 1 -->
- <execution>
- <id>basic-blueprint-application</id>
- <goals>
- <goal>jar</goal>
- </goals>
- <configuration>
- <archive>
- <manifestFile>src/test/bundles/blueprint/META-INF/MANIFEST.MF</manifestFile>
- </archive>
- <classesDirectory>${project.build.directory}/test-classes</classesDirectory>
- <includes>
- <include>org/apache/aries/subsystem/itests/blueprint/**</include>
- <include>OSGI-INF/blueprint/blueprint.xml</include>
- </includes>
- <outputDirectory>${project.build.directory}/test-classes/blueprint</outputDirectory>
- <finalName>blueprint</finalName>
- </configuration>
- <phase>process-test-classes</phase>
- </execution>
-
</executions>
</plugin>
<plugin>
@@ -537,18 +499,6 @@
<version>1.5</version>
<executions>
<execution>
- <id>core-fragment</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>add-test-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>src/test/bundles/core.fragment</source>
- </sources>
- </configuration>
- </execution>
- <execution>
<id>add-source-tb1</id>
<phase>generate-sources</phase>
<goals>
@@ -616,19 +566,6 @@
<!-- End of new pom for hello tests, part 2 -->
<execution>
- <id>add-source-blueprint</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>add-test-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>src/test/bundles/blueprint</source>
- </sources>
- </configuration>
- </execution>
-
- <execution>
<id>add-source-classes</id>
<phase>generate-sources</phase>
<goals>
Modified: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BasicTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BasicTest.java?rev=1629971&r1=1629970&r2=1629971&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BasicTest.java (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BasicTest.java Tue Oct 7 19:52:17 2014
@@ -18,12 +18,7 @@
*/
package org.apache.aries.subsystem.itests;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import org.junit.Test;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.ServiceReference;
import org.osgi.framework.Version;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.service.subsystem.SubsystemConstants;
@@ -36,27 +31,6 @@ public class BasicTest extends Subsystem
createApplication("emptySubsystem", new String[]{});
}
- /*
- * When the subsystems implementation bundle is installed, there should be
- * a Subsystem service available.
- */
- @Test
- public void test1() throws Exception {
- Bundle[] bundles = bundleContext.getBundles();
- boolean found = false;
- for (Bundle bundle : bundles) {
- if ("org.apache.aries.subsystem.core".equals(bundle.getSymbolicName())) {
- found = true;
- break;
- }
- }
- assertTrue("Subsystems implementation bundle not found", found);
- ServiceReference serviceReference = bundleContext.getServiceReference(Subsystem.class);
- assertNotNull("Reference to subsystem service not found", serviceReference);
- Subsystem subsystem = (Subsystem) bundleContext.getService(serviceReference);
- assertNotNull("Subsystem service not found", subsystem);
- }
-
@Test
public void testEmptyFeature() throws Exception {
Subsystem emptyFeature = installSubsystemFromFile("emptyFeature.esa");
Modified: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BlueprintTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BlueprintTest.java?rev=1629971&r1=1629970&r2=1629971&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BlueprintTest.java (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/BlueprintTest.java Tue Oct 7 19:52:17 2014
@@ -2,10 +2,15 @@ package org.apache.aries.subsystem.itest
import static org.junit.Assert.assertEquals;
+import java.io.InputStream;
+
import org.apache.aries.itest.RichBundleContext;
+import org.apache.aries.subsystem.itests.bundles.blueprint.BPHelloImpl;
import org.apache.aries.subsystem.itests.hello.api.Hello;
import org.junit.Test;
+import org.ops4j.pax.tinybundles.core.TinyBundles;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
import org.osgi.service.subsystem.Subsystem;
/*
@@ -13,15 +18,16 @@ import org.osgi.service.subsystem.Subsys
*/
public class BlueprintTest extends SubsystemTest
{
- @Override
- public void createApplications() throws Exception {
- createApplication("blueprint", "blueprint.jar");
- }
+ private static final String BLUEPRINT_ESA = "target/blueprint.esa";
+
+ protected void init() throws Exception {
+ writeToFile(createBlueprintEsa(), BLUEPRINT_ESA);
+ }
@Test
public void checkBlueprint() throws Exception
{
- Subsystem subsystem = installSubsystemFromFile ("blueprint.esa");
+ Subsystem subsystem = installSubsystemFromFile(BLUEPRINT_ESA);
try {
startSubsystem(subsystem);
BundleContext bc = subsystem.getBundleContext();
@@ -33,5 +39,20 @@ public class BlueprintTest extends Subsy
uninstallSubsystem(subsystem);
}
}
+
+ private InputStream createBlueprintEsa() throws Exception {
+ return TinyBundles.bundle()
+ .add("OSGI-INF/SUBSYSTEM.MF", getResource("blueprint/OSGI-INF/SUBSYSTEM.MF"))
+ .add("blueprint.jar", createBlueprintTestBundle())
+ .build(TinyBundles.withBnd());
+ }
+
+ private InputStream createBlueprintTestBundle() {
+ return TinyBundles.bundle()
+ .add(BPHelloImpl.class)
+ .add("OSGI-INF/blueprint/blueprint.xml", getResource("blueprint/OSGI-INF/blueprint/blueprint.xml"))
+ .set(Constants.BUNDLE_SYMBOLICNAME, "org.apache.aries.subsystem.itests.blueprint")
+ .build(TinyBundles.withBnd());
+ }
}
Modified: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java?rev=1629971&r1=1629970&r2=1629971&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java Tue Oct 7 19:52:17 2014
@@ -6,6 +6,7 @@ import static org.junit.Assert.assertTru
import static org.junit.Assert.fail;
import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Dictionary;
import java.util.HashMap;
@@ -77,7 +78,8 @@ public class DynamicImportTest extends S
public void weave(WovenClass arg0) {}
}
- @Test
+ @SuppressWarnings("rawtypes")
+ @Test
public void testFirstPassWeavingApproach() throws Exception
{
Dictionary<String, String> props = new Hashtable<String, String>();
@@ -133,7 +135,8 @@ public class DynamicImportTest extends S
* added to the region's sharing policy even if the subsystem has no
* Import-Package header.
*/
- @Test
+ @SuppressWarnings("rawtypes")
+ @Test
public void testDynamicPackageImportsAddedToSharingPolicyWhenNoImportPackageHeader() throws Exception {
final AtomicBoolean weavingHookCalled = new AtomicBoolean(false);
Dictionary<String, Object> props = new Hashtable<String, Object>();
@@ -180,4 +183,80 @@ public class DynamicImportTest extends S
catch (Exception e) {}
}
}
+
+ protected static final byte[] EMPTY_CLASS = new byte[] {
+ (byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x32,
+ (byte)0x00, (byte)0x12, (byte)0x07, (byte)0x00,
+ (byte)0x02, (byte)0x01, (byte)0x00, (byte)0x05,
+ (byte)0x45, (byte)0x6d, (byte)0x70, (byte)0x74,
+ (byte)0x79, (byte)0x07, (byte)0x00, (byte)0x04,
+ (byte)0x01, (byte)0x00, (byte)0x10, (byte)0x6a,
+ (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f,
+ (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67,
+ (byte)0x2f, (byte)0x4f, (byte)0x62, (byte)0x6a,
+ (byte)0x65, (byte)0x63, (byte)0x74, (byte)0x07,
+ (byte)0x00, (byte)0x06, (byte)0x01, (byte)0x00,
+ (byte)0x14, (byte)0x6a, (byte)0x61, (byte)0x76,
+ (byte)0x61, (byte)0x2f, (byte)0x69, (byte)0x6f,
+ (byte)0x2f, (byte)0x53, (byte)0x65, (byte)0x72,
+ (byte)0x69, (byte)0x61, (byte)0x6c, (byte)0x69,
+ (byte)0x7a, (byte)0x61, (byte)0x62, (byte)0x6c,
+ (byte)0x65, (byte)0x01, (byte)0x00, (byte)0x06,
+ (byte)0x3c, (byte)0x69, (byte)0x6e, (byte)0x69,
+ (byte)0x74, (byte)0x3e, (byte)0x01, (byte)0x00,
+ (byte)0x03, (byte)0x28, (byte)0x29, (byte)0x56,
+ (byte)0x01, (byte)0x00, (byte)0x04, (byte)0x43,
+ (byte)0x6f, (byte)0x64, (byte)0x65, (byte)0x0a,
+ (byte)0x00, (byte)0x03, (byte)0x00, (byte)0x0b,
+ (byte)0x0c, (byte)0x00, (byte)0x07, (byte)0x00,
+ (byte)0x08, (byte)0x01, (byte)0x00, (byte)0x0f,
+ (byte)0x4c, (byte)0x69, (byte)0x6e, (byte)0x65,
+ (byte)0x4e, (byte)0x75, (byte)0x6d, (byte)0x62,
+ (byte)0x65, (byte)0x72, (byte)0x54, (byte)0x61,
+ (byte)0x62, (byte)0x6c, (byte)0x65, (byte)0x01,
+ (byte)0x00, (byte)0x12, (byte)0x4c, (byte)0x6f,
+ (byte)0x63, (byte)0x61, (byte)0x6c, (byte)0x56,
+ (byte)0x61, (byte)0x72, (byte)0x69, (byte)0x61,
+ (byte)0x62, (byte)0x6c, (byte)0x65, (byte)0x54,
+ (byte)0x61, (byte)0x62, (byte)0x6c, (byte)0x65,
+ (byte)0x01, (byte)0x00, (byte)0x04, (byte)0x74,
+ (byte)0x68, (byte)0x69, (byte)0x73, (byte)0x01,
+ (byte)0x00, (byte)0x07, (byte)0x4c, (byte)0x45,
+ (byte)0x6d, (byte)0x70, (byte)0x74, (byte)0x79,
+ (byte)0x3b, (byte)0x01, (byte)0x00, (byte)0x0a,
+ (byte)0x53, (byte)0x6f, (byte)0x75, (byte)0x72,
+ (byte)0x63, (byte)0x65, (byte)0x46, (byte)0x69,
+ (byte)0x6c, (byte)0x65, (byte)0x01, (byte)0x00,
+ (byte)0x0a, (byte)0x45, (byte)0x6d, (byte)0x70,
+ (byte)0x74, (byte)0x79, (byte)0x2e, (byte)0x6a,
+ (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x00,
+ (byte)0x21, (byte)0x00, (byte)0x01, (byte)0x00,
+ (byte)0x03, (byte)0x00, (byte)0x01, (byte)0x00,
+ (byte)0x05, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x01, (byte)0x00, (byte)0x01, (byte)0x00,
+ (byte)0x07, (byte)0x00, (byte)0x08, (byte)0x00,
+ (byte)0x01, (byte)0x00, (byte)0x09, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x2f, (byte)0x00,
+ (byte)0x01, (byte)0x00, (byte)0x01, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x05, (byte)0x2a,
+ (byte)0xb7, (byte)0x00, (byte)0x0a, (byte)0xb1,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x02,
+ (byte)0x00, (byte)0x0c, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x01,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x04,
+ (byte)0x00, (byte)0x0d, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x0c, (byte)0x00, (byte)0x01,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x05,
+ (byte)0x00, (byte)0x0e, (byte)0x00, (byte)0x0f,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
+ (byte)0x00, (byte)0x10, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x11
+ };
+
+ protected static void createEmptyClass() throws IOException {
+ FileOutputStream fos = new FileOutputStream("Empty.class");
+ fos.write(EMPTY_CLASS);
+ fos.close();
+ }
}
Added: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemEventHandler.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemEventHandler.java?rev=1629971&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemEventHandler.java (added)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemEventHandler.java Tue Oct 7 19:52:17 2014
@@ -0,0 +1,109 @@
+package org.apache.aries.subsystem.itests;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.Version;
+import org.osgi.service.subsystem.SubsystemConstants;
+import org.osgi.service.subsystem.Subsystem.State;
+
+class SubsystemEventHandler implements ServiceListener {
+ static class ServiceEventInfo {
+ private final ServiceEvent event;
+ private final long id;
+ private final State state;
+ private final String symbolicName;
+ private final String type;
+ private final Version version;
+
+ public ServiceEventInfo(ServiceEvent event) {
+ id = (Long)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_ID_PROPERTY);
+ state = (State)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_STATE_PROPERTY);
+ symbolicName = (String)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME_PROPERTY);
+ type = (String)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_TYPE_PROPERTY);
+ version = (Version)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_VERSION_PROPERTY);
+ this.event = event;
+ }
+
+ public int getEventType() {
+ return event.getType();
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public State getState() {
+ return state;
+ }
+
+ public String getSymbolicName() {
+ return symbolicName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public Version getVersion() {
+ return version;
+ }
+ }
+
+ private final Map<Long, List<SubsystemEventHandler.ServiceEventInfo>> subsystemIdToEvents = new HashMap<Long, List<SubsystemEventHandler.ServiceEventInfo>>();
+
+ public void clear() {
+ synchronized (subsystemIdToEvents) {
+ subsystemIdToEvents.clear();
+ }
+ }
+
+ public SubsystemEventHandler.ServiceEventInfo poll(long subsystemId) throws InterruptedException {
+ return poll(subsystemId, 0);
+ }
+
+ public SubsystemEventHandler.ServiceEventInfo poll(long subsystemId, long timeout) throws InterruptedException {
+ List<SubsystemEventHandler.ServiceEventInfo> events;
+ synchronized (subsystemIdToEvents) {
+ events = subsystemIdToEvents.get(subsystemId);
+ if (events == null) {
+ events = new ArrayList<SubsystemEventHandler.ServiceEventInfo>();
+ subsystemIdToEvents.put(subsystemId, events);
+ }
+ }
+ synchronized (events) {
+ if (events.isEmpty()) {
+ events.wait(timeout);
+ if (events.isEmpty()) {
+ return null;
+ }
+ }
+ return events.remove(0);
+ }
+ }
+
+ public void serviceChanged(ServiceEvent event) {
+ Long subsystemId = (Long)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_ID_PROPERTY);
+ synchronized (subsystemIdToEvents) {
+ List<SubsystemEventHandler.ServiceEventInfo> events = subsystemIdToEvents.get(subsystemId);
+ if (events == null) {
+ events = new ArrayList<SubsystemEventHandler.ServiceEventInfo>();
+ subsystemIdToEvents.put(subsystemId, events);
+ }
+ synchronized (events) {
+ events.add(new ServiceEventInfo(event));
+ events.notify();
+ }
+ }
+ }
+
+ public int size() {
+ synchronized (subsystemIdToEvents) {
+ return subsystemIdToEvents.size();
+ }
+ }
+}
\ No newline at end of file
Modified: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java?rev=1629971&r1=1629970&r2=1629971&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java Tue Oct 7 19:52:17 2014
@@ -50,8 +50,8 @@ import org.apache.aries.itest.RichBundle
import org.apache.aries.subsystem.AriesSubsystem;
import org.apache.aries.subsystem.core.archive.ProvisionPolicyDirective;
import org.apache.aries.subsystem.core.archive.SubsystemTypeHeader;
+import org.apache.aries.subsystem.core.archive.TypeAttribute;
import org.apache.aries.subsystem.core.internal.BundleResource;
-import org.apache.aries.subsystem.core.internal.ResourceHelper;
import org.apache.aries.subsystem.core.internal.SubsystemIdentifier;
import org.apache.aries.subsystem.itests.util.TestRepository;
import org.apache.aries.subsystem.itests.util.Utils;
@@ -65,11 +65,14 @@ import org.eclipse.equinox.region.Region
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
+import org.ops4j.io.StreamUtils;
import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.CoreOptions;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.ops4j.pax.tinybundles.core.TinyBundles;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
@@ -78,7 +81,6 @@ import org.osgi.framework.FrameworkEvent
import org.osgi.framework.FrameworkListener;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.Version;
import org.osgi.framework.namespace.IdentityNamespace;
@@ -86,6 +88,7 @@ import org.osgi.framework.startlevel.Bun
import org.osgi.framework.startlevel.FrameworkStartLevel;
import org.osgi.framework.wiring.BundleRevision;
import org.osgi.framework.wiring.FrameworkWiring;
+import org.osgi.resource.Capability;
import org.osgi.resource.Resource;
import org.osgi.service.repository.Repository;
import org.osgi.service.repository.RepositoryContent;
@@ -96,7 +99,8 @@ import org.osgi.service.subsystem.Subsys
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
public abstract class SubsystemTest extends AbstractIntegrationTest {
- protected static boolean createdApplications = false;
+ private static final String SUBSYSTEM_CORE_NAME = "org.apache.aries.subsystem.core";
+ protected static boolean createdApplications = false;
boolean installModeler = true;
public SubsystemTest() {
@@ -106,103 +110,6 @@ public abstract class SubsystemTest exte
this.installModeler = installModeller;
}
- protected static class SubsystemEventHandler implements ServiceListener {
- private static class ServiceEventInfo {
- private final ServiceEvent event;
- private final long id;
- private final State state;
- private final String symbolicName;
- private final String type;
- private final Version version;
-
- public ServiceEventInfo(ServiceEvent event) {
- id = (Long)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_ID_PROPERTY);
- state = (State)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_STATE_PROPERTY);
- symbolicName = (String)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME_PROPERTY);
- type = (String)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_TYPE_PROPERTY);
- version = (Version)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_VERSION_PROPERTY);
- this.event = event;
- }
-
- public int getEventType() {
- return event.getType();
- }
-
- public long getId() {
- return id;
- }
-
- public State getState() {
- return state;
- }
-
- public String getSymbolicName() {
- return symbolicName;
- }
-
- public String getType() {
- return type;
- }
-
- public Version getVersion() {
- return version;
- }
- }
-
- private final Map<Long, List<ServiceEventInfo>> subsystemIdToEvents = new HashMap<Long, List<ServiceEventInfo>>();
-
- public void clear() {
- synchronized (subsystemIdToEvents) {
- subsystemIdToEvents.clear();
- }
- }
-
- public ServiceEventInfo poll(long subsystemId) throws InterruptedException {
- return poll(subsystemId, 0);
- }
-
- public ServiceEventInfo poll(long subsystemId, long timeout) throws InterruptedException {
- List<ServiceEventInfo> events;
- synchronized (subsystemIdToEvents) {
- events = subsystemIdToEvents.get(subsystemId);
- if (events == null) {
- events = new ArrayList<ServiceEventInfo>();
- subsystemIdToEvents.put(subsystemId, events);
- }
- }
- synchronized (events) {
- if (events.isEmpty()) {
- events.wait(timeout);
- if (events.isEmpty()) {
- return null;
- }
- }
- return events.remove(0);
- }
- }
-
- public void serviceChanged(ServiceEvent event) {
- Long subsystemId = (Long)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_ID_PROPERTY);
- synchronized (subsystemIdToEvents) {
- List<ServiceEventInfo> events = subsystemIdToEvents.get(subsystemId);
- if (events == null) {
- events = new ArrayList<ServiceEventInfo>();
- subsystemIdToEvents.put(subsystemId, events);
- }
- synchronized (events) {
- events.add(new ServiceEventInfo(event));
- events.notify();
- }
- }
- }
-
- public int size() {
- synchronized (subsystemIdToEvents) {
- return subsystemIdToEvents.size();
- }
- }
- }
-
public Option baseOptions() {
String localRepo = getLocalRepo();
return composite(
@@ -216,8 +123,8 @@ public abstract class SubsystemTest exte
@Configuration
public Option[] configuration() throws Exception {
- // The itests need private packages from the core subsystems bundle.
- InputStream fragment = SubsystemTest.class.getClassLoader().getResourceAsStream("core.fragment/core.fragment.jar");
+ new File("target").mkdirs();
+ init();
return new Option[] {
baseOptions(),
systemProperty("org.osgi.framework.bsnversion").value("multiple"),
@@ -225,13 +132,10 @@ public abstract class SubsystemTest exte
mavenBundle("org.apache.aries", "org.apache.aries.util").versionAsInProject(),
mavenBundle("org.apache.aries.application", "org.apache.aries.application.utils").versionAsInProject(),
mavenBundle("org.apache.aries.application", "org.apache.aries.application.api").versionAsInProject(),
- when(installModeler).useOptions(
- mavenBundle("org.apache.aries.application", "org.apache.aries.application.modeller").versionAsInProject(),
- mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint").versionAsInProject(),
- mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy").versionAsInProject()),
+ when(installModeler).useOptions(modelerBundles()),
mavenBundle("org.apache.aries.subsystem", "org.apache.aries.subsystem.api").versionAsInProject(),
- streamBundle(fragment).noStart(),
- mavenBundle("org.apache.aries.subsystem", "org.apache.aries.subsystem.core").versionAsInProject(),
+ mavenBundle("org.apache.aries.subsystem", SUBSYSTEM_CORE_NAME).versionAsInProject(),
+ streamBundle(createCoreFragment()).noStart(),
mavenBundle("org.apache.aries.subsystem", "org.apache.aries.subsystem.itest.interfaces").versionAsInProject(),
mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),
mavenBundle("org.apache.felix", "org.apache.felix.resolver").versionAsInProject(),
@@ -245,10 +149,35 @@ public abstract class SubsystemTest exte
// org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption("-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777"),
};
}
+
+ protected void init() throws Exception {
+
+ }
+
+ private Option modelerBundles() {
+ return CoreOptions.composite(
+ mavenBundle("org.apache.aries.application", "org.apache.aries.application.modeller").versionAsInProject(),
+ mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint").versionAsInProject(),
+ mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy").versionAsInProject());
+ }
+
+ /**
+ * The itests need private packages from the core subsystems bundle.
+ * So this fragment exports them.
+ * @return stream containing the fragment
+ */
+ private InputStream createCoreFragment() {
+ return TinyBundles.bundle()
+ .set("Bundle-SymbolicName", SUBSYSTEM_CORE_NAME + ".fragment")
+ .set("Export-Package", "org.apache.aries.subsystem.core.internal,org.apache.aries.subsystem.core.archive")
+ .set("Fragment-Host", SUBSYSTEM_CORE_NAME)
+ .build();
+ }
protected final SubsystemEventHandler subsystemEvents = new SubsystemEventHandler();
- protected Collection<ServiceRegistration> serviceRegistrations = new ArrayList<ServiceRegistration>();
+ @SuppressWarnings("rawtypes")
+ protected Collection<ServiceRegistration> serviceRegistrations = new ArrayList<ServiceRegistration>();
@Before
public void setUp() throws Exception {
@@ -256,18 +185,14 @@ public abstract class SubsystemTest exte
createApplications();
createdApplications = true;
}
- try {
- bundleContext.getBundle(0).getBundleContext().addServiceListener(subsystemEvents, '(' + Constants.OBJECTCLASS + '=' + Subsystem.class.getName() + ')');
- }
- catch (InvalidSyntaxException e) {
- fail("Invalid filter: " + e.getMessage());
- }
- assertSubsystemNotNull(getRootSubsystem());
+ bundleContext.getBundle(0).getBundleContext().addServiceListener(subsystemEvents, '(' + Constants.OBJECTCLASS + '=' + Subsystem.class.getName() + ')');
}
- protected abstract void createApplications() throws Exception;
+ protected void createApplications() throws Exception {
+ }
- @After
+ @SuppressWarnings("rawtypes")
+ @After
public void tearDown() throws Exception
{
bundleContext.removeServiceListener(subsystemEvents);
@@ -356,20 +281,6 @@ public abstract class SubsystemTest exte
assertEquals("Wrong number of constituents", size, subsystem.getConstituents().size());
}
- protected void assertDirectory(Subsystem subsystem) {
- Bundle bundle = getSubsystemCoreBundle();
- File file = bundle.getDataFile("subsystem" + subsystem.getSubsystemId());
- assertNotNull("Subsystem data file was null", file);
- assertTrue("Subsystem data file does not exist", file.exists());
- }
-
- protected void assertNotDirectory(Subsystem subsystem) {
- Bundle bundle = getSubsystemCoreBundle();
- File file = bundle.getDataFile("subsystem" + subsystem.getSubsystemId());
- assertNotNull("Subsystem data file was null", file);
- assertFalse("Subsystem data file exists", file.exists());
- }
-
protected void assertEvent(Subsystem subsystem, Subsystem.State state) throws InterruptedException {
assertEvent(subsystem, state, 0);
}
@@ -725,15 +636,39 @@ public abstract class SubsystemTest exte
return null;
}
- protected Resource getConstituent(Subsystem subsystem, String symbolicName, Version version, String type) {
+ public static Object getIdentityAttribute(Resource resource, String name) {
+ List<Capability> capabilities = resource.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE);
+ Capability capability = capabilities.get(0);
+ return capability.getAttributes().get(name);
+ }
+
+ public static String getSymbolicNameAttribute(Resource resource) {
+ return (String)getIdentityAttribute(resource, IdentityNamespace.IDENTITY_NAMESPACE);
+ }
+
+ public static Version getVersionAttribute(Resource resource) {
+ Version result = (Version)getIdentityAttribute(resource, IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE);
+ if (result == null)
+ result = Version.emptyVersion;
+ return result;
+ }
+
+ public static String getTypeAttribute(Resource resource) {
+ String result = (String)getIdentityAttribute(resource, IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE);
+ if (result == null)
+ result = TypeAttribute.DEFAULT_VALUE;
+ return result;
+ }
+
+ protected Resource getConstituent(Subsystem subsystem, String symbolicName, Version version, String type) {
for (Resource resource : subsystem.getConstituents()) {
- if (symbolicName.equals(ResourceHelper.getSymbolicNameAttribute(resource))) {
+ if (symbolicName.equals(getSymbolicNameAttribute(resource))) {
if (version == null)
version = Version.emptyVersion;
- if (version.equals(ResourceHelper.getVersionAttribute(resource))) {
+ if (version.equals(getVersionAttribute(resource))) {
if (type == null)
type = IdentityNamespace.TYPE_BUNDLE;
- if (type.equals(ResourceHelper.getTypeAttribute(resource))) {
+ if (type.equals(getTypeAttribute(resource))) {
return resource;
}
}
@@ -813,7 +748,7 @@ public abstract class SubsystemTest exte
}
protected Bundle getSubsystemCoreBundle() {
- return context().getBundleByName("org.apache.aries.subsystem.core");
+ return context().getBundleByName(SUBSYSTEM_CORE_NAME);
}
protected Bundle installBundleFromFile(String fileName) throws FileNotFoundException, BundleException {
@@ -1014,7 +949,16 @@ public abstract class SubsystemTest exte
}
}
- protected static void write(String file, ArchiveFixture.AbstractFixture fixture) throws IOException
+ protected void writeToFile(InputStream is, String name) {
+ try {
+ FileOutputStream dest = new FileOutputStream(name);
+ StreamUtils.copyStream(is, dest, true);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected static void write(String file, ArchiveFixture.AbstractFixture fixture) throws IOException
{
write(new File(file), fixture);
}
@@ -1029,24 +973,23 @@ public abstract class SubsystemTest exte
}
}
- static void createApplication(String name, String ... content) throws Exception
+ static void createApplication(String name, String ... contents) throws Exception
{
- ZipFixture feature = ArchiveFixture
+ ClassLoader cl = SubsystemTest.class.getClassLoader();
+ ZipFixture feature = ArchiveFixture
.newZip()
.binary("OSGI-INF/SUBSYSTEM.MF",
// The following input stream is closed by ArchiveFixture.copy.
- SubsystemTest.class.getClassLoader().getResourceAsStream(
- name + "/OSGI-INF/SUBSYSTEM.MF"));
- for (String s : content) {
+ cl.getResourceAsStream(name + "/OSGI-INF/SUBSYSTEM.MF"));
+ for (String content : contents) {
try {
- feature.binary(s,
+ feature.binary(content,
// The following input stream is closed by ArchiveFixture.copy.
- SubsystemTest.class.getClassLoader().getResourceAsStream(
- name + '/' + s));
+ cl.getResourceAsStream(name + '/' + content));
}
catch (Exception e) {
// The following input stream is closed by ArchiveFixture.copy.
- feature.binary(s, new FileInputStream(new File(s)));
+ feature.binary(content, new FileInputStream(new File(content)));
}
}
feature.end();
@@ -1064,79 +1007,12 @@ public abstract class SubsystemTest exte
return location;
}
- protected static final byte[] EMPTY_CLASS = new byte[] {
- (byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x32,
- (byte)0x00, (byte)0x12, (byte)0x07, (byte)0x00,
- (byte)0x02, (byte)0x01, (byte)0x00, (byte)0x05,
- (byte)0x45, (byte)0x6d, (byte)0x70, (byte)0x74,
- (byte)0x79, (byte)0x07, (byte)0x00, (byte)0x04,
- (byte)0x01, (byte)0x00, (byte)0x10, (byte)0x6a,
- (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f,
- (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67,
- (byte)0x2f, (byte)0x4f, (byte)0x62, (byte)0x6a,
- (byte)0x65, (byte)0x63, (byte)0x74, (byte)0x07,
- (byte)0x00, (byte)0x06, (byte)0x01, (byte)0x00,
- (byte)0x14, (byte)0x6a, (byte)0x61, (byte)0x76,
- (byte)0x61, (byte)0x2f, (byte)0x69, (byte)0x6f,
- (byte)0x2f, (byte)0x53, (byte)0x65, (byte)0x72,
- (byte)0x69, (byte)0x61, (byte)0x6c, (byte)0x69,
- (byte)0x7a, (byte)0x61, (byte)0x62, (byte)0x6c,
- (byte)0x65, (byte)0x01, (byte)0x00, (byte)0x06,
- (byte)0x3c, (byte)0x69, (byte)0x6e, (byte)0x69,
- (byte)0x74, (byte)0x3e, (byte)0x01, (byte)0x00,
- (byte)0x03, (byte)0x28, (byte)0x29, (byte)0x56,
- (byte)0x01, (byte)0x00, (byte)0x04, (byte)0x43,
- (byte)0x6f, (byte)0x64, (byte)0x65, (byte)0x0a,
- (byte)0x00, (byte)0x03, (byte)0x00, (byte)0x0b,
- (byte)0x0c, (byte)0x00, (byte)0x07, (byte)0x00,
- (byte)0x08, (byte)0x01, (byte)0x00, (byte)0x0f,
- (byte)0x4c, (byte)0x69, (byte)0x6e, (byte)0x65,
- (byte)0x4e, (byte)0x75, (byte)0x6d, (byte)0x62,
- (byte)0x65, (byte)0x72, (byte)0x54, (byte)0x61,
- (byte)0x62, (byte)0x6c, (byte)0x65, (byte)0x01,
- (byte)0x00, (byte)0x12, (byte)0x4c, (byte)0x6f,
- (byte)0x63, (byte)0x61, (byte)0x6c, (byte)0x56,
- (byte)0x61, (byte)0x72, (byte)0x69, (byte)0x61,
- (byte)0x62, (byte)0x6c, (byte)0x65, (byte)0x54,
- (byte)0x61, (byte)0x62, (byte)0x6c, (byte)0x65,
- (byte)0x01, (byte)0x00, (byte)0x04, (byte)0x74,
- (byte)0x68, (byte)0x69, (byte)0x73, (byte)0x01,
- (byte)0x00, (byte)0x07, (byte)0x4c, (byte)0x45,
- (byte)0x6d, (byte)0x70, (byte)0x74, (byte)0x79,
- (byte)0x3b, (byte)0x01, (byte)0x00, (byte)0x0a,
- (byte)0x53, (byte)0x6f, (byte)0x75, (byte)0x72,
- (byte)0x63, (byte)0x65, (byte)0x46, (byte)0x69,
- (byte)0x6c, (byte)0x65, (byte)0x01, (byte)0x00,
- (byte)0x0a, (byte)0x45, (byte)0x6d, (byte)0x70,
- (byte)0x74, (byte)0x79, (byte)0x2e, (byte)0x6a,
- (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x00,
- (byte)0x21, (byte)0x00, (byte)0x01, (byte)0x00,
- (byte)0x03, (byte)0x00, (byte)0x01, (byte)0x00,
- (byte)0x05, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x01, (byte)0x00, (byte)0x01, (byte)0x00,
- (byte)0x07, (byte)0x00, (byte)0x08, (byte)0x00,
- (byte)0x01, (byte)0x00, (byte)0x09, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x2f, (byte)0x00,
- (byte)0x01, (byte)0x00, (byte)0x01, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x05, (byte)0x2a,
- (byte)0xb7, (byte)0x00, (byte)0x0a, (byte)0xb1,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x02,
- (byte)0x00, (byte)0x0c, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x01,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x04,
- (byte)0x00, (byte)0x0d, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x0c, (byte)0x00, (byte)0x01,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x05,
- (byte)0x00, (byte)0x0e, (byte)0x00, (byte)0x0f,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
- (byte)0x00, (byte)0x10, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x11
- };
-
- protected static void createEmptyClass() throws IOException {
- FileOutputStream fos = new FileOutputStream("Empty.class");
- fos.write(EMPTY_CLASS);
- fos.close();
+ protected InputStream getResource(String path) {
+ InputStream is = this.getClass().getClassLoader().getResourceAsStream(path);
+ if (is == null) {
+ throw new IllegalArgumentException("No resource found at path " + path);
+ }
+ return is;
}
+
}
Copied: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/bundles/blueprint/BPHelloImpl.java (from r1629842, aries/trunk/subsystem/subsystem-itests/src/test/bundles/blueprint/org/apache/aries/subsystem/itests/blueprint/BPHelloImpl.java)
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/bundles/blueprint/BPHelloImpl.java?p2=aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/bundles/blueprint/BPHelloImpl.java&p1=aries/trunk/subsystem/subsystem-itests/src/test/bundles/blueprint/org/apache/aries/subsystem/itests/blueprint/BPHelloImpl.java&r1=1629842&r2=1629971&rev=1629971&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/bundles/blueprint/org/apache/aries/subsystem/itests/blueprint/BPHelloImpl.java (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/bundles/blueprint/BPHelloImpl.java Tue Oct 7 19:52:17 2014
@@ -12,7 +12,7 @@
* limitations under the License.
*/
-package org.apache.aries.subsystem.itests.blueprint;
+package org.apache.aries.subsystem.itests.bundles.blueprint;
import org.apache.aries.subsystem.itests.hello.api.Hello;
Copied: aries/trunk/subsystem/subsystem-itests/src/test/resources/blueprint/OSGI-INF/blueprint/blueprint.xml (from r1629842, aries/trunk/subsystem/subsystem-itests/src/test/resources/OSGI-INF/blueprint/blueprint.xml)
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/resources/blueprint/OSGI-INF/blueprint/blueprint.xml?p2=aries/trunk/subsystem/subsystem-itests/src/test/resources/blueprint/OSGI-INF/blueprint/blueprint.xml&p1=aries/trunk/subsystem/subsystem-itests/src/test/resources/OSGI-INF/blueprint/blueprint.xml&r1=1629842&r2=1629971&rev=1629971&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/resources/OSGI-INF/blueprint/blueprint.xml (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/resources/blueprint/OSGI-INF/blueprint/blueprint.xml Tue Oct 7 19:52:17 2014
@@ -15,7 +15,7 @@
License.
-->
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
- <bean id="helloBP" class="org.apache.aries.subsystem.itests.blueprint.BPHelloImpl"
+ <bean id="helloBP" class="org.apache.aries.subsystem.itests.bundles.blueprint.BPHelloImpl"
init-method="init">
<property name="message" value="messageFromBlueprint"/>
<property name="initMessage" value="BPHelloImpl init method invoked"/>