You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by jw...@apache.org on 2012/02/10 00:14:15 UTC
svn commit: r1242600 - in /aries/trunk/subsystem:
subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/
subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/
subsystem-core/src/main/java/org/apache/aries/subsystem/core/...
Author: jwross
Date: Thu Feb 9 23:14:14 2012
New Revision: 1242600
URL: http://svn.apache.org/viewvc?rev=1242600&view=rev
Log:
ARIES-825: Update subsystems to latest Subsystem, Resolver, and Repository APIs.
Initial support for region context bundle.
Added:
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/BasicRequirement.java
Removed:
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RootSubsystem.java
aries/trunk/subsystem/subsystem-itests/src/test/resources/feature3/tb3.jar
Modified:
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemArchive.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemFileResource.java
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/RootSubsystemTest.java
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java?rev=1242600&r1=1242599&r2=1242600&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java Thu Feb 9 23:14:14 2012
@@ -64,7 +64,7 @@ public class DeploymentManifest extends
resources.add(resource);
}
// TODO This does not validate that all content bundles were found.
- Map<Resource, List<Wire>> resolution = Activator.getInstance().getServiceProvider().getService(Resolver.class).resolve(environment, resources, Collections.EMPTY_LIST);
+ Map<Resource, List<Wire>> resolution = Activator.getInstance().getServiceProvider().getService(Resolver.class).resolve(environment, new ArrayList<Resource>(resources), Collections.EMPTY_LIST);
// TODO Once we have a resolver that actually returns lists of wires, we can use them to compute other manifest headers such as Import-Package.
Collection<Resource> deployedContent = new HashSet<Resource>();
Collection<Resource> provisionResource = new HashSet<Resource>();
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemArchive.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemArchive.java?rev=1242600&r1=1242599&r2=1242600&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemArchive.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemArchive.java Thu Feb 9 23:14:14 2012
@@ -335,7 +335,8 @@ public class SubsystemArchive implements
OutputStream out = new FileOutputStream(file);
try {
dataFile.write(out);
- resources.remove(old);
+ if (old != null)
+ resources.remove(old);
resources.put(dataFile, file.toURI().toURL());
} finally {
out.close();
@@ -354,7 +355,8 @@ public class SubsystemArchive implements
OutputStream out = new FileOutputStream(file);
try {
manifest.write(out);
- resources.remove(old);
+ if (old != null)
+ resources.remove(old);
resources.put(manifest, file.toURI().toURL());
} finally {
out.close();
@@ -373,7 +375,8 @@ public class SubsystemArchive implements
OutputStream out = new FileOutputStream(file);
try {
manifest.write(out);
- resources.remove(old);
+ if (old != null)
+ resources.remove(old);
resources.put(manifest, file.toURI().toURL());
}
finally {
@@ -387,17 +390,17 @@ public class SubsystemArchive implements
return new SubsystemArchive(file);
if (file.getName().endsWith(".jar"))
return BundleResource.newInstance(file.toURI().toURL());
- else if (!file.getName().startsWith("subsystem") && file.getName().endsWith(".ssa"))
+ if (!file.getName().startsWith("subsystem") && file.getName().endsWith(".ssa"))
return new SubsystemFileResource(file);
- else if (file.getName().endsWith("SUBSYSTEM.MF"))
+ if (file.getName().endsWith("SUBSYSTEM.MF"))
return new SubsystemManifest(file);
- else if (file.getName().endsWith("DEPLOYMENT.MF"))
+ if (file.getName().endsWith("DEPLOYMENT.MF"))
return new DeploymentManifest(file);
- else if (file.getName().endsWith(DataFile.IDENTITY_TYPE))
+ if (file.getName().endsWith(DataFile.IDENTITY_TYPE))
return new DataFile(file);
- else if (file.getName().endsWith(StaticDataFile.IDENTITY_TYPE))
+ if (file.getName().endsWith(StaticDataFile.IDENTITY_TYPE))
return new StaticDataFile(file);
- logger.warn("Ignoring unsupported resource type: " + file.getCanonicalPath());
+ logger.warn("Ignoring unsupported resource type: " + file.getAbsolutePath());
return null;
}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java?rev=1242600&r1=1242599&r2=1242600&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java Thu Feb 9 23:14:14 2012
@@ -78,7 +78,7 @@ import org.osgi.service.subsystem.Subsys
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class AriesSubsystem implements Subsystem, Resource, RepositoryContent {
+public class AriesSubsystem implements Subsystem, Resource {
public static final String ROOT_SYMBOLIC_NAME = "org.osgi.service.subsystem.root";
public static final Version ROOT_VERSION = Version.parseVersion("1.0.0");
public static final String ROOT_LOCATION = "subsystem://?"
@@ -331,63 +331,18 @@ public class AriesSubsystem implements S
this.parents.add(parent);
id = data.getSubsystemId();
String directoryName = "subsystem" + id;
-// String fileName = directoryName + ".ssa";
directory = new File(parent.directory, directoryName);
-// if (!directory.mkdir())
-// throw new IOException("Unable to make directory for "
-// + directory.getCanonicalPath());
-// File zipFile = new File(directory, fileName);
-// try {
-// copyContent(content, zipFile);
-// unzipContent(zipFile);
-// archive = new SubsystemArchive(directory);
-// } catch (Exception e) {
-// deleteFile(directory);
-// deleteFile(zipFile);
-// throw new SubsystemException(e);
-// }
environment = new SubsystemEnvironment(this);
-// if (archive.getSubsystemManifest() == null) {
-// // TODO Since it's optional to use the subsystem URI, it might be
-// // better to create the URI in a try/catch block and throw an
-// // exception with a message indicating we received a subsystem
-// // with no manifest and no subsystem URI.
-// archive.setSubsystemManifest(SubsystemManifest.newInstance(
-// uri.getSymbolicName(), uri.getVersion(),
-// archive.getResources()));
-// // TODO If the subsystem manifest is not null, need to provide
-// // default headers if subsystem URI was used.
-// }
region = createRegion(data.getRegionName());
}
-// public AriesSubsystem(File content, AriesSubsystem parent) throws Exception {
-// // Create a non-root, persisted subsystem.
-// if (!content.isDirectory())
-// throw new IllegalArgumentException(content.getCanonicalPath());
-// this.parents.add(parent);
-// directory = content;
-// // TODO The following call leads to a potentially dangerous escaping 'this' reference to this subsystem
-// // (as the parent) if there is an embedded subsystem archive within this subsystem's archive.
-// // Need to investigate.
-// archive = new SubsystemArchive(directory);
-// environment = new SubsystemEnvironment(this);
-// DataFile data = archive.getDataFile();
-// id = data.getSubsystemId();
-// location = data.getLocation();
-// ServiceProvider sp = Activator.getInstance().getServiceProvider();
-// RegionDigraph digraph = sp.getService(RegionDigraph.class);
-// region = digraph.getRegion(data.getRegionName());
-// }
-
public SubsystemArchive getArchive() {
return archive;
}
@Override
public BundleContext getBundleContext() {
- // TODO Auto-generated method stub
- return null;
+ return region.getBundle(RegionContextBundleHelper.SYMBOLICNAME_PREFIX + id, RegionContextBundleHelper.VERSION).getBundleContext();
}
@Override
@@ -403,35 +358,16 @@ public class AriesSubsystem implements S
}
@Override
- public Collection<Resource> getConstituents() {
- /*
- * TODO The definition of constituents needs to be worked out from both a design and implementation perspective.
- * (1) In general, any Resource type except for osgi.subsystem.
- * (2) A transitive dependency if this is the root subsystem or provision-policy:=acceptTransitive.
- * (3) A content Resource of this subsystem if the Resource is not also a subsystem (also, doesn't apply to
- * the root subsystem since it has no content resources).
- * (4) A bundle Resource installed into a region by means other than the subsystem API (primarily for the
- * root subsystem which shares the kernel region but could apply to any subsystem).
- * (5) Caution with 4: this does not include feature content resources installed into a non-feature subsystem region.
- * These are constituents of the feature itself.
- */
- if (isRoot()) {
- // TODO This does not take into account the possibility that resource types other than bundle became part of the root subsystem.
+ public synchronized Collection<Resource> getConstituents() {
+ Collection<Resource> resources = new ArrayList<Resource>();
+ if (isRoot() || isApplication() || isComposite()) {
Set<Long> bundleIds = region.getBundleIds();
- Collection<Resource> resources = new ArrayList<Resource>(bundleIds.size());
BundleContext context = Activator.getInstance().getBundleContext();
for (Long bundleId : bundleIds)
resources.add(context.getBundle(bundleId).adapt(BundleRevision.class));
- return resources;
}
- return Collections.unmodifiableCollection(constituents);
- }
-
- @Override
- public InputStream getContent() throws IOException {
- // TODO Assumes original archive location remains valid. Might want to
- // copy zipped archive to subsystem directory as well as extracted contents.
- return new URL(location).openStream();
+ resources.addAll(constituents);
+ return Collections.unmodifiableCollection(resources);
}
@Override
@@ -717,7 +653,8 @@ public class AriesSubsystem implements S
return region;
}
- void install() throws Exception {
+ synchronized void install() throws Exception {
+ RegionContextBundleHelper.installRegionContextBundle(this);
Activator.getInstance().getSubsystemServiceRegistrar().register(this);
List<Resource> contentResources = new ArrayList<Resource>();
List<Resource> transitiveDependencies = new ArrayList<Resource>();
Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java?rev=1242600&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java (added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java Thu Feb 9 23:14:14 2012
@@ -0,0 +1,65 @@
+package org.apache.aries.subsystem.core.internal;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.jar.Attributes;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+public class RegionContextBundleHelper {
+ public static final String SYMBOLICNAME_PREFIX = "org.osgi.service.subsystem.region.context.";
+ public static final Version VERSION = Version.parseVersion("1.0.0");
+
+ public static void installRegionContextBundle(AriesSubsystem subsystem) throws BundleException, IOException {
+ String symbolicName = SYMBOLICNAME_PREFIX + subsystem.getSubsystemId();
+ String location = subsystem.getLocation() + '/' + subsystem.getSubsystemId();
+ Bundle b = subsystem.getRegion().getBundle(symbolicName, VERSION);
+ if (b != null)
+ return;
+ Bundle t = subsystem.getRegion().installBundle(location + "/temp", createTempBundle(symbolicName));
+ try {
+ t.start();
+ b = t.getBundleContext().installBundle(location, createRegionContextBundle(symbolicName));
+ }
+ finally {
+ try {
+ t.uninstall();
+ }
+ catch (BundleException e) {}
+ }
+ b.start(Bundle.START_TRANSIENT);
+ }
+
+ private static InputStream createRegionContextBundle(String symbolicName) throws IOException {
+ Manifest manifest = createManifest(symbolicName);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ JarOutputStream jos = new JarOutputStream(baos, manifest);
+ jos.close();
+ return new ByteArrayInputStream(baos.toByteArray());
+ }
+
+ private static Manifest createManifest(String symbolicName) {
+ Manifest manifest = new Manifest();
+ manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
+ manifest.getMainAttributes().putValue(Constants.BUNDLE_SYMBOLICNAME, symbolicName);
+ manifest.getMainAttributes().putValue(Constants.BUNDLE_VERSION, VERSION.toString());
+ return manifest;
+ }
+
+ private static InputStream createTempBundle(String symbolicName) throws IOException {
+ Manifest manifest = new Manifest();
+ manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
+ manifest.getMainAttributes().putValue(Constants.BUNDLE_SYMBOLICNAME, symbolicName + ".temp");
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ JarOutputStream jos = new JarOutputStream(baos, manifest);
+ jos.close();
+ return new ByteArrayInputStream(baos.toByteArray());
+ }
+}
Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/BasicRequirement.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/BasicRequirement.java?rev=1242600&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/BasicRequirement.java (added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/BasicRequirement.java Thu Feb 9 23:14:14 2012
@@ -0,0 +1,54 @@
+package org.apache.aries.subsystem.core.resource;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.resource.Resource;
+
+public class BasicRequirement extends AbstractRequirement {
+ private final Map<String, Object> attributes;
+ private final Map<String, String> directives;
+ private final String namespace;
+ private final Resource resource;
+
+ public BasicRequirement(String namespace, String filter) throws InvalidSyntaxException {
+ this(namespace, FrameworkUtil.createFilter(filter));
+ }
+
+ public BasicRequirement(String namespace, Filter filter) {
+ if (namespace == null)
+ throw new NullPointerException("Missing required parameter: namespace");
+ attributes = Collections.emptyMap();
+ Map<String, String> directives = new HashMap<String, String>(1);
+ directives.put(Constants.FILTER_DIRECTIVE, filter.toString());
+ this.directives = Collections.unmodifiableMap(directives);
+ this.namespace = namespace;
+ resource = null;
+ }
+
+ @Override
+ public Map<String, Object> getAttributes() {
+ return attributes;
+ }
+
+ @Override
+ public Map<String, String> getDirectives() {
+ return directives;
+ }
+
+ @Override
+ public String getNamespace() {
+ return namespace;
+ }
+
+ @Override
+ public Resource getResource() {
+ return resource;
+ }
+
+}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemFileResource.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemFileResource.java?rev=1242600&r1=1242599&r2=1242600&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemFileResource.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemFileResource.java Thu Feb 9 23:14:14 2012
@@ -10,7 +10,6 @@ import java.util.List;
import java.util.jar.Manifest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import java.util.zip.ZipInputStream;
import org.apache.aries.subsystem.core.archive.SubsystemSymbolicNameHeader;
import org.apache.aries.subsystem.core.internal.OsgiIdentityCapability;
Modified: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/RootSubsystemTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/RootSubsystemTest.java?rev=1242600&r1=1242599&r2=1242600&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/RootSubsystemTest.java (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/RootSubsystemTest.java Thu Feb 9 23:14:14 2012
@@ -6,6 +6,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.Version;
import org.osgi.service.subsystem.Subsystem;
@@ -25,6 +26,14 @@ public class RootSubsystemTest extends S
}
@Test
+ public void testRegionContextBundle() throws BundleException {
+ assertRegionContextBundle(getRootSubsystem());
+ getSubsystemCoreBundle().stop();
+ getSubsystemCoreBundle().start();
+ assertRegionContextBundle(getRootSubsystem());
+ }
+
+ @Test
public void testServiceEventsFresh() throws Exception {
Subsystem root = getRootSubsystem();
Bundle core = getSubsystemCoreBundle();
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=1242600&r1=1242599&r2=1242600&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 Thu Feb 9 23:14:14 2012
@@ -43,6 +43,7 @@ import org.apache.felix.bundlerepository
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.container.def.PaxRunnerOptions;
import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceEvent;
@@ -50,6 +51,7 @@ import org.osgi.framework.ServiceListene
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.Version;
import org.osgi.framework.resource.Resource;
+import org.osgi.framework.resource.ResourceConstants;
import org.osgi.service.repository.Repository;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.service.subsystem.Subsystem.State;
@@ -316,6 +318,17 @@ public abstract class SubsystemTest exte
fail("Parent did not exist: " + expected.getSymbolicName());
}
+ protected void assertRegionContextBundle(Subsystem s) {
+ BundleContext bc = s.getBundleContext();
+ assertNotNull("No region context bundle", bc);
+ Bundle b = bc.getBundle();
+ assertEquals("Not active", Bundle.ACTIVE, b.getState());
+ assertEquals("Wrong location", s.getLocation() + '/' + s.getSubsystemId(), b.getLocation());
+ assertEquals("Wrong symbolic name", "org.osgi.service.subsystem.region.context." + s.getSubsystemId(), b.getSymbolicName());
+ assertEquals("Wrong version", Version.parseVersion("1.0.0"), b.getVersion());
+ assertConstituent(s, "org.osgi.service.subsystem.region.context." + s.getSubsystemId(), Version.parseVersion("1.0.0"), ResourceConstants.IDENTITY_TYPE_BUNDLE);
+ }
+
protected void assertState(State expected, State actual) {
assertState(EnumSet.of(expected), actual);
}