You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2013/04/02 14:11:26 UTC

svn commit: r1463496 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/ main/java/org/apache/camel/impl/ main/java/org/apache/camel/util/ test/java/org/apache/camel/issues/

Author: davsclaus
Date: Tue Apr  2 12:11:26 2013
New Revision: 1463496

URL: http://svn.apache.org/r1463496
Log:
CAMEL-6230: When a component isUseRaw enabled, then the parameter values should also be raw values.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/issues/ComponentUseRawUriTest.java
      - copied, changed from r1463391, camel/trunk/camel-core/src/test/java/org/apache/camel/issues/Camel4857UriIssueTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/Component.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/URISupport.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/Component.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/Component.java?rev=1463496&r1=1463495&r2=1463496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/Component.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/Component.java Tue Apr  2 12:11:26 2013
@@ -41,6 +41,8 @@ public interface Component extends Camel
 
     /**
      * Whether to use raw or encoded uri, when creating endpoints.
+     * <p/>
+     * <b>Notice:</b> When using raw uris, then the parameter values is raw as well.
      *
      * @return <tt>true</tt> to use raw uris, <tt>false</tt> to use encoded uris (default).
      *

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java?rev=1463496&r1=1463495&r2=1463496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java Tue Apr  2 12:11:26 2013
@@ -82,7 +82,24 @@ public abstract class DefaultComponent e
             path = path.substring(0, idx);
         }
 
-        Map<String, Object> parameters = URISupport.parseParameters(u);
+        Map<String, Object> parameters;
+        if (useRawUri()) {
+            // when using raw uri then the query is taking from the uri as is
+            String query;
+            idx = uri.indexOf('?');
+            if (idx > -1) {
+                query = uri.substring(idx + 1);
+            } else {
+                query = u.getRawQuery();
+            }
+            // and use method parseQuery
+            parameters = URISupport.parseQuery(query, true);
+        } else {
+            // however when using the encoded (default mode) uri then the query,
+            // is taken from the URI (ensures values is URI encoded)
+            // and use method parseParameters
+            parameters = URISupport.parseParameters(u);
+        }
         // parameters using raw syntax: RAW(value)
         // should have the token removed, so its only the value we have in parameters, as we are about to create
         // an endpoint and want to have the parameter values without the RAW tokens

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/URISupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/URISupport.java?rev=1463496&r1=1463495&r2=1463496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/URISupport.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/URISupport.java Tue Apr  2 12:11:26 2013
@@ -105,6 +105,24 @@ public final class URISupport {
      * @see #RAW_TOKEN_END
      */
     public static Map<String, Object> parseQuery(String uri) throws URISyntaxException {
+        return parseQuery(uri, false);
+    }
+
+    /**
+     * Parses the query part of the uri (eg the parameters).
+     * <p/>
+     * The URI parameters will by default be URI encoded. However you can define a parameter
+     * values with the syntax: <tt>key=RAW(value)</tt> which tells Camel to not encode the value,
+     * and use the value as is (eg key=value) and the value has <b>not</b> been encoded.
+     *
+     * @param uri the uri
+     * @param useRaw whether to force using raw values
+     * @return the parameters, or an empty map if no parameters (eg never null)
+     * @throws URISyntaxException is thrown if uri has invalid syntax.
+     * @see #RAW_TOKEN_START
+     * @see #RAW_TOKEN_END
+     */
+    public static Map<String, Object> parseQuery(String uri, boolean useRaw) throws URISyntaxException {
         // must check for trailing & as the uri.split("&") will ignore those
         if (uri != null && uri.endsWith("&")) {
             throw new URISyntaxException(uri, "Invalid uri syntax: Trailing & marker found. "
@@ -157,7 +175,7 @@ public final class URISupport {
                     boolean end = ch == RAW_TOKEN_END.charAt(0) && (next == '&' || next == '\u0000');
                     if (end) {
                         // raw value end, so add that as a parameter, and reset flags
-                        addParameter(key.toString(), value.toString(), rc, isRaw);
+                        addParameter(key.toString(), value.toString(), rc, useRaw || isRaw);
                         key.setLength(0);
                         value.setLength(0);
                         isKey = true;
@@ -180,7 +198,7 @@ public final class URISupport {
                 // the & denote parameter is ended
                 if (ch == '&') {
                     // parameter is ended, as we hit & separator
-                    addParameter(key.toString(), value.toString(), rc, isRaw);
+                    addParameter(key.toString(), value.toString(), rc, useRaw || isRaw);
                     key.setLength(0);
                     value.setLength(0);
                     isKey = true;
@@ -199,7 +217,7 @@ public final class URISupport {
 
             // any left over parameters, then add that
             if (key.length() > 0) {
-                addParameter(key.toString(), value.toString(), rc, isRaw);
+                addParameter(key.toString(), value.toString(), rc, useRaw || isRaw);
             }
 
             return rc;
@@ -324,7 +342,7 @@ public final class URISupport {
      * @return the value without the prefix
      */
     public static String stripPrefix(String value, String prefix) {
-        if (value.startsWith(prefix)) {
+        if (value != null && value.startsWith(prefix)) {
             return value.substring(prefix.length());
         }
         return value;

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/issues/ComponentUseRawUriTest.java (from r1463391, camel/trunk/camel-core/src/test/java/org/apache/camel/issues/Camel4857UriIssueTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/issues/ComponentUseRawUriTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/issues/ComponentUseRawUriTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/issues/Camel4857UriIssueTest.java&r1=1463391&r2=1463496&rev=1463496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/issues/Camel4857UriIssueTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/issues/ComponentUseRawUriTest.java Tue Apr  2 12:11:26 2013
@@ -27,19 +27,15 @@ import org.apache.camel.impl.DefaultComp
 import org.apache.camel.impl.DefaultEndpoint;
 
 /**
- * CAMEL-4857 issue test
+ *
  */
-public class Camel4857UriIssueTest extends ContextTestSupport {
+public class ComponentUseRawUriTest extends ContextTestSupport {
 
-    /**
-     * An URI of Camel Beanstalk component consists of a hostname, port and a list
-     * of tube names. Tube names are separated by "+" character (which is more or less
-     * usually used on the Web to make lists), but every tube name may contain URI special
-     * characters like ? or +
-     */
-    class MyEndpoint extends DefaultEndpoint {
+    public static class MyEndpoint extends DefaultEndpoint {
         String uri;
         String remaining;
+        String foo;
+        String bar;
 
         public MyEndpoint(final String uri, final String remaining) {
             this.uri = uri;
@@ -54,6 +50,22 @@ public class Camel4857UriIssueTest exten
             throw new UnsupportedOperationException("Not supported yet.");
         }
 
+        public String getFoo() {
+            return foo;
+        }
+
+        public void setFoo(String foo) {
+            this.foo = foo;
+        }
+
+        public String getBar() {
+            return bar;
+        }
+
+        public void setBar(String bar) {
+            this.bar = bar;
+        }
+
         public boolean isSingleton() {
             return true;
         }
@@ -67,7 +79,9 @@ public class Camel4857UriIssueTest exten
 
         @Override
         protected Endpoint createEndpoint(final String uri, final String remaining, final Map<String, Object> parameters) throws Exception {
-            return new MyEndpoint(uri, remaining);
+            MyEndpoint answer = new MyEndpoint(uri, remaining);
+            setProperties(answer, parameters);
+            return answer;
         }
 
         @Override
@@ -83,18 +97,14 @@ public class Camel4857UriIssueTest exten
         context.addComponent("my", new MyComponent());
     }
 
-    public void testExclamationInUri() {
-        // %3F is not an ?, it's part of tube name.
-        MyEndpoint endpoint = context.getEndpoint("my:host:11303/tube1+tube%2B+tube%3F", MyEndpoint.class);
+    public void testUseRaw() {
+        String uri = "my:host:11303/tube1+tube?foo=%2B+tube%3F&bar=++%%w?rd";
+        MyEndpoint endpoint = context.getEndpoint(uri, MyEndpoint.class);
         assertNotNull("endpoint", endpoint);
-        assertEquals("my:host:11303/tube1+tube%2B+tube%3F", endpoint.getUri());
-    }
 
-    public void testPath() {
-         // Here a tube name is "tube+" and written in URI as "tube%2B", but it gets
-         // normalized, so that an endpoint sees "tube1+tube+"
-        MyEndpoint endpoint = context.getEndpoint("my:host:11303/tube1+tube%2B", MyEndpoint.class);
-        assertEquals("Path contains several tube names, every tube name may have + or ? characters", "host:11303/tube1+tube%2B", endpoint.remaining);
+        assertEquals("%2B+tube%3F", endpoint.getFoo());
+        assertEquals("++%%w?rd", endpoint.getBar());
+        assertEquals(uri, endpoint.getUri());
     }
 
 }