Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 8B456200BA7 for ; Fri, 21 Oct 2016 17:18:33 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 89CF8160AE8; Fri, 21 Oct 2016 15:18:33 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id B26D9160AE0 for ; Fri, 21 Oct 2016 17:18:31 +0200 (CEST) Received: (qmail 95570 invoked by uid 500); 21 Oct 2016 15:18:30 -0000 Mailing-List: contact commits-help@felix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@felix.apache.org Delivered-To: mailing list commits@felix.apache.org Received: (qmail 95560 invoked by uid 99); 21 Oct 2016 15:18:30 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 21 Oct 2016 15:18:30 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 5EA0E1A0241 for ; Fri, 21 Oct 2016 15:18:30 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -1.199 X-Spam-Level: X-Spam-Status: No, score=-1.199 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RP_MATCHES_RCVD=-2.999] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id ivfWsHpYQLXz for ; Fri, 21 Oct 2016 15:18:22 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTP id DD6B25FB48 for ; Fri, 21 Oct 2016 15:18:21 +0000 (UTC) Received: from svn01-us-west.apache.org (svn.apache.org [10.41.0.6]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id 1A5D9E017A for ; Fri, 21 Oct 2016 15:18:21 +0000 (UTC) Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id 1B60D3A0046 for ; Fri, 21 Oct 2016 15:18:21 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1766046 - in /felix/trunk/configadmin-1.8.x: ./ src/main/java/org/apache/felix/cm/impl/ src/main/java/org/apache/felix/cm/impl/helper/ src/main/resources/OSGI-INF/ src/test/java/org/apache/felix/cm/file/ src/test/java/org/apache/felix/cm/i... Date: Fri, 21 Oct 2016 15:18:20 -0000 To: commits@felix.apache.org From: cziegeler@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20161021151821.1B60D3A0046@svn01-us-west.apache.org> archived-at: Fri, 21 Oct 2016 15:18:33 -0000 Author: cziegeler Date: Fri Oct 21 15:18:20 2016 New Revision: 1766046 URL: http://svn.apache.org/viewvc?rev=1766046&view=rev Log: Port changes from main branch to 1.8.x branch Modified: felix/trunk/configadmin-1.8.x/changelog.txt felix/trunk/configadmin-1.8.x/pom.xml felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/CachingPersistenceManagerProxy.java felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdapter.java felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationImpl.java felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/RankingComparator.java felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/BaseTracker.java felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceFactoryTracker.java felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceTracker.java felix/trunk/configadmin-1.8.x/src/main/resources/OSGI-INF/permissions.perm felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/file/ConfigurationHandlerTest.java felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/ConfigurationManagerTest.java felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java Modified: felix/trunk/configadmin-1.8.x/changelog.txt URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/changelog.txt?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/changelog.txt (original) +++ felix/trunk/configadmin-1.8.x/changelog.txt Fri Oct 21 15:18:20 2016 @@ -1,8 +1,21 @@ +Changes from 1.8.10 to 1.8.12 +----------------------------- + +** Improvement + * [FELIX-5380] - Reduce quite useless log verbosity + * [FELIX-5366] - Additional Unit Tests for ConfigurationHandler + +** Bug + * [FELIX-5368] - ConfigurationManager ignores NotCachablePersistenceManager marker interface + * [FELIX-5385] - ConfigAdmin uses wrong security when calling ManagedServices + + Changes from 1.8.8 to 1.8.10 ---------------------------- ** Improvement * [FELIX-5088] - CaseSensitiveDictionary should implement equals() + * [FELIX-5211] - Use provide/require capabilities instead of obsolete and meaningless import-export service headers ** Bug * [FELIX-5301] - ConfigurationPlugin support is not spec compliant Modified: felix/trunk/configadmin-1.8.x/pom.xml URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/pom.xml?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/pom.xml (original) +++ felix/trunk/configadmin-1.8.x/pom.xml Fri Oct 21 15:18:20 2016 @@ -22,8 +22,8 @@ org.apache.felix felix-parent - 3 - ../pom/pom.xml + 4 + org.apache.felix.configadmin @@ -68,6 +68,7 @@ in the IDE launcher. --> + 6 ${basedir}/target Modified: felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/CachingPersistenceManagerProxy.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/CachingPersistenceManagerProxy.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/CachingPersistenceManagerProxy.java (original) +++ felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/CachingPersistenceManagerProxy.java Fri Oct 21 15:18:20 2016 @@ -67,6 +67,10 @@ class CachingPersistenceManagerProxy imp this.pm = pm; this.cache = new Hashtable(); } + + public boolean isNotCachablePersistenceManager() { + return pm instanceof NotCachablePersistenceManager; + } /** Modified: felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdapter.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdapter.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdapter.java (original) +++ felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdapter.java Fri Oct 21 15:18:20 2016 @@ -49,6 +49,7 @@ public class ConfigurationAdapter implem /** * @see org.apache.felix.cm.impl.ConfigurationImpl#getPid() */ + @Override public String getPid() { checkDeleted(); @@ -59,6 +60,7 @@ public class ConfigurationAdapter implem /** * @see org.apache.felix.cm.impl.ConfigurationImpl#getFactoryPid() */ + @Override public String getFactoryPid() { checkDeleted(); @@ -69,12 +71,13 @@ public class ConfigurationAdapter implem /** * @see org.apache.felix.cm.impl.ConfigurationImpl#getBundleLocation() */ + @Override public String getBundleLocation() { // CM 1.4 / 104.13.2.4 final String bundleLocation = delegatee.getBundleLocation(); - delegatee.getConfigurationManager().log( LogService.LOG_DEBUG, "getBundleLocation() ==> {0}", new Object[] - { bundleLocation } ); + //delegatee.getConfigurationManager().log( LogService.LOG_DEBUG, "getBundleLocation() ==> {0}", new Object[] + // { bundleLocation } ); checkActive(); configurationAdmin.checkPermission( delegatee.getConfigurationManager(), ( bundleLocation == null ) ? "*" : bundleLocation, true ); checkDeleted(); @@ -86,6 +89,7 @@ public class ConfigurationAdapter implem * @param bundleLocation * @see org.apache.felix.cm.impl.ConfigurationImpl#setStaticBundleLocation(String) */ + @Override public void setBundleLocation( String bundleLocation ) { delegatee.getConfigurationManager().log( LogService.LOG_DEBUG, "setBundleLocation(bundleLocation={0})", @@ -106,6 +110,7 @@ public class ConfigurationAdapter implem * @throws IOException * @see org.apache.felix.cm.impl.ConfigurationImpl#update() */ + @Override public void update() throws IOException { delegatee.getConfigurationManager().log( LogService.LOG_DEBUG, "update()", ( Throwable ) null ); @@ -134,7 +139,7 @@ public class ConfigurationAdapter implem public Dictionary getProperties() { - delegatee.getConfigurationManager().log( LogService.LOG_DEBUG, "getProperties()", ( Throwable ) null ); + //delegatee.getConfigurationManager().log( LogService.LOG_DEBUG, "getProperties()", ( Throwable ) null ); checkDeleted(); @@ -144,9 +149,10 @@ public class ConfigurationAdapter implem } + @Override public long getChangeCount() { - delegatee.getConfigurationManager().log( LogService.LOG_DEBUG, "getChangeCount()", ( Throwable ) null ); + //delegatee.getConfigurationManager().log( LogService.LOG_DEBUG, "getChangeCount()", ( Throwable ) null ); checkDeleted(); @@ -158,6 +164,7 @@ public class ConfigurationAdapter implem * @throws IOException * @see org.apache.felix.cm.impl.ConfigurationImpl#delete() */ + @Override public void delete() throws IOException { delegatee.getConfigurationManager().log( LogService.LOG_DEBUG, "delete()", ( Throwable ) null ); @@ -171,6 +178,7 @@ public class ConfigurationAdapter implem /** * @see org.apache.felix.cm.impl.ConfigurationImpl#hashCode() */ + @Override public int hashCode() { return delegatee.hashCode(); @@ -181,6 +189,7 @@ public class ConfigurationAdapter implem * @param obj * @see org.apache.felix.cm.impl.ConfigurationImpl#equals(java.lang.Object) */ + @Override public boolean equals( Object obj ) { return delegatee.equals( obj ); @@ -190,6 +199,7 @@ public class ConfigurationAdapter implem /** * @see org.apache.felix.cm.impl.ConfigurationImpl#toString() */ + @Override public String toString() { return delegatee.toString(); Modified: felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java (original) +++ felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java Fri Oct 21 15:18:20 2016 @@ -70,6 +70,7 @@ public class ConfigurationAdminImpl impl /* (non-Javadoc) * @see org.osgi.service.cm.ConfigurationAdmin#createFactoryConfiguration(java.lang.String) */ + @Override public Configuration createFactoryConfiguration( String factoryPid ) throws IOException { final ConfigurationManager configurationManager = getConfigurationManager(); @@ -87,6 +88,7 @@ public class ConfigurationAdminImpl impl /* (non-Javadoc) * @see org.osgi.service.cm.ConfigurationAdmin#createFactoryConfiguration(java.lang.String, java.lang.String) */ + @Override public Configuration createFactoryConfiguration( String factoryPid, String location ) throws IOException { final ConfigurationManager configurationManager = getConfigurationManager(); @@ -106,6 +108,7 @@ public class ConfigurationAdminImpl impl /* (non-Javadoc) * @see org.osgi.service.cm.ConfigurationAdmin#getConfiguration(java.lang.String) */ + @Override public Configuration getConfiguration( String pid ) throws IOException { final ConfigurationManager configurationManager = getConfigurationManager(); @@ -147,6 +150,7 @@ public class ConfigurationAdminImpl impl /* (non-Javadoc) * @see org.osgi.service.cm.ConfigurationAdmin#getConfiguration(java.lang.String, java.lang.String) */ + @Override public Configuration getConfiguration( String pid, String location ) throws IOException { final ConfigurationManager configurationManager = getConfigurationManager(); @@ -175,6 +179,7 @@ public class ConfigurationAdminImpl impl /* (non-Javadoc) * @see org.osgi.service.cm.ConfigurationAdmin#listConfigurations(java.lang.String) */ + @Override public Configuration[] listConfigurations( String filter ) throws IOException, InvalidSyntaxException { final ConfigurationManager configurationManager = getConfigurationManager(); @@ -239,6 +244,25 @@ public class ConfigurationAdminImpl impl */ void checkPermission( final ConfigurationManager configurationManager, String name, boolean checkOwn ) { + checkPermission(configurationManager, name, ConfigurationPermission.CONFIGURE, checkOwn); + } + + /** + * Checks whether the current access control context (call stack) has + * the given permission for the given bundle location and throws a + * SecurityException if this is not the case. + * + * @param name The bundle location to check for permission. If this + * is null permission is always granted. + * @param action The action to check. + * @param checkOwn If {@code false} permission is alwas granted if + * {@code name} is the same the using bundle's location. + * + * @throws SecurityException if the access control context does not + * have the appropriate permission + */ + void checkPermission( final ConfigurationManager configurationManager, String name, String action, boolean checkOwn ) + { // the caller's permission must be checked final SecurityManager sm = System.getSecurityManager(); if ( sm != null ) @@ -248,45 +272,45 @@ public class ConfigurationAdminImpl impl { try { - sm.checkPermission( new ConfigurationPermission( name, ConfigurationPermission.CONFIGURE ) ); + sm.checkPermission( new ConfigurationPermission( name, action ) ); configurationManager.log( LogService.LOG_DEBUG, - "Explicit Permission; grant CONFIGURE permission on configuration bound to {0} to bundle {1}", + "Explicit Permission; grant {0} permission on configuration bound to {1} to bundle {2}", new Object[] - { name, getBundle().getLocation() } ); + { action, name, getBundle().getLocation() } ); } catch ( SecurityException se ) { configurationManager .log( LogService.LOG_DEBUG, - "No Permission; denied CONFIGURE permission on configuration bound to {0} to bundle {1}; reason: {2}", + "No Permission; denied {0} permission on configuration bound to {1} to bundle {2}; reason: {3}", new Object[] - { name, getBundle().getLocation(), se.getMessage() } ); + { action, name, getBundle().getLocation(), se.getMessage() } ); throw se; } } else if ( configurationManager.isLogEnabled( LogService.LOG_DEBUG ) ) { configurationManager.log( LogService.LOG_DEBUG, - "Implicit Permission; grant CONFIGURE permission on configuration bound to {0} to bundle {1}", + "Implicit Permission; grant {0} permission on configuration bound to {1} to bundle {2}", new Object[] - { name, getBundle().getLocation() } ); + { action, name, getBundle().getLocation() } ); } } else if ( configurationManager.isLogEnabled( LogService.LOG_DEBUG ) ) { configurationManager.log( LogService.LOG_DEBUG, - "No SecurityManager installed; grant CONFIGURE permission on configuration bound to {0} to bundle {1}", + "No SecurityManager installed; grant {0} permission on configuration bound to {1} to bundle {2}", new Object[] - { name, getBundle().getLocation() } ); + { action, name, getBundle().getLocation() } ); } } /** - * Returns the {@link ConfigurationManager} backing this configuraiton + * Returns the {@link ConfigurationManager} backing this configuration * admin instance or throws {@code IllegalStateException} if already * disposed off. * Modified: felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationImpl.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationImpl.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationImpl.java (original) +++ felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationImpl.java Fri Oct 21 15:18:20 2016 @@ -362,7 +362,7 @@ public class ConfigurationImpl extends C } - /* (non-Javadoc) + /** * @see org.osgi.service.cm.Configuration#update(java.util.Dictionary) */ public void update( Dictionary properties ) throws IOException @@ -397,6 +397,7 @@ public class ConfigurationImpl extends C //---------- Object overwrites -------------------------------------------- + @Override public boolean equals( Object obj ) { if ( obj == this ) @@ -413,12 +414,14 @@ public class ConfigurationImpl extends C } + @Override public int hashCode() { return getPidString().hashCode(); } + @Override public String toString() { return "Configuration PID=" + getPidString() + ", factoryPID=" + factoryPID + ", bundleLocation=" + getBundleLocation(); @@ -494,6 +497,7 @@ public class ConfigurationImpl extends C } + @Override void store() throws IOException { // we don't need a deep copy, since we are not modifying Modified: felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java (original) +++ felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java Fri Oct 21 15:18:20 2016 @@ -197,6 +197,7 @@ public class ConfigurationManager implem // flag indicating whether the manager is considered alive private volatile boolean isActive; + @Override public void start( BundleContext bundleContext ) { // track the log service using a ServiceTracker @@ -293,6 +294,7 @@ public class ConfigurationManager implem } + @Override public void stop( BundleContext bundleContext ) { @@ -681,7 +683,11 @@ public class ConfigurationManager implem } // ensure the service.pid and returned a cached config if available - ConfigurationImpl cfg = getCachedConfiguration( pid ); + ConfigurationImpl cfg = null; + if (! (pmList[i].isNotCachablePersistenceManager())) + { + cfg = getCachedConfiguration( pid ); + } if ( cfg == null ) { cfg = new ConfigurationImpl( this, pmList[i], config ); @@ -786,6 +792,7 @@ public class ConfigurationManager implem // ---------- BundleListener ----------------------------------------------- + @Override public void bundleChanged( BundleEvent event ) { if ( event.getType() == BundleEvent.UNINSTALLED && handleBundleEvents ) @@ -1399,6 +1406,7 @@ public class ConfigurationManager implem } + @Override public void run() { for ( String pid : this.pids ) @@ -1484,6 +1492,7 @@ public class ConfigurationManager implem } + @Override public void run() { for ( String factoryPid : this.factoryPids ) @@ -1724,6 +1733,7 @@ public class ConfigurationManager implem } + @Override public void run() { log( LogService.LOG_DEBUG, "Updating configuration {0} to revision #{1}", new Object[] @@ -1813,6 +1823,7 @@ public class ConfigurationManager implem } + @Override public void run() { List> srList = this.getHelper().getServices( getTargetedServicePid() ); @@ -1886,6 +1897,7 @@ public class ConfigurationManager implem } + @Override public void run() { List> srList = this.getHelper().getServices( getTargetedServicePid() ); @@ -2016,6 +2028,7 @@ public class ConfigurationManager implem } + @Override public void run() { for ( int i = 0; i < listeners.length; i++ ) Modified: felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/RankingComparator.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/RankingComparator.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/RankingComparator.java (original) +++ felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/RankingComparator.java Fri Oct 21 15:18:20 2016 @@ -95,16 +95,16 @@ public abstract class RankingComparator final long id1 = this.getLong( obj1, Constants.SERVICE_ID ); final long id2 = this.getLong( obj2, Constants.SERVICE_ID ); + if ( id1 == id2 ) + { + return 0; + } + final int rank1 = this.getInteger( obj1, ConfigurationPlugin.CM_RANKING ); final int rank2 = this.getInteger( obj2, ConfigurationPlugin.CM_RANKING ); if ( rank1 == rank2 ) { - if ( id1 == id2 ) - { - return 0; - } - return ( id1 > id2 ) ? -1 : 1; } Modified: felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/BaseTracker.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/BaseTracker.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/BaseTracker.java (original) +++ felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/BaseTracker.java Fri Oct 21 15:18:20 2016 @@ -20,6 +20,9 @@ package org.apache.felix.cm.impl.helper; import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.DomainCombiner; +import java.security.Permission; import java.security.ProtectionDomain; import java.util.ArrayList; import java.util.Collection; @@ -30,6 +33,7 @@ import java.util.List; import org.apache.felix.cm.impl.CaseInsensitiveDictionary; import org.apache.felix.cm.impl.ConfigurationManager; import org.apache.felix.cm.impl.RankingComparator; +import org.osgi.framework.Bundle; import org.osgi.framework.Constants; import org.osgi.framework.ServiceReference; import org.osgi.service.cm.ConfigurationException; @@ -286,9 +290,41 @@ public abstract class BaseTracker ext } - protected AccessControlContext getAccessControlContext( final Object ref ) + AccessControlContext getAccessControlContext( final Bundle bundle ) { - return new AccessControlContext( new ProtectionDomain[] - { ref.getClass().getProtectionDomain() } ); + return new AccessControlContext(AccessController.getContext(), new CMDomainCombiner(bundle)); } -} \ No newline at end of file + + private static class CMDomainCombiner implements DomainCombiner { + private final Bundle bundle; + + CMDomainCombiner(Bundle bundle) { + this.bundle = bundle; + } + + public ProtectionDomain[] combine(ProtectionDomain[] arg0, + ProtectionDomain[] arg1) { + return new ProtectionDomain[] { new CMProtectionDomain(bundle) }; + } + + } + + private static class CMProtectionDomain extends ProtectionDomain { + + private final Bundle bundle; + + CMProtectionDomain(Bundle bundle) { + super(null, null); + this.bundle = bundle; + } + + public boolean implies(Permission permission) { + try { + return bundle.hasPermission(permission); + } catch (IllegalStateException e) { + return false; + } + } + } + +} Modified: felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceFactoryTracker.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceFactoryTracker.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceFactoryTracker.java (original) +++ felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceFactoryTracker.java Fri Oct 21 15:18:20 2016 @@ -90,7 +90,7 @@ public class ManagedServiceFactoryTracke { Dictionary props = getProperties( properties, reference, configPid.toString(), factoryPid.toString() ); - updated( service, configPid.toString(), props ); + updated( reference, service, configPid.toString(), props ); configs.record( configPid, factoryPid, revision ); } catch ( Throwable t ) @@ -117,7 +117,7 @@ public class ManagedServiceFactoryTracke { try { - deleted( service, configPid.toString() ); + deleted( reference, service, configPid.toString() ); configs.record( configPid, factoryPid, -1 ); } catch ( Throwable t ) @@ -133,7 +133,7 @@ public class ManagedServiceFactoryTracke } - private void updated( final ManagedServiceFactory service, final String pid, final Dictionary properties ) + private void updated( final ServiceReference reference, final ManagedServiceFactory service, final String pid, final Dictionary properties ) throws ConfigurationException { if ( System.getSecurityManager() != null ) @@ -147,7 +147,7 @@ public class ManagedServiceFactoryTracke service.updated( pid, properties ); return null; } - }, getAccessControlContext( service ) ); + }, getAccessControlContext( reference.getBundle() ) ); } catch ( PrivilegedActionException e ) { @@ -161,7 +161,7 @@ public class ManagedServiceFactoryTracke } - private void deleted( final ManagedServiceFactory service, final String pid ) + private void deleted( final ServiceReference reference, final ManagedServiceFactory service, final String pid ) { if ( System.getSecurityManager() != null ) { @@ -172,11 +172,11 @@ public class ManagedServiceFactoryTracke service.deleted( pid ); return null; } - }, getAccessControlContext( service ) ); + }, getAccessControlContext( reference.getBundle() ) ); } else { service.deleted( pid ); } } -} \ No newline at end of file +} Modified: felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceTracker.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceTracker.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceTracker.java (original) +++ felix/trunk/configadmin-1.8.x/src/main/java/org/apache/felix/cm/impl/helper/ManagedServiceTracker.java Fri Oct 21 15:18:20 2016 @@ -149,7 +149,7 @@ public class ManagedServiceTracker exten { try { - updated( srv, properties ); + updated( service, srv, properties ); configs.record( configPid, null, revision ); } catch ( Throwable t ) @@ -164,7 +164,7 @@ public class ManagedServiceTracker exten } - private void updated( final ManagedService service, final Dictionary properties ) throws ConfigurationException + private void updated( final ServiceReference reference, final ManagedService service, final Dictionary properties) throws ConfigurationException { if ( System.getSecurityManager() != null ) { @@ -177,7 +177,7 @@ public class ManagedServiceTracker exten service.updated( properties ); return null; } - }, getAccessControlContext( service ) ); + }, getAccessControlContext( reference.getBundle() ) ); } catch ( PrivilegedActionException e ) { @@ -189,4 +189,4 @@ public class ManagedServiceTracker exten service.updated( properties ); } } -} \ No newline at end of file +} Modified: felix/trunk/configadmin-1.8.x/src/main/resources/OSGI-INF/permissions.perm URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/main/resources/OSGI-INF/permissions.perm?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/main/resources/OSGI-INF/permissions.perm (original) +++ felix/trunk/configadmin-1.8.x/src/main/resources/OSGI-INF/permissions.perm Fri Oct 21 15:18:20 2016 @@ -47,4 +47,4 @@ (org.osgi.framework.ServicePermission "org.apache.felix.cm.PersistenceManager" "register") # -> BaseTracker.getAccessControlContext -(java.lang.RuntimePermission "getProtectionDomain") +(java.security.SecurityPermission "createAccessControlContext") Modified: felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/file/ConfigurationHandlerTest.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/file/ConfigurationHandlerTest.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/file/ConfigurationHandlerTest.java (original) +++ felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/file/ConfigurationHandlerTest.java Fri Oct 21 15:18:20 2016 @@ -19,13 +19,21 @@ package org.apache.felix.cm.file; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Dictionary; +import java.util.Hashtable; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; -import junit.framework.TestCase; - -public class ConfigurationHandlerTest extends TestCase -{ +public class ConfigurationHandlerTest { + + private static final String SERVICE_PID = "service.pid"; private static final String PAR_1 = "mongouri"; private static final String VAL_1 = "127.0.0.1:27017"; @@ -39,11 +47,271 @@ public class ConfigurationHandlerTest ex " # custom datastore\n" + PAR_2 + "=B\"" + VAL_2 + "\"\n"; + @Test public void testComments() throws IOException { final Dictionary dict = ConfigurationHandler.read(new ByteArrayInputStream(CONFIG.getBytes("UTF-8"))); - assertEquals(2, dict.size()); - assertEquals(VAL_1, dict.get(PAR_1)); - assertEquals(VAL_2, dict.get(PAR_2).toString()); + Assert.assertEquals(2, dict.size()); + Assert.assertEquals(VAL_1, dict.get(PAR_1)); + Assert.assertEquals(VAL_2, dict.get(PAR_2).toString()); + } + + + @Test + public void test_writeArray() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Object> properties = new Hashtable< String, Object>(); + properties.put(SERVICE_PID , new String [] {"foo", "bar"}); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=[ \\\r\n \"foo\", \\\r\n \"bar\", \\\r\n ]\r\n", entry); + } + + @Test + public void test_writeEmptyCollection() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Object> properties = new Hashtable< String, Object>(); + properties.put(SERVICE_PID , new ArrayList()); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=( \\\r\n)\r\n", entry); + } + + @Test + public void test_writeCollection() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Object> properties = new Hashtable< String, Object>(); + List list = new ArrayList(){{ + add("foo"); + add("bar"); + }}; + + properties.put(SERVICE_PID , list); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=( \\\r\n \"foo\", \\\r\n \"bar\", \\\r\n)\r\n", entry); + } + + @Test + public void test_writeSimpleString() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, String> properties = new Hashtable< String, String>(); + properties.put(SERVICE_PID, "com.adobe.granite.foo.Bar"); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=\"com.adobe.granite.foo.Bar\"\r\n", entry); + } + + @Test + public void test_writeInteger() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Integer> properties = new Hashtable< String, Integer>(); + properties.put(SERVICE_PID, 1000); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=I\"1000\"\r\n", entry); + } + + @Test + public void test_writeLong() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Long> properties = new Hashtable< String, Long>(); + properties.put(SERVICE_PID, 1000L); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=L\"1000\"\r\n", entry); + } + + @Test + public void test_writeFloat() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Float> properties = new Hashtable< String, Float>(); + properties.put(SERVICE_PID, 3.6f); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=F\"1080452710\"\r\n", entry); + } + + @Test + public void test_writeDouble() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Double> properties = new Hashtable< String, Double>(); + properties.put(SERVICE_PID, 3.6d); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=D\"4615288898129284301\"\r\n", entry); + } + + @Test + public void test_writeByte() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Byte> properties = new Hashtable< String, Byte>(); + properties.put(SERVICE_PID, new Byte("10")); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=X\"10\"\r\n", entry); + } + + @Test + public void test_writeShort() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Short> properties = new Hashtable< String, Short>(); + properties.put(SERVICE_PID, (short)10); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=S\"10\"\r\n", entry); + } + + @Test + public void test_writeChar() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Character> properties = new Hashtable< String, Character>(); + properties.put(SERVICE_PID, 'c'); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=C\"c\"\r\n", entry); + } + + @Test + public void test_writeBoolean() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, Boolean> properties = new Hashtable< String, Boolean>(); + properties.put(SERVICE_PID, true); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("service.pid=B\"true\"\r\n", entry); + } + + @Test + public void test_writeSimpleStringWithError() throws IOException { + OutputStream out = new ByteArrayOutputStream(); + Dictionary< String, String> properties = new Hashtable< String, String>(); + properties.put("foo.bar", "com.adobe.granite.foo.Bar"); + ConfigurationHandler.write(out, properties); + String entry = new String(((ByteArrayOutputStream)out).toByteArray(),"UTF-8"); + Assert.assertEquals("foo.bar=\"com.adobe.granite.foo.Bar\"\r\n", entry); + } + + @Test + public void test_readArray() throws IOException { + String entry = "service.pid=[ \\\r\n \"foo\", \\\r\n \"bar\", \\\r\n ]\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertArrayEquals(new String [] {"foo", "bar"}, (String [])dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readEmptyCollection() throws IOException { + String entry = "service.pid=( \\\r\n)\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals(new ArrayList(), (ArrayList)dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readCollection() throws IOException { + String entry = "service.pid=( \\\r\n \"foo\", \\\r\n \"bar\", \\\r\n)\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + List list = new ArrayList(){{ + add("foo"); + add("bar"); + }}; + Assert.assertEquals(list, (ArrayList)dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readSimpleString() throws IOException { + String entry = "service.pid=\"com.adobe.granite.foo.Bar\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals( "com.adobe.granite.foo.Bar", dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readSimpleStrings() throws IOException { + String entry = "service.pid=\"com.adobe.granite.foo.Bar\"\r\nfoo.bar=\"com.adobe.granite.foo.Baz\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(2, dictionary.size()); + Assert.assertEquals( "com.adobe.granite.foo.Bar", dictionary.get(SERVICE_PID)); + Assert.assertNotNull(dictionary.get("foo.bar")); + } + + @Test + public void test_readInteger() throws IOException { + String entry = "service.pid=I\"1000\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals( 1000, dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readLong() throws IOException { + String entry = "service.pid=L\"1000\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals( 1000L, dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readFloat() throws IOException { + String entry = "service.pid=F\"1080452710\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals( 3.6f, dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readDouble() throws IOException { + String entry = "service.pid=D\"4615288898129284301\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals( 3.6d, dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readByte() throws IOException { + String entry = "service.pid=X\"10\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals((byte)10 , dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readShort() throws IOException { + String entry = "service.pid=S\"10\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals((short)10 , dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readChar() throws IOException { + String entry = "service.pid=C\"c\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals('c' , dictionary.get(SERVICE_PID)); + } + + @Test + public void test_readBoolean() throws IOException { + String entry = "service.pid=B\"true\"\r\n"; + InputStream stream = new ByteArrayInputStream(entry.getBytes(StandardCharsets.UTF_8)); + Dictionary dictionary = ConfigurationHandler.read(stream); + Assert.assertEquals(1, dictionary.size()); + Assert.assertEquals(true , dictionary.get(SERVICE_PID)); } } + Modified: felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/ConfigurationManagerTest.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/ConfigurationManagerTest.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/ConfigurationManagerTest.java (original) +++ felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/ConfigurationManagerTest.java Fri Oct 21 15:18:20 2016 @@ -28,10 +28,11 @@ import java.util.HashSet; import java.util.Hashtable; import java.util.Map; import java.util.Set; - import org.apache.felix.cm.MockBundleContext; import org.apache.felix.cm.MockLogService; +import org.apache.felix.cm.MockNotCachablePersistenceManager; import org.apache.felix.cm.MockPersistenceManager; +import org.apache.felix.cm.PersistenceManager; import org.mockito.Mockito; import org.osgi.framework.Bundle; import org.osgi.framework.Constants; @@ -41,10 +42,8 @@ import org.osgi.service.cm.Configuration import org.osgi.service.cm.SynchronousConfigurationListener; import org.osgi.service.log.LogService; import org.osgi.util.tracker.ServiceTracker; - import junit.framework.TestCase; - public class ConfigurationManagerTest extends TestCase { @@ -73,6 +72,84 @@ public class ConfigurationManagerTest ex super.tearDown(); } + public void test_listConfigurations_cached() throws Exception + { + String pid = "testDefaultPersistenceManager"; + ConfigurationManager configMgr = new ConfigurationManager(); + setServiceTrackerField( configMgr, "persistenceManagerTracker" ); + + Field field = configMgr.getClass().getDeclaredField( "persistenceManagers" ); + field.setAccessible( true ); + CachingPersistenceManagerProxy[] persistenceManagers = new CachingPersistenceManagerProxy [1]; + PersistenceManager pm =new MockPersistenceManager(); + Dictionary dictionary = new Hashtable(); + dictionary.put( "property1", "value1" ); + dictionary.put( Constants.SERVICE_PID, pid ); + pm.store( pid, dictionary ); + + persistenceManagers[0] = new CachingPersistenceManagerProxy(pm); + field.set(configMgr, persistenceManagers); + + ConfigurationImpl[] conf = configMgr.listConfigurations(new ConfigurationAdminImpl(configMgr, null), null); + + assertEquals(1, conf.length); + assertEquals(2, conf[0].getProperties(true).size()); + + Field configurations = configMgr.getClass().getDeclaredField( "configurations" ); + configurations.setAccessible( true ); + HashMap configurationsMap = new HashMap(); + configurationsMap.put(pid, conf[0]); + configurations.set(configMgr, configurationsMap); + + dictionary = new Hashtable(); + dictionary.put( "property1", "value2" ); + pid = "testDefaultPersistenceManager"; + dictionary.put( Constants.SERVICE_PID, pid ); + pm.store( pid, dictionary ); + + conf = configMgr.listConfigurations(new ConfigurationAdminImpl(configMgr, null), null); + assertEquals(1, conf.length); + assertEquals(2, conf[0].getProperties(true).size()); + } + + public void test_listConfigurations_notcached() throws Exception + { + String pid = "testDefaultPersistenceManager"; + ConfigurationManager configMgr = new ConfigurationManager(); + setServiceTrackerField( configMgr, "persistenceManagerTracker" ); + + Field field = configMgr.getClass().getDeclaredField( "persistenceManagers" ); + field.setAccessible( true ); + CachingPersistenceManagerProxy[] persistenceManagers = new CachingPersistenceManagerProxy[1]; + PersistenceManager pm =new MockNotCachablePersistenceManager(); + Dictionary dictionary = new Hashtable(); + dictionary.put( "property1", "value1" ); + dictionary.put( Constants.SERVICE_PID, pid ); + pm.store( pid, dictionary ); + + persistenceManagers[0] = new CachingPersistenceManagerProxy(pm); + field.set(configMgr, persistenceManagers); + + ConfigurationImpl[] conf = configMgr.listConfigurations(new ConfigurationAdminImpl(configMgr, null), null); + + assertEquals(1, conf.length); + assertEquals(2, conf[0].getProperties(true).size()); + + Field configurations = configMgr.getClass().getDeclaredField( "configurations" ); + configurations.setAccessible( true ); + HashMap configurationsMap = new HashMap(); + configurationsMap.put(pid, conf[0]); + configurations.set(configMgr, configurationsMap); + + dictionary = new Hashtable(); + pid = "testDefaultPersistenceManager"; + dictionary.put( Constants.SERVICE_PID, pid ); + pm.store( pid, dictionary ); + + conf = configMgr.listConfigurations(new ConfigurationAdminImpl(configMgr, null), null); + assertEquals(1, conf.length); + assertEquals(1, conf[0].getProperties(true).size()); + } public void testLogNoLogService() { @@ -214,6 +291,7 @@ public class ConfigurationManagerTest ex SynchronousConfigurationListener syncListener1 = new SynchronousConfigurationListener() { + @Override public void configurationEvent(ConfigurationEvent event) { result.add("L1"); @@ -221,6 +299,7 @@ public class ConfigurationManagerTest ex }; SynchronousConfigurationListener syncListener2 = new SynchronousConfigurationListener() { + @Override public void configurationEvent(ConfigurationEvent event) { result.add("L2"); @@ -228,6 +307,7 @@ public class ConfigurationManagerTest ex }; SynchronousConfigurationListener syncListener3 = new SynchronousConfigurationListener() { + @Override public void configurationEvent(ConfigurationEvent event) { result.add("L3"); @@ -272,7 +352,7 @@ public class ConfigurationManagerTest ex utField.setAccessible( true ); utField.set( configMgr, new UpdateThread( configMgr, null, "Test updater" )); - Dictionary props = new Hashtable(); + Dictionary props = new Hashtable(); props.put( Constants.SERVICE_PID, "org.acme.testpid" ); ConfigurationImpl config = new ConfigurationImpl( configMgr, new MockPersistenceManager(), props ); configMgr.updated( config, true ); Modified: felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java?rev=1766046&r1=1766045&r2=1766046&view=diff ============================================================================== --- felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java (original) +++ felix/trunk/configadmin-1.8.x/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java Fri Oct 21 15:18:20 2016 @@ -222,36 +222,42 @@ public class RankingComparatorTest exten } + @Override public Object getProperty( String key ) { return props.get( key ); } + @Override public String[] getPropertyKeys() { return props.keySet().toArray( new String[props.size()] ); } + @Override public Bundle getBundle() { return null; } + @Override public Bundle[] getUsingBundles() { return null; } + @Override public boolean isAssignableTo( Bundle bundle, String className ) { return false; } + @Override public int compareTo( Object reference ) { return 0;