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/02/21 13:03:40 UTC

svn commit: r1661330 - in /felix/trunk/http/base/src: main/java/org/apache/felix/http/base/internal/runtime/ main/java/org/apache/felix/http/base/internal/runtime/dto/ main/java/org/apache/felix/http/base/internal/util/ main/java/org/apache/felix/http/...

Author: cziegeler
Date: Sat Feb 21 12:03:40 2015
New Revision: 1661330

URL: http://svn.apache.org/r1661330
Log:
FELIX-4060 : Fix servlet context DTOs and check servlet context helper name according to spec

Modified:
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/AbstractInfo.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilder.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/util/PatternUtil.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
    felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/util/PatternUtilTest.java

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/AbstractInfo.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/AbstractInfo.java?rev=1661330&r1=1661329&r2=1661330&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/AbstractInfo.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/AbstractInfo.java Sat Feb 21 12:03:40 2015
@@ -119,7 +119,7 @@ public abstract class AbstractInfo<T> im
     protected String getStringProperty(final ServiceReference<T> ref, final String key)
     {
         final Object value = ref.getProperty(key);
-        return (value instanceof String) ? (String) value : null;
+        return (value instanceof String) ? ((String) value).trim(): null;
     }
 
     protected String[] getStringArrayProperty(ServiceReference<T> ref, String key)
