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 2008/10/10 17:13:11 UTC

svn commit: r703496 - in /felix/trunk/framework/src/main/java/org/apache/felix/framework: BundleInfo.java Felix.java RegularBundleInfo.java SystemBundleInfo.java

Author: rickhall
Date: Fri Oct 10 08:13:10 2008
New Revision: 703496

URL: http://svn.apache.org/viewvc?rev=703496&view=rev
Log:
The refactoring of BundleInfo was not complete, since RegularBundleInfo was
duplicating its functionality. Now they are completely separated. (FELIX-753)

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleInfo.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/RegularBundleInfo.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/SystemBundleInfo.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleInfo.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleInfo.java?rev=703496&r1=703495&r2=703496&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleInfo.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleInfo.java Fri Oct 10 08:13:10 2008
@@ -23,24 +23,17 @@
 import java.security.ProtectionDomain;
 import java.util.*;
 
-import org.apache.felix.framework.cache.BundleArchive;
-import org.apache.felix.framework.searchpolicy.ModuleDefinition;
-import org.apache.felix.framework.util.manifestparser.ManifestParser;
-import org.apache.felix.moduleloader.ICapability;
 import org.apache.felix.moduleloader.IContentLoader;
 import org.apache.felix.moduleloader.IModule;
 import org.osgi.framework.*;
 
