You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2009/07/22 00:39:16 UTC

svn commit: r796571 - in /felix/trunk/framework/src/main/java/org/apache/felix/framework: Felix.java searchpolicy/Resolver.java

Author: rickhall
Date: Tue Jul 21 22:39:16 2009
New Revision: 796571

URL: http://svn.apache.org/viewvc?rev=796571&view=rev
Log:
Perform required execution environment check at resolve time. (FELIX-1397)

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/Resolver.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java?rev=796571&r1=796570&r2=796571&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java Tue Jul 21 22:39:16 2009
@@ -113,10 +113,6 @@
     // Reusable bundle URL stream handler.
     private final URLStreamHandler m_bundleStreamHandler;
 
-    // Execution environment.
-    private String m_executionEnvironment = "";
-    private Set m_executionEnvironmentCache = new HashSet();
-
     // Boot package delegation.
     private final String[] m_bootPkgs;
     private final boolean[] m_bootPkgWildcards;
@@ -295,7 +291,10 @@
 
         // Create a resolver and its state.
         m_resolverState = new FelixResolverState(m_logger);
-        m_felixResolver = new FelixResolver(new Resolver(m_logger), m_resolverState);
+        m_felixResolver = new FelixResolver(
+            new Resolver(m_logger,
+                (String) m_configMap.get(Constants.FRAMEWORK_EXECUTIONENVIRONMENT)),
+            m_resolverState);
 
         // Create the extension manager, which we will use as the module
         // definition for creating the system bundle module.
@@ -2410,8 +2409,6 @@
                     releaseGlobalLock();
                 }
 
