FELIX-3177 Replace temp. inclusion of OSGi source by offical class inclusion
  - Compile with source/target 1.5
  - Check for Java 5 API signature
  - Use BND annotations for exports
  - Include modified Core 4.1 ServiceReference (generified with service class)
    in source but not in final bundle. This helps compiling against Compendium 4.3
    library while allowing to still use Core 4.1 dependency. Thus ensuring
    minimal framework requirement (Core 4.1)
  - update OSGi Alliance copyright year

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1344193 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/configadmin/pom.xml b/configadmin/pom.xml
index a6e05e0..8dd9426 100644
--- a/configadmin/pom.xml
+++ b/configadmin/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.felix</groupId>
         <artifactId>felix-parent</artifactId>
-        <version>2</version>
+        <version>2.1</version>
         <relativePath>../pom/pom.xml</relativePath>
     </parent>
 
@@ -74,8 +74,6 @@
         <bundle.file.name>
             ${bundle.build.name}/${project.build.finalName}.jar
         </bundle.file.name>
-
-		<api-package-version>1.0</api-package-version>
     </properties>
 
 
@@ -83,16 +81,24 @@
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
-            <version>4.0.0</version>
+            <version>4.1.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
-            <version>4.2.0</version>
+            <version>4.3.0</version>
             <scope>provided</scope>
         </dependency>
-        
+
+        <!-- BND export annotations -->        
+        <dependency>
+            <groupId>biz.aQute</groupId>
+            <artifactId>bndlib</artifactId>
+            <version>1.50.0</version>
+            <scope>provided</scope>
+        </dependency>
+
         <!-- Integration Testing with Pax Exam -->
         <dependency>
             <groupId>junit</groupId>
@@ -147,19 +153,17 @@
                             org.apache.felix.cm.impl.ConfigurationManager
                         </Bundle-Activator>
                         <Export-Package>
+                            <!-- just list, version from package-info classes -->
                             org.apache.felix.cm;
-                            org.apache.felix.cm.file;version=${api-package-version};provide:=true,
-                            org.osgi.service.cm;version=1.4;-split-package:=merge-first;provide:=true
+                            org.apache.felix.cm.file,
+                            org.osgi.service.cm;provide:=true
                         </Export-Package>
                         <Private-Package>
                             org.apache.felix.cm.impl,
                             org.osgi.util.tracker
                         </Private-Package>
-                        <Import-Package>
-                            org.osgi.service.cm;version="[1.4,1.5)",
-                            *
-                        </Import-Package>
                         <DynamicImport-Package>
+                            <!-- overwrite version from compendium bundle -->
                             org.osgi.service.log;version="1.3"
                         </DynamicImport-Package>
 						<Export-Service>
@@ -178,7 +182,6 @@
                     </instructions>
                 </configuration>
             </plugin>
-            <!-- Make sure to not use non Java 1.3 API -->
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>animal-sniffer-maven-plugin</artifactId>
@@ -186,7 +189,7 @@
                 <configuration>
                     <signature>
                         <groupId>org.codehaus.mojo.signature</groupId>
-                        <artifactId>java13-sun</artifactId>
+                        <artifactId>java15</artifactId>
                         <version>1.0</version>
                     </signature>
                 </configuration>
@@ -199,40 +202,13 @@
                     </execution>
                 </executions>
             </plugin>
-            <!--
-                configure default compilation for Java 1.3 and integration
-                test compilation for Java 5 (since integration tests use
-                Java Annotations for Pax Exam)
-            -->
             <plugin>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>test-compile-java5</id>
