Author: sagara Date: Mon Feb 20 09:13:23 2012 New Revision: 1291158 URL: http://svn.apache.org/viewvc?rev=1291158&view=rev Log: Applied patch for AXIS2-5247.
Added: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/ axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java (with props) axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/Stock.java (with props) axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/StockService.java (with props) Modified: axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL2Constants.java axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/dispatchers/RequestURIBasedServiceDispatcher.java axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/namespace/Constants.java axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/wsdl/WSDLUtil.java Added: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java?rev=1291158&view=auto ============================================================================== --- axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java (added) +++ axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java Mon Feb 20 09:13:23 2012 @@ -0,0 +1,188 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF 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.axis2.rest; + +import junit.framework.Test; +import junit.framework.TestSuite; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.util.AXIOMUtil; +import org.apache.axis2.AxisFault; +import org.apache.axis2.Constants; +import org.apache.axis2.context.ConfigurationContext; +import org.apache.axis2.context.ConfigurationContextFactory; +import org.apache.axis2.description.AxisBinding; +import org.apache.axis2.description.AxisBindingOperation; +import org.apache.axis2.description.AxisEndpoint; +import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.WSDL2Constants; +import org.apache.axis2.engine.AxisConfiguration; +import org.apache.axis2.integration.UtilServer; +import org.apache.axis2.integration.UtilServerBasedTestCase; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.GetMethod; + +import javax.xml.namespace.QName; +import java.util.Comparator; +import java.util.Map; +import java.util.TreeMap; + +public class RESTfulServiceTest extends UtilServerBasedTestCase { + + ConfigurationContext configContext; + ConfigurationContext clinetConfigurationctx; + + public static Test suite() { + return getTestSetup(new TestSuite(RESTfulServiceTest.class)); + } + + protected void setUp() throws Exception { + configContext = UtilServer.getConfigurationContext(); + clinetConfigurationctx = ConfigurationContextFactory. + createConfigurationContextFromFileSystem(null, null); + } + + public void testServiceCreate() throws AxisFault { + AxisConfiguration axisConfig = configContext.getAxisConfiguration(); + AxisService axisService = + AxisService.createService("org.apache.axis2.rest.StockService", axisConfig); + assertNotNull(axisService); + + assertNotNull(axisService.getOperation(new QName("addStock"))); + assertNotNull(axisService.getOperation(new QName("getStockValue"))); + + axisService.setTargetNamespace("http://rest.axis2.apache.org"); + + Map httpLocationTable = new TreeMap(new Comparator() { + public int compare(Object o1, Object o2) { + return (-1 * ((Comparable) o1).compareTo(o2)); + } + }); + // StockServiceHttpBinding for StockService + AxisBinding binding = new AxisBinding(); + binding.setName(new QName("StockServiceHttpBinding")); + binding.setType("http://www.w3.org/ns/wsdl/http"); + binding.setProperty(WSDL2Constants.ATTR_WHTTP_METHOD_DEFAULT, + Constants.Configuration.HTTP_METHOD_GET); + + // AxisBindingOperation for addStock + AxisBindingOperation bindingOperation1 = new AxisBindingOperation(); + bindingOperation1.setAxisOperation(axisService.getOperation(new QName("addStock"))); + bindingOperation1.setName(axisService.getOperation(new QName("addStock")).getName()); + bindingOperation1.setParent(binding); + bindingOperation1.setProperty(WSDL2Constants.ATTR_WHTTP_METHOD, + Constants.Configuration.HTTP_METHOD_GET); + bindingOperation1.setProperty(WSDL2Constants.ATTR_WHTTP_LOCATION, + "add/{name}/value/{value}"); + httpLocationTable.put(Constants.Configuration.HTTP_METHOD_GET + "/add/", + axisService.getOperation(new QName("addStock"))); + bindingOperation1.setProperty(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION, + Constants.MIME_CT_APPLICATION_URL_ENCODED); + bindingOperation1.setProperty(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION, + Constants.MIME_CT_APPLICATION_XML); + binding.addChild(bindingOperation1); + + assertNotNull(binding.getChild(bindingOperation1.getName())); + + // AxisBindingOperation for getStockValue + AxisBindingOperation bindingOperation2 = new AxisBindingOperation(); + bindingOperation2.setAxisOperation(axisService.getOperation(new QName("getStockValue"))); + bindingOperation2.setName(axisService.getOperation(new QName("getStockValue")).getName()); + bindingOperation2.setParent(binding); + bindingOperation2.setProperty(WSDL2Constants.ATTR_WHTTP_METHOD, + Constants.Configuration.HTTP_METHOD_GET); + bindingOperation2.setProperty(WSDL2Constants.ATTR_WHTTP_LOCATION, "get/{name}"); + httpLocationTable.put(Constants.Configuration.HTTP_METHOD_GET + "/get/", + axisService.getOperation(new QName("getStockValue"))); + bindingOperation2.setProperty(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION, + Constants.MIME_CT_APPLICATION_URL_ENCODED); + bindingOperation2.setProperty(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION, + Constants.MIME_CT_APPLICATION_XML); + binding.addChild(bindingOperation2); + + assertNotNull(binding.getChild(bindingOperation2.getName())); + binding.setProperty(WSDL2Constants.HTTP_LOCATION_TABLE, httpLocationTable); + + // adding Http AxisEndpoint, HttpBinding to service + AxisEndpoint axisEndpoint = new AxisEndpoint(); + axisEndpoint.setBinding(binding); + axisEndpoint.setName("StockServiceHttpEndpoint"); + axisService.addEndpoint("StockServiceHttpEndpoint", axisEndpoint); + axisService.setEndpointName("StockServiceHttpEndpoint"); + axisService.setBindingName("StockServiceHttpBinding"); + axisService.setEndpointURL("http://127.0.0.1:" + (UtilServer.TESTING_PORT) + + "/axis2/services/StockService.StockServiceHttpEndpoint/"); + assertNotNull(axisService.getEndpoint("StockServiceHttpEndpoint")); + axisConfig.addService(axisService); + assertEquals("StockService", axisService.getName()); + + } + + public void testRESTMethods() throws AxisFault { + + HttpClient httpClient = new HttpClient(); + + String url1 = "http://127.0.0.1:" + (UtilServer.TESTING_PORT) + + "/axis2/services/StockService/add/IBM/value/34.7"; + + GetMethod method1 = new GetMethod(url1); + + try { + int statusCode = httpClient.executeMethod(method1); + if (statusCode != HttpStatus.SC_OK) { + System.err.println("Method failed: " + method1.getStatusLine()); + } + OMElement response = AXIOMUtil.stringToOM(new String(method1.getResponseBody())); + OMElement returnElem = response.getFirstChildWithName(new QName("return")); + assertEquals("IBM stock added with value : 34.7", returnElem.getText()); + + } catch (Exception e) { + System.err.println("Error occurred while trying to invoke method: " + e.getMessage()); + e.printStackTrace(); + fail("Caught exception " + e.toString()); + } finally { + method1.releaseConnection(); + } + + + String url2 = "http://127.0.0.1:" + (UtilServer.TESTING_PORT) + + "/axis2/services/StockService/get/IBM"; + GetMethod method2 = new GetMethod(url2); + + try { + int statusCode = httpClient.executeMethod(method2); + + if (statusCode != HttpStatus.SC_OK) { + System.err.println("Method failed: " + method2.getStatusLine()); + } + OMElement response = AXIOMUtil.stringToOM(new String(method2.getResponseBody())); + OMElement returnElem = response.getFirstChildWithName(new QName("return")); + assertEquals("34.7", returnElem.getText()); + + } catch (Exception e) { + System.err.println("Error occurred while trying to invoke method: " + e.getMessage()); + e.printStackTrace(); + fail("Caught exception " + e.toString()); + } finally { + method2.releaseConnection(); + } + + } +} Propchange: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/Stock.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/Stock.java?rev=1291158&view=auto ============================================================================== --- axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/Stock.java (added) +++ axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/Stock.java Mon Feb 20 09:13:23 2012 @@ -0,0 +1,43 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF 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.axis2.rest; + + +public class Stock { + private String name; + private float value; + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return this.name; + } + + public void setValue(float value) { + this.value = value; + } + + public float getValue() { + return this.value; + } + +} Propchange: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/Stock.java ------------------------------------------------------------------------------ svn:eol-style = native Added: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/StockService.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/StockService.java?rev=1291158&view=auto ============================================================================== --- axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/StockService.java (added) +++ axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/StockService.java Mon Feb 20 09:13:23 2012 @@ -0,0 +1,52 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF 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.axis2.rest; + +import java.util.HashMap; +import java.util.Map; + + +public class StockService { + + private static Map<String, Stock> map = new HashMap<String, Stock>(); + + + public float getStockValue(String name) { + float value = 0; + try { + value = map.get(name).getValue(); + } catch (Exception e) { + } + return value; + } + + public String addStock(String name, float value) { + Stock stock = new Stock(); + stock.setName(name); + stock.setValue(value); + map.put(name, stock); + return name+ " stock added with value : "+value; + } + + public void removeStock(String name) { + map.remove(name); + } + +} Propchange: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/rest/StockService.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL2Constants.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL2Constants.java?rev=1291158&r1=1291157&r2=1291158&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL2Constants.java (original) +++ axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL2Constants.java Mon Feb 20 09:13:23 2012 @@ -109,6 +109,7 @@ public interface WSDL2Constants { String ATTR_WHTTP_LOCATION = "whttp:location"; String ATTR_WHTTP_HEADER = "whttp:header"; String ATTR_WHTTP_METHOD = "whttp:method"; + String ATTR_WHTTP_METHOD_DEFAULT = "whttp:methodDefault"; String ATTR_WHTTP_CODE = "whttp:code"; String ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR = "whttp:queryParameterSeparator"; String ATTR_WHTTP_IGNORE_UNCITED = "whttp:ignoreUncited"; Modified: axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/dispatchers/RequestURIBasedServiceDispatcher.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/dispatchers/RequestURIBasedServiceDispatcher.java?rev=1291158&r1=1291157&r2=1291158&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/dispatchers/RequestURIBasedServiceDispatcher.java (original) +++ axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/dispatchers/RequestURIBasedServiceDispatcher.java Mon Feb 20 09:13:23 2012 @@ -24,12 +24,15 @@ import org.apache.axis2.Constants; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.MessageContext; +import org.apache.axis2.description.AxisEndpoint; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.HandlerDescription; +import org.apache.axis2.description.TransportInDescription; import org.apache.axis2.description.WSDL2Constants; import org.apache.axis2.engine.AxisConfiguration; import org.apache.axis2.util.LoggingControl; import org.apache.axis2.util.Utils; +import org.apache.axis2.wsdl.WSDLUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -104,9 +107,17 @@ public class RequestURIBasedServiceDispa messageContext.setProperty(WSDL2Constants.ENDPOINT_LOCAL_NAME, endpoints.get(endpointName)); } - } - } - } + String endpointName = temp[0].substring(temp[0].indexOf(".") + 1); + AxisEndpoint endpoint = (AxisEndpoint) endpoints.get(endpointName); + if (endpoint != null) { + messageContext.setProperty(WSDL2Constants.ENDPOINT_LOCAL_NAME, + endpoint); + } else { + inferEndpoint(messageContext, axisService); + } + } + } + } return axisService; } else { @@ -128,4 +139,29 @@ public class RequestURIBasedServiceDispa public void initDispatcher() { init(new HandlerDescription(NAME)); } + + private void inferEndpoint(MessageContext msgCtx, AxisService service) { + if (!msgCtx.isServerSide()) { + return; + } + String transport = null; + TransportInDescription transportIn = msgCtx.getTransportIn(); + if (transportIn != null) { + transport = transportIn.getName(); + if (transport == null) { + return; + } + } + AxisEndpoint endpoint = null; + Map endpointMapping = service.getEndpoints(); + String serviceName = service.getName(); + + if (msgCtx.isDoingREST()) { + endpoint = (AxisEndpoint) endpointMapping.get(WSDLUtil. + getEndpointName(serviceName, transport)); + } + if (endpoint != null) { + msgCtx.setProperty(WSDL2Constants.ENDPOINT_LOCAL_NAME, endpoint); + } + } } Modified: axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/namespace/Constants.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/namespace/Constants.java?rev=1291158&r1=1291157&r2=1291158&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/namespace/Constants.java (original) +++ axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/namespace/Constants.java Mon Feb 20 09:13:23 2012 @@ -357,6 +357,7 @@ public class Constants { public static final String MIME_CT_IMAGE_GIF = "image/gif"; public static final String MIME_CT_TEXT_XML = "text/xml"; public static final String MIME_CT_APPLICATION_XML = "application/xml"; + public static final String MIME_CT_APPLICATION_URL_ENCODED = "application/x-www-form-urlencoded"; public static final String MIME_CT_MULTIPART_PREFIX = "multipart/"; public static final QName BASE_64_CONTENT_QNAME = Modified: axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/wsdl/WSDLUtil.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/wsdl/WSDLUtil.java?rev=1291158&r1=1291157&r2=1291158&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/wsdl/WSDLUtil.java (original) +++ axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/wsdl/WSDLUtil.java Mon Feb 20 09:13:23 2012 @@ -90,4 +90,22 @@ public class WSDLUtil { return httpMethod + httpLocation; } + /** + * This method will return the EndPointName for a service with give transport protocol + * ex : StudentServiceHttpEndpoint + * + * @param serviceName + * @param protocol transport protocol + * @return + */ + public static String getEndpointName(String serviceName, String protocol) { + + StringBuilder buffer = new StringBuilder(); + buffer.append(serviceName); + buffer.append(protocol.substring(0, 1).toUpperCase()); + buffer.append(protocol.substring(1, protocol.length()).toLowerCase()); + buffer.append("Endpoint"); + return buffer.toString(); + } + }