@@ -128,11 +128,18 @@ public abstract class AbstractInfo<T> im
 
         if (value instanceof String)
         {
-            return new String[] { (String) value };
+            return new String[] { ((String) value).trim() };
         }
         else if (value instanceof String[])
         {
-            return (String[]) value;
+            final String[] arr = (String[]) value;
+            for(int i=0; i<arr.length; i++)
+            {
+                if ( arr[i] != null )
+                {
+                    arr[i] = arr[i].trim();
+                }
+            }
         }
         else if (value instanceof Collection<?>)
         {
@@ -142,7 +149,7 @@ public abstract class AbstractInfo<T> im
             int i = 0;
             for (Object current : collectionValues)
             {
-                values[i++] = current != null ? String.valueOf(current) : null;
+                values[i++] = current != null ? String.valueOf(current).trim() : null;
             }
 
             return values;

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java?rev=1661330&r1=1661329&r2=1661330&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java Sat Feb 21 12:03:40 2015
@@ -20,6 +20,7 @@ package org.apache.felix.http.base.inter
 
 import java.util.Map;
 
+import org.apache.felix.http.base.internal.util.PatternUtil;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.http.context.ServletContextHelper;
 import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
@@ -68,7 +69,7 @@ public final class ServletContextHelperI
     {
         if ( !this.isEmpty(path) )
         {
-        	if ( path.equals("/") ) 
+        	if ( path.equals("/") )
         	{
         		return true;
         	}
@@ -84,8 +85,9 @@ public final class ServletContextHelperI
     @Override
     public boolean isValid()
     {
-        // TODO - check if name has valid value
-        return super.isValid() && !this.isEmpty(this.name) && isValidPath();
+        return super.isValid()
+                && PatternUtil.isValidSymbolicName(this.name)
+                && isValidPath();
     }
 
     public String getName()

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilder.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilder.java?rev=1661330&r1=1661329&r2=1661330&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilder.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilder.java Sat Feb 21 12:03:40 2015
@@ -33,6 +33,12 @@ import org.apache.felix.http.base.intern
 import org.apache.felix.http.base.internal.whiteboard.ContextHandler;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.http.runtime.dto.ErrorPageDTO;
+import org.osgi.service.http.runtime.dto.FailedErrorPageDTO;
+import org.osgi.service.http.runtime.dto.FailedFilterDTO;
+import org.osgi.service.http.runtime.dto.FailedListenerDTO;
+import org.osgi.service.http.runtime.dto.FailedResourceDTO;
+import org.osgi.service.http.runtime.dto.FailedServletContextDTO;
+import org.osgi.service.http.runtime.dto.FailedServletDTO;
 import org.osgi.service.http.runtime.dto.FilterDTO;
 import org.osgi.service.http.runtime.dto.ListenerDTO;
 import org.osgi.service.http.runtime.dto.ResourceDTO;
@@ -64,12 +70,12 @@ public final class RuntimeDTOBuilder
         RuntimeDTO runtimeDTO = new RuntimeDTO();
         runtimeDTO.attributes = createAttributes();
         //TODO <**
-        runtimeDTO.failedErrorPageDTOs = null;
-        runtimeDTO.failedFilterDTOs = null;
-        runtimeDTO.failedListenerDTOs = null;
-        runtimeDTO.failedResourceDTOs = null;
-        runtimeDTO.failedServletContextDTOs = null;
-        runtimeDTO.failedServletDTOs = null;
+        runtimeDTO.failedErrorPageDTOs = new FailedErrorPageDTO[0];
+        runtimeDTO.failedFilterDTOs = new FailedFilterDTO[0];
+        runtimeDTO.failedListenerDTOs = new FailedListenerDTO[0];
+        runtimeDTO.failedResourceDTOs = new FailedResourceDTO[0];
+        runtimeDTO.failedServletContextDTOs = new FailedServletContextDTO[0];
+        runtimeDTO.failedServletDTOs = new FailedServletDTO[0];
         //**>
         runtimeDTO.servletContextDTOs = createContextDTOs();
         return runtimeDTO;

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/util/PatternUtil.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/util/PatternUtil.java?rev=1661330&r1=1661329&r2=1661330&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/util/PatternUtil.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/util/PatternUtil.java Sat Feb 21 12:03:40 2015
@@ -18,9 +18,11 @@
  */
 package org.apache.felix.http.base.internal.util;
 
+import java.util.StringTokenizer;
+
 /**
  * Some convenience utilities to deal with path patterns.
- * 
+ *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class PatternUtil
@@ -32,11 +34,81 @@ public class PatternUtil
         // see Servlet 3.0, section 12.2
         // - replace '*.' prefixes with a regex that matches extensions...
         result = result.replaceFirst("^\\Q*.\\E(.*)$", "\\^(.*)(\\\\.\\\\Q$1\\\\E)\\$");
-        // - replace '/*' suffixes with a regex that matches paths (actually, 
-        //   the path should also start with a leading slash, but we're a bit 
+        // - replace '/*' suffixes with a regex that matches paths (actually,
+        //   the path should also start with a leading slash, but we're a bit
         //   more liberal on this one)...
         result = result.replaceFirst("^(.*)\\Q/*\\E$", "\\^($1)(|/.*)\\$");
         return result;
     }
 
+    // check for valid symbolic name
+    public static boolean isValidSymbolicName(final String name)
+    {
+        if ( name == null || name.isEmpty() )
+        {
+            return false;
+        }
+        boolean valid = true;
+        boolean expectToken = false;
+        boolean done = false;
+        final StringTokenizer st = new StringTokenizer(name, ".", true);
+        while ( !done && st.hasMoreTokens() )
+        {
+            final String token = st.nextToken();
+            if ( expectToken )
+            {
+                if ( !".".equals(token) )
+                {
+                    valid = false;
+                    done = true;
+                }
+                else
+                {
+                    expectToken = false;
+                }
+            }
+            else
+            {
+                if ( ".".equals(token) )
+                {
+                    valid = false;
+                    done = true;
+                }
+                else
+                {
+                    int i = 0;
+                    while ( i < token.length() && valid )
+                    {
+                        final char c = token.charAt(i);
+                        i++;
+                        if ( c >= 'a' && c <= 'z' )
+                        {
+                            continue;
+                        }
+                        if ( c >= 'A' && c <= 'Z' )
+                        {
+                            continue;
+                        }
+                        if ( c >= '0' && c <= '9' )
+                        {
+                            continue;
+                        }
+                        if ( c == '-' || c == '_' )
+                        {
+                            continue;
+                        }
+                        valid = false;
+                        done = true;
+                    }
+                }
+                expectToken = true;
+            }
+        }
+        if ( !expectToken )
+        {
+            valid = false;
+        }
+
+        return valid;
+    }
 }

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java?rev=1661330&r1=1661329&r2=1661330&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java Sat Feb 21 12:03:40 2015
@@ -513,7 +513,10 @@ public final class ServletContextHelperM
         {
             for (List<ContextHandler> contextHandlerList : this.contextMap.values())
             {
-                contextHandlers.addAll(contextHandlerList);
+                if ( !contextHandlerList.isEmpty() )
+                {
+                    contextHandlers.add(contextHandlerList.get(0));
+                }
             }
             handlerRuntimes = registry.getRuntime();
             listenerRuntimes = listenerRegistry.getContextRuntimes();

Modified: felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/util/PatternUtilTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/util/PatternUtilTest.java?rev=1661330&r1=1661329&r2=1661330&view=diff
==============================================================================
--- felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/util/PatternUtilTest.java (original)
+++ felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/util/PatternUtilTest.java Sat Feb 21 12:03:40 2015
@@ -29,7 +29,7 @@ import org.junit.Test;
 
 /**
  * Test cases for {@link PatternUtil}.
- * 
+ *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class PatternUtilTest
@@ -71,4 +71,13 @@ public class PatternUtilTest
         assertFalse(p6.matcher("/index.gz").matches());
     }
 
+    @Test
+    public void testSymbolicName()
+    {
+        assertTrue(PatternUtil.isValidSymbolicName("default"));
+        assertFalse(PatternUtil.isValidSymbolicName("$bad#"));
+        assertTrue(PatternUtil.isValidSymbolicName("abcdefghijklmnopqrstuvwyz"));
+        assertTrue(PatternUtil.isValidSymbolicName("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+        assertTrue(PatternUtil.isValidSymbolicName("0123456789-_"));
+    }
 }