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/03/19 22:40:16 UTC
svn commit: r1302667 - in
/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core:
internal/AriesSubsystem.java resource/SubsystemFileResource.java
resource/SubsystemStreamResource.java
Author: jwross
Date: Mon Mar 19 21:40:15 2012
New Revision: 1302667
URL: http://svn.apache.org/viewvc?rev=1302667&view=rev
Log:
ARIES-825: Update subsystems to latest Subsystem, Resolver, and Repository APIs.
(1) Fixed NPE in SubsystemStreamResource when no subsystem manifest exists.
(2) Reduced nested exceptions when starting a subsystem fails.
(3) Added initial support for capabilities and requirements on subsystem resources.
Modified:
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-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemStreamResource.java
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=1302667&r1=1302666&r2=1302667&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 Mon Mar 19 21:40:15 2012
@@ -585,18 +585,19 @@ public class AriesSubsystem implements S
startResource(resource, coordination);
}
setState(State.ACTIVE);
- } catch (Exception e) {
- coordination.fail(e);
+ } catch (Throwable t) {
+ coordination.fail(t);
// TODO Need to reinstate complete isolation by disconnecting the
// region and transition to INSTALLED.
} finally {
try {
coordination.end();
} catch (CoordinationException e) {
- LOGGER.error(
- "An error occurred while starting a resource in subsystem "
- + this, e);
setState(State.RESOLVED);
+ Throwable t = e.getCause();
+ if (t instanceof SubsystemException)
+ throw (SubsystemException)t;
+ throw new SubsystemException(t);
}
}
}
@@ -1044,9 +1045,12 @@ public class AriesSubsystem implements S
// TODO Could avoid calling setState (and notifyAll) here and
// avoid the need for a lock.
setState(State.RESOLVED);
- } catch (Exception e) {
+ }
+ catch (Throwable t) {
setState(State.INSTALLED);
- throw new SubsystemException(e);
+ if (t instanceof SubsystemException)
+ throw (SubsystemException)t;
+ throw new SubsystemException(t);
}
}
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=1302667&r1=1302666&r2=1302667&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 Mon Mar 19 21:40:15 2012
@@ -7,17 +7,21 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Map.Entry;
import java.util.jar.Manifest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.aries.subsystem.core.archive.Header;
+import org.apache.aries.subsystem.core.archive.HeaderFactory;
+import org.apache.aries.subsystem.core.archive.SubsystemManifest;
import org.apache.aries.subsystem.core.archive.SubsystemSymbolicNameHeader;
+import org.apache.aries.subsystem.core.archive.SubsystemTypeHeader;
+import org.apache.aries.subsystem.core.archive.SubsystemVersionHeader;
import org.apache.aries.subsystem.core.internal.OsgiIdentityCapability;
import org.apache.aries.util.filesystem.FileSystem;
import org.apache.aries.util.filesystem.IDirectory;
import org.apache.aries.util.manifest.ManifestProcessor;
-import org.osgi.framework.Version;
-import org.osgi.framework.namespace.IdentityNamespace;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
@@ -32,6 +36,7 @@ public class SubsystemFileResource imple
private final IDirectory directory;
private final File file;
private final String location;
+ private final List<Requirement> requirements;
public SubsystemFileResource(File content) throws IOException {
file = content;
@@ -39,42 +44,56 @@ public class SubsystemFileResource imple
Manifest manifest = ManifestProcessor.obtainManifestFromAppDir(directory, "OSGI-INF/DEPLOYMENT.MF");
if (manifest == null)
manifest = ManifestProcessor.obtainManifestFromAppDir(directory, "OSGI-INF/SUBSYSTEM.MF");
- String symbolicName = null;
- Version version = Version.emptyVersion;
- String type = SubsystemConstants.SUBSYSTEM_TYPE_APPLICATION;
- if (manifest != null) {
- String value = manifest.getMainAttributes().getValue(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME);
- if (value != null)
- symbolicName = new SubsystemSymbolicNameHeader(value).getSymbolicName();
- value = manifest.getMainAttributes().getValue(SubsystemConstants.SUBSYSTEM_VERSION);
- if (value != null)
- version = Version.parseVersion(value);
- value = manifest.getMainAttributes().getValue(SubsystemConstants.SUBSYSTEM_TYPE);
- if (value != null)
- type = value;
- }
+
+ String symbolicName = manifest == null ? null : manifest.getMainAttributes().getValue(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME);
Matcher matcher = PATTERN.matcher(content.getName());
if (symbolicName == null) {
if (!matcher.matches())
throw new IllegalArgumentException("No symbolic name");
symbolicName = new SubsystemSymbolicNameHeader(matcher.group(1)).getSymbolicName();
}
- if (version == Version.emptyVersion && matcher.matches()) {
+ SubsystemManifest.Builder builder = new SubsystemManifest.Builder(symbolicName);
+ if (manifest != null)
+ for (Entry<Object, Object> entry : manifest.getMainAttributes().entrySet()) {
+ String key = String.valueOf(entry.getKey());
+ if (key.equals(SubsystemManifest.SUBSYSTEM_SYMBOLICNAME))
+ continue;
+ builder.header(HeaderFactory.createHeader(key, String.valueOf(entry.getValue())));
+ }
+ SubsystemManifest subsystemManifest = builder.build();
+ SubsystemVersionHeader version = SubsystemVersionHeader.DEFAULT;
+ SubsystemTypeHeader type = SubsystemTypeHeader.DEFAULT;
+ Header<?> value = subsystemManifest.getSubsystemVersionHeader();
+ if (value != null)
+ version = (SubsystemVersionHeader)value;
+ value = subsystemManifest.getSubsystemTypeHeader();
+ if (value != null)
+ type = (SubsystemTypeHeader)value;
+ if (version == SubsystemVersionHeader.DEFAULT && matcher.matches()) {
String group = matcher.group(2);
if (group != null)
- version = Version.parseVersion(group);
+ version = new SubsystemVersionHeader(group);
}
- List<Capability> capabilities = new ArrayList<Capability>(1);
- capabilities.add(new OsgiIdentityCapability(this, symbolicName, version, type));
+ List<Capability> capabilities;
+ List<Requirement> requirements;
+ capabilities = subsystemManifest.toCapabilities(this);
+ requirements = subsystemManifest.toRequirements(this);
+ capabilities.add(new OsgiIdentityCapability(this, symbolicName, version.getVersion(), type.getType()));
this.capabilities = Collections.unmodifiableList(capabilities);
- location = "subsystem://?" + SubsystemConstants.SUBSYSTEM_SYMBOLICNAME + '=' + symbolicName + '&' + SubsystemConstants.SUBSYSTEM_VERSION + '=' + version;
+ this.requirements = Collections.unmodifiableList(requirements);
+ location = "subsystem://?" + SubsystemConstants.SUBSYSTEM_SYMBOLICNAME + '=' + symbolicName + '&' + SubsystemConstants.SUBSYSTEM_VERSION + '=' + version.getVersion();
}
@Override
public List<Capability> getCapabilities(String namespace) {
- if (namespace == null || IdentityNamespace.IDENTITY_NAMESPACE.equals(namespace))
+ if (namespace == null)
return capabilities;
- return Collections.emptyList();
+ ArrayList<Capability> result = new ArrayList<Capability>(capabilities.size());
+ for (Capability capability : capabilities)
+ if (namespace.equals(capability.getNamespace()))
+ result.add(capability);
+ result.trimToSize();
+ return result;
}
@Override
@@ -93,6 +112,13 @@ public class SubsystemFileResource imple
@Override
public List<Requirement> getRequirements(String namespace) {
- return Collections.emptyList();
+ if (namespace == null)
+ return requirements;
+ ArrayList<Requirement> result = new ArrayList<Requirement>(requirements.size());
+ for (Requirement requirement : requirements)
+ if (namespace.equals(requirement.getNamespace()))
+ result.add(requirement);
+ result.trimToSize();
+ return result;
}
}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemStreamResource.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemStreamResource.java?rev=1302667&r1=1302666&r2=1302667&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemStreamResource.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/SubsystemStreamResource.java Mon Mar 19 21:40:15 2012
@@ -10,7 +10,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
-import java.util.jar.Attributes;
import java.util.jar.Manifest;
import org.apache.aries.subsystem.core.archive.Header;
@@ -64,20 +63,20 @@ public class SubsystemStreamResource imp
IOUtils.close(content);
}
Manifest manifest = ManifestProcessor.obtainManifestFromAppDir(directory, "OSGI-INF/SUBSYSTEM.MF");
- Attributes attributes = manifest.getMainAttributes();
- String symbolicName = attributes.getValue(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME);
+ String symbolicName = manifest == null ? null : manifest.getMainAttributes().getValue(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME);
if (symbolicName == null) {
if (uri == null)
throw new IllegalArgumentException("No symbolic name");
symbolicName = uri.getSymbolicName();
}
SubsystemManifest.Builder builder = new SubsystemManifest.Builder(symbolicName);
- for (Entry<Object, Object> entry : attributes.entrySet()) {
- String key = String.valueOf(entry.getKey());
- if (key.equals(SubsystemManifest.SUBSYSTEM_SYMBOLICNAME))
- continue;
- builder.header(HeaderFactory.createHeader(key, String.valueOf(entry.getValue())));
- }
+ if (manifest != null)
+ for (Entry<Object, Object> entry : manifest.getMainAttributes().entrySet()) {
+ String key = String.valueOf(entry.getKey());
+ if (key.equals(SubsystemManifest.SUBSYSTEM_SYMBOLICNAME))
+ continue;
+ builder.header(HeaderFactory.createHeader(key, String.valueOf(entry.getValue())));
+ }
SubsystemManifest subsystemManifest = builder.build();
SubsystemVersionHeader version = SubsystemVersionHeader.DEFAULT;
SubsystemTypeHeader type = SubsystemTypeHeader.DEFAULT;