-                        <goals>
-                            <goal>testCompile</goal>
-                        </goals>
-                        <configuration>
-                            <source>1.5</source>
-                            <target>1.5</target>
-                            <testExcludes>
-                                <testExclude>**/cm/*</testExclude>
-                                <testExclude>**/cm/file/*</testExclude>
-                                <testExclude>**/cm/impl/**</testExclude>
-                            </testExcludes>
-                            <testIncludes>
-                                <testInclude>**/integration/**</testInclude>
-                            </testIncludes>
-                        </configuration>
-                    </execution>
-                </executions>
                 <configuration>
-                    <testExcludes>
-                        <testExclude>**/integration/**</testExclude>
-                    </testExcludes>
+                    <source>1.5</source>
+                    <target>1.5</target>
                 </configuration>
             </plugin>
-
             <!--
                 Exclude Integration tests in (default) unit tests and
                 conversely enable integration tests for integration testing
diff --git a/configadmin/src/main/appended-resources/META-INF/DEPENDENCIES b/configadmin/src/main/appended-resources/META-INF/DEPENDENCIES
index 659f29e..114cc1e 100644
--- a/configadmin/src/main/appended-resources/META-INF/DEPENDENCIES
+++ b/configadmin/src/main/appended-resources/META-INF/DEPENDENCIES
@@ -2,14 +2,14 @@
 
 This product includes software developed at
 The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
+Copyright (c) OSGi Alliance (2000, 2012).
 Licensed under the Apache License 2.0. 
 
 II. Used Third-Party Software
 
 This product uses software developed at
 The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
+Copyright (c) OSGi Alliance (2000, 2012).
 Licensed under the Apache License 2.0. 
 
 This product uses software developed at
diff --git a/configadmin/src/main/appended-resources/META-INF/NOTICE b/configadmin/src/main/appended-resources/META-INF/NOTICE
index 46c62c4..c87a187 100644
--- a/configadmin/src/main/appended-resources/META-INF/NOTICE
+++ b/configadmin/src/main/appended-resources/META-INF/NOTICE
@@ -1,4 +1,4 @@
 This product includes software developed at
 The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
+Copyright (c) OSGi Alliance (2000, 2012).
 Licensed under the Apache License 2.0.
\ No newline at end of file
diff --git a/configadmin/src/main/java/org/apache/felix/cm/file/package-info.java b/configadmin/src/main/java/org/apache/felix/cm/file/package-info.java
new file mode 100644
index 0000000..1cb467b
--- /dev/null
+++ b/configadmin/src/main/java/org/apache/felix/cm/file/package-info.java
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+@Version("1.0")
+@Export(optional = "provide:=true")
+package org.apache.felix.cm.file;
+
+
+import aQute.bnd.annotation.Export;
+import aQute.bnd.annotation.Version;
+
+
diff --git a/configadmin/src/main/java/org/apache/felix/cm/package-info.java b/configadmin/src/main/java/org/apache/felix/cm/package-info.java
new file mode 100644
index 0000000..32888b3
--- /dev/null
+++ b/configadmin/src/main/java/org/apache/felix/cm/package-info.java
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+@Version("1.0")
+@Export(optional = "provide:=true")
+package org.apache.felix.cm;
+
+
+import aQute.bnd.annotation.Export;
+import aQute.bnd.annotation.Version;
+
+
diff --git a/configadmin/src/main/java/org/osgi/framework/ServiceReference.java b/configadmin/src/main/java/org/osgi/framework/ServiceReference.java
new file mode 100644
index 0000000..156e30b
--- /dev/null
+++ b/configadmin/src/main/java/org/osgi/framework/ServiceReference.java
@@ -0,0 +1,180 @@
+/*
+ * $Header: /cvshome/build/org.osgi.framework/src/org/osgi/framework/ServiceReference.java,v 1.20 2007/02/21 16:49:05 hargrave Exp $
+ *
+ * Copyright (c) OSGi Alliance (2000, 2007). 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 service.
+ *
+ * <p>
+ * The Framework returns <code>ServiceReference</code> objects from the
+ * <code>BundleContext.getServiceReference</code> and
+ * <code>BundleContext.getServiceReferences</code> methods.
+ * <p>
+ * A <code>ServiceReference</code> object may be shared between bundles and
+ * can be used to examine the properties of the service and to get the service
+ * object.
+ * <p>
+ * Every service registered in the Framework has a unique
+ * <code>ServiceRegistration</code> object and may have multiple, distinct
+ * <code>ServiceReference</code> objects referring to it.
+ * <code>ServiceReference</code> objects associated with a
+ * <code>ServiceRegistration</code> object have the same <code>hashCode</code>
+ * and are considered equal (more specifically, their <code>equals()</code>
+ * method will return <code>true</code> when compared).
+ * <p>
+ * If the same service object is registered multiple times,
+ * <code>ServiceReference</code> objects associated with different
+ * <code>ServiceRegistration</code> objects are not equal.
+ *
+ * @see BundleContext#getServiceReference
+ * @see BundleContext#getServiceReferences
+ * @see BundleContext#getService
+ * @ThreadSafe
+ * @version $Revision: 1.20 $
+ */
+
+public interface ServiceReference<T> extends Comparable {
+    /**
+     * Returns the property value to which the specified property key is mapped
+     * in the properties <code>Dictionary</code> object of the service
+     * referenced by this <code>ServiceReference</code> object.
+     *
+     * <p>
+     * Property keys are case-insensitive.
+     *
+     * <p>
+     * This method must continue to return property values after the service has
+     * been unregistered. This is so references to unregistered services (for
+     * example, <code>ServiceReference</code> objects stored in the log) can
+     * still be interrogated.
+     *
+     * @param key The property key.
+     * @return The property value to which the key is mapped; <code>null</code>
+     *         if there is no property named after the key.
+     */
+    public Object getProperty(String key);
+
+    /**
+     * Returns an array of the keys in the properties <code>Dictionary</code>
+     * object of the service referenced by this <code>ServiceReference</code>
+     * object.
+     *
+     * <p>
+     * This method will continue to return the keys after the service has been
+     * unregistered. This is so references to unregistered services (for
+     * example, <code>ServiceReference</code> objects stored in the log) can
+     * still be interrogated.
+     *
+     * <p>
+     * This method is <i>case-preserving </i>; this means that every key in the
+     * returned array must have the same case as the corresponding key in the
+     * properties <code>Dictionary</code> that was passed to the
+     * {@link BundleContext#registerService(String[],Object,java.util.Dictionary)}
+     * or {@link ServiceRegistration#setProperties} methods.
+     *
+     * @return An array of property keys.
+     */
+    public String[] getPropertyKeys();
+
+    /**
+     * Returns the bundle that registered the service referenced by this
+     * <code>ServiceReference</code> object.
+     *
+     * <p>
+     * This method must return <code>null</code> when the service has been
+     * unregistered. This can be used to determine if the service has been
+     * unregistered.
+     *
+     * @return The bundle that registered the service referenced by this
+     *         <code>ServiceReference</code> object; <code>null</code> if
+     *         that service has already been unregistered.
+     * @see BundleContext#registerService(String[],Object,java.util.Dictionary)
+     */
+    public Bundle getBundle();
+
+    /**
+     * Returns the bundles that are using the service referenced by this
+     * <code>ServiceReference</code> object. Specifically, this method returns
+     * the bundles whose usage count for that service is greater than zero.
+     *
+     * @return An array of bundles whose usage count for the service referenced
+     *         by this <code>ServiceReference</code> object is greater than
+     *         zero; <code>null</code> if no bundles are currently using that
+     *         service.
+     *
+     * @since 1.1
+     */
+    public Bundle[] getUsingBundles();
+
+    /**
+     * Tests if the bundle that registered the service referenced by this
+     * <code>ServiceReference</code> and the specified bundle use the same
+     * source for the package of the specified class name.
+     * <p>
+     * This method performs the following checks:
+     * <ol>
+     * <li>Get the package name from the specified class name.</li>
+     * <li>For the bundle that registered the service referenced by this
+     * <code>ServiceReference</code> (registrant bundle); find the source for
+     * the package. If no source is found then return <code>true</code> if the
+     * registrant bundle is equal to the specified bundle; otherwise return
+     * <code>false</code>.</li>
+     * <li>If the package source of the registrant bundle is equal to the
+     * package source of the specified bundle then return <code>true</code>;
+     * otherwise return <code>false</code>.</li>
+     * </ol>
+     *
+     * @param bundle The <code>Bundle</code> object to check.
+     * @param className The class name to check.
+     * @return <code>true</code> if the bundle which registered the service
+     *         referenced by this <code>ServiceReference</code> and the
+     *         specified bundle use the same source for the package of the
+     *         specified class name. Otherwise <code>false</code> is returned.
+     *
+     * @since 1.3
+     */
+    public boolean isAssignableTo(Bundle bundle, String className);
+
+    /**
+     * Compares this <code>ServiceReference</code> with the specified
+     * <code>ServiceReference</code> for order.
+     *
+     * <p>
+     * If this <code>ServiceReference</code> and the specified
+     * <code>ServiceReference</code> have the same
+     * {@link Constants#SERVICE_ID service id} they are equal. This
+     * <code>ServiceReference</code> is less than the specified
+     * <code>ServiceReference</code> if it has a lower
+     * {@link Constants#SERVICE_RANKING service ranking} and greater if it has a
+     * higher service ranking. Otherwise, if this <code>ServiceReference</code>
+     * and the specified <code>ServiceReference</code> have the same
+     * {@link Constants#SERVICE_RANKING service ranking}, this
+     * <code>ServiceReference</code> is less than the specified
+     * <code>ServiceReference</code> if it has a higher
+     * {@link Constants#SERVICE_ID service id} and greater if it has a lower
+     * service id.
+     *
+     * @param reference The <code>ServiceReference</code> to be compared.
+     * @return Returns a negative integer, zero, or a positive integer if this
+     *         <code>ServiceReference</code> is less than, equal to, or
+     *         greater than the specified <code>ServiceReference</code>.
+     * @since 1.4
+     */
+    public int compareTo(Object reference);
+}
diff --git a/configadmin/src/main/java/org/osgi/service/cm/ConfigurationEvent.java b/configadmin/src/main/java/org/osgi/service/cm/ConfigurationEvent.java
deleted file mode 100644
index c215ad4..0000000
--- a/configadmin/src/main/java/org/osgi/service/cm/ConfigurationEvent.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2011). 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.service.cm;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * A Configuration Event.
- *
- * <p>
- * {@code ConfigurationEvent} objects are delivered to all registered
- * {@code ConfigurationListener} service objects. ConfigurationEvents must be
- * asynchronously delivered in chronological order with respect to each
- * listener.
- *
- * <p>
- * A type code is used to identify the type of event. The following event types
- * are defined:
- * <ul>
- * <li>{@link #CM_UPDATED}</li>
- * <li>{@link #CM_DELETED}</li>
- * <li>{@link #CM_LOCATION_CHANGED}</li>
- * </ul>
- * Additional event types may be defined in the future.
- *
- * <p>
- * Security Considerations. {@code ConfigurationEvent} objects do not provide
- * {@code Configuration} objects, so no sensitive configuration information is
- * available from the event. If the listener wants to locate the
- * {@code Configuration} object for the specified pid, it must use
- * {@code ConfigurationAdmin}.
- *
- * @see ConfigurationListener
- * @Immutable
- * @version $Id: 1493c281dfd9387837e6399b9b815cdc8dc43453 $
- * @since 1.2
- */
-public class ConfigurationEvent {
-    /**
-     * A {@code Configuration} has been updated.
-     *
-     * <p>
-     * This {@code ConfigurationEvent} type that indicates that a
-     * {@code Configuration} object has been updated with new properties.
-     *
-     * An event is fired when a call to {@link Configuration#update(Dictionary)}
-     * successfully changes a configuration.
-     */
-    public static final int         CM_UPDATED  = 1;
-    /**
-     * A {@code Configuration} has been deleted.
-     *
-     * <p>
-     * This {@code ConfigurationEvent} type that indicates that a
-     * {@code Configuration} object has been deleted.
-     *
-     * An event is fired when a call to {@link Configuration#delete()}
-     * successfully deletes a configuration.
-     */
-    public static final int         CM_DELETED  = 2;
-
-    /**
-     * The location of a {@code Configuration} has been changed.
-     *
-     * <p>
-     * This {@code ConfigurationEvent} type that indicates that the location of
-     * a {@code Configuration} object has been changed.
-     *
-     * An event is fired when a call to
-     * {@link Configuration#setBundleLocation(String)} successfully changes the
-     * location.
-     *
-     * @since 1.4
-     */
-    public static final int         CM_LOCATION_CHANGED = 3;
-    /**
-     * Type of this event.
-     *
-     * @see #getType()
-     */
-    private final int               type;
-    /**
-     * The factory pid associated with this event.
-     */
-    private final String            factoryPid;
-    /**
-     * The pid associated with this event.
-     */
-    private final String            pid;
-    /**
-     * The ConfigurationAdmin service which created this event.
-     */
-    private final ServiceReference  reference;
-
-    /**
-     * Constructs a {@code ConfigurationEvent} object from the given
-     * {@code ServiceReference} object, event type, and pids.
-     *
-     * @param reference The {@code ServiceReference} object of the Configuration
-     *        Admin service that created this event.
-     * @param type The event type. See {@link #getType()}.
-     * @param factoryPid The factory pid of the associated configuration if the
-     *        target of the configuration is a ManagedServiceFactory. Otherwise
-     *        {@code null} if the target of the configuration is a
-     *        ManagedService.
-     * @param pid The pid of the associated configuration.
-     */
-    public ConfigurationEvent(ServiceReference reference,
-            int type,
-            String factoryPid, String pid) {
-        this.reference = reference;
-        this.type = type;
-        this.factoryPid = factoryPid;
-        this.pid = pid;
-        if ((reference == null) || (pid == null)) {
-            throw new NullPointerException("reference and pid must not be null");
-        }
-    }
-
-    /**
-     * Returns the factory pid of the associated configuration.
-     *
-     * @return Returns the factory pid of the associated configuration if the
-     *         target of the configuration is a ManagedServiceFactory. Otherwise
-     *         {@code null} if the target of the configuration is a
-     *         ManagedService.
-     */
-    public String getFactoryPid() {
-        return factoryPid;
-    }
-
-    /**
-     * Returns the pid of the associated configuration.
-     *
-     * @return Returns the pid of the associated configuration.
-     */
-    public String getPid() {
-        return pid;
-    }
-
-    /**
-     * Return the type of this event.
-     * <p>
-     * The type values are:
-     * <ul>
-     * <li>{@link #CM_UPDATED}</li>
-     * <li>{@link #CM_DELETED}</li>
-     * <li>{@link #CM_LOCATION_CHANGED}</li>
-     * </ul>
-     *
-     * @return The type of this event.
-     */
-    public int getType() {
-        return type;
-    }
-
-    /**
-     * Return the {@code ServiceReference} object of the Configuration
-     * Admin service that created this event.
-     *
-     * @return The {@code ServiceReference} object for the Configuration
-     *         Admin service that created this event.
-     */
-    public ServiceReference getReference() {
-        return reference;
-    }
-}
diff --git a/configadmin/src/main/java/org/osgi/service/cm/ConfigurationPermission.java b/configadmin/src/main/java/org/osgi/service/cm/ConfigurationPermission.java
deleted file mode 100644
index fb3eb4e..0000000
--- a/configadmin/src/main/java/org/osgi/service/cm/ConfigurationPermission.java
+++ /dev/null
@@ -1,638 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2011). 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.service.cm;
-
-import java.io.IOException;
-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.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Indicates a bundle's authority to configure bundles or be updated by
- * Configuration Admin.
- *
- * @ThreadSafe
- * @version $Id: 0d700c494f2dc2bbe05165bf5c79fe185c9f0a4a $
- * @since 1.2
- */
-
-public final class ConfigurationPermission extends BasicPermission {
-    static final long               serialVersionUID    = 5716868734811965383L;
-    /**
-     * Provides permission to create new configurations for other bundles as
-     * well as manipulate them. The action string {@value #CONFIGURE}.
-     */
-    public final static String      CONFIGURE           = "configure";
-
-    /**
-     * The permission to be updated, that is, act as a Managed Service or
-     * Managed Service Factory. The action string {@value #TARGET}.
-     *
-     * @since 1.4
-     */
-    public final static String      TARGET              = "target";
-
-    private final static int        ACTION_CONFIGURE    = 0x00000001;
-    private final static int        ACTION_TARGET       = 0x00000002;
-    private final static int        ACTION_ALL          = ACTION_CONFIGURE
-                                                                | ACTION_TARGET;
-    final static int                ACTION_NONE         = 0;
-
-    /**
-     * The actions mask.
-     */
-    transient int                   action_mask;
-
-    /**
-     * The actions in canonical form.
-     *
-     * @serial
-     */
-    private volatile String         actions             = null;
-
-    /**
-     * Parsed name if it includes wildcards: "*"
-     */
-    private transient List substrings;
-
-    /**
-     * Create a new ConfigurationPermission.
-     *
-     * @param name Name of the permission. Wildcards ({@code '*'}) are allowed
-     *        in the name. During {@link #implies(Permission)}, the name is
-     *        matched to the requested permission using the substring matching
-     *        rules used by {@link Filter}s.
-     * @param actions Comma separated list of {@link #CONFIGURE},
-     *        {@link #TARGET}.
-     */
-
-    public ConfigurationPermission(String name, String actions) {
-        this(name, parseActions(actions));
-    }
-
-    /**
-     * Package private constructor used by ConfigurationPermissionCollection.
-     *
-     * @param name location string
-     * @param mask action mask
-     */
-    ConfigurationPermission(String name, int mask) {
-        super(name);
-        setTransients(mask);
-    }
-
-    /**
-     * Called by constructors and when deserialized.
-     *
-     * @param mask action mask
-     */
-    private void setTransients(int mask) {
-        if ((mask == ACTION_NONE) || ((mask & ACTION_ALL) != mask)) {
-            throw new IllegalArgumentException("invalid action string");
-        }
-        action_mask = mask;
-        substrings = parseSubstring(getName());
-    }
-
-    /**
-     * Parse action string into action mask.
-     *
-     * @param actions Action string.
-     * @return action mask.
-     */
-    private static int parseActions(String actions) {
-        boolean seencomma = false;
-
-        int mask = ACTION_NONE;
-
-        if (actions == null) {
-            return mask;
-        }
-
-        char[] a = actions.toCharArray();
-
-        int i = a.length - 1;
-        if (i < 0)
-            return mask;
-
-        while (i != -1) {
-            char c;
-
-            // skip whitespace
-            while ((i != -1)
-                    && ((c = a[i]) == ' ' || c == '\r' || c == '\n'
-                            || c == '\f' || c == '\t'))
-                i--;
-
-            // check for the known strings
-            int matchlen;
-
-            if (i >= 5 && (a[i - 5] == 't' || a[i - 5] == 'T')
-                    && (a[i - 4] == 'a' || a[i - 4] == 'A')
-                    && (a[i - 3] == 'r' || a[i - 3] == 'R')
-                    && (a[i - 2] == 'g' || a[i - 2] == 'G')
-                    && (a[i - 1] == 'e' || a[i - 1] == 'E')
-                    && (a[i] == 't' || a[i] == 'T')) {
-                matchlen = 6;
-                mask |= ACTION_TARGET;
-
-            }
-            else
-                if (i >= 8 && (a[i - 8] == 'c' || a[i - 8] == 'C')
-                        && (a[i - 7] == 'o' || a[i - 7] == 'O')
-                        && (a[i - 6] == 'n' || a[i - 6] == 'N')
-                        && (a[i - 5] == 'f' || a[i - 5] == 'F')
-                        && (a[i - 4] == 'i' || a[i - 4] == 'I')
-                        && (a[i - 3] == 'g' || a[i - 3] == 'G')
-                        && (a[i - 2] == 'u' || a[i - 2] == 'U')
-                        && (a[i - 1] == 'r' || a[i - 1] == 'R')
-                        && (a[i] == 'e' || a[i] == 'E')) {
-                    matchlen = 9;
-                    mask |= ACTION_CONFIGURE;
-
-                }
-                else {
-                    // parse error
-                    throw new IllegalArgumentException("invalid actions: "
-                            + actions);
-                }
-
-            // make sure we didn't just match the tail of a word
-            // like "ackbarftarget". Also, skip to the comma.
-            seencomma = false;
-            while (i >= matchlen && !seencomma) {
-                switch (a[i - matchlen]) {
-                    case ',' :
-                        seencomma = true;
-                        /* FALLTHROUGH */
-                    case ' ' :
-                    case '\r' :
-                    case '\n' :
-                    case '\f' :
-                    case '\t' :
-                        break;
-                    default :
-                        throw new IllegalArgumentException(
-                                "invalid permission: " + actions);
-                }
-                i--;
-            }
-
-            // point i at the location of the comma minus one (or -1).
-            i -= matchlen;
-        }
-
-        if (seencomma) {
-            throw new IllegalArgumentException("invalid actions: " + actions);
-        }
-
-        return mask;
-    }
-
-    /**
-     * Parse the name for wildcard processing.
-     *
-     * @param name The name of the permission.
-     * @return {@code null} is the name has no wildcards or a
-     *         {@code List<String>} where element is a substring to match or
-     *         null for {@code '*'}.
-     */
-    private static List parseSubstring(String name) {
-        if (name.indexOf('*') < 0) {
-            return null;
-        }
-        char[] chars = name.toCharArray();
-        StringBuffer sb = new StringBuffer(chars.length);
-
-        List sub = new ArrayList(10);
-
-        for (int pos = 0; pos < chars.length; pos++) {
-            char c = chars[pos];
-
-            switch (c) {
-                case '*' : {
-                    if (sb.length() > 0) {
-                        sub.add(sb.toString());
-                    }
-                    sb.setLength(0);
-                    sub.add(null);
-                    break;
-                }
-
-                case '\\' : {
-                    pos++;
-                    if (pos < chars.length) {
-                        c = chars[pos];
-                    }
-                    /* fall through into default */
-                }
-
-                default : {
-                    sb.append(c);
-                    break;
-                }
-            }
-        }
-        if (sb.length() > 0) {
-            sub.add(sb.toString());
-        }
-
-        int size = sub.size();
-
-        if (size == 0) {
-            return null;
-        }
-
-        if (size == 1) {
-            if (sub.get(0) != null) {
-                return null;
-            }
-        }
-        return sub;
-    }
-
-    /**
-     * Determines if a {@code ConfigurationPermission} object "implies" the
-     * specified permission.
-     *
-     * @param p The target permission to check.
-     * @return {@code true} if the specified permission is implied by this
-     *         object; {@code false} otherwise.
-     */
-
-    public boolean implies(Permission p) {
-        if (!(p instanceof ConfigurationPermission)) {
-            return false;
-        }
-        ConfigurationPermission requested = (ConfigurationPermission) p;
-        return implies0(requested, ACTION_NONE);
-    }
-
-    /**
-     * Internal implies method. Used by the implies and the permission
-     * collection implies methods.
-     *
-     * @param requested The requested ConfigurationPermission which has already
-     *        be validated as a proper argument.
-     * @param effective The effective actions with which to start.
-     * @return {@code true} if the specified permission is implied by this
-     *         object; {@code false} otherwise.
-     */
-    boolean implies0(ConfigurationPermission requested, int effective) {
-        /* check actions first - much faster */
-        effective |= action_mask;
-        final int desired = requested.action_mask;
-        if ((effective & desired) != desired) {
-            return false;
-        }
-        String requestedName = requested.getName();
-        if (substrings == null) {
-            return getName().equals(requestedName);
-        }
-        for (int i = 0, pos = 0, size = substrings.size(); i < size; i++) {
-            String substr = (String) substrings.get(i);
-
-            if (i + 1 < size) /* if this is not that last substr */{
-                if (substr == null) /* * */{
-                    String substr2 = (String) substrings.get(i + 1);
-
-                    if (substr2 == null) /* ** */
-                        continue; /* ignore first star */
-                    /* xxx */
-                    int index = requestedName.indexOf(substr2, pos);
-                    if (index == -1) {
-                        return false;
-                    }
-
-                    pos = index + substr2.length();
-                    if (i + 2 < size) // if there are more
-                        // substrings, increment
-                        // over the string we just
-                        // matched; otherwise need
-                        // to do the last substr
-                        // check
-                        i++;
-                }
-                else /* xxx */{
-                    int len = substr.length();
-                    if (requestedName.regionMatches(pos, substr, 0, len)) {
-                        pos += len;
-                    }
-                    else {
-                        return false;
-                    }
-                }
-            }
-            else /* last substr */{
-                if (substr == null) /* * */{
-                    return true;
-                }
-                /* xxx */
-                return requestedName.endsWith(substr);
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Determines the equality of two {@code ConfigurationPermission} objects.
-     * <p>
-     * Two {@code ConfigurationPermission} objects are equal.
-     *
-     * @param obj The object being compared for equality with this object.
-     * @return {@code true} if {@code obj} is equivalent to this
-     *         {@code ConfigurationPermission}; {@code false} otherwise.
-     */
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof ConfigurationPermission)) {
-            return false;
-        }
-
-        ConfigurationPermission cp = (ConfigurationPermission) obj;
-
-        return (action_mask == cp.action_mask)
-                && getName().equals(cp.getName());
-    }
-
-    /**
-     * Returns the hash code value for this object.
-     *
-     * @return Hash code value for this object.
-     */
-
-    public int hashCode() {
-        int h = 31 * 17 + getName().hashCode();
-        h = 31 * h + getActions().hashCode();
-        return h;
-    }
-
-    /**
-     * Returns the canonical string representation of the
-     * {@code ConfigurationPermission} actions.
-     *
-     * <p>
-     * Always returns present {@code ConfigurationPermission} actions in the
-     * following order: {@value #CONFIGURE}, {@value #TARGET}
-     *
-     * @return Canonical string representation of the
-     *         {@code ConfigurationPermission} actions.
-     */
-    public String getActions() {
-        String result = actions;
-        if (result == null) {
-            StringBuffer sb = new StringBuffer();
-            boolean comma = false;
-
-            int mask = action_mask;
-            if ((mask & ACTION_CONFIGURE) == ACTION_CONFIGURE) {
-                sb.append(CONFIGURE);
-                comma = true;
-            }
-
-            if ((mask & ACTION_TARGET) == ACTION_TARGET) {
-                if (comma)
-                    sb.append(',');
-                sb.append(TARGET);
-            }
-
-            actions = result = sb.toString();
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns a new {@code PermissionCollection} object suitable for storing
-     * {@code ConfigurationPermission}s.
-     *
-     * @return A new {@code PermissionCollection} object.
-     */
-    public PermissionCollection newPermissionCollection() {
-        return new ConfigurationPermissionCollection();
-    }
-
-    /**
-     * WriteObject is called to save the state of this permission 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
-        // call getActions to make sure actions field is initialized
-        if (actions == null)
-            getActions();
-        s.defaultWriteObject();
-    }
-
-    /**
-     * readObject is called to restore the state of this permission from a
-     * stream.
-     */
-    private synchronized void readObject(java.io.ObjectInputStream s)
-            throws IOException, ClassNotFoundException {
-        // Read in the data, then initialize the transients
-        s.defaultReadObject();
-        setTransients(parseActions(actions));
-    }
-}
-
-/**
- * Stores a set of {@code ConfigurationPermission} permissions.
- *
- * @see java.security.Permission
- * @see java.security.Permissions
- * @see java.security.PermissionCollection
- */
-final class ConfigurationPermissionCollection extends PermissionCollection {
-    static final long                               serialVersionUID    = -6917638867081695839L;
-    /**
-     * Collection of permissions.
-     *
-     * @serial
-     * @GuardedBy this
-     */
-    private Map    permissions;
-
-    /**
-     * Boolean saying if "*" is in the collection.
-     *
-     * @serial
-     * @GuardedBy this
-     */
-    private boolean                                 all_allowed;
-
-    /**
-     * Creates an empty {@code ConfigurationPermissionCollection} object.
-     *
-     */
-    public ConfigurationPermissionCollection() {
-        permissions = new HashMap();
-        all_allowed = false;
-    }
-
-    /**
-     * Adds the specified permission to the
-     * {@code ConfigurationPermissionCollection}. The key for the hash is the
-     * interface name of the service.
-     *
-     * @param permission The {@code Permission} object to add.
-     *
-     * @exception IllegalArgumentException If the permission is not an
-     *            {@code ConfigurationPermission}.
-     *
-     * @exception SecurityException If this ConfigurationPermissionCollection
-     *            object has been marked read-only.
-     */
-
-    public void add(Permission permission) {
-        if (!(permission instanceof ConfigurationPermission)) {
-            throw new IllegalArgumentException("invalid permission: "
-                    + permission);
-        }
-
-        if (isReadOnly())
-            throw new SecurityException("attempt to add a Permission to a "
-                    + "readonly PermissionCollection");
-
-        final ConfigurationPermission cp = (ConfigurationPermission) permission;
-        final String name = cp.getName();
-        synchronized (this) {
-            Map pc = permissions;
-            final ConfigurationPermission existing = (ConfigurationPermission) pc.get(name);
-            if (existing != null) {
-                final int oldMask = existing.action_mask;
-                final int newMask = cp.action_mask;
-                if (oldMask != newMask) {
-                    pc.put(name, new ConfigurationPermission(name, oldMask
-                            | newMask));
-                }
-            }
-            else {
-                pc.put(name, cp);
-            }
-
-            if (!all_allowed) {
-                if (name.equals("*")) {
-                    all_allowed = true;
-                }
-            }
-        }
-    }
-
-    /**
-     * Determines if the specified permissions implies the permissions expressed
-     * in {@code permission}.
-     *
-     * @param permission The Permission object to compare with this
-     *        {@code ConfigurationPermission} object.
-     * @return {@code true} if {@code permission} is a proper subset of a
-     *         permission in the set; {@code false} otherwise.
-     */
-    public boolean implies(Permission permission) {
-        if (!(permission instanceof ConfigurationPermission)) {
-            return false;
-        }
-        final ConfigurationPermission requested = (ConfigurationPermission) permission;
-        int effective = ConfigurationPermission.ACTION_NONE;
-
-        Collection perms;
-        synchronized (this) {
-            Map pc = permissions;
-            /* short circuit if the "*" Permission was added */
-            if (all_allowed) {
-                ConfigurationPermission cp = (ConfigurationPermission) pc.get("*");
-                if (cp != null) {
-                    effective |= cp.action_mask;
-                    final int desired = requested.action_mask;
-                    if ((effective & desired) == desired) {
-                        return true;
-                    }
-                }
-            }
-            perms = pc.values();
-        }
-        /* iterate one by one over permissions */
-        for (Iterator permI = perms.iterator(); permI.hasNext(); ) {
-            ConfigurationPermission perm = (ConfigurationPermission) permI.next();
-            if (perm.implies0(requested, effective)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns an enumeration of all {@code ConfigurationPermission} objects in
-     * the container.
-     *
-     * @return Enumeration of all {@code ConfigurationPermission} objects.
-     */
-    public synchronized Enumeration elements() {
-        List all = new ArrayList(permissions.values());
-        return Collections.enumeration(all);
-    }
-
-    /* serialization logic */
-    private static final ObjectStreamField[]    serialPersistentFields  = {
-            new ObjectStreamField("hasElement", Boolean.TYPE),
-            new ObjectStreamField("permissions", HashMap.class),
-            new ObjectStreamField("all_allowed", Boolean.TYPE)          };
-
-    private synchronized void writeObject(ObjectOutputStream out)
-            throws IOException {
-        ObjectOutputStream.PutField pfields = out.putFields();
-        pfields.put("hasElement", false);
-        pfields.put("permissions", permissions);
-        pfields.put("all_allowed", all_allowed);
-        out.writeFields();
-    }
-
-    private synchronized void readObject(java.io.ObjectInputStream in)
-            throws IOException, ClassNotFoundException {
-        ObjectInputStream.GetField gfields = in.readFields();
-        boolean hasElement = gfields.get("hasElement", false);
-        if (hasElement) { // old format
-            permissions = new HashMap();
-            permissions.put("*", new ConfigurationPermission("*",
-                    ConfigurationPermission.CONFIGURE));
-            all_allowed = true;
-        }
-        else {
-            permissions = (HashMap) gfields
-                    .get("permissions",
-                            new HashMap());
-            all_allowed = gfields.get("all_allowed", false);
-        }
-    }
-}
diff --git a/configadmin/src/test/java/org/apache/felix/cm/MockBundle.java b/configadmin/src/test/java/org/apache/felix/cm/MockBundle.java
index d1ef4e7..6273d90 100644
--- a/configadmin/src/test/java/org/apache/felix/cm/MockBundle.java
+++ b/configadmin/src/test/java/org/apache/felix/cm/MockBundle.java
@@ -195,4 +195,18 @@
 
     }
 
+
+    public void start( int options ) throws BundleException
+    {
+        // TODO Auto-generated method stub
+
+    }
+
+
+    public void stop( int options ) throws BundleException
+    {
+        // TODO Auto-generated method stub
+
+    }
+
 }
diff --git a/configadmin/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java b/configadmin/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java
index fcd61da..1fe4d10 100644
--- a/configadmin/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java
+++ b/configadmin/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java
@@ -252,6 +252,12 @@
         }
 
 
+        public int compareTo( Object reference )
+        {
+            return 0;
+        }
+
+
         public String toString()
         {
             return "ServiceReference " + getProperty( Constants.SERVICE_ID );
diff --git a/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java b/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java
index 50563f8..e1a4892 100644
--- a/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java
+++ b/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java
@@ -23,6 +23,7 @@
 import java.io.StringWriter;
 import java.util.Dictionary;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
@@ -266,7 +267,7 @@
                 {
                     // Create factory configuration
                     org.osgi.service.cm.Configuration conf = cm.createFactoryConfiguration( _FACTORYPID, null );
-                    Properties props = new Properties();
+                    Hashtable<String, Object> props = new Hashtable<String, Object>();
                     props.put( "foo", "bar" );
                     conf.update( props );
 
@@ -279,7 +280,7 @@
                     // Update factory configuration many times
                     for ( int i = 0; i < UPDATE_LOOP; i++ )
                     {
-                        props = new Properties();
+                        props = new Hashtable<String, Object>();
                         props.put( "foo", "bar" + i );
                         props.put( "number", new Long( UPDATE_LOOP - i ) );
                         conf.update( props );
diff --git a/configadmin/src/test/java/org/apache/felix/cm/integration/FELIX2813_ConfigurationAdminStartupTest.java b/configadmin/src/test/java/org/apache/felix/cm/integration/FELIX2813_ConfigurationAdminStartupTest.java
index 2bf4bd0..ea7deef 100644
--- a/configadmin/src/test/java/org/apache/felix/cm/integration/FELIX2813_ConfigurationAdminStartupTest.java
+++ b/configadmin/src/test/java/org/apache/felix/cm/integration/FELIX2813_ConfigurationAdminStartupTest.java
@@ -21,9 +21,8 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Hashtable;
 import java.util.List;
-import java.util.Properties;
-
 import junit.framework.TestCase;
 
 import org.junit.Test;
@@ -130,7 +129,7 @@
             try
             {
                 org.osgi.service.cm.Configuration config = ca.getConfiguration( "test" );
-                Properties props = new Properties();
+                Hashtable<String, Object> props = new Hashtable<String, Object>();
                 props.put( "abc", "123" );
                 config.update( props );
             }