-class BundleInfo
+abstract class BundleInfo
 {
     private Logger m_logger = null;
-    private BundleArchive m_archive = null;
     private IModule[] m_modules = null;
     private int m_state = 0;
     private BundleActivator m_activator = null;
     private BundleContext m_context = null;
-    private String m_cachedSymbolicName = null;
-    private long m_cachedSymbolicNameTimestamp;
     private Map m_cachedHeaders = new HashMap();
     private long m_cachedHeadersTimestamp;
 
@@ -57,13 +50,19 @@
     private int m_lockCount = 0;
     private Thread m_lockThread = null;
 
-    /**
-     *  Returns the bundle archive associated with this bundle.
-     * @return the bundle archive associated with this bundle.
-    **/
-    public BundleArchive getArchive()
+    public BundleInfo(Logger logger, IModule module)
+    {
+        m_logger = logger;
+        m_modules = (module == null) ? new IModule[0] : new IModule[] { module };
+        m_state = Bundle.INSTALLED;
+        m_stale = false;
+        m_activator = null;
+        m_context = null;
+    }
+
+    public Logger getLogger()
     {
-        return m_archive;
+        return m_logger;
     }
 
     /**
@@ -124,118 +123,17 @@
         m_modules = dest;
     }
 
-    public synchronized String getSymbolicName()
-    {
-        // If the bundle has been updated, clear the cached symbolic name.
-        if (getLastModified() > m_cachedSymbolicNameTimestamp)
-        {
-            m_cachedSymbolicName = null;
-            m_cachedSymbolicNameTimestamp = getLastModified();
-            try
-            {
-                // TODO: FRAMEWORK - Rather than reparsing every time, I wonder if
-                //       we should be caching this value some place.
-                final ICapability moduleCap = ManifestParser.parseBundleSymbolicName(getCurrentHeader());
-                if (moduleCap != null)
-                {
-                    m_cachedSymbolicName = (String) moduleCap.getProperties().get(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE);
-                }
-            }
-            catch (BundleException ex)
-            {
-                // Return null.
-            }
-        }
-        return m_cachedSymbolicName;
-    }
+    public abstract String getSymbolicName();
 
-    public long getBundleId()
-    {
-        try
-        {
-            return m_archive.getId();
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(
-                Logger.LOG_ERROR,
-                "Error getting the identifier from bundle archive.",
-                ex);
-            return -1;
-        }
-    }
+    public abstract long getBundleId();
 
-    public String getLocation()
-    {
-        try
-        {
-            return m_archive.getLocation();
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(
-                Logger.LOG_ERROR,
-                "Error getting location from bundle archive.",
-                ex);
-            return null;
-        }
-    }
+    public abstract String getLocation();
 
-    public int getStartLevel(int defaultLevel)
-    {
-        try
-        {
-            return m_archive.getStartLevel();
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(
-                Logger.LOG_ERROR,
-                "Error reading start level from bundle archive.",
-                ex);
-            return defaultLevel;
-        }
-    }
+    public abstract int getStartLevel(int defaultLevel);
 
-    public void setStartLevel(int i)
-    {
-        try
-        {
-            m_archive.setStartLevel(i);
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(
-                Logger.LOG_ERROR,
-                "Error writing start level to bundle archive.",
-                ex);
-        }
-    }
+    public abstract void setStartLevel(int i);
 
-    public Map getCurrentHeader()
-    {
-        Map headerMap = null;
-        // Special case the system bundle
-        if (getBundleId() == 0)
-        {
-            // TODO: REFACTOR - This is sort of a hack, we should just expose
-            //       the bundle symbolic name from our API.
-            try
-            {
-                headerMap = m_archive.getRevision(0).getManifestHeader();
-            }
-            catch (Exception ex)
-            {
-                // This should never happen.
-            }
-        }
-        else
-        {
-            headerMap = ((ModuleDefinition) getCurrentModule().getDefinition()).getHeaders();
-        }
-            
-        return headerMap;
-    }
+    public abstract Map getCurrentHeader();
 
     public Map getCurrentLocalizedHeader(String locale)
     {
@@ -372,96 +270,17 @@
         m_state = i;
     }
 
-    public long getLastModified()
-    {
-        try
-        {
-            return m_archive.getLastModified();
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(
-                Logger.LOG_ERROR,
-                "Error reading last modification time from bundle archive.",
-                ex);
-            return 0;
-        }
-    }
+    public abstract long getLastModified();
 
-    public void setLastModified(long l)
-    {
-        try
-        {
-            m_archive.setLastModified(l);
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(
-                Logger.LOG_ERROR,
-                "Error writing last modification time to bundle archive.",
-                ex);
-        }
-    }
+    public abstract void setLastModified(long l);
 
-    public int getPersistentState()
-    {
-        try
-        {
-            return m_archive.getPersistentState();
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(
-                Logger.LOG_ERROR,
-                "Error reading persistent state from bundle archive.",
-                ex);
-            return Bundle.INSTALLED;
-        }
-    }
+    public abstract int getPersistentState();
 
-    public void setPersistentStateInactive()
-    {
-        try
-        {
-            m_archive.setPersistentState(Bundle.INSTALLED);
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(Logger.LOG_ERROR,
-                "Error writing persistent state to bundle archive.",
-                ex);
-        }
-    }
+    public abstract void setPersistentStateInactive();
 
-    public void setPersistentStateActive()
-    {
-        try
-        {
-            m_archive.setPersistentState(Bundle.ACTIVE);
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(
-                Logger.LOG_ERROR,
-                "Error writing persistent state to bundle archive.",
-                ex);
-        }
-    }
+    public abstract void setPersistentStateActive();
 
-    public void setPersistentStateUninstalled()
-    {
-        try
-        {
-            m_archive.setPersistentState(Bundle.UNINSTALLED);
-        }
-        catch (Exception ex)
-        {
-            m_logger.log(
-                Logger.LOG_ERROR,
-                "Error writing persistent state to bundle archive.",
-                ex);
-        }
-    }
+    public abstract void setPersistentStateUninstalled();
 
     public synchronized BundleContext getBundleContext()
     {

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=703496&r1=703495&r2=703496&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 Fri Oct 10 08:13:10 2008
@@ -320,7 +320,7 @@
         m_policyCore.setModuleFactory(m_factory);
 
         // Create the system bundle info object, which will hold state info.
-        m_sbi = new SystemBundleInfo();
+        m_sbi = new SystemBundleInfo(m_logger, null);
         // Create the extension manager, which we will use as the module
         // definition for creating the system bundle module.
         m_extensionManager = new ExtensionManager(m_logger, m_configMap, m_sbi);
@@ -3279,7 +3279,7 @@
             isExtension);
 
         // Finally, create an return the bundle info.
-        RegularBundleInfo info = new RegularBundleInfo(m_logger, archive, module);
+        RegularBundleInfo info = new RegularBundleInfo(m_logger, module, archive);
         info.setExtension(isExtension);
 
         return info;

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/RegularBundleInfo.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/RegularBundleInfo.java?rev=703496&r1=703495&r2=703496&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/RegularBundleInfo.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/RegularBundleInfo.java Fri Oct 10 08:13:10 2008
@@ -33,110 +33,26 @@
 
 class RegularBundleInfo extends BundleInfo
 {
-    private Logger m_logger = null;
     private BundleArchive m_archive = null;
-    private IModule[] m_modules = null;
-    private int m_state = 0;
-    private BundleActivator m_activator = null;
-    private BundleContext m_context = null;
     private String m_cachedSymbolicName = null;
     private long m_cachedSymbolicNameTimestamp;
-    private Map m_cachedHeaders = new HashMap();
-    private long m_cachedHeadersTimestamp;
 
-    // Indicates whether the bundle is stale, meaning that it has
-    // been refreshed and completely removed from the framework.
-    private boolean m_stale = false;
-
-    // Indicates whether the bundle is an extension, meaning that it is
-    // installed as an extension bundle to the framework (i.e., can not be
-    // removed or updated until a framework restart.
-    private boolean m_extension = false;
-
-    // Used for bundle locking.
-    private int m_lockCount = 0;
-    private Thread m_lockThread = null;
-
-    protected RegularBundleInfo(Logger logger, BundleArchive archive, IModule module)
+    protected RegularBundleInfo(Logger logger, IModule module, BundleArchive archive)
     {
-        m_logger = logger;
+        super(logger, module);
         m_archive = archive;
-        m_modules = (module == null) ? new IModule[0] : new IModule[] { module };
-
-        m_state = Bundle.INSTALLED;
-        m_stale = false;
-        m_activator = null;
-        m_context = null;
     }
 
     /**
      *  Returns the bundle archive associated with this bundle.
      * @return the bundle archive associated with this bundle.
     **/
-// TODO: KARL - Should this be on BundleInfo and just return in SystemBundleInfo or exception?
+// TODO: SYSTEMBUNDLE - Should this be on BundleInfo and just return in SystemBundleInfo or exception?
     public BundleArchive getArchive()
     {
         return m_archive;
     }
 
-    /**
-     * Returns an array of all modules associated with the bundle represented by
-     * this <tt>BundleInfo</tt> object. A module in the array corresponds to a
-     * revision of the bundle's JAR file and is ordered from oldest to newest.
-     * Multiple revisions of a bundle JAR file might exist if a bundle is
-     * updated, without refreshing the framework. In this case, exports from
-     * the prior revisions of the bundle JAR file are still offered; the
-     * current revision will be bound to packages from the prior revision,
-     * unless the packages were not offered by the prior revision. There is
-     * no limit on the potential number of bundle JAR file revisions.
-     * @return array of modules corresponding to the bundle JAR file revisions.
-    **/
-    public synchronized IModule[] getModules()
-    {
-        return m_modules;
-    }
-
-    /**
-     * Determines if the specified module is associated with this bundle.
-     * @param module the module to determine if it is associate with this bundle.
-     * @return <tt>true</tt> if the specified module is in the array of modules
-     *         associated with this bundle, <tt>false</tt> otherwise.
-    **/
-    public synchronized boolean hasModule(IModule module)
-    {
-        for (int i = 0; i < m_modules.length; i++)
-        {
-            if (m_modules[i] == module)
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns the newest module, which corresponds to the last module
-     * in the module array.
-     * @return the newest module.
-    **/
-    public synchronized IModule getCurrentModule()
-    {
-        return m_modules[m_modules.length - 1];
-    }
-
-    /**
-     * Add a module that corresponds to a new bundle JAR file revision for
-     * the bundle associated with this <tt>BundleInfo</tt> object.
-     * @param module the module to add.
-    **/
-    public synchronized void addModule(IModule module)
-    {
-        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;
-    }
-
     public synchronized String getSymbolicName()
     {
         // If the bundle has been updated, clear the cached symbolic name.
@@ -170,7 +86,7 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(
+            getLogger().log(
                 Logger.LOG_ERROR,
                 "Error getting the identifier from bundle archive.",
                 ex);
@@ -186,7 +102,7 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(
+            getLogger().log(
                 Logger.LOG_ERROR,
                 "Error getting location from bundle archive.",
                 ex);
@@ -202,7 +118,7 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(
+            getLogger().log(
                 Logger.LOG_ERROR,
                 "Error reading start level from bundle archive.",
                 ex);
@@ -218,7 +134,7 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(
+            getLogger().log(
                 Logger.LOG_ERROR,
                 "Error writing start level to bundle archive.",
                 ex);
@@ -250,141 +166,6 @@
         return headerMap;
     }
 
-    public Map getCurrentLocalizedHeader(String locale)
-    {
-        synchronized (m_cachedHeaders)
-        {
-            // If the bundle has been updated, clear the cached headers
-            if (getLastModified() > m_cachedHeadersTimestamp)
-            {
-                m_cachedHeaders.clear();
-            }
-            else
-            {
-                // Check if headers for this locale have already been resolved
-                if (m_cachedHeaders.containsKey(locale))
-                {
-                    return (Map) m_cachedHeaders.get(locale);
-                }
-            }
-        }
-
-        Map rawHeaders = getCurrentHeader();
-        Map headers = new HashMap(rawHeaders.size());
-        headers.putAll(rawHeaders);
-
-        // Check to see if we actually need to localize anything
-        boolean needsLocalization = false;
-        for (Iterator it = headers.values().iterator(); it.hasNext(); )
-        {
-            if (((String) it.next()).startsWith("%"))
-            {
-                needsLocalization = true;
-                break;
-            }
-        }
-
-        if (!needsLocalization)
-        {
-            // If localization is not needed, just cache the headers and return them as-is
-            // Not sure if this is useful
-            updateHeaderCache(locale, headers);
-            return headers;
-        }
-
-        // Do localization here and return the localized headers
-        IContentLoader loader = this.getCurrentModule().getContentLoader();
-
-        String basename = (String) headers.get(Constants.BUNDLE_LOCALIZATION);
-        if (basename == null)
-        {
-            basename = Constants.BUNDLE_LOCALIZATION_DEFAULT_BASENAME;
-        }
-
-        // Create ordered list of files to load properties from
-        List resourceList = createResourceList(basename, locale);
-
-        // Create a merged props file with all available props for this locale
-        Properties mergedProperties = new Properties();
-        for (Iterator it = resourceList.iterator(); it.hasNext(); )
-        {
-            URL temp = loader.getResource(it.next() + ".properties");
-            if (temp == null)
-            {
-                continue;
-            }
-            try
-            {
-                mergedProperties.load(temp.openConnection().getInputStream());
-            }
-            catch (IOException ex)
-            {
-                // File doesn't exist, just continue loop
-            }
-        }
-
-        // Resolve all localized header entries
-        for (Iterator it = headers.entrySet().iterator(); it.hasNext(); )
-        {
-            Map.Entry entry = (Map.Entry) it.next();
-            String value = (String) entry.getValue();
-            if (value.startsWith("%"))
-            {
-                String newvalue;
-                String key = value.substring(value.indexOf("%") + 1);
-                newvalue = mergedProperties.getProperty(key);
-                if (newvalue==null)
-                {
-                    newvalue = key;
-                }
-                entry.setValue(newvalue);
-            }
-        }
-
-        updateHeaderCache(locale, headers);
-        return headers;
-    }
-
-    private void updateHeaderCache(String locale, Map localizedHeaders)
-    {
-        synchronized (m_cachedHeaders)
-        {
-            m_cachedHeaders.put(locale, localizedHeaders);
-            m_cachedHeadersTimestamp = System.currentTimeMillis();
-        }
-    }
-
-    private List createResourceList(String basename, String locale)
-    {
-        List result = new ArrayList(4);
-
-        StringTokenizer tokens;
-        StringBuffer tempLocale = new StringBuffer(basename);
-
-        result.add(tempLocale.toString());
-
-        if (locale.length() > 0)
-        {
-            tokens = new StringTokenizer(locale, "_");
-            while (tokens.hasMoreTokens())
-            {
-                tempLocale.append("_").append(tokens.nextToken());
-                result.add(tempLocale.toString());
-            }
-        }
-        return result;
-    }
-
-    public synchronized int getState()
-    {
-        return m_state;
-    }
-
-    public synchronized void setState(int i)
-    {
-        m_state = i;
-    }
-
     public long getLastModified()
     {
         try
@@ -393,7 +174,7 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(
+            getLogger().log(
                 Logger.LOG_ERROR,
                 "Error reading last modification time from bundle archive.",
                 ex);
@@ -409,7 +190,7 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(
+            getLogger().log(
                 Logger.LOG_ERROR,
                 "Error writing last modification time to bundle archive.",
                 ex);
@@ -424,7 +205,7 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(
+            getLogger().log(
                 Logger.LOG_ERROR,
                 "Error reading persistent state from bundle archive.",
                 ex);
@@ -440,7 +221,7 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(Logger.LOG_ERROR,
+            getLogger().log(Logger.LOG_ERROR,
                 "Error writing persistent state to bundle archive.",
                 ex);
         }
@@ -454,7 +235,7 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(
+            getLogger().log(
                 Logger.LOG_ERROR,
                 "Error writing persistent state to bundle archive.",
                 ex);
@@ -469,112 +250,10 @@
         }
         catch (Exception ex)
         {
-            m_logger.log(
+            getLogger().log(
                 Logger.LOG_ERROR,
                 "Error writing persistent state to bundle archive.",
                 ex);
         }
     }
-
-    public synchronized BundleContext getBundleContext()
-    {
-        return m_context;
-    }
-
-    public synchronized void setBundleContext(BundleContext context)
-    {
-        m_context = context;
-    }
-
-    public synchronized BundleActivator getActivator()
-    {
-        return m_activator;
-    }
-
-    public synchronized void setActivator(BundleActivator activator)
-    {
-        m_activator = activator;
-    }
-
-    public synchronized boolean isStale()
-    {
-        return m_stale;
-    }
-
-    public synchronized void setStale()
-    {
-        m_stale = true;
-    }
-
-    public synchronized boolean isExtension()
-    {
-        return m_extension;
-    }
-
-    public synchronized void setExtension(boolean extension)
-    {
-        m_extension = extension;
-    }
-
-    //
-    // Locking related methods.
-    // NOTE: These methods are not synchronized because it is assumed they
-    // will only ever be called when the caller is in a synchronized block.
-    //
-
-    public synchronized boolean isLockable()
-    {
-        return (m_lockCount == 0) || (m_lockThread == Thread.currentThread());
-    }
-
-    public synchronized void lock()
-    {
-        if ((m_lockCount > 0) && (m_lockThread != Thread.currentThread()))
-        {
-            throw new IllegalStateException("Bundle is locked by another thread.");
-        }
-        m_lockCount++;
-        m_lockThread = Thread.currentThread();
-    }
-
-    public synchronized void unlock()
-    {
-        if (m_lockCount == 0)
-        {
-            throw new IllegalStateException("Bundle is not locked.");
-        }
-        if ((m_lockCount > 0) && (m_lockThread != Thread.currentThread()))
-        {
-            throw new IllegalStateException("Bundle is locked by another thread.");
-        }
-        m_lockCount--;
-        if (m_lockCount == 0)
-        {
-            m_lockThread = null;
-        }
-    }
-
-    public synchronized void syncLock(RegularBundleInfo info)
-    {
-        m_lockCount = info.m_lockCount;
-        m_lockThread = info.m_lockThread;
-    }
-
-    public synchronized void setProtectionDomain(ProtectionDomain pd)
-    {
-        getCurrentModule().getContentLoader().setSecurityContext(pd);
-    }
-
-    public synchronized ProtectionDomain getProtectionDomain()
-    {
-        ProtectionDomain pd = null;
-
-        for (int i = m_modules.length - 1; (i >= 0) && (pd == null); i--)
-        {
-            pd = (ProtectionDomain)
-                m_modules[i].getContentLoader().getSecurityContext();
-        }
-
-        return pd;
-    }
 }
\ No newline at end of file

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/SystemBundleInfo.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/SystemBundleInfo.java?rev=703496&r1=703495&r2=703496&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/SystemBundleInfo.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/SystemBundleInfo.java Fri Oct 10 08:13:10 2008
@@ -21,6 +21,7 @@
 import java.util.Map;
 import org.apache.felix.framework.util.FelixConstants;
 import org.apache.felix.framework.util.StringMap;
+import org.apache.felix.moduleloader.IModule;
 import org.osgi.framework.Bundle;
 
 class SystemBundleInfo extends BundleInfo
@@ -28,6 +29,11 @@
     private Map m_headerMap = new StringMap(false);
     private int m_startLevel = FelixConstants.SYSTEMBUNDLE_DEFAULT_STARTLEVEL;
 
+    SystemBundleInfo(Logger logger, IModule module)
+    {
+        super(logger, module);
+    }
+
     public String getSymbolicName()
     {
         return FelixConstants.SYSTEM_BUNDLE_SYMBOLICNAME;