You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/07/30 16:07:38 UTC

svn commit: r1693428 - in /felix/trunk/configadmin/src: main/java/org/apache/felix/cm/file/FilePersistenceManager.java main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java test/java/org/apache/felix/cm/file/FilePersistenceManagerTest.java

Author: cziegeler
Date: Thu Jul 30 14:07:38 2015
New Revision: 1693428

URL: http://svn.apache.org/r1693428
Log:
FELIX-4945 : Escaped folder names makes ConfigAdmin incompatible and factory configs not always work. Apply patch from Balazs Zsoldos

Modified:
    felix/trunk/configadmin/src/main/java/org/apache/felix/cm/file/FilePersistenceManager.java
    felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java
    felix/trunk/configadmin/src/test/java/org/apache/felix/cm/file/FilePersistenceManagerTest.java

Modified: felix/trunk/configadmin/src/main/java/org/apache/felix/cm/file/FilePersistenceManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin/src/main/java/org/apache/felix/cm/file/FilePersistenceManager.java?rev=1693428&r1=1693427&r2=1693428&view=diff
==============================================================================
--- felix/trunk/configadmin/src/main/java/org/apache/felix/cm/file/FilePersistenceManager.java (original)
+++ felix/trunk/configadmin/src/main/java/org/apache/felix/cm/file/FilePersistenceManager.java Thu Jul 30 14:07:38 2015
@@ -144,16 +144,6 @@ public class FilePersistenceManager impl
      */
     private final boolean isWin;
 
-    /**
-     * A set of three character names (prefixes) considered reserved
-     * on Windows platform systems. This set consists of names such as
-     * LPT, CON, COM, etc., which cause weird behaviour on Windows systems
-     * if used as prefixes on path segments. See .
-     *
-     * @see <a href="https://issues.apache.org/jira/browse/FELIX-4302">FELIX-4302</a>
-     */
-    private final Set winDevNames;
-
     // sets up this class defining the set of valid characters in path
     // set getFile(String) for details.
     static
@@ -187,21 +177,37 @@ public class FilePersistenceManager impl
         // "Windows" hence we assume a Windows platform in thus case.
         final String osName = System.getProperty( "os.name" );
         isWin = osName != null && osName.startsWith( "Windows" );
-        if ( isWin )
-        {
-            winDevNames = new HashSet();
-            winDevNames.add( "CON" ); // keyboard and display
-            winDevNames.add( "PRN" ); // system list; generally par. port
-            winDevNames.add( "AUX" ); // auxiliary; generally ser. port
-            winDevNames.add( "CLO" ); // CLOCK$; system real time clock
-            winDevNames.add( "NUL" ); // Bit-bucket
-            winDevNames.add( "COM" ); // COM1..COMn; serial ports
-            winDevNames.add( "LPT" ); // LPT1..LPTn; parallel ports
+    }
+    
+    private static boolean equalsNameWithPrefixPlusOneDigit( String name, String prefix) {
+        if ( name.length() != prefix.length() + 1 ) {
+            return false;
         }
-        else
-        {
-            winDevNames = null;
+        if ( !name.startsWith(prefix) ) {
+            return false;
+        }
+        char charAfterPrefix = name.charAt( prefix.length() );
+        return charAfterPrefix > '0' && charAfterPrefix < '9';
+    }
+
+    private static boolean isWinReservedName(String name) {
+        String upperCaseName = name.toUpperCase();
+        if ( "CON".equals( upperCaseName ) ) {
+            return true;
+        } else if ( "PRN".equals( upperCaseName ) ){
+            return true;
+        } else if ( "AUX".equals( upperCaseName ) ){
+            return true;
+        } else if ( "CLOCK$".equals( upperCaseName ) ){
+            return true;
+        } else if ( "NUL".equals( upperCaseName ) ){
+            return true;
+        } else if ( equalsNameWithPrefixPlusOneDigit( upperCaseName, "COM") ) {
+            return true;
+        } else if ( equalsNameWithPrefixPlusOneDigit( upperCaseName, "LPT") ){
+            return true;
         }
+        return false;
     }
 
 
@@ -403,7 +409,7 @@ public class FilePersistenceManager impl
             while ( segments.hasMoreTokens() )
             {
                 final String segment = segments.nextToken();
-                if ( segment.length() >= 3 && winDevNames.contains( segment.substring( 0, 3 ).toUpperCase() ) )
+                if ( isWinReservedName(segment) )
                 {
                     appendEncoded( pidBuffer, segment.charAt( 0 ) );
                     pidBuffer.append( segment.substring( 1 ) );

Modified: felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java?rev=1693428&r1=1693427&r2=1693428&view=diff
==============================================================================
--- felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java (original)
+++ felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java Thu Jul 30 14:07:38 2015
@@ -20,6 +20,7 @@ package org.apache.felix.cm.impl;
 
 
 import java.io.IOException;
+
 import org.osgi.framework.Bundle;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.cm.Configuration;
@@ -38,10 +39,10 @@ public class ConfigurationAdminImpl impl
 {
 
     // The configuration manager to which most of the tasks are delegated
-    private ConfigurationManager configurationManager;
+    private volatile ConfigurationManager configurationManager;
 
     // The bundle for which this instance has been created
-    private Bundle bundle;
+    private volatile Bundle bundle;
 
 
     ConfigurationAdminImpl( ConfigurationManager configurationManager, Bundle bundle )

Modified: felix/trunk/configadmin/src/test/java/org/apache/felix/cm/file/FilePersistenceManagerTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin/src/test/java/org/apache/felix/cm/file/FilePersistenceManagerTest.java?rev=1693428&r1=1693427&r2=1693428&view=diff
==============================================================================
--- felix/trunk/configadmin/src/test/java/org/apache/felix/cm/file/FilePersistenceManagerTest.java (original)
+++ felix/trunk/configadmin/src/test/java/org/apache/felix/cm/file/FilePersistenceManagerTest.java Thu Jul 30 14:07:38 2015
@@ -102,7 +102,7 @@ public class FilePersistenceManagerTest
             assertEquals("%0043ON", winFpm.encodePid( "CON" ));
             assertEquals("%0050RN", winFpm.encodePid( "PRN" ));
             assertEquals("%0041UX", winFpm.encodePid( "AUX" ));
-            assertEquals("%0043LOCK%0024", winFpm.encodePid( "CLOCK$" ));
+            assertEquals("CLOCK%0024", winFpm.encodePid( "CLOCK$" ));
             assertEquals("%004eUL", winFpm.encodePid( "NUL" ));
             assertEquals("%0043OM6", winFpm.encodePid( "COM6" ));
         } finally {