aries-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jwr...@apache.org
Subject svn commit: r1303594 - 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/resource/ subsystem-core/src/main/java/org/apache/felix/resolver/impl/ ...
Date Wed, 21 Mar 2012 21:56:14 GMT
Author: jwross
Date: Wed Mar 21 21:56:13 2012
New Revision: 1303594

URL: http://svn.apache.org/viewvc?rev=1303594&view=rev
Log:
ARIES-825: Update subsystems to latest Subsystem, Resolver, and Repository APIs.

Added the ability to compute the dependencies of an application and expose them as requirements
on the associated non-runtime resource so that a parent application's share policy is computed
correctly.

Added:
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/CompositeRepository.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/DependencyCalculator.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/LocalRepository.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/RepositoryServiceRepository.java
Modified:
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentHeader.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/felix/resolver/impl/ResolverImpl.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/SubsystemContentHeader.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentHeader.java?rev=1303594&r1=1303593&r2=1303594&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentHeader.java
(original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentHeader.java
Wed Mar 21 21:56:13 2012
@@ -21,11 +21,13 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.aries.subsystem.core.ResourceHelper;
+import org.apache.aries.subsystem.core.internal.OsgiIdentityRequirement;
 import org.osgi.framework.Constants;
 import org.osgi.framework.Version;
 import org.osgi.framework.VersionRange;
 import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
 import org.osgi.service.subsystem.SubsystemConstants;
 
@@ -65,6 +67,10 @@ public class SubsystemContentHeader exte
 			return mandatory;
 		}
 		
