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());
+ }
+}