Modified: 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleException.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleException.java?rev=782737&r1=782736&r2=782737&view=diff
==============================================================================
--- 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleException.java 
(original)
+++ 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleException.java 
Mon Jun  8 19:31:06 2009
@@ -1,7 +1,5 @@
 /*
- * $Header: 
/cvshome/build/org.osgi.framework/src/org/osgi/framework/BundleException.java,v 
1.15 2006/07/11 13:15:54 hargrave Exp $
- * 
- * Copyright (c) OSGi Alliance (2000, 2006). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2000, 2008). All Rights Reserved.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,84 +21,198 @@
  * occurred.
  * 
  * <p>
- * <code>BundleException</code> object is created by the Framework to denote
+ * A <code>BundleException</code> object is created by the Framework to denote
  * an exception condition in the lifecycle of a bundle.
  * <code>BundleException</code>s should not be created by bundle developers.
+ * A type code is used to identify the exception type for future extendability.
+ * 
+ * <p>
+ * OSGi Alliance reserves the right to extend the set of types.
  * 
  * <p>
- * This exception is updated to conform to the general purpose exception
- * chaining mechanism.
+ * This exception conforms to the general purpose exception chaining mechanism.
  * 
- * @version $Revision: 1.15 $
+ * @version $Revision: 6083 $
  */
 
 public class BundleException extends Exception {
-       static final long       serialVersionUID        = 3571095144220455665L;
+       static final long               serialVersionUID                = 
3571095144220455665L;
+       /**
+        * Type of bundle exception.
+        * 
+        * @since 1.5
+        */
+       private final int               type;
+
+       /**
+        * No exception type is unspecified.
+        * 
+        * @since 1.5
+        */
+       public static final int UNSPECIFIED                             = 0;
+       /**
+        * The operation was unsupported.
+        * 
+        * @since 1.5
+        */
+       public static final int UNSUPPORTED_OPERATION   = 1;
+       /**
+        * The operation was invalid.
+        * 
+        * @since 1.5
+        */
+       public static final int INVALID_OPERATION               = 2;
+       /**
+        * The bundle manifest was in error.
+        * 
+        * @since 1.5
+        */
+       public static final int MANIFEST_ERROR                  = 3;
+       /**
+        * The bundle was not resolved.
+        * 
+        * @since 1.5
+        */
+       public static final int RESOLVE_ERROR                   = 4;
+       /**
+        * The bundle activator was in error.
+        * 
+        * @since 1.5
+        */
+       public static final int ACTIVATOR_ERROR                 = 5;
+       /**
+        * The operation failed due to insufficient permissions.
+        * 
+        * @since 1.5
+        */
+       public static final int SECURITY_ERROR                  = 6;
+       /**
+        * The operation failed to complete the requested lifecycle state 
change.
+        * 
+        * @since 1.5
+        */
+       public static final int STATECHANGE_ERROR               = 7;
+
+       /**
+        * The bundle could not be resolved due to an error with the
+        * Bundle-NativeCode header.
+        * 
+        * @since 1.5
+        */
+       public static final int NATIVECODE_ERROR                = 8;
+
        /**
-        * Nested exception.
+        * The install or update operation failed because another 
+        * already installed bundle has the same symbolic name and version.
+        * @since 1.5
+        */
+       public static final int DUPLICATE_BUNDLE_ERROR  = 9;
+       
+    /**
+        * The start transient operation failed because the start level of the
+        * bundle is greater than the current framework start level
+        * 
+        * @since 1.5
         */
-       private final Throwable cause;
+       public static final int START_TRANSIENT_ERROR   = 10;
 
        /**
-        * Creates a <code>BundleException</code> that wraps another exception.
+        * Creates a <code>BundleException</code> with the specified message and
+        * exception cause.
         * 
         * @param msg The associated message.
         * @param cause The cause of this exception.
         */
        public BundleException(String msg, Throwable cause) {
-               super(msg);
-               this.cause = cause;
+               this(msg, UNSPECIFIED, cause);
        }
 
        /**
-        * Creates a <code>BundleException</code> object with the specified
-        * message.
+        * Creates a <code>BundleException</code> with the specified message.
         * 
         * @param msg The message.
         */
        public BundleException(String msg) {
+               this(msg, UNSPECIFIED);
+       }
+
+       /**
+        * Creates a <code>BundleException</code> with the specified message, 
type
+        * and exception cause.
+        * 
+        * @param msg The associated message.
+        * @param type The type for this exception.
+        * @param cause The cause of this exception.
+        * @since 1.5
+        */
+       public BundleException(String msg, int type, Throwable cause) {
+               super(msg, cause);
+               this.type = type;
+       }
+
+       /**
+        * Creates a <code>BundleException</code> with the specified message and
+        * type.
+        * 
+        * @param msg The message.
+        * @param type The type for this exception.
+        * @since 1.5
+        */
+       public BundleException(String msg, int type) {
                super(msg);
-               this.cause = null;
+               this.type = type;
        }
 
        /**
-        * Returns any nested exceptions included in this exception.
+        * Returns the cause of this exception or <code>null</code> if no cause 
was
+        * specified when this exception was created.
         * 
         * <p>
         * This method predates the general purpose exception chaining 
mechanism.
-        * The {...@link #getCause()} method is now the preferred means of 
obtaining
-        * this information.
+        * The <code>getCause()</code> method is now the preferred means of
+        * obtaining this information.
         * 
-        * @return The nested exception; <code>null</code> if there is no nested
-        *         exception.
+        * @return The result of calling <code>getCause()</code>.
         */
        public Throwable getNestedException() {
-               return cause;
+               return getCause();
        }
 
        /**
-        * Returns the cause of this exception or <code>null</code> if no cause
-        * was specified when this exception was created.
+        * Returns the cause of this exception or <code>null</code> if no cause 
was
+        * set.
         * 
-        * @return The cause of this exception or <code>null</code> if no cause
-        *         was specified.
+        * @return The cause of this exception or <code>null</code> if no cause 
was
+        *         set.
         * @since 1.3
         */
-       public Throwable getCause() {
-               return cause;
+    public Throwable getCause() {
+               return super.getCause();
        }
 
        /**
-        * The cause of this exception can only be set when constructed.
+        * Initializes the cause of this exception to the specified value.
         * 
-        * @param cause Cause of the exception.
-        * @return This object.
-        * @throws java.lang.IllegalStateException This method will always 
throw an
-        *         <code>IllegalStateException</code> since the cause of this
-        *         exception can only be set when constructed.
+        * @param cause The cause of this exception.
+        * @return This exception.
+        * @throws IllegalArgumentException If the specified cause is this
+        *         exception.
+        * @throws IllegalStateException If the cause of this exception has 
already
+        *         been set.
         * @since 1.3
         */
        public Throwable initCause(Throwable cause) {
-               throw new IllegalStateException();
+               return super.initCause(cause);
+       }
+
+       /**
+        * Returns the type for this exception or <code>UNSPECIFIED</code> if 
the
+        * type was unspecified or unknown.
+        * 
+        * @return The type of this exception.
+        * @since 1.5
+        */
+       public int getType() {
+               return type;
        }
 }

Modified: 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleListener.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleListener.java?rev=782737&r1=782736&r2=782737&view=diff
==============================================================================
--- 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleListener.java 
(original)
+++ 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleListener.java 
Mon Jun  8 19:31:06 2009
@@ -1,7 +1,5 @@
 /*
- * $Header: 
/cvshome/build/org.osgi.framework/src/org/osgi/framework/BundleListener.java,v 
1.13 2007/02/21 16:49:05 hargrave Exp $
- * 
- * Copyright (c) OSGi Alliance (2000, 2007). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2000, 2008). All Rights Reserved.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -36,7 +34,7 @@
  * 
  * @see BundleEvent
  * @NotThreadSafe
- * @version $Revision: 1.13 $
+ * @version $Revision: 5673 $
  */
 
 public interface BundleListener extends EventListener {

Modified: 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundlePermission.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundlePermission.java?rev=782737&r1=782736&r2=782737&view=diff
==============================================================================
--- 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundlePermission.java
 (original)
+++ 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundlePermission.java
 Mon Jun  8 19:31:06 2009
@@ -1,7 +1,5 @@
 /*
- * $Header: 
/cvshome/build/org.osgi.framework/src/org/osgi/framework/BundlePermission.java,v
 1.16 2007/02/20 00:06:02 hargrave Exp $
- *
- * Copyright (c) OSGi Alliance (2004, 2007). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2004, 2009). All Rights Reserved.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,32 +17,46 @@
 package org.osgi.framework;
 
 import java.io.IOException;
-import java.security.*;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
+import java.security.BasicPermission;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.util.Collections;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.Map;
 
 /**
  * A bundle's authority to require or provide a bundle or to receive or attach
  * fragments.
  * 
  * <p>
- * A bundle symbolic name defines a unique fully qualified name.
- * <p>
- * For example:
+ * A bundle symbolic name defines a unique fully qualified name. Wildcards may
+ * be used.
+ * 
+ * <pre>
+ * name ::= &lt;symbolic name&gt; | &lt;symbolic name ending in 
&quot;.*&quot;&gt; | *
+ * </pre>
+ * 
+ * Examples:
  * 
  * <pre>
- * <code>
  * org.osgi.example.bundle
- * </code>
+ * org.osgi.example.*
+ * *
  * </pre>
  * 
  * <p>
- * <code>BundlePermission</code> has four actions: <code>PROVIDE</code>,
- * <code>REQUIRE</code>,<code>HOST</code>, and <code>FRAGMENT</code>.
- * The <code>PROVIDE</code> action implies the <code>REQUIRE</code> action.
+ * <code>BundlePermission</code> has four actions: <code>provide</code>,
+ * <code>require</code>,<code>host</code>, and <code>fragment</code>. The
+ * <code>provide</code> action implies the <code>require</code> action.
  * 
  * @since 1.3
- * @version $Revision: 1.16 $
+ * @ThreadSafe
+ * @version $Revision: 6860 $
  */
 
 public final class BundlePermission extends BasicPermission {
@@ -52,12 +64,14 @@
        private static final long       serialVersionUID        = 
3257846601685873716L;
 
        /**
-        * The action string <code>provide</code>.
+        * The action string <code>provide</code>. The <code>provide</code> 
action
+        * implies the <code>require</code> action.
         */
        public final static String      PROVIDE                         = 
"provide";
 
        /**
-        * The action string <code>require</code>.
+        * The action string <code>require</code>. The <code>require</code> 
action
+        * is implied by the <code>provide</code> action.
         */
        public final static String      REQUIRE                         = 
"require";
 
@@ -79,18 +93,18 @@
                                                                                
                                        | ACTION_REQUIRE
                                                                                
                                        | ACTION_HOST
                                                                                
                                        | ACTION_FRAGMENT;
-       private final static int        ACTION_NONE                     = 0;
+       final static int                        ACTION_NONE                     
= 0;
        /**
         * The actions mask.
         */
-       private transient int           action_mask                     = 
ACTION_NONE;
+       private transient int           action_mask;
 
        /**
         * The actions in canonical form.
         * 
         * @serial
         */
-       private String                          actions                         
= null;
+       private volatile String         actions                         = null;
 
        /**
         * Defines the authority to provide and/or require and or specify a host
@@ -104,24 +118,23 @@
         * for that symbolic name; a bundle that specifies a fragment host must 
have
         * the appropriate <code>BundlePermission</code> for that symbolic name.
         * 
-        * @param symbolicName the bundle symbolic name.
-        * @param actions <code>PROVIDE</code>,<code>REQUIRE</code>,
-        *        <code>HOST</code>,<code>FRAGMENT</code> (canonical order).
+        * @param symbolicName The bundle symbolic name.
+        * @param actions <code>provide</code>,<code>require</code>,
+        *        <code>host</code>,<code>fragment</code> (canonical order).
         */
-
        public BundlePermission(String symbolicName, String actions) {
-               this(symbolicName, getMask(actions));
+               this(symbolicName, parseActions(actions));
        }
 
        /**
-        * Bundle private constructor used by BundlePermissionCollection.
+        * Package private constructor used by BundlePermissionCollection.
         * 
         * @param symbolicName the bundle symbolic name
         * @param mask the action mask
         */
        BundlePermission(String symbolicName, int mask) {
                super(symbolicName);
-               init(mask);
+               setTransients(mask);
        }
 
        /**
@@ -129,7 +142,7 @@
         * 
         * @param mask
         */
-       private void init(int mask) {
+       private synchronized void setTransients(int mask) {
                if ((mask == ACTION_NONE) || ((mask & ACTION_ALL) != mask)) {
                        throw new IllegalArgumentException("invalid action 
string");
                }
@@ -138,25 +151,36 @@
        }
 
        /**
+        * Returns the current action mask.
+        * <p>
+        * Used by the BundlePermissionCollection class.
+        * 
+        * @return Current action mask.
+        */
+       synchronized int getActionsMask() {
+               return action_mask;
+       }
+
+       /**
         * Parse action string into action mask.
         * 
         * @param actions Action string.
         * @return action mask.
         */
-       private static int getMask(String actions) {
+       private static int parseActions(String actions) {
                boolean seencomma = false;
 
                int mask = ACTION_NONE;
 
                if (actions == null) {
-                       return (mask);
+                       return mask;
                }
 
                char[] a = actions.toCharArray();
 
                int i = a.length - 1;
                if (i < 0)
-                       return (mask);
+                       return mask;
 
                while (i != -1) {
                        char c;
@@ -224,7 +248,7 @@
                                switch (a[i - matchlen]) {
                                        case ',' :
                                                seencomma = true;
-                                       /* FALLTHROUGH */
+                                               /* FALLTHROUGH */
                                        case ' ' :
                                        case '\r' :
                                        case '\n' :
@@ -246,7 +270,7 @@
                        throw new IllegalArgumentException("invalid permission: 
" + actions);
                }
 
-               return (mask);
+               return mask;
        }
 
        /**
@@ -268,21 +292,20 @@
         *       x.y,&quot;provide&quot; -&gt; x.y.z, &quot;provide&quot;  is 
false
         * </pre>
         * 
-        * @param p The target permission to interrogate.
-        * @return <code>true</code> if the specified
-        *         <code>BundlePermission</code> action is implied by this 
object;
-        *         <code>false</code> otherwise.
+        * @param p The requested permission.
+        * @return <code>true</code> if the specified 
<code>BundlePermission</code>
+        *         action is implied by this object; <code>false</code> 
otherwise.
         */
-
        public boolean implies(Permission p) {
-               if (p instanceof BundlePermission) {
-                       BundlePermission target = (BundlePermission) p;
-
-                       return (((action_mask & target.action_mask) == 
target.action_mask) && super
-                                       .implies(p));
+               if (!(p instanceof BundlePermission)) {
+                       return false;
                }
+               BundlePermission requested = (BundlePermission) p;
 
-               return (false);
+               final int effective = getActionsMask();
+               final int desired = requested.getActionsMask();
+               return ((effective & desired) == desired)
+                               && super.implies(requested);
        }
 
        /**
@@ -291,13 +314,15 @@
         * 
         * <p>
         * Always returns present <code>BundlePermission</code> actions in the
-        * following order: <code>PROVIDE</code>,<code>REQUIRE</code>,
-        * <code>HOST</code>,<code>FRAGMENT.
-        * @return Canonical string representation of the 
<code>BundlePermission</code> actions.
+        * following order: <code>provide</code>, <code>require</code>,
+        * <code>host</code>, <code>fragment</code>.
+        * 
+        * @return Canonical string representation of the <code>BundlePermission
+        *         </code> actions.
         */
-
        public String getActions() {
-               if (actions == null) {
+               String result = actions;
+               if (result == null) {
                        StringBuffer sb = new StringBuffer();
                        boolean comma = false;
 
@@ -326,10 +351,9 @@
                                sb.append(FRAGMENT);
                        }
 
-                       actions = sb.toString();
+                       actions = result = sb.toString();
                }
-
-               return (actions);
+               return result;
        }
 
        /**
@@ -339,7 +363,7 @@
         * @return A new <code>PermissionCollection</code> object.
         */
        public PermissionCollection newPermissionCollection() {
-               return (new BundlePermissionCollection());
+               return new BundlePermissionCollection();
        }
 
        /**
@@ -352,22 +376,23 @@
         * @param obj The object to test for equality with this
         *        <code>BundlePermission</code> object.
         * @return <code>true</code> if <code>obj</code> is a
-        *         <code>BundlePermission</code>, and has the same bundle
-        *         symbolic name and actions as this 
<code>BundlePermission</code>
-        *         object; <code>false</code> otherwise.
+        *         <code>BundlePermission</code>, and has the same bundle 
symbolic
+        *         name and actions as this <code>BundlePermission</code> 
object;
+        *         <code>false</code> otherwise.
         */
        public boolean equals(Object obj) {
                if (obj == this) {
-                       return (true);
+                       return true;
                }
 
                if (!(obj instanceof BundlePermission)) {
-                       return (false);
+                       return false;
                }
 
-               BundlePermission p = (BundlePermission) obj;
+               BundlePermission bp = (BundlePermission) obj;
 
-               return ((action_mask == p.action_mask) && 
getName().equals(p.getName()));
+               return (getActionsMask() == bp.getActionsMask())
+                               && getName().equals(bp.getName());
        }
 
        /**
@@ -375,20 +400,10 @@
         * 
         * @return A hash code value for this object.
         */
-
        public int hashCode() {
-               return (getName().hashCode() ^ getActions().hashCode());
-       }
-
-       /**
-        * Returns the current action mask.
-        * <p>
-        * Used by the BundlePermissionCollection class.
-        * 
-        * @return Current action mask.
-        */
-       int getMask() {
-               return (action_mask);
+               int h = 31 * 17 + getName().hashCode();
+               h = 31 * h + getActions().hashCode();
+               return h;
        }
 
        /**
@@ -396,7 +411,6 @@
         * <code>BundlePermission</code> object to a stream. The actions are
         * serialized, and the superclass takes care of the name.
         */
-
        private synchronized void writeObject(java.io.ObjectOutputStream s)
                        throws IOException {
                // Write out the actions. The superclass takes care of the name
@@ -414,7 +428,7 @@
                        throws IOException, ClassNotFoundException {
                // Read in the action, then initialize the rest
                s.defaultReadObject();
-               init(getMask(actions));
+               setTransients(parseActions(actions));
        }
 }
 
@@ -427,23 +441,20 @@
  */
 
 final class BundlePermissionCollection extends PermissionCollection {
-
-       /**
-        * Comment for <code>serialVersionUID</code>
-        */
        private static final long       serialVersionUID        = 
3258407326846433079L;
 
        /**
         * Table of permissions.
         * 
-        * @serial
+        * @GuardedBy this
         */
-       private Hashtable                       permissions;
+       private transient Map           permissions;
 
        /**
         * Boolean saying if "*" is in the collection.
         * 
         * @serial
+        * @GuardedBy this
         */
        private boolean                         all_allowed;
 
@@ -451,53 +462,51 @@
         * Create an empty BundlePermissions object.
         * 
         */
-
        public BundlePermissionCollection() {
-               permissions = new Hashtable();
+               permissions = new HashMap();
                all_allowed = false;
        }
 
        /**
-        * Adds a permission to the <code>BundlePermission</code> objects. The 
key
-        * for the hash is the symbolic name.
+        * Add a permission to this permission collection.
         * 
         * @param permission The <code>BundlePermission</code> object to add.
-        * 
         * @throws IllegalArgumentException If the permission is not a
         *         <code>BundlePermission</code> instance.
         * @throws SecurityException If this 
<code>BundlePermissionCollection</code>
         *         object has been marked read-only.
         */
-
-       public void add(Permission permission) {
-               if (!(permission instanceof BundlePermission))
+       public void add(final Permission permission) {
+               if (!(permission instanceof BundlePermission)) {
                        throw new IllegalArgumentException("invalid permission: 
"
                                        + permission);
-               if (isReadOnly())
+               }
+               if (isReadOnly()) {
                        throw new SecurityException("attempt to add a 
Permission to a "
                                        + "readonly PermissionCollection");
+               }
+               final BundlePermission bp = (BundlePermission) permission;
+               final String name = bp.getName();
+               synchronized (this) {
+                       Map pc = permissions;
+                       BundlePermission existing = (BundlePermission) 
pc.get(name);
+                       if (existing != null) {
+                               final int oldMask = existing.getActionsMask();
+                               final int newMask = bp.getActionsMask();
+                               if (oldMask != newMask) {
+                                       pc.put(name, new BundlePermission(name, 
oldMask
+                                                       | newMask));
 
-               BundlePermission bp = (BundlePermission) permission;
-               String name = bp.getName();
-
-               BundlePermission existing = (BundlePermission) 
permissions.get(name);
-
-               if (existing != null) {
-                       int oldMask = existing.getMask();
-                       int newMask = bp.getMask();
-                       if (oldMask != newMask) {
-                               permissions.put(name, new 
BundlePermission(name, oldMask
-                                               | newMask));
-
+                               }
+                       }
+                       else {
+                               pc.put(name, bp);
                        }
-               }
-               else {
-                       permissions.put(name, permission);
-               }
 
-               if (!all_allowed) {
-                       if (name.equals("*"))
-                               all_allowed = true;
+                       if (!all_allowed) {
+                               if (name.equals("*"))
+                                       all_allowed = true;
+                       }
                }
        }
 
@@ -507,68 +516,60 @@
         * 
         * @param permission The Permission object to compare with this
         *        <code>BundlePermission</code> object.
-        * 
-        * @return <code>true</code> if <code>permission</code> is a proper
-        *         subset of a permission in the set; <code>false</code>
-        *         otherwise.
+        * @return <code>true</code> if <code>permission</code> is a proper 
subset
+        *         of a permission in the set; <code>false</code> otherwise.
         */
-
-       public boolean implies(Permission permission) {
-               if (!(permission instanceof BundlePermission))
-                       return (false);
-
-               BundlePermission bp = (BundlePermission) permission;
-               BundlePermission x;
-
-               int desired = bp.getMask();
-               int effective = 0;
-
-               // short circuit if the "*" Permission was added
-               if (all_allowed) {
-                       x = (BundlePermission) permissions.get("*");
-                       if (x != null) {
-                               effective |= x.getMask();
-                               if ((effective & desired) == desired)
-                                       return (true);
+       public boolean implies(final Permission permission) {
+               if (!(permission instanceof BundlePermission)) {
+                       return false;
+               }
+               BundlePermission requested = (BundlePermission) permission;
+               String requestedName = requested.getName();
+               final int desired = requested.getActionsMask();
+               int effective = BundlePermission.ACTION_NONE;
+               BundlePermission bp;
+
+               synchronized (this) {
+                       Map pc = permissions;
+                       /* short circuit if the "*" Permission was added */
+                       if (all_allowed) {
+                               bp = (BundlePermission) pc.get("*");
+                               if (bp != null) {
+                                       effective |= bp.getActionsMask();
+                                       if ((effective & desired) == desired) {
+                                               return true;
+                                       }
+                               }
                        }
-               }
-
-               // strategy:
-               // Check for full match first. Then work our way up the
-               // name looking for matches on a.b.*
-
-               String name = bp.getName();
-
-               x = (BundlePermission) permissions.get(name);
-
-               if (x != null) {
-                       // we have a direct hit!
-                       effective |= x.getMask();
-                       if ((effective & desired) == desired)
-                               return (true);
-               }
-
-               // work our way up the tree...
-               int last, offset;
-
-               offset = name.length() - 1;
-
-               while ((last = name.lastIndexOf(".", offset)) != -1) {
-
-                       name = name.substring(0, last + 1) + "*";
-                       x = (BundlePermission) permissions.get(name);
-
-                       if (x != null) {
-                               effective |= x.getMask();
-                               if ((effective & desired) == desired)
-                                       return (true);
+                       bp = (BundlePermission) pc.get(requestedName);
+                       // strategy:
+                       // Check for full match first. Then work our way up the
+                       // name looking for matches on a.b.*
+                       if (bp != null) {
+                               // we have a direct hit!
+                               effective |= bp.getActionsMask();
+                               if ((effective & desired) == desired) {
+                                       return true;
+                               }
                        }
-                       offset = last - 1;
+                       // work our way up the tree...
+                       int last;
+                       int offset = requestedName.length() - 1;
+                       while ((last = requestedName.lastIndexOf(".", offset)) 
!= -1) {
+                               requestedName = requestedName.substring(0, last 
+ 1) + "*";
+                               bp = (BundlePermission) pc.get(requestedName);
+                               if (bp != null) {
+                                       effective |= bp.getActionsMask();
+                                       if ((effective & desired) == desired) {
+                                               return true;
+                                       }
+                               }
+                               offset = last - 1;
+                       }
+                       // we don't have to check for "*" as it was already 
checked
+                       // at the top (all_allowed), so we just return false
+                       return false;
                }
-
-               // we don't have to check for "*" as it was already checked
-               // at the top (all_allowed), so we just return false
-               return (false);
        }
 
        /**
@@ -577,8 +578,29 @@
         * 
         * @return Enumeration of all <code>BundlePermission</code> objects.
         */
+       public synchronized Enumeration elements() {
+               return Collections.enumeration(permissions.values());
+       }
+       
+       /* serialization logic */
+       private static final ObjectStreamField[]        serialPersistentFields  
= {
+                       new ObjectStreamField("permissions", Hashtable.class),
+                       new ObjectStreamField("all_allowed", Boolean.TYPE)      
                };
 
-       public Enumeration elements() {
-               return (permissions.elements());
+       private synchronized void writeObject(ObjectOutputStream out)
+                       throws IOException {
+               Hashtable hashtable = new Hashtable(permissions);
+               ObjectOutputStream.PutField pfields = out.putFields();
+               pfields.put("permissions", hashtable);
+               pfields.put("all_allowed", all_allowed);
+               out.writeFields();
+       }
+
+       private synchronized void readObject(java.io.ObjectInputStream in)
+                       throws IOException, ClassNotFoundException {
+               ObjectInputStream.GetField gfields = in.readFields();
+               Hashtable hashtable = (Hashtable) gfields.get("permissions", 
null);
+               permissions = new HashMap(hashtable);
+               all_allowed = gfields.get("all_allowed", false);
        }
 }

Added: 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleReference.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleReference.java?rev=782737&view=auto
==============================================================================
--- 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleReference.java 
(added)
+++ 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/BundleReference.java 
Mon Jun  8 19:31:06 2009
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) OSGi Alliance (2009). All Rights Reserved.
+ * 
+ * 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.osgi.framework;
+
+/**
+ * A reference to a Bundle.
+ * 
+ * @since 1.5
+ * @ThreadSafe
+ * @version $Revision: 6860 $
+ */
+public interface BundleReference {
+       /**
+        * Returns the <code>Bundle</code> object associated with this
+        * <code>BundleReference</code>.
+        * 
+        * @return The <code>Bundle</code> object associated with this
+        *         <code>BundleReference</code>.
+        */
+       public Bundle getBundle();
+}

Modified: 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/Configurable.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/Configurable.java?rev=782737&r1=782736&r2=782737&view=diff
==============================================================================
--- 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/Configurable.java 
(original)
+++ 
felix/trunk/org.osgi.core/src/main/java/org/osgi/framework/Configurable.java 
Mon Jun  8 19:31:06 2009
@@ -1,7 +1,5 @@
 /*
- * $Header: 
/cvshome/build/org.osgi.framework/src/org/osgi/framework/Configurable.java,v 
1.12 2007/02/20 00:07:22 hargrave Exp $
- * 
- * Copyright (c) OSGi Alliance (2000, 2007). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2000, 2009). All Rights Reserved.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,7 +26,7 @@
  * <code>instanceof Configurable</code>.
  * 
  * @deprecated As of 1.2. Please use Configuration Admin service.
- * @version $Revision: 1.12 $
+ * @version $Revision: 6361 $
  */
 public interface Configurable {
        /**
@@ -44,7 +42,7 @@
         * returning the configuration object.
         * 
         * @return The configuration object for this service.
-        * @throws java.lang.SecurityException If the caller does not have an
+        * @throws SecurityException If the caller does not have an
         *         appropriate permission and the Java Runtime Environment 
supports
         *         permissions.
         * @deprecated As of 1.2. Please use Configuration Admin service.


Reply via email to