More changes due to abstraction changes for the new resolver implementation.
(FELIX-2036, FELIX-2037, FELIX-2035)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@918505 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/pom.xml b/framework/pom.xml
index 851dbc4..c52854f 100644
--- a/framework/pom.xml
+++ b/framework/pom.xml
@@ -46,6 +46,15 @@
<build>
<plugins>
<plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <target>jsr14</target>
+ <source>1.5</source>
+ </configuration>
+ </plugin>
+
+ <plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>1.4.3</version>
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleImpl.java b/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
index 9226422..c275dda 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
@@ -25,9 +25,9 @@
import java.util.*;
import org.apache.felix.framework.cache.BundleArchive;
+import org.apache.felix.framework.resolver.Module;
import org.apache.felix.framework.ext.SecurityProvider;
import org.apache.felix.framework.util.StringMap;
-import org.apache.felix.moduleloader.IModule;
import org.osgi.framework.*;
class BundleImpl implements Bundle
@@ -36,7 +36,7 @@
private final Felix __m_felix;
private final BundleArchive m_archive;
- private IModule[] m_modules = new IModule[0];
+ private final List<Module> m_modules = new ArrayList<Module>(0);
private volatile int m_state;
private boolean m_useDeclaredActivationPolicy;
private BundleActivator m_activator = null;
@@ -76,7 +76,7 @@
m_activator = null;
m_context = null;
- IModule module = createModule();
+ Module module = createModule();
addModule(module);
}
@@ -127,10 +127,10 @@
{
// Remove the bundle's associated modules from the resolver state
// and close them.
- for (int i = 0; i < m_modules.length; i++)
+ for (int i = 0; i < m_modules.size(); i++)
{
- getFramework().getResolverState().removeModule(m_modules[i]);
- ((ModuleImpl) m_modules[i]).close();
+ getFramework().getResolverState().removeModule(m_modules.get(i));
+ ((ModuleImpl) m_modules.get(i)).close();
}
}
@@ -143,9 +143,9 @@
*/
synchronized void cleanAfterUninstall()
{
- for (int i = 0; i < m_modules.length; i++)
+ for (int i = 0; i < m_modules.size(); i++)
{
- getFramework().getResolverState().unmergeFragment(m_modules[i]);
+ getFramework().getResolverState().unmergeFragment(m_modules.get(i));
}
}
@@ -166,8 +166,8 @@
// Lastly, we want to reset our bundle be reinitializing our state
// and recreating a module for the newest revision.
- m_modules = new IModule[0];
- final IModule module = createModule();
+ m_modules.clear();
+ final Module module = createModule();
addModule(module);
m_state = Bundle.INSTALLED;
m_stale = false;
@@ -398,7 +398,7 @@
{
for (Iterator it = resourceList.iterator(); it.hasNext(); )
{
- URL temp = ((IModule) moduleList.get(modIdx)).getEntry(
+ URL temp = ((Module) moduleList.get(modIdx)).getEntry(
it.next() + ".properties");
if (temp != null)
{
@@ -469,15 +469,15 @@
// version instead of the fragment itself. If there are
// no hosts, but the module is a fragment, then just
// search the module itself.
- IModule[] hosts = module.getDependentHosts();
- if ((hosts != null) && (hosts.length > 0))
+ List<Module> hosts = module.getDependentHosts();
+ if ((hosts != null) && (hosts.size() > 0))
{
- module = (ModuleImpl) hosts[0];
- for (int hostIdx = 1; hostIdx < hosts.length; hostIdx++)
+ module = (ModuleImpl) hosts.get(0);
+ for (int hostIdx = 1; hostIdx < hosts.size(); hostIdx++)
{
- if (module.getVersion().compareTo(hosts[hostIdx].getVersion()) < 0)
+ if (module.getVersion().compareTo(hosts.get(hostIdx).getVersion()) < 0)
{
- module = (ModuleImpl) hosts[hostIdx];
+ module = (ModuleImpl) hosts.get(hostIdx);
}
}
}
@@ -485,10 +485,10 @@
// Create a list of the module and any attached fragments.
List result = new ArrayList();
result.add(module);
- IModule[] fragments = module.getFragments();
- for (int i = 0; (fragments != null) && (i < fragments.length); i++)
+ List<Module> fragments = module.getFragments();
+ if (fragments != null)
{
- result.add(fragments[i]);
+ result.addAll(fragments);
}
return result;
}
@@ -831,9 +831,9 @@
synchronized boolean isExtension()
{
- for (int i = (m_modules.length - 1); i > -1; i--)
+ for (int i = (m_modules.size() - 1); i > -1; i--)
{
- if (m_modules[i].isExtension())
+ if (m_modules.get(i).isExtension())
{
return true;
}
@@ -977,7 +977,7 @@
synchronized boolean isRemovalPending()
{
- return (m_state == Bundle.UNINSTALLED) || (m_modules.length > 1) || m_stale;
+ return (m_state == Bundle.UNINSTALLED) || (m_modules.size() > 1) || m_stale;
}
//
@@ -996,7 +996,7 @@
* no limit on the potential number of bundle JAR file revisions.
* @return array of modules corresponding to the bundle JAR file revisions.
**/
- synchronized IModule[] getModules()
+ synchronized List<Module> getModules()
{
return m_modules;
}
@@ -1007,11 +1007,11 @@
* @return <tt>true</tt> if the specified module is in the array of modules
* associated with this bundle, <tt>false</tt> otherwise.
**/
- synchronized boolean hasModule(IModule module)
+ synchronized boolean hasModule(Module module)
{
- for (int i = 0; i < m_modules.length; i++)
+ for (int i = 0; i < m_modules.size(); i++)
{
- if (m_modules[i] == module)
+ if (m_modules.get(i) == module)
{
return true;
}
@@ -1024,20 +1024,20 @@
* in the module array.
* @return the newest module.
**/
- synchronized IModule getCurrentModule()
+ synchronized Module getCurrentModule()
{
- return m_modules[m_modules.length - 1];
+ return m_modules.get(m_modules.size() - 1);
}
synchronized boolean isUsed()
{
boolean used = false;
- for (int i = 0; !used && (i < m_modules.length); i++)
+ for (int i = 0; !used && (i < m_modules.size()); i++)
{
- IModule[] dependents = ((ModuleImpl) m_modules[i]).getDependents();
- for (int j = 0; (dependents != null) && (j < dependents.length) && !used; j++)
+ List<Module> dependents = ((ModuleImpl) m_modules.get(i)).getDependents();
+ for (int j = 0; (dependents != null) && (j < dependents.size()) && !used; j++)
{
- if (dependents[j] != m_modules[i])
+ if (dependents.get(j) != m_modules.get(i))
{
used = true;
}
@@ -1053,7 +1053,7 @@
m_archive.revise(location, is);
try
{
- IModule module = createModule();
+ Module module = createModule();
addModule(module);
}
catch (Exception ex)
@@ -1072,13 +1072,9 @@
// system bundle needs to add its module directly to the bundle,
// since it doesn't have an archive from which the module will
// be created, which is the normal case.
- synchronized void addModule(IModule module) throws Exception
+ synchronized void addModule(Module module) throws Exception
{
- IModule[] backup = m_modules;
- IModule[] dest = new IModule[m_modules.length + 1];
- System.arraycopy(m_modules, 0, dest, 0, m_modules.length);
- dest[m_modules.length] = module;
- m_modules = dest;
+ m_modules.add(module);
// Set protection domain after adding the module to the bundle,
// since this requires that the bundle has a module.
@@ -1093,7 +1089,7 @@
}
catch (Exception ex)
{
- m_modules = backup;
+ m_modules.remove(m_modules.size() - 1);
throw ex;
}
}
@@ -1109,7 +1105,7 @@
}
}
- private IModule createModule() throws Exception
+ private Module createModule() throws Exception
{
// Get and parse the manifest from the most recent revision to
// create an associated module for it.
@@ -1161,9 +1157,9 @@
{
ProtectionDomain pd = null;
- for (int i = m_modules.length - 1; (i >= 0) && (pd == null); i--)
+ for (int i = m_modules.size() - 1; (i >= 0) && (pd == null); i--)
{
- pd = (ProtectionDomain) m_modules[i].getSecurityContext();
+ pd = (ProtectionDomain) m_modules.get(i).getSecurityContext();
}
return pd;
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java b/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java
index 3aac628..2ba8f92 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java
@@ -20,13 +20,12 @@
import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
-import java.net.URL;
import java.security.CodeSource;
import java.security.Permission;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
-import org.apache.felix.moduleloader.IModule;
+import org.apache.felix.framework.resolver.Module;
public class BundleProtectionDomain extends ProtectionDomain
{
@@ -56,9 +55,9 @@
m_toString = "[" + bundle + "]";
}
- IModule getModule()
+ Module getModule()
{
- return (IModule) m_module.get();
+ return (Module) m_module.get();
}
public boolean implies(Permission permission)
diff --git a/framework/src/main/java/org/apache/felix/framework/ExportedPackageImpl.java b/framework/src/main/java/org/apache/felix/framework/ExportedPackageImpl.java
index 30b0d0e..abb4fed 100644
--- a/framework/src/main/java/org/apache/felix/framework/ExportedPackageImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ExportedPackageImpl.java
@@ -18,8 +18,9 @@
*/
package org.apache.felix.framework;
-import org.apache.felix.framework.util.manifestparser.Capability;
-import org.apache.felix.moduleloader.IModule;
+import java.util.List;
+import org.apache.felix.framework.capabilityset.Capability;
+import org.apache.felix.framework.resolver.Module;
import org.osgi.framework.Bundle;
import org.osgi.framework.Version;
import org.osgi.service.packageadmin.ExportedPackage;
@@ -28,18 +29,22 @@
{
private final Felix m_felix;
private final BundleImpl m_exportingBundle;
- private final IModule m_exportingModule;
+ private final Module m_exportingModule;
private final Capability m_export;
- private volatile String m_toString = null;
- private volatile String m_versionString = null;
+ private final String m_pkgName;
+ private final Version m_version;
public ExportedPackageImpl(
- Felix felix, BundleImpl exporter, IModule module, Capability export)
+ Felix felix, BundleImpl exporter, Module module, Capability export)
{
m_felix = felix;
m_exportingBundle = exporter;
m_exportingModule = module;
m_export = export;
+ m_pkgName = (String) m_export.getAttribute(Capability.PACKAGE_ATTR).getValue();
+ m_version = (m_export.getAttribute(Capability.VERSION_ATTR) == null)
+ ? Version.emptyVersion
+ : (Version) m_export.getAttribute(Capability.VERSION_ATTR).getValue();
}
public Bundle getExportingBundle()
@@ -59,30 +64,23 @@
{
return null;
}
- return m_felix.getImportingBundles(this);
+ List<Bundle> list = m_felix.getImportingBundles(this);
+ return list.toArray(new Bundle[list.size()]);
}
public String getName()
{
- return m_export.getPackageName();
+ return m_pkgName;
}
public String getSpecificationVersion()
{
- if (m_versionString == null)
- {
- m_versionString = (m_export.getPackageVersion() == null)
- ? Version.emptyVersion.toString()
- : m_export.getPackageVersion().toString();
- }
- return m_versionString;
+ return m_version.toString();
}
public Version getVersion()
{
- return (m_export.getPackageVersion() == null)
- ? Version.emptyVersion
- : m_export.getPackageVersion();
+ return m_version;
}
public boolean isRemovalPending()
@@ -92,11 +90,6 @@
public String toString()
{
- if (m_toString == null)
- {
- m_toString = m_export.getPackageName()
- + "; version=" + getSpecificationVersion();
- }
- return m_toString;
+ return m_pkgName + "; version=" + m_version;
}
}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
index 55826a3..3726438 100644
--- a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
+++ b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
@@ -38,17 +38,16 @@
import java.util.Set;
import org.apache.felix.framework.Felix.FelixResolver;
-import org.apache.felix.framework.ModuleImpl;
+import org.apache.felix.framework.capabilityset.Attribute;
+import org.apache.felix.framework.capabilityset.Capability;
+import org.apache.felix.framework.capabilityset.Directive;
+import org.apache.felix.framework.resolver.Module;
import org.apache.felix.framework.util.FelixConstants;
import org.apache.felix.framework.util.StringMap;
import org.apache.felix.framework.util.Util;
-import org.apache.felix.framework.util.manifestparser.Capability;
+import org.apache.felix.framework.util.manifestparser.CapabilityImpl;
import org.apache.felix.framework.util.manifestparser.ManifestParser;
-import org.apache.felix.framework.util.manifestparser.R4Attribute;
-import org.apache.felix.framework.util.manifestparser.R4Directive;
-import org.apache.felix.moduleloader.ICapability;
-import org.apache.felix.moduleloader.IContent;
-import org.apache.felix.moduleloader.IModule;
+import org.apache.felix.framework.resolver.Content;
import org.osgi.framework.AdminPermission;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
@@ -80,7 +79,7 @@
// with the parent classloader and one instance per framework instance that
// keeps track of extension bundles and systembundle exports for that framework
// instance.
-class ExtensionManager extends URLStreamHandler implements IContent
+class ExtensionManager extends URLStreamHandler implements Content
{
// The private instance that is added to Felix.class.getClassLoader() -
// will be null if extension bundles are not supported (i.e., we are not
@@ -119,8 +118,8 @@
private final Logger m_logger;
private final Map m_headerMap = new StringMap(false);
- private final IModule m_systemBundleModule;
- private ICapability[] m_capabilities = null;
+ private final Module m_systemBundleModule;
+ private List<Capability> m_capabilities = null;
private Set m_exportNames = null;
private Object m_securityContext = null;
private final List m_extensions;
@@ -188,12 +187,12 @@
{
ManifestParser mp = new ManifestParser(
m_logger, felix.getConfig(), m_systemBundleModule, m_headerMap);
- ICapability[] caps = aliasSymbolicName(mp.getCapabilities());
+ List<Capability> caps = aliasSymbolicName(mp.getCapabilities());
setCapabilities(caps);
}
catch (Exception ex)
{
- m_capabilities = new ICapability[0];
+ m_capabilities = new ArrayList<Capability>(0);
m_logger.log(
Logger.LOG_ERROR,
"Error parsing system bundle export statement: "
@@ -201,39 +200,39 @@
}
}
- private static ICapability[] aliasSymbolicName(ICapability[] caps)
+ private static List<Capability> aliasSymbolicName(List<Capability> caps)
{
if (caps == null)
{
- return new ICapability[0];
+ return new ArrayList<Capability>(0);
}
- ICapability[] aliasCaps = new ICapability[caps.length];
- System.arraycopy(caps, 0, aliasCaps, 0, caps.length);
+ List<Capability> aliasCaps = new ArrayList<Capability>(caps);
- for (int capIdx = 0; capIdx < aliasCaps.length; capIdx++)
+ for (int capIdx = 0; capIdx < aliasCaps.size(); capIdx++)
{
// Get the attributes and search for bundle symbolic name.
- R4Attribute[] attrs = ((Capability) aliasCaps[capIdx]).getAttributes();
- for (int i = 0; i < attrs.length; i++)
+ List<Attribute> attrs = aliasCaps.get(capIdx).getAttributes();
+ for (int i = 0; i < attrs.size(); i++)
{
// If there is a bundle symbolic name attribute, add the
// standard alias as a value.
- if (attrs[i].getName().equalsIgnoreCase(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE))
+ if (attrs.get(i).getName().equalsIgnoreCase(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE))
{
// Make a copy of the attribute array.
- R4Attribute[] aliasAttrs = new R4Attribute[attrs.length];
- System.arraycopy(attrs, 0, aliasAttrs, 0, attrs.length);
+ List<Attribute> aliasAttrs = new ArrayList<Attribute>(attrs);
// Add the aliased value.
- aliasAttrs[i] = new R4Attribute(
+ aliasAttrs.set(i, new Attribute(
Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE,
- new String[] { (String) attrs[i].getValue(), Constants.SYSTEM_BUNDLE_SYMBOLICNAME }, false);
+ new String[] {
+ (String) attrs.get(i).getValue(), Constants.SYSTEM_BUNDLE_SYMBOLICNAME},
+ false));
// Create the aliased capability to replace the old capability.
- aliasCaps[capIdx] = new Capability(
- caps[capIdx].getModule(),
- caps[capIdx].getNamespace(),
- ((Capability) caps[capIdx]).getDirectives(),
- aliasAttrs);
+ aliasCaps.set(capIdx, new CapabilityImpl(
+ caps.get(capIdx).getModule(),
+ caps.get(capIdx).getNamespace(),
+ caps.get(capIdx).getDirectives(),
+ aliasAttrs));
// Continue with the next capability.
break;
}
@@ -243,7 +242,7 @@
return aliasCaps;
}
- public IModule getModule()
+ public Module getModule()
{
return m_systemBundleModule;
}
@@ -295,7 +294,7 @@
throw new SecurityException("Extension Bundles must have AllPermission");
}
- R4Directive dir = ManifestParser.parseExtensionBundleHeader((String)
+ Directive dir = ManifestParser.parseExtensionBundleHeader((String)
bundle.getCurrentModule().getHeaders().get(Constants.FRAGMENT_HOST));
// We only support classpath extensions (not bootclasspath).
@@ -312,11 +311,11 @@
// bundle.setExtension(true);
// Merge the exported packages with the exported packages of the systembundle.
- ICapability[] exports = null;
+ List<Capability> exports = null;
try
{
exports = ManifestParser.parseExportHeader(
- m_systemBundleModule,
+ m_logger, m_systemBundleModule,
(String) bundle.getCurrentModule().getHeaders().get(Constants.EXPORT_PACKAGE),
m_systemBundleModule.getSymbolicName(), m_systemBundleModule.getVersion());
exports = aliasSymbolicName(exports);
@@ -344,9 +343,9 @@
throw new UnsupportedOperationException(
"Unable to add extension bundle to FrameworkClassLoader - Maybe not an URLClassLoader?");
}
- ICapability[] temp = new ICapability[m_capabilities.length + exports.length];
- System.arraycopy(m_capabilities, 0, temp, 0, m_capabilities.length);
- System.arraycopy(exports, 0, temp, m_capabilities.length, exports.length);
+ List<Capability> temp = new ArrayList<Capability>(m_capabilities.size() + exports.size());
+ temp.addAll(m_capabilities);
+ temp.addAll(exports);
setCapabilities(temp);
}
catch (Exception ex)
@@ -415,7 +414,7 @@
}
}
- private void setCapabilities(ICapability[] capabilities)
+ private void setCapabilities(List<Capability> capabilities)
{
m_capabilities = capabilities;
m_headerMap.put(Constants.EXPORT_PACKAGE, convertCapabilitiesToHeaders(m_headerMap));
@@ -426,9 +425,9 @@
StringBuffer exportSB = new StringBuffer("");
Set exportNames = new HashSet();
- for (int i = 0; (m_capabilities != null) && (i < m_capabilities.length); i++)
+ for (int i = 0; (m_capabilities != null) && (i < m_capabilities.size()); i++)
{
- if (m_capabilities[i].getNamespace().equals(ICapability.PACKAGE_NAMESPACE))
+ if (m_capabilities.get(i).getNamespace().equals(Capability.PACKAGE_NAMESPACE))
{
// Add a comma separate if there is an existing package.
if (exportSB.length() > 0)
@@ -437,13 +436,13 @@
}
// Append exported package information.
- exportSB.append(((Capability) m_capabilities[i]).getPackageName());
+ exportSB.append(m_capabilities.get(i).getAttribute(Capability.PACKAGE_ATTR).getValue());
exportSB.append("; version=\"");
- exportSB.append(((Capability) m_capabilities[i]).getPackageVersion().toString());
+ exportSB.append(m_capabilities.get(i).getAttribute(Capability.VERSION_ATTR).getValue());
exportSB.append("\"");
// Remember exported packages.
- exportNames.add(((Capability) m_capabilities[i]).getPackageName());
+ exportNames.add(m_capabilities.get(i).getAttribute(Capability.PACKAGE_ATTR).getValue());
}
}
@@ -568,7 +567,7 @@
return null;
}
- public IContent getEntryAsContent(String name)
+ public Content getEntryAsContent(String name)
{
return null;
}
@@ -651,7 +650,7 @@
}
}
- public ICapability[] getCapabilities()
+ public List<Capability> getCapabilities()
{
synchronized (ExtensionManager.this)
{
@@ -714,7 +713,7 @@
return null;
}
- public void attachFragmentContents(IContent[] fragmentContents)
+ public void attachFragmentContents(Content[] fragmentContents)
throws Exception
{
throw new UnsupportedOperationException("Should not be used!");
@@ -725,7 +724,7 @@
// Nothing needed here.
}
- public IContent getContent()
+ public Content getContent()
{
return ExtensionManager.this;
}
diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index 7db8b23..fdb6478 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -23,16 +23,56 @@
import java.net.*;
import java.security.*;
import java.util.*;
-
-import org.apache.felix.framework.cache.*;
-import org.apache.felix.framework.ext.SecurityProvider;
-import org.apache.felix.framework.searchpolicy.*;
+import java.util.Map.Entry;
+import org.apache.felix.framework.ModuleImpl.FragmentRequirement;
import org.apache.felix.framework.ServiceRegistry.ServiceRegistryCallbacks;
-import org.apache.felix.framework.util.*;
-import org.apache.felix.framework.util.manifestparser.*;
-import org.apache.felix.moduleloader.*;
-import org.osgi.framework.*;
-import org.osgi.framework.hooks.service.*;
+import org.apache.felix.framework.cache.BundleArchive;
+import org.apache.felix.framework.cache.BundleCache;
+import org.apache.felix.framework.capabilityset.Attribute;
+import org.apache.felix.framework.capabilityset.Capability;
+import org.apache.felix.framework.capabilityset.CapabilitySet;
+import org.apache.felix.framework.capabilityset.Directive;
+import org.apache.felix.framework.resolver.Module;
+import org.apache.felix.framework.capabilityset.Requirement;
+import org.apache.felix.framework.resolver.Wire;
+import org.apache.felix.framework.ext.SecurityProvider;
+import org.apache.felix.framework.resolver.ResolveException;
+import org.apache.felix.framework.resolver.Resolver;
+import org.apache.felix.framework.resolver.ResolverImpl;
+import org.apache.felix.framework.util.EventDispatcher;
+import org.apache.felix.framework.util.FelixConstants;
+import org.apache.felix.framework.util.ListenerHookInfoImpl;
+import org.apache.felix.framework.util.MapToDictionary;
+import org.apache.felix.framework.util.SecureAction;
+import org.apache.felix.framework.util.ShrinkableCollection;
+import org.apache.felix.framework.util.StringMap;
+import org.apache.felix.framework.util.ThreadGate;
+import org.apache.felix.framework.util.Util;
+import org.apache.felix.framework.util.manifestparser.R4LibraryClause;
+import org.apache.felix.framework.util.manifestparser.RequirementImpl;
+import org.osgi.framework.AdminPermission;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.BundleReference;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceException;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServicePermission;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.hooks.service.FindHook;
+import org.osgi.framework.hooks.service.ListenerHook;
import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.startlevel.StartLevel;
@@ -294,7 +334,7 @@
// Create a resolver and its state.
m_resolverState = new FelixResolverState(m_logger);
m_felixResolver = new FelixResolver(
- new Resolver(m_logger,
+ new ResolverImpl(m_logger,
(String) m_configMap.get(Constants.FRAMEWORK_EXECUTIONENVIRONMENT)),
m_resolverState);
@@ -1579,7 +1619,7 @@
// Record whether the bundle is using its declared activation policy.
boolean wasDeferred = bundle.isDeclaredActivationPolicyUsed()
- && (bundle.getCurrentModule().getDeclaredActivationPolicy() == IModule.LAZY_ACTIVATION);
+ && (bundle.getCurrentModule().getDeclaredActivationPolicy() == Module.LAZY_ACTIVATION);
bundle.setDeclaredActivationPolicyUsed(
(options & Bundle.START_ACTIVATION_POLICY) != 0);
@@ -1667,7 +1707,7 @@
// If the bundle's activation policy is eager or activation has already
// been triggered, then activate the bundle immediately.
if (!bundle.isDeclaredActivationPolicyUsed()
- || (bundle.getCurrentModule().getDeclaredActivationPolicy() != IModule.LAZY_ACTIVATION)
+ || (bundle.getCurrentModule().getDeclaredActivationPolicy() != Module.LAZY_ACTIVATION)
|| ((ModuleImpl) bundle.getCurrentModule()).isActivationTriggered())
{
// Record the event type for the final event and activate.
@@ -2090,7 +2130,7 @@
throw new IllegalStateException("Cannot stop an uninstalled bundle.");
case Bundle.STARTING:
if (bundle.isDeclaredActivationPolicyUsed()
- && bundle.getCurrentModule().getDeclaredActivationPolicy() != IModule.LAZY_ACTIVATION)
+ && bundle.getCurrentModule().getDeclaredActivationPolicy() != Module.LAZY_ACTIVATION)
{
throw new BundleException(
"Stopping a starting or stopping bundle is currently not supported.");
@@ -2469,7 +2509,6 @@
"Could not remove from cache.", ex1);
}
}
-
if (ex instanceof BundleException)
{
throw (BundleException) ex;
@@ -2990,26 +3029,29 @@
ExportedPackage[] getExportedPackages(String pkgName)
{
// First, get all exporters of the package.
- List exports =
- m_resolverState.getResolvedCandidates(
- new Requirement(
- ICapability.PACKAGE_NAMESPACE,
- null,
- new R4Attribute[] { new R4Attribute(ICapability.PACKAGE_PROPERTY, pkgName, false) }), null);
+ List<Directive> dirs = new ArrayList<Directive>(0);
+ List<Attribute> attrs = new ArrayList<Attribute>(1);
+ attrs.add(new Attribute(Capability.PACKAGE_ATTR, pkgName, false));
+ Requirement req = new RequirementImpl(Capability.PACKAGE_NAMESPACE, dirs, attrs);
+ Set<Capability> exports = m_resolverState.getCandidates(null, req, false);
+
+ // We only want resolved capabilities.
+ for (Iterator<Capability> it = exports.iterator(); it.hasNext(); )
+ {
+ if (!it.next().getModule().isResolved())
+ {
+ it.remove();
+ }
+ }
if (exports != null)
{
List pkgs = new ArrayList();
- Requirement req = new Requirement(ICapability.PACKAGE_NAMESPACE,
- null,
- new R4Attribute[] { new R4Attribute(ICapability.PACKAGE_PROPERTY, pkgName, false) });
-
- for (int pkgIdx = 0; pkgIdx < exports.size(); pkgIdx++)
+ for (Iterator<Capability> it = exports.iterator(); it.hasNext(); )
{
// Get the bundle associated with the current exporting module.
- BundleImpl bundle = (BundleImpl)
- ((ICapability) exports.get(pkgIdx)).getModule().getBundle();
+ BundleImpl bundle = (BundleImpl) it.next().getModule().getBundle();
// We need to find the version of the exported package, but this
// is tricky since there may be multiple versions of the package
@@ -3021,16 +3063,18 @@
// that the first module found to be exporting the package is the
// provider of the package, which makes sense since it must have
// been resolved first.
- IModule[] modules = bundle.getModules();
- for (int modIdx = 0; modIdx < modules.length; modIdx++)
+ List<Module> modules = bundle.getModules();
+ for (int modIdx = 0; modIdx < modules.size(); modIdx++)
{
- ICapability[] ec = modules[modIdx].getCapabilities();
- for (int i = 0; (ec != null) && (i < ec.length); i++)
+ List<Capability> ec = modules.get(modIdx).getCapabilities();
+ for (int i = 0; (ec != null) && (i < ec.size()); i++)
{
- if (ec[i].getNamespace().equals(req.getNamespace()) &&
- req.isSatisfied(ec[i]))
+ if (ec.get(i).getNamespace().equals(req.getNamespace())
+ && CapabilitySet.matches(ec.get(i), req.getFilter()))
{
- pkgs.add(new ExportedPackageImpl(this, bundle, modules[modIdx], (Capability) ec[i]));
+ pkgs.add(
+ new ExportedPackageImpl(
+ this, bundle, modules.get(modIdx), ec.get(i)));
}
}
}
@@ -3111,31 +3155,43 @@
// Since a bundle may have many modules associated with it,
// one for each revision in the cache, search each module
// for each revision to get all exports.
- IModule[] modules = bundle.getModules();
- for (int modIdx = 0; modIdx < modules.length; modIdx++)
+ List<Module> modules = bundle.getModules();
+ for (int modIdx = 0; modIdx < modules.size(); modIdx++)
{
- ICapability[] caps = modules[modIdx].getCapabilities();
- if ((caps != null) && (caps.length > 0))
+ List<Capability> caps = modules.get(modIdx).getCapabilities();
+ if ((caps != null) && (caps.size() > 0))
{
- for (int capIdx = 0; capIdx < caps.length; capIdx++)
+ for (int capIdx = 0; capIdx < caps.size(); capIdx++)
{
// See if the target bundle's module is one of the
// resolved exporters of the package.
- if (caps[capIdx].getNamespace().equals(ICapability.PACKAGE_NAMESPACE))
+ if (caps.get(capIdx).getNamespace().equals(Capability.PACKAGE_NAMESPACE))
{
- List resolvedCaps = m_resolverState.getResolvedCandidates(
- new Requirement(
- ICapability.PACKAGE_NAMESPACE,
- null,
- new R4Attribute[] { new R4Attribute(ICapability.PACKAGE_PROPERTY, ((Capability) caps[capIdx]).getPackageName(), false) }), null);
+ String pkgName = (String)
+ caps.get(capIdx).getAttribute(Capability.PACKAGE_ATTR).getValue();
+ List<Directive> dirs = new ArrayList<Directive>(0);
+ List<Attribute> attrs = new ArrayList<Attribute>(1);
+ attrs.add(new Attribute(Capability.PACKAGE_ATTR, pkgName, false));
+ Requirement req =
+ new RequirementImpl(Capability.PACKAGE_NAMESPACE, dirs, attrs);
+ Set<Capability> exports = m_resolverState.getCandidates(null, req, false);
+ // We only want resolved capabilities.
+ for (Iterator<Capability> it = exports.iterator(); it.hasNext(); )
+ {
+ if (!it.next().getModule().isResolved())
+ {
+ it.remove();
+ }
+ }
+
// Search through the current providers to find the target module.
- for (int i = 0; (resolvedCaps != null) && (i < resolvedCaps.size()); i++)
+ for (Capability cap : exports)
{
- if ((ICapability) resolvedCaps.get(i) == caps[capIdx])
+ if (cap == caps.get(capIdx))
{
list.add(new ExportedPackageImpl(
- this, bundle, modules[modIdx], (Capability) caps[capIdx]));
+ this, bundle, modules.get(modIdx), caps.get(capIdx)));
}
}
}
@@ -3144,70 +3200,64 @@
}
}
- Bundle[] getDependentBundles(BundleImpl exporter)
+ List<Bundle> getDependentBundles(BundleImpl exporter)
{
// Create list for storing importing bundles.
- List list = new ArrayList();
+ List<Bundle> list = new ArrayList();
// Get all dependent modules from all exporter module revisions.
- IModule[] modules = exporter.getModules();
- for (int modIdx = 0; modIdx < modules.length; modIdx++)
+ List<Module> modules = exporter.getModules();
+ for (int modIdx = 0; modIdx < modules.size(); modIdx++)
{
- IModule[] dependents = ((ModuleImpl) modules[modIdx]).getDependents();
+ List<Module> dependents = ((ModuleImpl) modules.get(modIdx)).getDependents();
for (int depIdx = 0;
- (dependents != null) && (depIdx < dependents.length);
+ (dependents != null) && (depIdx < dependents.size());
depIdx++)
{
- list.add(dependents[depIdx].getBundle());
+ list.add(dependents.get(depIdx).getBundle());
}
}
- // Return the results.
- if (list.size() > 0)
- {
- return (Bundle[]) list.toArray(new Bundle[list.size()]);
- }
-
- return null;
+ return list;
}
- Bundle[] getImportingBundles(ExportedPackage ep)
+ List<Bundle> getImportingBundles(ExportedPackage ep)
{
// Create list for storing importing bundles.
- List list = new ArrayList();
+ List<Bundle> list = new ArrayList();
// Get exporting bundle information.
BundleImpl exporter = (BundleImpl) ep.getExportingBundle();
// Get all importers and requirers for all revisions of the bundle.
// The spec says that require-bundle should be returned with importers.
- IModule[] expModules = exporter.getModules();
- for (int expIdx = 0; (expModules != null) && (expIdx < expModules.length); expIdx++)
+ List<Module> expModules = exporter.getModules();
+ for (int expIdx = 0; (expModules != null) && (expIdx < expModules.size()); expIdx++)
{
// Include any importers that have wires to the specific
// exported package.
- IModule[] dependents = ((ModuleImpl) expModules[expIdx]).getDependentImporters();
- for (int depIdx = 0; (dependents != null) && (depIdx < dependents.length); depIdx++)
+ List<Module> dependents = ((ModuleImpl) expModules.get(expIdx)).getDependentImporters();
+ for (int depIdx = 0; (dependents != null) && (depIdx < dependents.size()); depIdx++)
{
- IWire[] wires = dependents[depIdx].getWires();
- for (int wireIdx = 0; (wires != null) && (wireIdx < wires.length); wireIdx++)
+ List<Wire> wires = dependents.get(depIdx).getWires();
+ for (int wireIdx = 0; (wires != null) && (wireIdx < wires.size()); wireIdx++)
{
- if ((wires[wireIdx].getExporter() == expModules[expIdx])
- && (wires[wireIdx].hasPackage(ep.getName())))
+ if ((wires.get(wireIdx).getExporter() == expModules.get(expIdx))
+ && (wires.get(wireIdx).hasPackage(ep.getName())))
{
- list.add(dependents[depIdx].getBundle());
+ list.add(dependents.get(depIdx).getBundle());
}
}
}
- dependents = ((ModuleImpl) expModules[expIdx]).getDependentRequirers();
- for (int depIdx = 0; (dependents != null) && (depIdx < dependents.length); depIdx++)
+ dependents = ((ModuleImpl) expModules.get(expIdx)).getDependentRequirers();
+ for (int depIdx = 0; (dependents != null) && (depIdx < dependents.size()); depIdx++)
{
- list.add(dependents[depIdx].getBundle());
+ list.add(dependents.get(depIdx).getBundle());
}
}
// Return the results.
- return (Bundle[]) list.toArray(new Bundle[list.size()]);
+ return list;
}
boolean resolveBundles(Bundle[] targets)
@@ -3473,20 +3523,20 @@
private void populateDependentGraph(BundleImpl exporter, Map map)
{
// Get all dependent bundles of this bundle.
- Bundle[] dependents = getDependentBundles(exporter);
+ List<Bundle> dependents = getDependentBundles(exporter);
for (int depIdx = 0;
- (dependents != null) && (depIdx < dependents.length);
+ (dependents != null) && (depIdx < dependents.size());
depIdx++)
{
// Avoid cycles if the bundle is already in map.
- if (!map.containsKey(dependents[depIdx]))
+ if (!map.containsKey(dependents.get(depIdx)))
{
// Add each importing bundle to map.
- map.put(dependents[depIdx], dependents[depIdx]);
+ map.put(dependents.get(depIdx), dependents.get(depIdx));
// Now recurse into each bundle to get its importers.
populateDependentGraph(
- (BundleImpl) dependents[depIdx], map);
+ (BundleImpl) dependents.get(depIdx), map);
}
}
}
@@ -3819,7 +3869,7 @@
m_resolverState = resolverState;
}
- public void resolve(IModule rootModule) throws ResolveException
+ public void resolve(Module rootModule) throws ResolveException
{
// Although there is a race condition to check the bundle state
// then lock it, we do this because we don't want to acquire the
@@ -3850,14 +3900,44 @@
// must find a host to attach it to and resolve the host
// instead, since the underlying resolver doesn't know
// how to deal with fragments.
- IModule newRootModule = m_resolverState.findHost(rootModule);
+ Module newRootModule = m_resolverState.findHost(rootModule);
if (!Util.isFragment(newRootModule))
{
- // Resolve the module.
- Map resolvedModuleWireMap = m_resolver.resolve(m_resolverState, newRootModule);
+ // Check singleton status.
+ m_resolverState.checkSingleton(newRootModule);
- // Mark all modules as resolved.
- markResolvedModules(resolvedModuleWireMap);
+ boolean repeat;
+ do
+ {
+ repeat = false;
+ try
+ {
+ // Resolve the module.
+ Map<Module, List<Wire>> wireMap =
+ m_resolver.resolve(m_resolverState, newRootModule);
+
+ // Mark all modules as resolved.
+ markResolvedModules(wireMap);
+ }
+ catch (ResolveException ex)
+ {
+ if ((ex.getRequirement() != null)
+ && (ex.getRequirement() instanceof FragmentRequirement)
+ && (rootModule !=
+ ((FragmentRequirement) ex.getRequirement()).getFragment()))
+ {
+ m_resolverState.detachFragment(
+ newRootModule,
+ ((FragmentRequirement) ex.getRequirement()).getFragment());
+ repeat = true;
+ }
+ else
+ {
+ throw ex;
+ }
+ }
+ }
+ while (repeat);
}
}
finally
@@ -3868,24 +3948,23 @@
}
}
- public IWire resolveDynamicImport(IModule importer, String pkgName) throws ResolveException
+ public Wire resolve(Module module, String pkgName) throws ResolveException
{
- IWire candidateWire = null;
-
- // We cannot dynamically import if the module is already resolved or
- // if it is not allowed, so check that first. Note: We check if the
+ Wire candidateWire = null;
+ // We cannot dynamically import if the module is not already resolved
+ // or if it is not allowed, so check that first. Note: We check if the
// dynamic import is allowed without holding any locks, but this is
// okay since the resolver will double check later after we have
// acquired the global lock below.
- if (importer.isResolved()
- && (Resolver.findAllowedDynamicImport(importer, pkgName) != null))
+ if (module.isResolved()
+ && (ResolverImpl.isAllowedDynamicImport(m_resolverState, module, pkgName, new HashMap())))
{
// Acquire global lock.
boolean locked = acquireGlobalLock();
if (!locked)
{
throw new ResolveException(
- "Unable to acquire global lock for resolve.", importer, null);
+ "Unable to acquire global lock for resolve.", module, null);
}
try
@@ -3894,42 +3973,34 @@
// dynamically importing the package, which can happen if two
// threads are racing to do so. If we have an existing wire,
// then just return it instead.
- IWire[] wires = importer.getWires();
- for (int i = 0; (wires != null) && (i < wires.length); i++)
+ List<Wire> wires = module.getWires();
+ for (int i = 0; (wires != null) && (i < wires.size()); i++)
{
- if (wires[i].hasPackage(pkgName))
+ if (wires.get(i).hasPackage(pkgName))
{
- return wires[i];
+ return wires.get(i);
}
}
- Object[] result = m_resolver.resolveDynamicImport(m_resolverState, importer, pkgName);
- if (result != null)
+ Map<Module, List<Wire>> wireMap =
+ m_resolver.resolve(m_resolverState, module, pkgName);
+
+ if ((wireMap != null) && wireMap.containsKey(module))
{
- candidateWire = (IWire) result[0];
- Map resolvedModuleWireMap = (Map) result[1];
+ List<Wire> dynamicWires = wireMap.remove(module);
+ candidateWire = dynamicWires.get(0);
// Mark all modules as resolved.
- markResolvedModules(resolvedModuleWireMap);
+ markResolvedModules(wireMap);
// Dynamically add new wire to importing module.
if (candidateWire != null)
{
- wires = importer.getWires();
- IWire[] newWires = null;
- if (wires == null)
- {
- newWires = new IWire[1];
- }
- else
- {
- newWires = new IWire[wires.length + 1];
- System.arraycopy(wires, 0, newWires, 0, wires.length);
- }
-
- newWires[newWires.length - 1] = candidateWire;
- ((ModuleImpl) importer).setWires(newWires);
-m_logger.log(Logger.LOG_DEBUG, "DYNAMIC WIRE: " + newWires[newWires.length - 1]);
+ wires = new ArrayList(wires.size() + 1);
+ wires.addAll(module.getWires());
+ wires.add(candidateWire);
+ ((ModuleImpl) module).setWires(wires);
+m_logger.log(Logger.LOG_DEBUG, "DYNAMIC WIRE: " + wires.get(wires.size() - 1));
}
}
}
@@ -3943,58 +4014,45 @@
return candidateWire;
}
- public synchronized List getResolvedCandidates(IRequirement req, IModule reqModule)
+ public synchronized Set<Capability> getCandidates(
+ Module reqModule, Requirement req, boolean obeyMandatory)
{
- return m_resolverState.getResolvedCandidates(req, reqModule);
+ return m_resolverState.getCandidates(reqModule, req, obeyMandatory);
}
- public synchronized List getUnresolvedCandidates(IRequirement req, IModule reqModule)
+ private void markResolvedModules(Map<Module, List<Wire>> wireMap)
{
- return m_resolverState.getUnresolvedCandidates(req, reqModule);
- }
-
- private void markResolvedModules(Map resolvedModuleWireMap)
- {
- if (resolvedModuleWireMap != null)
+ if (wireMap != null)
{
- Iterator iter = resolvedModuleWireMap.entrySet().iterator();
+ Iterator<Entry<Module, List<Wire>>> iter = wireMap.entrySet().iterator();
// Iterate over the map to mark the modules as resolved and
// update our resolver data structures.
- List wireList = new ArrayList();
while (iter.hasNext())
{
- wireList.clear();
-
- Map.Entry entry = (Map.Entry) iter.next();
- IModule module = (IModule) entry.getKey();
- IWire[] wires = (IWire[]) entry.getValue();
+ Entry<Module, List<Wire>> entry = iter.next();
+ Module module = entry.getKey();
+ List<Wire> wires = entry.getValue();
// Only add wires attribute if some exist; export
// only modules may not have wires.
-// TODO: RESOLVER - Seems stupid that we package these up as wires to tear them apart.
- if (wires.length > 0)
+ for (int wireIdx = 0; wireIdx < wires.size(); wireIdx++)
{
- for (int wireIdx = 0; wireIdx < wires.length; wireIdx++)
- {
- wireList.add(wires[wireIdx]);
- m_logger.log(
- Logger.LOG_DEBUG,
- "WIRE: " + wires[wireIdx]);
- }
- wires = (IWire[]) wireList.toArray(new IWire[wireList.size()]);
- ((ModuleImpl) module).setWires(wires);
- }
-
- // Resolve all attached fragments.
- IModule[] fragments = ((ModuleImpl) module).getFragments();
- for (int i = 0; (fragments != null) && (i < fragments.length); i++)
- {
- ((ModuleImpl) fragments[i]).setResolved();
- // Update the state of the module's bundle to resolved as well.
- markBundleResolved(fragments[i]);
m_logger.log(
Logger.LOG_DEBUG,
- "FRAGMENT WIRE: " + fragments[i] + " -> hosted by -> " + module);
+ "WIRE: " + wires.get(wireIdx));
+ }
+ ((ModuleImpl) module).setWires(wires);
+
+ // Resolve all attached fragments.
+ List<Module> fragments = ((ModuleImpl) module).getFragments();
+ for (int i = 0; (fragments != null) && (i < fragments.size()); i++)
+ {
+ ((ModuleImpl) fragments.get(i)).setResolved();
+ // Update the state of the module's bundle to resolved as well.
+ markBundleResolved(fragments.get(i));
+ m_logger.log(
+ Logger.LOG_DEBUG,
+ "FRAGMENT WIRE: " + fragments.get(i) + " -> hosted by -> " + module);
}
// Update the resolver state to show the module as resolved.
((ModuleImpl) module).setResolved();
@@ -4005,7 +4063,7 @@
}
}
- private void markBundleResolved(IModule module)
+ private void markBundleResolved(Module module)
{
// Update the bundle's state to resolved when the
// current module is resolved; just ignore resolve
diff --git a/framework/src/main/java/org/apache/felix/framework/FindEntriesEnumeration.java b/framework/src/main/java/org/apache/felix/framework/FindEntriesEnumeration.java
index 826e4e8..5ccae21 100644
--- a/framework/src/main/java/org/apache/felix/framework/FindEntriesEnumeration.java
+++ b/framework/src/main/java/org/apache/felix/framework/FindEntriesEnumeration.java
@@ -19,18 +19,18 @@
package org.apache.felix.framework;
import java.util.*;
+import org.apache.felix.framework.resolver.Module;
import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IModule;
class FindEntriesEnumeration implements Enumeration
{
private final BundleImpl m_bundle;
- private final Enumeration[] m_enumerations;
- private final IModule[] m_modules;
+ private final List<Enumeration> m_enumerations;
+ private final List<Module> m_modules;
private int m_moduleIndex = 0;
private final String m_path;
- private final String[] m_filePattern;
+ private final List<String> m_filePattern;
private final boolean m_recurse;
private Object m_next = null;
@@ -38,23 +38,20 @@
BundleImpl bundle, String path, String filePattern, boolean recurse)
{
m_bundle = bundle;
- IModule bundleModule = m_bundle.getCurrentModule();
- IModule[] fragmentModules = ((ModuleImpl) bundleModule).getFragments();
+ Module bundleModule = m_bundle.getCurrentModule();
+ List<Module> fragmentModules = ((ModuleImpl) bundleModule).getFragments();
if (fragmentModules == null)
{
- fragmentModules = new IModule[0];
+ fragmentModules = new ArrayList<Module>(0);
}
- m_modules = new IModule[fragmentModules.length + 1];
- m_modules[0] = bundleModule;
- for (int i = 0; i < fragmentModules.length; i++)
+ m_modules = new ArrayList<Module>(fragmentModules.size() + 1);
+ m_modules.add(bundleModule);
+ m_modules.addAll(fragmentModules);
+ m_enumerations = new ArrayList<Enumeration>(m_modules.size());
+ for (int i = 0; i < m_modules.size(); i++)
{
- m_modules[i + 1] = fragmentModules[i];
- }
- m_enumerations = new Enumeration[m_modules.length];
- for (int i = 0; i < m_modules.length; i++)
- {
- m_enumerations[i] = m_modules[i].getContent() != null ?
- m_modules[i].getContent().getEntries() : null;
+ m_enumerations.add(m_modules.get(i).getContent() != null ?
+ m_modules.get(i).getContent().getEntries() : null);
}
m_recurse = recurse;
@@ -109,13 +106,13 @@
{
return null;
}
- while (m_moduleIndex < m_enumerations.length)
+ while (m_moduleIndex < m_enumerations.size())
{
- while (m_enumerations[m_moduleIndex] != null
- && m_enumerations[m_moduleIndex].hasMoreElements())
+ while (m_enumerations.get(m_moduleIndex) != null
+ && m_enumerations.get(m_moduleIndex).hasMoreElements())
{
// Get the next entry name.
- String entryName = (String) m_enumerations[m_moduleIndex].nextElement();
+ String entryName = (String) m_enumerations.get(m_moduleIndex).nextElement();
// Check to see if it is a descendent of the specified path.
if (!entryName.equals(m_path) && entryName.startsWith(m_path))
{
@@ -141,7 +138,7 @@
if (Util.checkSubstring(m_filePattern, lastElement))
{
// Convert entry name into an entry URL.
- return m_modules[m_moduleIndex].getEntry(entryName);
+ return m_modules.get(m_moduleIndex).getEntry(entryName);
}
}
}
diff --git a/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java b/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
index 550828e..d828570 100644
--- a/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
@@ -19,13 +19,16 @@
package org.apache.felix.framework;
import java.util.*;
-
-import org.apache.felix.framework.ModuleImpl;
-import org.apache.felix.framework.util.Util;
+import org.apache.felix.framework.resolver.Module;
import org.apache.felix.framework.util.VersionRange;
-import org.apache.felix.moduleloader.IModule;
-import org.osgi.framework.*;
-import org.osgi.service.packageadmin.*;
+import org.osgi.framework.AdminPermission;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.service.packageadmin.RequiredBundle;
+
class PackageAdminImpl implements PackageAdmin, Runnable
{
@@ -191,14 +194,14 @@
if ((getBundleType(bundle) & BUNDLE_TYPE_FRAGMENT) == 0)
{
// Get attached fragments.
- IModule[] modules =
+ List<Module> modules =
((ModuleImpl)
((BundleImpl) bundle).getCurrentModule()).getFragments();
// Convert fragment modules to bundles.
List list = new ArrayList();
- for (int i = 0; (modules != null) && (i < modules.length); i++)
+ for (int i = 0; (modules != null) && (i < modules.size()); i++)
{
- Bundle b = modules[i].getBundle();
+ Bundle b = modules.get(i).getBundle();
if (b != null)
{
list.add(b);
@@ -216,7 +219,11 @@
{
if (getBundleType(bundle) == BUNDLE_TYPE_FRAGMENT)
{
- return m_felix.getDependentBundles((BundleImpl) bundle);
+ List<Bundle> hosts = m_felix.getDependentBundles((BundleImpl) bundle);
+ if (hosts != null)
+ {
+ return hosts.toArray(new Bundle[hosts.size()]);
+ }
}
return null;
}
@@ -347,4 +354,4 @@
}
}
}
-}
+}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/framework/RequiredBundleImpl.java b/framework/src/main/java/org/apache/felix/framework/RequiredBundleImpl.java
index 897022e..9f013a6 100644
--- a/framework/src/main/java/org/apache/felix/framework/RequiredBundleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/RequiredBundleImpl.java
@@ -18,16 +18,11 @@
*/
package org.apache.felix.framework;
-import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import org.apache.felix.framework.ModuleImpl;
-import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.ICapability;
-import org.apache.felix.moduleloader.IModule;
+import org.apache.felix.framework.resolver.Module;
import org.osgi.framework.Bundle;
-import org.osgi.framework.Constants;
import org.osgi.framework.Version;
import org.osgi.service.packageadmin.RequiredBundle;
@@ -67,17 +62,17 @@
// of the dependent modules.
Set bundleSet = new HashSet();
// Loop through all of this bundle's modules.
- IModule[] modules = m_bundle.getModules();
- for (int modIdx = 0; (modules != null) && (modIdx < modules.length); modIdx++)
+ List<Module> modules = m_bundle.getModules();
+ for (int modIdx = 0; (modules != null) && (modIdx < modules.size()); modIdx++)
{
// For each of this bundle's modules, loop through all of the
// modules that require it and add them to the module list.
- IModule[] dependents = ((ModuleImpl) modules[modIdx]).getDependentRequirers();
- for (int depIdx = 0; (dependents != null) && (depIdx < dependents.length); depIdx++)
+ List<Module> dependents = ((ModuleImpl) modules.get(modIdx)).getDependentRequirers();
+ for (int depIdx = 0; (dependents != null) && (depIdx < dependents.size()); depIdx++)
{
- if (dependents[depIdx].getBundle() != null)
+ if (dependents.get(depIdx).getBundle() != null)
{
- bundleSet.add(dependents[depIdx].getBundle());
+ bundleSet.add(dependents.get(depIdx).getBundle());
}
}
}
diff --git a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
index 10b964e..8cd05e2 100644
--- a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
@@ -22,12 +22,12 @@
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.*;
+import org.apache.felix.framework.resolver.Module;
+import org.apache.felix.framework.resolver.Wire;
import org.apache.felix.framework.util.MapToDictionary;
import org.apache.felix.framework.util.StringMap;
import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IModule;
-import org.apache.felix.moduleloader.IWire;
import org.osgi.framework.*;
import org.osgi.framework.BundleReference;
@@ -434,12 +434,12 @@
// Get the package.
String pkgName =
Util.getClassPackage(className);
- IModule requesterModule = ((BundleImpl) requester).getCurrentModule();
+ Module requesterModule = ((BundleImpl) requester).getCurrentModule();
// Get package wiring from service requester.
- IWire requesterWire = Util.getWire(requesterModule, pkgName);
+ Wire requesterWire = Util.getWire(requesterModule, pkgName);
// Get package wiring from service provider.
- IModule providerModule = ((BundleImpl) m_bundle).getCurrentModule();
- IWire providerWire = Util.getWire(providerModule, pkgName);
+ Module providerModule = ((BundleImpl) m_bundle).getCurrentModule();
+ Wire providerWire = Util.getWire(providerModule, pkgName);
// There are four situations that may occur here:
// 1. Neither the requester, nor provider have wires for the package.
diff --git a/framework/src/main/java/org/apache/felix/framework/URLHandlersBundleURLConnection.java b/framework/src/main/java/org/apache/felix/framework/URLHandlersBundleURLConnection.java
index 3947785..58be85c 100644
--- a/framework/src/main/java/org/apache/felix/framework/URLHandlersBundleURLConnection.java
+++ b/framework/src/main/java/org/apache/felix/framework/URLHandlersBundleURLConnection.java
@@ -23,14 +23,15 @@
import java.net.URL;
import java.net.URLConnection;
import java.security.Permission;
+import java.util.List;
+import org.apache.felix.framework.resolver.Module;
import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IModule;
class URLHandlersBundleURLConnection extends URLConnection
{
private Felix m_framework;
- private IModule m_targetModule;
+ private Module m_targetModule;
private int m_classPathIdx = -1;
private int m_contentLength;
private long m_contentTime;
@@ -77,8 +78,8 @@
m_contentTime = bundle.getLastModified();
int revision = Util.getModuleRevisionFromModuleId(url.getHost());
- IModule[] modules = bundle.getModules();
- if ((modules == null) || (revision >= modules.length))
+ List<Module> modules = bundle.getModules();
+ if ((modules == null) || (revision >= modules.size()))
{
throw new IOException("Resource does not exist: " + url);
}
@@ -86,7 +87,7 @@
// If the revision is not specified, check the latest
if (revision < 0)
{
- revision = modules.length - 1;
+ revision = modules.size() - 1;
}
// If the resource cannot be found at the current class path index,
@@ -96,15 +97,15 @@
// Of course, this approach won't work in cases where there are multiple
// resources with the same path, since it will always find the first
// one on the class path.
- m_targetModule = modules[revision];
+ m_targetModule = modules.get(revision);
m_classPathIdx = url.getPort();
if (m_classPathIdx < 0)
{
m_classPathIdx = 0;
}
- if (!modules[revision].hasInputStream(m_classPathIdx, url.getPath()))
+ if (!modules.get(revision).hasInputStream(m_classPathIdx, url.getPath()))
{
- URL newurl = modules[revision].getResourceByDelegation(url.getPath());
+ URL newurl = modules.get(revision).getResourceByDelegation(url.getPath());
if (newurl == null)
{
throw new IOException("Resource does not exist: " + url);
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/BundleRevision.java b/framework/src/main/java/org/apache/felix/framework/cache/BundleRevision.java
index c07a13c..72ec9fd 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/BundleRevision.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/BundleRevision.java
@@ -22,7 +22,7 @@
import java.util.Map;
import org.apache.felix.framework.Logger;
-import org.apache.felix.moduleloader.IContent;
+import org.apache.felix.framework.resolver.Content;
/**
* <p>
@@ -128,7 +128,7 @@
**/
public abstract Map getManifestHeader() throws Exception;
- public abstract IContent getContent() throws Exception;
+ public abstract Content getContent() throws Exception;
/**
* <p>
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java b/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
index f82f4fc..cfdde9c 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
@@ -18,18 +18,18 @@
*/
package org.apache.felix.framework.cache;
-import org.apache.felix.moduleloader.*;
+import org.apache.felix.framework.resolver.Content;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.NoSuchElementException;
-public class ContentDirectoryContent implements IContent
+public class ContentDirectoryContent implements Content
{
- private IContent m_content = null;
+ private Content m_content = null;
private String m_rootPath = null;
- public ContentDirectoryContent(IContent content, String path)
+ public ContentDirectoryContent(Content content, String path)
{
m_content = content;
// Add a '/' to the end if not present.
@@ -82,7 +82,7 @@
return m_content.getEntryAsStream(m_rootPath + name);
}
- public IContent getEntryAsContent(String name)
+ public Content getEntryAsContent(String name)
{
if ((name.length() > 0) && (name.charAt(0) == '/'))
{
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
index 7ff55cf..394cc76 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
@@ -18,7 +18,7 @@
*/
package org.apache.felix.framework.cache;
-import org.apache.felix.moduleloader.*;
+import org.apache.felix.framework.resolver.Content;
import java.io.*;
import java.util.*;
import org.apache.felix.framework.Logger;
@@ -26,7 +26,7 @@
import org.apache.felix.framework.util.Util;
import org.osgi.framework.Constants;
-public class DirectoryContent implements IContent
+public class DirectoryContent implements Content
{
private static final int BUFSIZE = 4096;
private static final transient String EMBEDDED_DIRECTORY = "-embedded";
@@ -131,7 +131,7 @@
return new FileInputStream(new File(m_dir, name));
}
- public synchronized IContent getEntryAsContent(String entryName)
+ public synchronized Content getEntryAsContent(String entryName)
{
// If the entry name refers to the content itself, then
// just return it immediately.
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java
index 716d81a..8275272 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java
@@ -26,7 +26,7 @@
import org.apache.felix.framework.Logger;
import org.apache.felix.framework.util.StringMap;
-import org.apache.felix.moduleloader.IContent;
+import org.apache.felix.framework.resolver.Content;
/**
* <p>
@@ -94,7 +94,7 @@
}
}
- public synchronized IContent getContent() throws Exception
+ public synchronized Content getContent() throws Exception
{
return new DirectoryContent(getLogger(), getConfig(), this, getRevisionRootDir(), m_refDir);
}
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java b/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
index 7af4bed..6402e78 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
@@ -32,10 +32,10 @@
import org.apache.felix.framework.util.FelixConstants;
import org.apache.felix.framework.util.JarFileX;
import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IContent;
+import org.apache.felix.framework.resolver.Content;
import org.osgi.framework.Constants;
-public class JarContent implements IContent
+public class JarContent implements Content
{
private static final int BUFSIZE = 4096;
private static final transient String EMBEDDED_DIRECTORY = "-embedded";
@@ -190,7 +190,7 @@
return is;
}
- public IContent getEntryAsContent(String entryName)
+ public Content getEntryAsContent(String entryName)
{
// If the entry name refers to the content itself, then
// just return it immediately.
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java b/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java
index b12a38c..c179566 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java
@@ -30,7 +30,7 @@
import org.apache.felix.framework.util.JarFileX;
import org.apache.felix.framework.util.StringMap;
import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IContent;
+import org.apache.felix.framework.resolver.Content;
/**
* <p>
@@ -107,7 +107,7 @@
return new StringMap(mf.getMainAttributes(), false);
}
- public synchronized IContent getContent() throws Exception
+ public synchronized Content getContent() throws Exception
{
return new JarContent(getLogger(), getConfig(), this, getRevisionRootDir(),
m_bundleFile, m_jarFile);
diff --git a/framework/src/main/java/org/apache/felix/framework/util/Util.java b/framework/src/main/java/org/apache/felix/framework/util/Util.java
index feae61f..d3477cc 100644
--- a/framework/src/main/java/org/apache/felix/framework/util/Util.java
+++ b/framework/src/main/java/org/apache/felix/framework/util/Util.java
@@ -25,9 +25,12 @@
import java.util.List;
import java.util.Map;
import java.util.Properties;
+import org.apache.felix.framework.capabilityset.Capability;
+import org.apache.felix.framework.capabilityset.CapabilitySet;
+import org.apache.felix.framework.resolver.Module;
+import org.apache.felix.framework.capabilityset.Requirement;
+import org.apache.felix.framework.resolver.Wire;
-import org.apache.felix.framework.util.manifestparser.Capability;
-import org.apache.felix.moduleloader.*;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
@@ -229,15 +232,15 @@
return allow;
}
- public static ICapability getSatisfyingCapability(IModule m, IRequirement req)
+ public static Capability getSatisfyingCapability(Module m, Requirement req)
{
- ICapability[] caps = m.getCapabilities();
- for (int i = 0; (caps != null) && (i < caps.length); i++)
+ List<Capability> caps = m.getCapabilities();
+ for (int i = 0; (caps != null) && (i < caps.size()); i++)
{
- if (caps[i].getNamespace().equals(req.getNamespace()) &&
- req.isSatisfied(caps[i]))
+ if (caps.get(i).getNamespace().equals(req.getNamespace())
+ && CapabilitySet.matches(caps.get(i), req.getFilter()))
{
- return caps[i];
+ return caps.get(i);
}
}
return null;
@@ -250,29 +253,29 @@
* @param namespace capability namespace
* @return array of matching capabilities or empty if none found
*/
- public static ICapability[] getCapabilityByNamespace(IModule module, String namespace)
+ public static List<Capability> getCapabilityByNamespace(Module module, String namespace)
{
- final List matching = new ArrayList();
- final ICapability[] caps = module.getCapabilities();
- for (int capIdx = 0; (caps != null) && (capIdx < caps.length); capIdx++)
+ final List<Capability> matching = new ArrayList();
+ final List<Capability> caps = module.getCapabilities();
+ for (int capIdx = 0; (caps != null) && (capIdx < caps.size()); capIdx++)
{
- if (caps[capIdx].getNamespace().equals(namespace))
+ if (caps.get(capIdx).getNamespace().equals(namespace))
{
- matching.add(caps[capIdx]);
+ matching.add(caps.get(capIdx));
}
}
- return (ICapability[]) matching.toArray(new ICapability[matching.size()]);
+ return matching;
}
- public static IWire getWire(IModule m, String name)
+ public static Wire getWire(Module m, String name)
{
- IWire[] wires = m.getWires();
- for (int i = 0; (wires != null) && (i < wires.length); i++)
+ List<Wire> wires = m.getWires();
+ for (int i = 0; (wires != null) && (i < wires.size()); i++)
{
- if (wires[i].getCapability().getNamespace().equals(ICapability.PACKAGE_NAMESPACE) &&
- ((Capability) wires[i].getCapability()).getPackageName().equals(name))
+ if (wires.get(i).getCapability().getNamespace().equals(Capability.PACKAGE_NAMESPACE) &&
+ wires.get(i).getCapability().getAttribute(Capability.PACKAGE_ATTR).getValue().equals(name))
{
- return wires[i];
+ return wires.get(i);
}
}
return null;
@@ -522,21 +525,20 @@
* @return <code>true</code> if the module declares a fragment host, <code>false</code>
* otherwise.
*/
- public static boolean isFragment(IModule module)
+ public static boolean isFragment(Module module)
{
Map headerMap = module.getHeaders();
return headerMap.containsKey(Constants.FRAGMENT_HOST);
}
-
//
// The following substring-related code was lifted and modified
// from the LDAP parser code.
//
- public static String[] parseSubstring(String target)
+ public static List<String> parseSubstring(String target)
{
- List pieces = new ArrayList();
+ ArrayList pieces = new ArrayList();
StringBuffer ss = new StringBuffer();
// int kind = SIMPLE; // assume until proven otherwise
boolean wasStar = false; // indicates last piece was a star
@@ -608,10 +610,11 @@
pieces.add(0, "");
}
}
- return (String[]) pieces.toArray(new String[pieces.size()]);
+ pieces.trimToSize();
+ return pieces;
}
- public static boolean checkSubstring(String[] pieces, String s)
+ public static boolean checkSubstring(List<String> pieces, String s)
{
// Walk the pieces to match the string
// There are implicit stars between each piece,
@@ -620,13 +623,13 @@
// minimal case is <string>*<string>
boolean result = true;
- int len = pieces.length;
+ int len = pieces.size();
int index = 0;
loop: for (int i = 0; i < len; i++)
{
- String piece = pieces[i];
+ String piece = pieces.get(i);
// If this is the first piece, then make sure the
// string starts with it.
@@ -672,4 +675,4 @@
return result;
}
-}
+}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/framework/util/VersionRange.java b/framework/src/main/java/org/apache/felix/framework/util/VersionRange.java
index b3d4a55..f8481b5 100644
--- a/framework/src/main/java/org/apache/felix/framework/util/VersionRange.java
+++ b/framework/src/main/java/org/apache/felix/framework/util/VersionRange.java
@@ -22,130 +22,63 @@
public class VersionRange
{
- private final Version m_low;
- private final boolean m_isLowInclusive;
- private final Version m_high;
- private final boolean m_isHighInclusive;
- public static final VersionRange infiniteRange = new VersionRange(Version.emptyVersion, true, null, true);
+ private final Version m_floor;
+ private final boolean m_isFloorInclusive;
+ private final Version m_ceiling;
+ private final boolean m_isCeilingInclusive;
+ public static final VersionRange infiniteRange
+ = new VersionRange(Version.emptyVersion, true, null, true);
public VersionRange(
Version low, boolean isLowInclusive,
Version high, boolean isHighInclusive)
{
- m_low = low;
- m_isLowInclusive = isLowInclusive;
- m_high = high;
- m_isHighInclusive = isHighInclusive;
+ m_floor = low;
+ m_isFloorInclusive = isLowInclusive;
+ m_ceiling = high;
+ m_isCeilingInclusive = isHighInclusive;
}
- public Version getLow()
+ public Version getFloor()
{
- return m_low;
+ return m_floor;
}
- public boolean isLowInclusive()
+ public boolean isFloorInclusive()
{
- return m_isLowInclusive;
+ return m_isFloorInclusive;
}
- public Version getHigh()
+ public Version getCeiling()
{
- return m_high;
+ return m_ceiling;
}
- public boolean isHighInclusive()
+ public boolean isCeilingInclusive()
{
- return m_isHighInclusive;
+ return m_isCeilingInclusive;
}
public boolean isInRange(Version version)
{
// We might not have an upper end to the range.
- if (m_high == null)
+ if (m_ceiling == null)
{
- return (version.compareTo(m_low) >= 0);
+ return (version.compareTo(m_floor) >= 0);
}
- else if (isLowInclusive() && isHighInclusive())
+ else if (isFloorInclusive() && isCeilingInclusive())
{
- return (version.compareTo(m_low) >= 0) && (version.compareTo(m_high) <= 0);
+ return (version.compareTo(m_floor) >= 0) && (version.compareTo(m_ceiling) <= 0);
}
- else if (isHighInclusive())
+ else if (isCeilingInclusive())
{
- return (version.compareTo(m_low) > 0) && (version.compareTo(m_high) <= 0);
+ return (version.compareTo(m_floor) > 0) && (version.compareTo(m_ceiling) <= 0);
}
- else if (isLowInclusive())
+ else if (isFloorInclusive())
{
- return (version.compareTo(m_low) >= 0) && (version.compareTo(m_high) < 0);
+ return (version.compareTo(m_floor) >= 0) && (version.compareTo(m_ceiling) < 0);
}
- return (version.compareTo(m_low) > 0) && (version.compareTo(m_high) < 0);
- }
-
- public boolean intersects(VersionRange vr)
- {
- // Check to see if the passed in floor is less than or equal to
- // this ceiling and the passed in ceiling is greater than or
- // equal to this floor.
- boolean isFloorLessThanCeiling = false;
- if ((m_high == null)
- || (m_high.compareTo(vr.getLow()) > 0)
- || ((m_high.compareTo(vr.getLow()) == 0)
- && m_isHighInclusive && vr.isLowInclusive()))
- {
- isFloorLessThanCeiling = true;
- }
- boolean isCeilingGreaterThanFloor = false;
- if ((vr.getHigh() == null)
- || (m_low.compareTo(vr.getHigh()) < 0)
- || ((m_low.compareTo(vr.getHigh()) == 0)
- && m_isLowInclusive && vr.isHighInclusive()))
- {
- isCeilingGreaterThanFloor = true;
- }
- return isFloorLessThanCeiling && isCeilingGreaterThanFloor;
- }
-
- public VersionRange intersection(VersionRange vr)
- {
- if (!intersects(vr))
- {
- return null;
- }
-
- VersionRange floor = (m_low.compareTo(vr.getLow()) > 0) ? this : vr;
- boolean floorInclusive = (getLow().equals(vr.getLow()))
- ? (isLowInclusive() & vr.isLowInclusive())
- : floor.isLowInclusive();
-
- VersionRange ceiling;
- boolean ceilingInclusive;
- if (vr.getHigh() == null)
- {
- ceiling = this;
- ceilingInclusive = ceiling.isHighInclusive();
- }
- else if (m_high == null)
- {
- ceiling = vr;
- ceilingInclusive = ceiling.isHighInclusive();
- }
- else if (m_high.compareTo(vr.getHigh()) > 0)
- {
- ceiling = vr;
- ceilingInclusive = ceiling.isHighInclusive();
- }
- else if (m_high.compareTo(vr.getHigh()) < 0)
- {
- ceiling = this;
- ceilingInclusive = ceiling.isHighInclusive();
- }
- else
- {
- ceiling = this;
- ceilingInclusive = (isHighInclusive() & vr.isHighInclusive());
- }
-
- return new VersionRange(
- floor.getLow(), floorInclusive, ceiling.getHigh(), ceilingInclusive);
+ return (version.compareTo(m_floor) > 0) && (version.compareTo(m_ceiling) < 0);
}
public static VersionRange parse(String range)
@@ -177,19 +110,19 @@
return false;
}
final VersionRange other = (VersionRange) obj;
- if (m_low != other.m_low && (m_low == null || !m_low.equals(other.m_low)))
+ if (m_floor != other.m_floor && (m_floor == null || !m_floor.equals(other.m_floor)))
{
return false;
}
- if (m_isLowInclusive != other.m_isLowInclusive)
+ if (m_isFloorInclusive != other.m_isFloorInclusive)
{
return false;
}
- if (m_high != other.m_high && (m_high == null || !m_high.equals(other.m_high)))
+ if (m_ceiling != other.m_ceiling && (m_ceiling == null || !m_ceiling.equals(other.m_ceiling)))
{
return false;
}
- if (m_isHighInclusive != other.m_isHighInclusive)
+ if (m_isCeilingInclusive != other.m_isCeilingInclusive)
{
return false;
}
@@ -199,28 +132,28 @@
public int hashCode()
{
int hash = 5;
- hash = 97 * hash + (m_low != null ? m_low.hashCode() : 0);
- hash = 97 * hash + (m_isLowInclusive ? 1 : 0);
- hash = 97 * hash + (m_high != null ? m_high.hashCode() : 0);
- hash = 97 * hash + (m_isHighInclusive ? 1 : 0);
+ hash = 97 * hash + (m_floor != null ? m_floor.hashCode() : 0);
+ hash = 97 * hash + (m_isFloorInclusive ? 1 : 0);
+ hash = 97 * hash + (m_ceiling != null ? m_ceiling.hashCode() : 0);
+ hash = 97 * hash + (m_isCeilingInclusive ? 1 : 0);
return hash;
}
public String toString()
{
- if (m_high != null)
+ if (m_ceiling != null)
{
StringBuffer sb = new StringBuffer();
- sb.append(m_isLowInclusive ? '[' : '(');
- sb.append(m_low.toString());
+ sb.append(m_isFloorInclusive ? '[' : '(');
+ sb.append(m_floor.toString());
sb.append(',');
- sb.append(m_high.toString());
- sb.append(m_isHighInclusive ? ']' : ')');
+ sb.append(m_ceiling.toString());
+ sb.append(m_isCeilingInclusive ? ']' : ')');
return sb.toString();
}
else
{
- return m_low.toString();
+ return m_floor.toString();
}
}
}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/moduleloader/IContent.java b/framework/src/main/java/org/apache/felix/moduleloader/IContent.java
deleted file mode 100644
index 93dcd9a..0000000
--- a/framework/src/main/java/org/apache/felix/moduleloader/IContent.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.moduleloader;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Enumeration;
-
-public interface IContent
-{
- /**
- * <p>
- * This method must be called when the content is no longer needed so
- * that any resourses being used (e.g., open files) can be closed. Once
- * this method is called, the content is no longer usable. If the content
- * is already closed, then calls on this method should have no effect.
- * </p>
- **/
- void close();
-
- /**
- * <p>
- * This method determines if the specified named entry is contained in
- * the associated content. The entry name is a relative path with '/'
- * separators.
- * </p>
- * @param name The name of the entry to find.
- * @return <tt>true</tt> if a corresponding entry was found, <tt>false</tt>
- * otherwise.
- **/
- boolean hasEntry(String name);
-
- /**
- * <p>
- * Returns an enumeration of entry names as <tt>String</tt> objects.
- * An entry name is a path constructed with '/' as path element
- * separators and is relative to the root of the content. Entry names
- * for entries that represent directories should end with the '/'
- * character.
- * </p>
- * @returns An enumeration of entry names or <tt>null</tt>.
- **/
- Enumeration getEntries();
-
- /**
- * <p>
- * This method returns the named entry as an array of bytes.
- * </p>
- * @param name The name of the entry to retrieve as a byte array.
- * @return An array of bytes if the corresponding entry was found, <tt>null</tt>
- * otherwise.
- **/
- byte[] getEntryAsBytes(String name);
-
- /**
- * <p>
- * This method returns the named entry as an input stream.
- * </p>
- * @param name The name of the entry to retrieve as an input stream.
- * @return An input stream if the corresponding entry was found, <tt>null</tt>
- * otherwise.
- * @throws <tt>java.io.IOException</tt> if any error occurs.
- **/
- InputStream getEntryAsStream(String name) throws IOException;
-
- /**
- * <p>
- * This method returns the named entry as an <tt>IContent</tt> Typically,
- * this method only makes sense for entries that correspond to some form
- * of aggregated resource (e.g., an embedded JAR file or directory), but
- * implementations are free to interpret this however makes sense. This method
- * should return a new <tt>IContent</tt> instance for every invocation and
- * the caller is responsible for opening and closing the returned content
- * object.
- * </p>
- * @param name The name of the entry to retrieve as an <tt>IContent</tt>.
- * @return An <tt>IContent</tt> instance if a corresponding entry was found,
- * <tt>null</tt> otherwise.
- **/
- IContent getEntryAsContent(String name);
-
- /**
- * <p>
- * This method returns the named entry as a file in the file system for
- * use as a native library. It may not be possible for all content
- * implementations (e.g., memory only) to implement this method, in which
- * case it is acceptable to return <tt>null</tt>. Since native libraries
- * can only be associated with a single class loader, this method should
- * return a unique file per request.
- * </p>
- * @param name The name of the entry to retrieve as a file.
- * @return A string corresponding to the absolute path of the file if a
- * corresponding entry was found, <tt>null</tt> otherwise.
- **/
- String getEntryAsNativeLibrary(String name);
-}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/moduleloader/ResourceNotFoundException.java b/framework/src/main/java/org/apache/felix/moduleloader/ResourceNotFoundException.java
deleted file mode 100644
index 8b339a0..0000000
--- a/framework/src/main/java/org/apache/felix/moduleloader/ResourceNotFoundException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.moduleloader;
-
-public class ResourceNotFoundException extends Exception
-{
- public ResourceNotFoundException(String msg)
- {
- super(msg);
- }
-}
\ No newline at end of file
diff --git a/framework/src/test/java/org/apache/felix/framework/util/UtilTest.java b/framework/src/test/java/org/apache/felix/framework/util/UtilTest.java
index 56fb313..0761cb7 100644
--- a/framework/src/test/java/org/apache/felix/framework/util/UtilTest.java
+++ b/framework/src/test/java/org/apache/felix/framework/util/UtilTest.java
@@ -19,12 +19,13 @@
package org.apache.felix.framework.util;
import junit.framework.TestCase;
+import java.util.List;
public class UtilTest extends TestCase
{
public void testSubstringMatching()
{
- String[] pieces;
+ List<String> pieces;
pieces = Util.parseSubstring("foo");
assertTrue("Should match!", Util.checkSubstring(pieces, "foo"));
@@ -60,4 +61,4 @@
assertTrue("Should match!", Util.checkSubstring(pieces, "sdffoobsdfbarlj"));
assertFalse("Should not match!", Util.checkSubstring(pieces, "sdffobsdfbarlj"));
}
-}
\ No newline at end of file
+}