Author: hiranya
Date: Fri Aug 13 23:00:19 2010
New Revision: 985396

URL: http://svn.apache.org/viewvc?rev=985396&view=rev
Log:
experimental url rewrite mediator


Added:
    synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/
    synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/
    synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/
    
synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/
    
synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/RewriteRule.java
    
synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/URLRewriteMediator.java
    synapse/trunk/scratch/hiranya/urlrewrite/src/test/
    synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/
    synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/org/
    synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/org/apache/
    synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/org/apache/synapse/
    
synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/org/apache/synapse/mediators/
    
synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/org/apache/synapse/mediators/URLRewriteTest.java

Added: 
synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/RewriteRule.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/RewriteRule.java?rev=985396&view=auto
==============================================================================
--- 
synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/RewriteRule.java
 (added)
+++ 
synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/RewriteRule.java
 Fri Aug 13 23:00:19 2010
@@ -0,0 +1,111 @@
+/*
+ *  Copyright (c) 2005-2008, WSO2 Inc. (http://www.wso2.org) All Rights 
Reserved.
+ *
+ *  WSO2 Inc. 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.
+ *
+ */
+
+package org.apache.synapse.mediators;
+
+import org.apache.synapse.commons.evaluators.Evaluator;
+import org.apache.synapse.commons.evaluators.EvaluatorContext;
+import org.apache.synapse.commons.evaluators.EvaluatorException;
+import org.apache.synapse.util.xpath.SynapseXPath;
+import org.apache.synapse.MessageContext;
+
+import java.util.Map;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class RewriteRule {
+
+    private Evaluator condition;
+
+    private String value;
+    private SynapseXPath xpath;
+
+    private int fragmentIndex = URLRewriteMediator.FULL_URI;
+
+    public void rewrite(Object[] fragments, MessageContext messageContext, 
String uriString,
+                        Map<String,String> headers) {
+
+        EvaluatorContext ctx = new EvaluatorContext(uriString, headers);
+        try {
+            if (condition != null && !condition.evaluate(ctx)) {
+                return;
+            }
+        } catch (EvaluatorException e) {
+            e.printStackTrace();
+            return;
+        }
+
+        String result;
+        if (xpath != null) {
+            result = xpath.stringValueOf(messageContext);
+        } else {
+            result = value;
+        }
+
+        if (fragmentIndex == URLRewriteMediator.FULL_URI) {
+            try {
+                URI uri = new URI(result);
+                fragments[0] = uri.getScheme();
+                fragments[1] = uri.getUserInfo();
+                fragments[2] = uri.getHost();
+                fragments[3] = uri.getPort();
+                fragments[4] = uri.getPath();
+                fragments[5] = uri.getQuery();
+                fragments[6] = uri.getFragment();
+
+            } catch (URISyntaxException e) {
+                return;
+            }
+        } else {
+            fragments[fragmentIndex] = result;
+        }
+    }
+
+    public Evaluator getCondition() {
+        return condition;
+    }
+
+    public void setCondition(Evaluator condition) {
+        this.condition = condition;
+    }
+
+    public int getFragmentIndex() {
+        return fragmentIndex;
+    }
+
+    public void setFragmentIndex(int fragmentIndex) {
+        this.fragmentIndex = fragmentIndex;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public SynapseXPath getXpath() {
+        return xpath;
+    }
+
+    public void setXpath(SynapseXPath xpath) {
+        this.xpath = xpath;
+    }
+}

Added: 
synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/URLRewriteMediator.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/URLRewriteMediator.java?rev=985396&view=auto
==============================================================================
--- 
synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/URLRewriteMediator.java
 (added)
+++ 
synapse/trunk/scratch/hiranya/urlrewrite/src/main/java/org/apache/synapse/mediators/URLRewriteMediator.java
 Fri Aug 13 23:00:19 2010
@@ -0,0 +1,123 @@
+/*
+ *  Copyright (c) 2005-2008, WSO2 Inc. (http://www.wso2.org) All Rights 
Reserved.
+ *
+ *  WSO2 Inc. 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.
+ *
+ */
+
+package org.apache.synapse.mediators;
+
+import org.apache.synapse.MessageContext;
+import org.apache.synapse.core.axis2.Axis2MessageContext;
+import org.apache.axis2.addressing.EndpointReference;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+
+public class URLRewriteMediator extends AbstractMediator {
+
+    public static final int FULL_URI    = -1;
+    public static final int PROTOCOL    = 0;
+    public static final int USER_INFO   = 1;
+    public static final int HOST        = 2;
+    public static final int PORT        = 3;
+    public static final int PATH        = 4;
+    public static final int QUERY       = 5;
+    public static final int REF         = 6;
+
+    private List<RewriteRule> rules = new ArrayList<RewriteRule>();
+
+    public boolean mediate(MessageContext messageContext) {
+        Object[] fragments = newFragmentSet();
+        URI uri;
+
+        if (messageContext.getTo() != null) {
+            try {
+                uri = new URI(messageContext.getTo().getAddress());
+                fragments[0] = uri.getScheme();
+                fragments[1] = uri.getUserInfo();
+                fragments[2] = uri.getHost();
+                fragments[3] = uri.getPort();
+                fragments[4] = uri.getPath();
+                fragments[5] = uri.getQuery();
+                fragments[6] = uri.getFragment();
+
+            } catch (URISyntaxException e) {
+                handleException("Malformed URI in the To header", e, 
messageContext);
+                return false;
+            }
+        } else {
+            uri = getURI(fragments, messageContext);
+        }
+
+        Map<String, String> headers = getHeaders(messageContext);
+        for (RewriteRule r : rules) {
+            r.rewrite(fragments, messageContext, uri.toString(), headers);
+            uri = getURI(fragments, messageContext);
+        }
+
+        messageContext.setTo(new EndpointReference(uri.toString()));
+        return true;
+    }
+
+    private Object[] newFragmentSet() {
+        return new Object[] {
+            null, null, null, -1, null, null, null
+        };
+    }
+
+    private Map<String, String> getHeaders(MessageContext synCtx) {
+        Axis2MessageContext axis2smc = (Axis2MessageContext) synCtx;
+        org.apache.axis2.context.MessageContext axis2MessageCtx =
+                axis2smc.getAxis2MessageContext();
+        Object headers = axis2MessageCtx.getProperty(
+                org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
+        Map<String, String> evaluatorHeaders = new HashMap<String, String>();
+
+        if (headers != null && headers instanceof Map) {
+            Map headersMap = (Map) headers;
+            for (Object key : headersMap.keySet()) {
+                if (key instanceof String && headersMap.get(key) instanceof 
String) {
+                    evaluatorHeaders.put((String) key, (String) 
headersMap.get(key));
+                }
+            }
+        }
+        return evaluatorHeaders;
+    }
+
+    private URI getURI(Object[] fragments, MessageContext messageContext) {
+        try {
+            return new URI(
+                    (String) fragments[0],
+                    (String) fragments[1],
+                    (String) fragments[2],
+                    (Integer) fragments[3],
+                    (String) fragments[4],
+                    (String) fragments[5],
+                    (String) fragments[6]);
+        } catch (URISyntaxException e) {
+            handleException("Error while constructing the URI from fragments", 
e, messageContext);
+        }
+        return null;
+    }
+
+    public void addRule(RewriteRule rule) {
+        rules.add(rule);
+    }
+}

Added: 
synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/org/apache/synapse/mediators/URLRewriteTest.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/org/apache/synapse/mediators/URLRewriteTest.java?rev=985396&view=auto
==============================================================================
--- 
synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/org/apache/synapse/mediators/URLRewriteTest.java
 (added)
+++ 
synapse/trunk/scratch/hiranya/urlrewrite/src/test/java/org/apache/synapse/mediators/URLRewriteTest.java
 Fri Aug 13 23:00:19 2010
@@ -0,0 +1,89 @@
+/*
+ *  Copyright (c) 2005-2008, WSO2 Inc. (http://www.wso2.org) All Rights 
Reserved.
+ *
+ *  WSO2 Inc. 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.
+ *
+ */
+
+package org.apache.synapse.mediators;
+
+import junit.framework.TestCase;
+import org.apache.synapse.MessageContext;
+import org.apache.synapse.commons.evaluators.EqualEvaluator;
+import org.apache.synapse.config.SynapseConfiguration;
+import org.apache.synapse.core.axis2.Axis2MessageContext;
+import org.apache.synapse.core.axis2.Axis2SynapseEnvironment;
+import org.apache.synapse.core.SynapseEnvironment;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMDocument;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class URLRewriteTest extends TestCase {
+
+    public void testURIBuilder() {
+        try {
+            URI uri = new URI("http", null, "localhost", 8080, "/foo", 
"test=132&foo=bar", "id");
+            System.out.println(uri);
+        } catch (URISyntaxException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    public void testURIParser() {
+        String uriTxt = "/services/MyService";
+        try {
+            URI uri = new URI(uriTxt);
+            printURLFragmetns(uri);
+        } catch (URISyntaxException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    public void testMediate() {
+        org.apache.axis2.context.MessageContext mc =
+                new org.apache.axis2.context.MessageContext();
+        SynapseConfiguration config = new SynapseConfiguration();
+        SynapseEnvironment env = new Axis2SynapseEnvironment(config);
+        MessageContext synMc = new Axis2MessageContext(mc, config, env);
+
+        URLRewriteMediator mediator = new URLRewriteMediator();
+
+        RewriteRule r1 = new RewriteRule();
+        r1.setValue("http://localhost:8080/";);
+        mediator.addRule(r1);
+
+        RewriteRule r2 = new RewriteRule();
+        r2.setValue("/services/TestService");
+        r2.setFragmentIndex(URLRewriteMediator.PATH);
+        mediator.addRule(r2);
+
+        mediator.mediate(synMc);
+        System.out.println(synMc.getTo());
+    }
+
+    private void printURLFragmetns(URI uri) {
+        System.out.println("Protocol: " + uri.getScheme());
+        System.out.println("Host: " + uri.getHost());
+        System.out.println("Port: " + uri.getPort());
+        System.out.println("User: " + uri.getUserInfo());
+        System.out.println("Path: " + uri.getPath());
+        System.out.println("Query: " + uri.getQuery());
+        System.out.println("Ref: " + uri.getFragment());
+    }
+}


Reply via email to