Initial source commit.


git-svn-id: https://svn.apache.org/repos/asf/incubator/oscar/trunk@233031 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/org/apache/osgi/framework/BundleContextImpl.java b/src/org/apache/osgi/framework/BundleContextImpl.java
new file mode 100644
index 0000000..e0114d2
--- /dev/null
+++ b/src/org/apache/osgi/framework/BundleContextImpl.java
@@ -0,0 +1,284 @@
+/*
+ *   Copyright 2005 The Apache Software Foundation
+ *
+ *   Licensed 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.osgi.framework;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Dictionary;
+
+import org.apache.osgi.framework.ext.FelixBundleContext;
+import org.osgi.framework.*;
+
+class BundleContextImpl implements FelixBundleContext
+{
+    private Felix m_felix = null;
+    private BundleImpl m_bundle = null;
+
+    protected BundleContextImpl(Felix felix, BundleImpl bundle)
+    {
+        m_felix = felix;
+        m_bundle = bundle;
+    }
+
+    public void addImportPackage() throws BundleException
+    {
+        throw new BundleException("Not implemented yet.");
+    }
+
+    public void removeImportPackage() throws BundleException
+    {
+        throw new BundleException("Not implemented yet.");
+    }
+
+    public void addExportPackage() throws BundleException
+    {
+        throw new BundleException("Not implemented yet.");
+    }
+
+    public void removeExportPackage() throws BundleException
+    {
+        throw new BundleException("Not implemented yet.");
+    }
+
+    public String getProperty(String name)
+    {
+        return m_felix.getProperty(name);
+    }
+
+    public Bundle getBundle()
+    {
+        return m_bundle;
+    }
+
+    public Filter createFilter(String expr)
+        throws InvalidSyntaxException
+    {
+        return new FilterImpl(m_felix.getLogger(), expr);
+    }
+
+    public Bundle installBundle(String location)
+        throws BundleException
+    {
+        return installBundle(location, null);
+    }
+
+    public Bundle installBundle(String location, InputStream is)
+        throws BundleException
+    {
+        return m_felix.installBundle(location, is);
+    }
+
+    public Bundle getBundle(long id)
+    {
+        return m_felix.getBundle(id);
+    }
+
+    public Bundle[] getBundles()
+    {
+        return m_felix.getBundles();
+    }
+
+    public void addBundleListener(BundleListener l)
+    {
+        m_felix.addBundleListener(m_bundle, l);
+    }
+
+    public void removeBundleListener(BundleListener l)
+    {
+        m_felix.removeBundleListener(l);
+    }
+
+    public void addServiceListener(ServiceListener l)
+    {
+        try
+        {
+            addServiceListener(l, null);
+        }
+        catch (InvalidSyntaxException ex)
+        {
+            // This will not happen since the filter is null.
+        }
+    }
+
+    public void addServiceListener(ServiceListener l, String s)
+        throws InvalidSyntaxException
+    {
+        m_felix.addServiceListener(m_bundle, l, s);
+    }
+
+    public void removeServiceListener(ServiceListener l)
+    {
+        m_felix.removeServiceListener(l);
+    }
+
+    public void addFrameworkListener(FrameworkListener l)
+    {
+        m_felix.addFrameworkListener(m_bundle, l);
+    }
+
+    public void removeFrameworkListener(FrameworkListener l)
+    {
+        m_felix.removeFrameworkListener(l);
+    }
+
+    public ServiceRegistration registerService(
+        String clazz, Object svcObj, Dictionary dict)
+    {
+        return registerService(new String[] { clazz }, svcObj, dict);
+    }
+
+    public ServiceRegistration registerService(
+        String[] clazzes, Object svcObj, Dictionary dict)
+    {
+        return m_felix.registerService(m_bundle, clazzes, svcObj, dict);
+    }
+
+    public ServiceReference getServiceReference(String clazz)
+    {
+        try
+        {
+            ServiceReference[] refs = getServiceReferences(clazz, null);
+            return getBestServiceReference(refs);
+        }
+        catch (InvalidSyntaxException ex)
+        {
+            m_felix.getLogger().log(LogWrapper.LOG_ERROR, "BundleContextImpl: " + ex);
+        }
+        return null;
+    }
+
+    private ServiceReference getBestServiceReference(ServiceReference[] refs)
+    {
+        if (refs == null)
+        {
+            return null;
+        }
+
+        if (refs.length == 1)
+        {
+            return refs[0];
+        }
+
+        // Loop through all service references and return
+        // the "best" one according to its rank and ID.
+        ServiceReference bestRef = null;
+        Integer bestRank = null;
+        Long bestId = null;
+        for (int i = 0; i < refs.length; i++)
+        {
+            ServiceReference ref = refs[i];
+
+            // The first time through the loop just
+            // assume that the first reference is best.
+            if (bestRef == null)
+            {
+                bestRef = ref;
+                bestRank = (Integer) bestRef.getProperty("service.ranking");
+                // The spec says no ranking defaults to zero.
+                if (bestRank == null)
+                {
+                    bestRank = new Integer(0);
+                }
+                bestId = (Long) bestRef.getProperty("service.id");
+            }
+
+            // Compare current and best references to see if
+            // the current reference is a better choice.
+            Integer rank = (Integer) ref.getProperty("service.ranking");
+
+            // The spec says no ranking defaults to zero.
+            if (rank == null)
+            {
+                rank = new Integer(0);
+            }
+
+            // If the current reference ranking is greater than the
+            // best ranking, then keep the current reference.
+            if (bestRank.compareTo(rank) < 0)
+            {
+                bestRef = ref;
+                bestRank = rank;
+                bestId = (Long) bestRef.getProperty("service.id");
+            }
+            // If rankings are equal, then compare IDs and
+            // keep the smallest.
+            else if (bestRank.compareTo(rank) == 0)
+            {
+                Long id = (Long) ref.getProperty("service.id");
+                // If either reference has a null ID, then keep
+                // the one with a non-null ID.
+                if ((bestId == null) || (id == null))
+                {
+                    bestRef = (bestId == null) ? ref : bestRef;
+                    // bestRank = bestRank; // No need to update since they are equal.
+                    bestId = (Long) bestRef.getProperty("service.id");
+                }
+                // Otherwise compare IDs.
+                else
+                {
+                    // If the current reference ID is less than the
+                    // best ID, then keep the current reference.
+                    if (bestId.compareTo(id) > 0)
+                    {
+                        bestRef = ref;
+                        // bestRank = bestRank; // No need to update since they are equal.
+                        bestId = (Long) bestRef.getProperty("service.id");
+                    }
+                }
+            }
+        }
+
+        return bestRef;
+    }
+
+    public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException
+    {
+        // TODO: Implement BundleContext.getAllServiceReferences()
+        return null;
+    }
+
+    public ServiceReference[] getServiceReferences(String clazz, String filter)
+        throws InvalidSyntaxException
+    {
+        return m_felix.getServiceReferences(m_bundle, clazz, filter);
+    }
+
+    public Object getService(ServiceReference ref)
+    {
+        if (ref == null)
+        {
+            throw new NullPointerException("Specified service reference cannot be null.");
+        }
+        return m_felix.getService(m_bundle, ref);
+    }
+
+    public boolean ungetService(ServiceReference ref)
+    {
+        if (ref == null)
+        {
+            throw new NullPointerException("Specified service reference cannot be null.");
+        }
+
+        // Unget the specified service.
+        return m_felix.ungetService(m_bundle, ref);
+    }
+
+    public File getDataFile(String s)
+    {
+        return m_felix.getDataFile(m_bundle, s);
+    }
+}
\ No newline at end of file