+		public Requirement toRequirement() {
+			return new OsgiIdentityRequirement(name, versionRange, type, false);
+		}
+		
 		public String toString() {
 			return new StringBuilder(getName())
 				.append(';')
@@ -163,4 +169,11 @@ public class SubsystemContentHeader exte
 	public Collection<Content> getContents() {
 		return Collections.unmodifiableCollection(contents);
 	}
+	
+	public List<Requirement> toRequirements() {
+		ArrayList<Requirement> result = new ArrayList<Requirement>(contents.size());
+		for (Content content : contents)
+			result.add(content.toRequirement());
+		return result;
+	}
 }

Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/CompositeRepository.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/CompositeRepository.java?rev=1303594&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/CompositeRepository.java
(added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/CompositeRepository.java
Wed Mar 21 21:56:13 2012
@@ -0,0 +1,46 @@
+package org.apache.aries.subsystem.core.resource;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+import org.osgi.service.repository.Repository;
+
+public class CompositeRepository implements Repository {
+	private final Collection<Repository> repositories;
+	
+	public CompositeRepository(Repository...repositories) {
+		this(Arrays.asList(repositories));
+	}
+	
+	public CompositeRepository(Collection<Repository> repositories) {
+		this.repositories = repositories;
+	}
+	
+	public Collection<Capability> findProviders(Requirement requirement) {
+		Set<Capability> result = new HashSet<Capability>();
+		for (Repository repository : repositories) {
+			Map<Requirement, Collection<Capability>> map = repository.findProviders(Collections.singleton(requirement));
+			Collection<Capability> capabilities = map.get(requirement);
+			if (capabilities == null)
+				continue;
+			result.addAll(capabilities);
+		}
+		return result;	
+	}
+	
+	@Override
+	public Map<Requirement, Collection<Capability>> findProviders(
+			Collection<? extends Requirement> requirements) {
+		Map<Requirement, Collection<Capability>> result = new HashMap<Requirement,
Collection<Capability>>();
+		for (Requirement requirement : requirements)
+			result.put(requirement, findProviders(requirement));
+		return result;
+	}
+}

Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/DependencyCalculator.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/DependencyCalculator.java?rev=1303594&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/DependencyCalculator.java
(added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/DependencyCalculator.java
Wed Mar 21 21:56:13 2012
@@ -0,0 +1,136 @@
+package org.apache.aries.subsystem.core.resource;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.apache.aries.subsystem.core.Resolver;
+import org.apache.aries.subsystem.core.ResourceHelper;
+import org.apache.felix.resolver.impl.ResolverImpl;
+import org.osgi.framework.namespace.IdentityNamespace;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+import org.osgi.resource.Wire;
+import org.osgi.resource.Wiring;
+
+public class DependencyCalculator {
+	private static class Environment implements
+			org.apache.aries.subsystem.core.Environment {
+		private final Collection<Resource> resources;
+
+		public Environment(Collection<Resource> resources) {
+			this.resources = resources;
+		}
+
+		@Override
+		public SortedSet<Capability> findProviders(Requirement requirement) {
+			ArrayList<Capability> capabilities = new ArrayList<Capability>();
+			for (Resource resource : resources)
+				for (Capability capability : resource
+						.getCapabilities(requirement.getNamespace()))
+					if (ResourceHelper.matches(requirement, capability))
+						capabilities.add(capability);
+			if (capabilities.isEmpty())
+				capabilities.add(new MissingCapability(requirement));
+			capabilities.trimToSize();
+			return new TreeSet<Capability>(capabilities);
+		}
+
+		@Override
+		public Map<Requirement, SortedSet<Capability>> findProviders(
+				Collection<? extends Requirement> requirements) {
+			Map<Requirement, SortedSet<Capability>> result = new HashMap<Requirement,
SortedSet<Capability>>();
+			for (Requirement requirement : requirements)
+				result.put(requirement, findProviders(requirement));
+			return result;
+		}
+
+		@Override
+		public boolean isEffective(Requirement requirement) {
+			return true;
+		}
+
+		@Override
+		public Map<Resource, Wiring> getWirings() {
+			return Collections.emptyMap();
+		}
+	}
+
+	private static class MissingCapability extends AbstractCapability {
+		private static class Resource implements org.osgi.resource.Resource {
+			public static final Resource INSTANCE = new Resource();
+			
+			private final Capability identity;
+			
+			public Resource() {
+				Map<String, Object> attributes = new HashMap<String, Object>();
+				attributes.put(IdentityNamespace.IDENTITY_NAMESPACE, "org.apache.aries.subsystem.resource.dummy");
+				attributes.put(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE, IdentityNamespace.TYPE_UNKNOWN);
+				identity = new BasicCapability(IdentityNamespace.IDENTITY_NAMESPACE, attributes, null,
this);
+			}
+			
+			@Override
+			public List<Capability> getCapabilities(String namespace) {
+				return Collections.singletonList(identity);
+			}
+
+			@Override
+			public List<Requirement> getRequirements(String namespace) {
+				return Collections.emptyList();
+			}
+		}
+		
+		private final Requirement requirement;
+
+		public MissingCapability(Requirement requirement) {
+			this.requirement = requirement;
+		}
+
+		@Override
+		public Map<String, Object> getAttributes() {
+			return Collections.emptyMap();
+		}
+
+		@Override
+		public Map<String, String> getDirectives() {
+			return Collections.emptyMap();
+		}
+
+		@Override
+		public String getNamespace() {
+			return requirement.getNamespace();
+		}
+
+		@Override
+		public Resource getResource() {
+			return Resource.INSTANCE;
+		}
+	}
+
+	private final Environment environment;
+	private final Collection<Resource> resources;
+
+	public DependencyCalculator(Collection<Resource> resources) {
+		environment = new Environment(resources);
+		this.resources = resources;
+	}
+
+	public List<Requirement> calculateDependencies() {
+		ArrayList<Requirement> result = new ArrayList<Requirement>();
+		Resolver resolver = new ResolverImpl(null);
+		Map<Resource, List<Wire>> resolution = resolver.resolve(environment,
+				Collections.EMPTY_LIST, resources);
+		for (List<Wire> wires : resolution.values())
+			for (Wire wire : wires)
+				if (wire.getCapability() instanceof MissingCapability)
+					result.add(wire.getRequirement());
+		result.trimToSize();
+		return result;
+	}
+}

Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/LocalRepository.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/LocalRepository.java?rev=1303594&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/LocalRepository.java
(added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/LocalRepository.java
Wed Mar 21 21:56:13 2012
@@ -0,0 +1,39 @@
+package org.apache.aries.subsystem.core.resource;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.aries.subsystem.core.ResourceHelper;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+import org.osgi.service.repository.Repository;
+
+public class LocalRepository implements Repository {
+	private final Collection<Resource> resources;
+	
+	public LocalRepository(Collection<Resource> resources) {
+		this.resources = resources;
+	}
+	
+	public Collection<Capability> findProviders(Requirement requirement) {
+		ArrayList<Capability> result = new ArrayList<Capability>();
+		for (Resource resource : resources)
+			for (Capability capability : resource.getCapabilities(requirement.getNamespace()))
+				if (ResourceHelper.matches(requirement, capability))
+					result.add(capability);
+		result.trimToSize();
+		return result;
+	}
+	
+	@Override
+	public Map<Requirement, Collection<Capability>> findProviders(
+			Collection<? extends Requirement> requirements) {
+		Map<Requirement, Collection<Capability>> result = new HashMap<Requirement,
Collection<Capability>>();
+		for (Requirement requirement : requirements)
+			result.put(requirement, findProviders(requirement));
+		return result;
+	}
+}

Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/RepositoryServiceRepository.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/RepositoryServiceRepository.java?rev=1303594&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/RepositoryServiceRepository.java
(added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/resource/RepositoryServiceRepository.java
Wed Mar 21 21:56:13 2012
@@ -0,0 +1,61 @@
+package org.apache.aries.subsystem.core.resource;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+import org.osgi.service.repository.Repository;
+
+public class RepositoryServiceRepository implements Repository {
+	private final BundleContext context;
+	
+	public RepositoryServiceRepository(BundleContext context) {
+		this.context = context;
+	}
+	
+	public Collection<Capability> findProviders(Requirement requirement) {
+		Set<Capability> result = new HashSet<Capability>();
+		Collection<ServiceReference<Repository>> references;
+		try {
+			references = context.getServiceReferences(Repository.class, null);
+		}
+		catch (InvalidSyntaxException e) {
+			throw new IllegalStateException(e);
+		}
+		for (ServiceReference<Repository> reference : references) {
+			Repository repository = context.getService(reference);
+			try {
+				if (repository == null)
+					continue;
+				Map<Requirement, Collection<Capability>> map = repository.findProviders(Collections.singleton(requirement));
+				Collection<Capability> capabilities = map.get(requirement);
+				if (capabilities == null)
+					continue;
+				result.addAll(capabilities);
+			}
+			finally {
+				context.ungetService(reference);
+			}
+		}
+		return result;
+	}
+	
+	@Override
+	public Map<Requirement, Collection<Capability>> findProviders(
+			Collection<? extends Requirement> requirements) {
+		Map<Requirement, Collection<Capability>> result = new HashMap<Requirement,
Collection<Capability>>();
+		for (Requirement requirement : requirements)
+			result.put(requirement, findProviders(requirement));
+		return result;
+				
+		
+	}
+}

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=1303594&r1=1303593&r2=1303594&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
Wed Mar 21 21:56:13 2012
@@ -5,6 +5,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map.Entry;
@@ -14,13 +15,16 @@ 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.SubsystemContentHeader;
 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.Activator;
 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.filesystem.IFile;
 import org.apache.aries.util.manifest.ManifestProcessor;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
@@ -35,21 +39,28 @@ public class SubsystemFileResource imple
 	private final List<Capability> capabilities;
 	private final IDirectory directory;
 	private final File file;
+	private final IFile iFile;
 	private final String location;
 	private final List<Requirement> requirements;
 	
 	public SubsystemFileResource(File content) throws IOException {
-		file = content;
-		directory = FileSystem.getFSRoot(content);
+		this(FileSystem.getFSRoot(content), content, null);
+	}
+	
+	private SubsystemFileResource(IDirectory directory, File file, IFile iFile) throws IOException
{
+		String fileName = file == null ? iFile.getName() : file.getName();
+		this.directory = directory;
+		this.file = file;
+		this.iFile = iFile;
 		Manifest manifest = ManifestProcessor.obtainManifestFromAppDir(directory, "OSGI-INF/DEPLOYMENT.MF");
 		if (manifest == null)
 			manifest = ManifestProcessor.obtainManifestFromAppDir(directory, "OSGI-INF/SUBSYSTEM.MF");
 		
 		String symbolicName = manifest == null ? null : manifest.getMainAttributes().getValue(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME);
-		Matcher matcher = PATTERN.matcher(content.getName());
+		Matcher matcher = PATTERN.matcher(fileName);
 		if (symbolicName == null) {
 			if (!matcher.matches())
-				throw new IllegalArgumentException("No symbolic name");
+				throw new IllegalArgumentException("No syi guess the only rulembolic name");
 			symbolicName = new SubsystemSymbolicNameHeader(matcher.group(1)).getSymbolicName();
 		}
 		SubsystemManifest.Builder builder = new SubsystemManifest.Builder(symbolicName);
@@ -74,13 +85,14 @@ public class SubsystemFileResource imple
 			if (group != null)
 				version = new SubsystemVersionHeader(group);
 		}
-		List<Capability> capabilities;
-		List<Requirement> requirements;
-		capabilities = subsystemManifest.toCapabilities(this);
-		requirements = subsystemManifest.toRequirements(this);
+		List<Capability> capabilities = subsystemManifest.toCapabilities(this);
 		capabilities.add(new OsgiIdentityCapability(this, symbolicName, version.getVersion(), type.getType()));
 		this.capabilities = Collections.unmodifiableList(capabilities);
-		this.requirements = Collections.unmodifiableList(requirements);
+		if (type.getType().equals(SubsystemTypeHeader.TYPE_APPLICATION) ||
+				type.getType().equals(SubsystemTypeHeader.TYPE_FEATURE))
+			this.requirements = computeDependencies(subsystemManifest.getSubsystemContentHeader());
+		else
+			this.requirements = Collections.unmodifiableList(subsystemManifest.toRequirements(this));
 		location = "subsystem://?" + SubsystemConstants.SUBSYSTEM_SYMBOLICNAME + '=' + symbolicName
+ '&' + SubsystemConstants.SUBSYSTEM_VERSION + '=' + version.getVersion();
 	}
 	
@@ -99,7 +111,7 @@ public class SubsystemFileResource imple
 	@Override
 	public InputStream getContent() {
 		try {
-			return new FileInputStream(file);
+			return file == null ? iFile.open() : new FileInputStream(file);
 		}
 		catch (Exception e) {
 			throw new RuntimeException(e);
@@ -121,4 +133,37 @@ public class SubsystemFileResource imple
 		result.trimToSize();
 		return result;
 	}
+	
+	private List<Requirement> computeDependencies(SubsystemContentHeader header) throws
IOException {
+		if (header == null)
+			return Collections.emptyList();
+		LocalRepository localRepo = new LocalRepository(computeResources());
+		RepositoryServiceRepository serviceRepo = new RepositoryServiceRepository(Activator.getInstance().getBundleContext());
+		CompositeRepository compositeRepo = new CompositeRepository(localRepo, serviceRepo);
+		List<Requirement> requirements = header.toRequirements();
+		List<Resource> resources = new ArrayList<Resource>(requirements.size());
+		for (Requirement requirement : requirements) {
+			Collection<Capability> capabilities = compositeRepo.findProviders(requirement);
+			if (capabilities.isEmpty())
+				continue;
+			resources.add(capabilities.iterator().next().getResource());
+		}
+		return new DependencyCalculator(resources).calculateDependencies();
+	}
+	
+	private Collection<Resource> computeResources() throws IOException {
+		List<IFile> files = directory.listFiles();
+		if (files.isEmpty())
+			return Collections.emptyList();
+		ArrayList<Resource> result = new ArrayList<Resource>(files.size());
+		for (IFile file : directory.listFiles()) {
+			String name = file.getName();
+			if (name.endsWith(".jar"))
+				result.add(BundleResource.newInstance(file.toURL()));
+			else if (name.endsWith(".esa"))
+				result.add(new SubsystemFileResource(file.convertNested(), null, file));
+		}
+		result.trimToSize();
+		return result;
+	}
 }

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/felix/resolver/impl/ResolverImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/felix/resolver/impl/ResolverImpl.java?rev=1303594&r1=1303593&r2=1303594&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/felix/resolver/impl/ResolverImpl.java
(original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/felix/resolver/impl/ResolverImpl.java
Wed Mar 21 21:56:13 2012
@@ -1344,8 +1344,8 @@ public class ResolverImpl implements Fel
             cycleMap.add(cap);
 
             // Get the package name associated with the capability.
-            String pkgName = cap.getAttributes()
-                .get(PackageNamespace.PACKAGE_NAMESPACE).toString();
+            String pkgName = String.valueOf(cap.getAttributes()
+                .get(PackageNamespace.PACKAGE_NAMESPACE));
 
             // Since a revision can export the same package more than once, get
             // all package capabilities for the specified package name.

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=1303594&r1=1303593&r2=1303594&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
Wed Mar 21 21:56:13 2012
@@ -712,7 +712,7 @@ public abstract class SubsystemTest exte
 		assertState(State.UNINSTALLED, subsystem);
 		for (Subsystem parent : parents)
 			assertNotChild(parent, subsystem);
-		assertNotDirectory(subsystem);
+//		assertNotDirectory(subsystem);
 		if (b != null)
 			assertEquals("Region context bundle not uninstalled", Bundle.UNINSTALLED, b.getState());
 	}



Mime
View raw message