-                verifyExecutionEnvironment(bundle);
-
                 if (!bundle.isExtension())
                 {
                     Object sm = System.getSecurityManager();
@@ -2533,98 +2530,6 @@
     }
 
     /**
-     * Checks the passed in bundle and checks to see if there is a required execution environment.
-     * If there is, it gets the execution environment string and verifies that the framework provides it.
-     * @param bundle The bundle to verify
-     * @throws BundleException if the bundle's required execution environment does
-     *         not match the current execution environment.
-    **/
-    private void verifyExecutionEnvironment(BundleImpl bundle)
-        throws ResolveException
-    {
-        String bundleEnvironment = (String)
-            bundle.getCurrentModule().getHeaders().get(
-                Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT);
-        if (bundleEnvironment != null)
-        {
-            bundleEnvironment = bundleEnvironment.trim();
-            if (!bundleEnvironment.equals(""))
-            {
-                if (!isMatchingExecutionEnvironment(bundleEnvironment))
-                {
-                    throw new ResolveException(
-                        "Execution Environment not supported: " + bundleEnvironment, null, null);
-                }
-            }
-        }
-    }
-
-    /**
-     * Check the required bundle execution environment against the framework provided
-     * exectution environment.
-     * @param bundleEnvironment The required execution environment string
-     *        (from Bundle-RequiredExecutionEnvironment manifest header
-     * @return True if the required bundle execution environment is provided by the framework
-     *         False if none of the provided framework execution environments match
-    **/
-    private boolean isMatchingExecutionEnvironment(String bundleEnvironment)
-    {
-        String frameworkEnvironment = getProperty(Constants.FRAMEWORK_EXECUTIONENVIRONMENT);
-        if (frameworkEnvironment == null)
-        {
-            // If no framework execution environment is set, then all are valid
-            return true;
-        }
-
-        frameworkEnvironment = frameworkEnvironment.trim();
-        if ("".equals(frameworkEnvironment))
-        {
-            // If no framework execution environment is set, then all are valid
-            return true;
-        }
-
-        // The execution environment has changed, so update the cache and EE set
-        if (!m_executionEnvironment.equals(frameworkEnvironment))
-        {
-            updateFrameworkExecutionEnvironment(frameworkEnvironment);
-        }
-
-        StringTokenizer tokens = new StringTokenizer(bundleEnvironment, ",");
-        while (tokens.hasMoreTokens())
-        {
-            if (m_executionEnvironmentCache.contains(tokens.nextToken().trim()))
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Updates the framework wide execution environment string and a cached Set of
-     * execution environment tokens from the comma delimited list specified by the
-     * system variable 'org.osgi.framework.executionenvironment'.
-     * @param frameworkEnvironment Comma delimited string of provided execution environments
-    **/
-    private void updateFrameworkExecutionEnvironment(String frameworkEnvironment)
-    {
-        StringTokenizer tokens = new StringTokenizer(frameworkEnvironment, ",");
-
-        Set newSet = new HashSet(tokens.countTokens());
-        while (tokens.hasMoreTokens())
-        {
-            newSet.add(tokens.nextToken().trim());
-        }
-
-        synchronized (m_executionEnvironmentCache)
-        {
-            m_executionEnvironment = frameworkEnvironment;
-            m_executionEnvironmentCache = newSet;
-        }
-    }
-
-    /**
      * Retrieves a bundle from its location.
      *
      * @param location The location of the bundle to retrieve.
@@ -3990,8 +3895,6 @@
                         }
                     }
 
-                    verifyExecutionEnvironment(bundle);
-
                     // Before trying to resolve, tell the resolver state to
                     // merge all fragments into host, which may result in the
                     // rootModule changing if the real root is a module.

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/Resolver.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/Resolver.java?rev=796571&r1=796570&r2=796571&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/Resolver.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/Resolver.java Tue Jul 21 22:39:16 2009
@@ -22,9 +22,12 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
 import org.apache.felix.framework.Logger;
 import org.apache.felix.framework.util.Util;
 import org.apache.felix.framework.util.manifestparser.Capability;
@@ -36,20 +39,27 @@
 import org.apache.felix.moduleloader.IModule;
 import org.apache.felix.moduleloader.IRequirement;
 import org.apache.felix.moduleloader.IWire;
+import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
 
 public class Resolver
 {
     private final Logger m_logger;
 
+    // Execution environment.
+    private final String m_fwkExecEnvStr;
+    private final Set m_fwkExecEnvSet;
+
     // Reusable empty array.
     private static final IWire[] m_emptyWires = new IWire[0];
     private static final IModule[] m_emptyModules = new IModule[0];
     private static final PackageSource[] m_emptySources = new PackageSource[0];
 
-    public Resolver(Logger logger)
+    public Resolver(Logger logger, String fwkExecEnvStr)
     {
         m_logger = logger;
+        m_fwkExecEnvStr = fwkExecEnvStr.trim();
+        m_fwkExecEnvSet = parseExecutionEnvironments(fwkExecEnvStr);
     }
 
     // Returns a map of resolved bundles where the key is the module
@@ -336,7 +346,7 @@
         return populateWireMap(state, candidatesMap, provider, new HashMap());
     }
 
-    private static void populateCandidatesMap(
+    private void populateCandidatesMap(
         ResolverState state, Map candidatesMap, IModule targetModule)
         throws ResolveException
     {
@@ -346,39 +356,15 @@
             return;
         }
 
-        // First, try to resolve any native code, since the module is
-        // not resolvable if its native code cannot be loaded.
-        R4Library[] libs = targetModule.getNativeLibraries();
-        if (libs != null)
-        {
-            String msg = null;
-            // Verify that all native libraries exist in advance; this will
-            // throw an exception if the native library does not exist.
-            for (int libIdx = 0; (msg == null) && (libIdx < libs.length); libIdx++)
-            {
-                String entryName = libs[libIdx].getEntryName();
-                if (entryName != null)
-                {
-                    if (!targetModule.getContent().hasEntry(entryName))
-                    {
-                        msg = "Native library does not exist: " + entryName;
-                    }
-                }
-            }
-            // If we have a zero-length native library array, then
-            // this means no native library class could be selected
-            // so we should fail to resolve.
-            if (libs.length == 0)
-            {
-                msg = "No matching native libraries found.";
-            }
-            if (msg != null)
-            {
-                throw new ResolveException(msg, targetModule, null);
-            }
-        }
+        // Verify that any required execution environment is satisfied.
+        verifyExecutionEnvironment(m_fwkExecEnvStr, m_fwkExecEnvSet, targetModule);
 
-        // List to hold the resolving candidate sets for the target
+        // Verify that any native libraries match the current platform.
+        verifyNativeLibraries(targetModule);
+
+        // Finally, resolve any dependencies the module may have.
+
+        // Create list to hold the resolving candidate sets for the target
         // module's requirements.
         List candSetList = new ArrayList();
 
@@ -1558,6 +1544,106 @@
     // Utility methods.
     //
 
+    private static void verifyNativeLibraries(IModule module)
+        throws ResolveException
+    {
+        // Next, try to resolve any native code, since the module is
+        // not resolvable if its native code cannot be loaded.
+        R4Library[] libs = module.getNativeLibraries();
+        if (libs != null)
+        {
+            String msg = null;
+            // Verify that all native libraries exist in advance; this will
+            // throw an exception if the native library does not exist.
+            for (int libIdx = 0; (msg == null) && (libIdx < libs.length); libIdx++)
+            {
+                String entryName = libs[libIdx].getEntryName();
+                if (entryName != null)
+                {
+                    if (!module.getContent().hasEntry(entryName))
+                    {
+                        msg = "Native library does not exist: " + entryName;
+                    }
+                }
+            }
+            // If we have a zero-length native library array, then
+            // this means no native library class could be selected
+            // so we should fail to resolve.
+            if (libs.length == 0)
+            {
+                msg = "No matching native libraries found.";
+            }
+            if (msg != null)
+            {
+                throw new ResolveException(msg, module, null);
+            }
+        }
+    }
+
+    /**
+     * Checks to see if the passed in module's required execution environment
+     * is provided by the framework.
+     * @param fwkExecEvnStr The original property value of the framework's
+     *        supported execution environments.
+     * @param fwkExecEnvSet Parsed set of framework's supported execution environments.
+     * @param module The module whose required execution environment is to be to verified.
+     * @throws ResolveException if the module's required execution environment does
+     *         not match the framework's supported execution environment.
+    **/
+    private static void verifyExecutionEnvironment(
+        String fwkExecEnvStr, Set fwkExecEnvSet, IModule module)
+        throws ResolveException
+    {
+        String bundleExecEnvStr = (String)
+            module.getHeaders().get(Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT);
+        if (bundleExecEnvStr != null)
+        {
+            bundleExecEnvStr = bundleExecEnvStr.trim();
+
+            // If the bundle has specified an execution environment and the
+            // framework has an execution environment specified, then we must
+            // check for a match.
+            if (!bundleExecEnvStr.equals("")
+                && (fwkExecEnvStr != null)
+                && (fwkExecEnvStr.length() > 0))
+            {
+                StringTokenizer tokens = new StringTokenizer(bundleExecEnvStr, ",");
+                boolean found = false;
+                while (tokens.hasMoreTokens() && !found)
+                {
+                    if (fwkExecEnvSet.contains(tokens.nextToken().trim()))
+                    {
+                        found = true;
+                    }
+                }
+                if (!found)
+                {
+                    throw new ResolveException(
+                        "Execution environment not supported: "
+                        + bundleExecEnvStr, module, null);
+                }
+            }
+        }
+    }
+
+    /**
+     * Updates the framework wide execution environment string and a cached Set of
+     * execution environment tokens from the comma delimited list specified by the
+     * system variable 'org.osgi.framework.executionenvironment'.
+     * @param frameworkEnvironment Comma delimited string of provided execution environments
+    **/
+    private static Set parseExecutionEnvironments(String frameworkEnvironment)
+    {
+        StringTokenizer tokens = new StringTokenizer(frameworkEnvironment, ",");
+
+        Set newSet = new HashSet(tokens.countTokens());
+        while (tokens.hasMoreTokens())
+        {
+            newSet.add(tokens.nextToken().trim());
+        }
+        return newSet;
+    }
+
     private static IModule[] shrinkModuleArray(IModule[] modules)
     {
         if (modules == null)