diff --git a/build.gradle b/build.gradle index 183afbe..f890d8d 100644 --- a/build.gradle +++ b/build.gradle @@ -19,9 +19,11 @@ subprojects { } dependencies { - testImplementation "org.junit.jupiter:junit-jupiter-api:${project.property('junit.version')}" - testImplementation "org.junit.jupiter:junit-jupiter-params:${project.property('junit.version')}" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${project.property('junit.version')}" + testCompile "org.junit.jupiter:junit-jupiter-api:${project.property('junit.version')}" + testCompile "org.junit.jupiter:junit-jupiter-params:${project.property('junit.version')}" + testCompile "org.junit.jupiter:junit-jupiter-engine:${project.property('junit.version')}" + testCompile "org.junit.vintage:junit-vintage-engine:${project.property('junit.version')}" + testCompile "junit:junit:${project.property('junit4.version')}" asciidoclet "org.asciidoctor:asciidoclet:${project.property('asciidoclet.version')}" } diff --git a/gradle.properties b/gradle.properties index 8398494..cc9dda8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ group = org.xbib name = netty-http -version = 4.1.36.6 +version = 4.1.36.7 # main packages netty.version = 4.1.36.Final @@ -23,6 +23,7 @@ commons-httpclient.version = 3.1 # test packages junit.version = 5.4.2 +junit4.version = 4.12 conscrypt.version = 2.0.0 jackson.version = 2.8.11.1 asciidoclet.version = 1.5.4 diff --git a/netty-http-server/src/main/java/org/xbib/netty/http/server/ServerResponse.java b/netty-http-server/src/main/java/org/xbib/netty/http/server/ServerResponse.java index 33cca57..8dea0d8 100644 --- a/netty-http-server/src/main/java/org/xbib/netty/http/server/ServerResponse.java +++ b/netty-http-server/src/main/java/org/xbib/netty/http/server/ServerResponse.java @@ -43,10 +43,6 @@ public interface ServerResponse { void write(ChunkedInput chunkedInput); - /** - * Convenience methods. - */ - static void write(ServerResponse serverResponse, int status) { write(serverResponse, HttpResponseStatus.valueOf(status)); } diff --git a/netty-http-xmlrpc-client/build.gradle b/netty-http-xmlrpc-client/build.gradle index b2214fb..2fbcb31 100644 --- a/netty-http-xmlrpc-client/build.gradle +++ b/netty-http-xmlrpc-client/build.gradle @@ -2,6 +2,5 @@ dependencies { compile project(":netty-http-xmlrpc-common") compile "commons-httpclient:commons-httpclient:${project.property(('commons-httpclient.version'))}" testCompile project(":netty-http-xmlrpc-servlet") - testCompileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' - + testCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' } \ No newline at end of file diff --git a/netty-http-xmlrpc-client/src/main/java/org/xbib/netty/http/xmlrpc/client/XmlRpcSunHttpTransport.java b/netty-http-xmlrpc-client/src/main/java/org/xbib/netty/http/xmlrpc/client/XmlRpcSunHttpTransport.java index 3f36c44..3dbbb99 100644 --- a/netty-http-xmlrpc-client/src/main/java/org/xbib/netty/http/xmlrpc/client/XmlRpcSunHttpTransport.java +++ b/netty-http-xmlrpc-client/src/main/java/org/xbib/netty/http/xmlrpc/client/XmlRpcSunHttpTransport.java @@ -17,7 +17,9 @@ import org.xml.sax.SAXException; * {@link HttpURLConnection} class. */ public class XmlRpcSunHttpTransport extends XmlRpcHttpTransport { + private static final String userAgent = USER_AGENT + " (Sun HTTP Transport)"; + private URLConnection conn; /** Creates a new instance. @@ -55,7 +57,7 @@ public class XmlRpcSunHttpTransport extends XmlRpcHttpTransport { getURLConnection().setRequestProperty(pHeader, pValue); } - protected void close() throws XmlRpcClientException { + protected void close() { final URLConnection c = getURLConnection(); if (c instanceof HttpURLConnection) { ((HttpURLConnection) c).disconnect(); @@ -69,7 +71,7 @@ public class XmlRpcSunHttpTransport extends XmlRpcHttpTransport { protected InputStream getInputStream() throws XmlRpcException { try { URLConnection connection = getURLConnection(); - if ( connection instanceof HttpURLConnection ) { + if (connection instanceof HttpURLConnection ) { HttpURLConnection httpConnection = (HttpURLConnection) connection; int responseCode = httpConnection.getResponseCode(); if (responseCode < 200 || responseCode > 299) { diff --git a/netty-http-xmlrpc-client/src/main/java/org/xbib/netty/http/xmlrpc/client/XmlRpcTransportImpl.java b/netty-http-xmlrpc-client/src/main/java/org/xbib/netty/http/xmlrpc/client/XmlRpcTransportImpl.java index 9b012e2..4123d96 100644 --- a/netty-http-xmlrpc-client/src/main/java/org/xbib/netty/http/xmlrpc/client/XmlRpcTransportImpl.java +++ b/netty-http-xmlrpc-client/src/main/java/org/xbib/netty/http/xmlrpc/client/XmlRpcTransportImpl.java @@ -1,25 +1,7 @@ -/* - * 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.xbib.netty.http.xmlrpc.client; - -/** Abstract base implementation of an {@link org.apache.xmlrpc.client.XmlRpcTransport}. +/** + * Abstract base implementation of an {@link XmlRpcTransport}. */ public abstract class XmlRpcTransportImpl implements XmlRpcTransport { private final XmlRpcClient client; diff --git a/netty-http-xmlrpc-client/src/main/resources/org/xbib/netty/http/xmlrpc/client/XmlRpcClient.properties b/netty-http-xmlrpc-client/src/main/resources/org/xbib/netty/http/xmlrpc/client/XmlRpcClient.properties new file mode 100644 index 0000000..5d23b60 --- /dev/null +++ b/netty-http-xmlrpc-client/src/main/resources/org/xbib/netty/http/xmlrpc/client/XmlRpcClient.properties @@ -0,0 +1 @@ +user.agent=Apache XML RPC diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/AuthenticationTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/AuthenticationTest.java index dfd3c4e..c169553 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/AuthenticationTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/AuthenticationTest.java @@ -5,7 +5,6 @@ import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfigImpl; import org.xbib.netty.http.xmlrpc.common.XmlRpcException; import org.xbib.netty.http.xmlrpc.common.XmlRpcHttpRequestConfig; -import org.xbib.netty.http.xmlrpc.common.XmlRpcRequest; import org.xbib.netty.http.xmlrpc.common.XmlRpcRequestConfig; import org.xbib.netty.http.xmlrpc.server.AbstractReflectiveHandlerMapping; import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; @@ -18,7 +17,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; * Test case for supported authentication variants. */ public class AuthenticationTest extends XmlRpcTestCase { + private static final String PASSWORD = "98765432109876543210987654321098765432109876543210"; + private static final String USER_NAME = "01234567890123456789012345678901234567890123456789" + "\u00C4\u00D6\u00DC\u00F6\u00FC\u00E4\u00DF"; @@ -26,9 +27,11 @@ public class AuthenticationTest extends XmlRpcTestCase { * server. */ public interface Adder { - /** Returns the sum of the given integers. + + /** + * Returns the sum of the given integers. */ - public int add(int pNum1, int pNum2); + int add(int pNum1, int pNum2); } /** Implementation of {@link DynamicProxyTest.Adder}, which is used by @@ -42,42 +45,33 @@ public class AuthenticationTest extends XmlRpcTestCase { protected XmlRpcHandlerMapping getHandlerMapping() throws IOException, XmlRpcException { XmlRpcHandlerMapping mapping = getHandlerMapping("AuthenticationTest.properties"); - ((AbstractReflectiveHandlerMapping) mapping).setAuthenticationHandler(new AbstractReflectiveHandlerMapping.AuthenticationHandler(){ - public boolean isAuthorized(XmlRpcRequest pRequest) - throws XmlRpcException { - XmlRpcRequestConfig config = pRequest.getConfig(); - if (config instanceof XmlRpcHttpRequestConfig) { - XmlRpcHttpRequestConfig httpRequestConfig = (XmlRpcHttpRequestConfig) config; - return USER_NAME.equals(httpRequestConfig.getBasicUserName()) - && PASSWORD.equals(httpRequestConfig.getBasicPassword()); - } - return true; + ((AbstractReflectiveHandlerMapping) mapping).setAuthenticationHandler(pRequest -> { + XmlRpcRequestConfig config = pRequest.getConfig(); + if (config instanceof XmlRpcHttpRequestConfig) { + XmlRpcHttpRequestConfig httpRequestConfig = (XmlRpcHttpRequestConfig) config; + return USER_NAME.equals(httpRequestConfig.getBasicUserName()) + && PASSWORD.equals(httpRequestConfig.getBasicPassword()); } + return true; }); return mapping; } - protected XmlRpcClientConfigImpl getConfig(ClientProvider pProvider) - throws Exception { + protected XmlRpcClientConfigImpl getConfig(ClientProvider pProvider) throws Exception { XmlRpcClientConfigImpl config = super.getConfig(pProvider); config.setBasicUserName(USER_NAME); config.setBasicPassword(PASSWORD); return config; } - private ClientFactory getClientFactory(ClientProvider pProvider) throws Exception { - XmlRpcClient client = pProvider.getClient(); - client.setConfig(getConfig(pProvider)); - return new ClientFactory(client); - } - - /** Tests calling the {@link Adder#add(int,int)} method + /** T + * ests calling the {@link Adder#add(int,int)} method * by using an object, which has been created by the * {@link ClientFactory}. */ public void testAdderCall() throws Exception { - for (int i = 0; i < providers.length; i++) { - testAdderCall(providers[i]); + for (ClientProvider provider : providers) { + testAdderCall(provider); } } @@ -86,4 +80,11 @@ public class AuthenticationTest extends XmlRpcTestCase { Adder adder = (Adder) factory.newInstance(Adder.class); assertEquals(6, adder.add(2, 4)); } + + private ClientFactory getClientFactory(ClientProvider pProvider) throws Exception { + XmlRpcClient client = pProvider.getClient(); + client.setConfig(getConfig(pProvider)); + return new ClientFactory(client); + } + } diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/BaseTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/BaseTest.java index 61cce2d..a8a8674 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/BaseTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/BaseTest.java @@ -7,7 +7,6 @@ import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; import java.util.TimeZone; @@ -24,10 +23,6 @@ import org.xbib.netty.http.xmlrpc.common.XmlRpcInvocationException; import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; import org.xml.sax.InputSource; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - - /** * An abstract test case, to be implemented for the various * transport classes. @@ -129,8 +124,8 @@ public class BaseTest extends XmlRpcTestCase { */ public int byteArrayParam(byte[] pArg) { int sum = 0; - for (int i = 0; i < pArg.length; i++) { - sum += pArg[i]; + for (byte b : pArg) { + sum += b; } return sum; } @@ -151,11 +146,11 @@ public class BaseTest extends XmlRpcTestCase { */ public int objectArrayParam(Object[] pArg) { int sum = 0; - for (int i = 0; i < pArg.length; i++) { - if (pArg[i] instanceof Number) { - sum += ((Number) pArg[i]).intValue(); + for (Object o : pArg) { + if (o instanceof Number) { + sum += ((Number) o).intValue(); } else { - sum += Integer.parseInt((String) pArg[i]); + sum += Integer.parseInt((String) o); } } return sum; @@ -168,7 +163,7 @@ public class BaseTest extends XmlRpcTestCase { public Object[] objectArrayResult(int pArg) { Object[] result = new Object[pArg]; for (int i = 0; i < result.length; i++) { - result[i] = new Integer(i); + result[i] = i; } return result; } @@ -177,13 +172,12 @@ public class BaseTest extends XmlRpcTestCase { * @param pArg The map being iterated. * @return Sum of keys, multiplied by their values. */ - public int mapParam(Map pArg) { + public int mapParam(Map pArg) { int sum = 0; - for (Iterator iter = pArg.entrySet().iterator(); iter.hasNext(); ) { - Map.Entry entry = (Map.Entry) iter.next(); - String key = (String) entry.getKey(); - Integer value = (Integer) entry.getValue(); - sum += Integer.parseInt(key) * value.intValue(); + for (Map.Entry entry : pArg.entrySet()) { + String key = entry.getKey(); + Integer value = entry.getValue(); + sum += Integer.parseInt(key) * value; } return sum; } @@ -193,10 +187,10 @@ public class BaseTest extends XmlRpcTestCase { * @return Map with the keys "0".."pArg" and * 0..pArg as values. */ - public Map mapResult(int pArg) { - Map result = new HashMap(); + public Map mapResult(int pArg) { + Map result = new HashMap<>(); for (int i = 0; i < pArg; i++) { - result.put(Integer.toString(i), new Integer(i)); + result.put(Integer.toString(i), i); } return result; } @@ -217,7 +211,7 @@ public class BaseTest extends XmlRpcTestCase { } private int count(Node pNode) { if (INT_TAG.equals(pNode.getLocalName()) && INT_URI.equals(pNode.getNamespaceURI())) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (Node child = pNode.getFirstChild(); child != null; child = child.getNextSibling()) { if (child.getNodeType() == Node.TEXT_NODE || child.getNodeType() == Node.CDATA_SECTION_NODE) { sb.append(child.getNodeValue()); @@ -237,7 +231,7 @@ public class BaseTest extends XmlRpcTestCase { /** Example of a Serializable instance. */ - public static class CalendarWrapper implements Serializable { + static class CalendarWrapper implements Serializable { private static final long serialVersionUID = 8153663910532549627L; final Calendar cal; CalendarWrapper(Calendar pCalendar) { @@ -255,7 +249,7 @@ public class BaseTest extends XmlRpcTestCase { /** Returns midnight of the following day. */ - public Calendar calendarParam(Calendar pCal) { + Calendar calendarParam(Calendar pCal) { Calendar cal = (Calendar) pCal.clone(); cal.add(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.HOUR_OF_DAY, 0); @@ -282,96 +276,88 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testByteParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testByteParam(providers[i]); + for (ClientProvider provider : providers) { + testByteParam(provider); } } private void testByteParam(ClientProvider pProvider) throws Exception { final String methodName = "Remote.byteParam"; - final Object[] params = new Object[]{new Byte((byte) 3)}; + final Object[] params = new Object[]{(byte) 3}; XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Integer(6), result); - boolean ok = false; + assertEquals(6, result); try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, returning a byte. * @throws Exception The test failed. */ public void testByteResult() throws Exception { - for (int i = 0; i < providers.length; i++) { - testByteResult(providers[i]); + for (ClientProvider provider : providers) { + testByteResult(provider); } } private void testByteResult(ClientProvider pProvider) throws Exception { final String methodName = "Remote.byteResult"; - final Object[] params = new Object[]{new Byte((byte) 3)}; + final Object[] params = new Object[]{(byte) 3}; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Byte((byte) 6), result); - boolean ok = false; + assertEquals((byte) 6, result); try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, passing a short value. * @throws Exception The test failed. */ public void testShortParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testShortParam(providers[i]); + for (ClientProvider provider : providers) { + testShortParam(provider); } } private void testShortParam(ClientProvider pProvider) throws Exception { final String methodName = "Remote.shortParam"; - final Object[] params = new Object[]{new Short((short) 4)}; + final Object[] params = new Object[] { (short) 4 }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Integer(8), result); - boolean ok = false; + assertEquals(8, result); try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, returning a short value. * @throws Exception The test failed. */ public void testShortResult() throws Exception { - for (int i = 0; i < providers.length; i++) { - testShortResult(providers[i]); + for (ClientProvider provider : providers) { + testShortResult(provider); } } private void testShortResult(ClientProvider pProvider) throws Exception { final String methodName = "Remote.shortResult"; - final Object[] params = new Object[]{new Short((short) 4)}; + final Object[] params = new Object[] { (short) 4 }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Short((short) 8), result); - boolean ok = false; + assertEquals((short) 8, result); try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, passing an @@ -379,67 +365,63 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testIntParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testIntParam(providers[i]); + for (ClientProvider provider : providers) { + testIntParam(provider); } } private void testIntParam(ClientProvider pProvider) throws Exception { final String methodName = "Remote.intParam"; - final Object[] params = new Object[]{new Integer(5)}; + final Object[] params = new Object[] { 5 }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getConfig(pProvider), methodName, params); - assertEquals(new Integer(10), result); + assertEquals(10, result); result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Integer(10), result); + assertEquals(10, result); } /** Test, whether we can invoke a method, passing a long value. * @throws Exception The test failed. */ public void testLongParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testLongParam(providers[i]); + for (ClientProvider provider : providers) { + testLongParam(provider); } } private void testLongParam(ClientProvider pProvider) throws Exception { final String methodName = "Remote.longParam"; - final Object[] params = new Object[]{new Long(6L)}; + final Object[] params = new Object[] { 6L }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Integer(12), result); - boolean ok = false; + assertEquals(12, result); try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, returning a long value. * @throws Exception The test failed. */ public void testLongResult() throws Exception { - for (int i = 0; i < providers.length; i++) { - testLongResult(providers[i]); + for (ClientProvider provider : providers) { + testLongResult(provider); } } private void testLongResult(ClientProvider pProvider) throws Exception { final String methodName = "Remote.longResult"; - final Object[] params = new Object[]{new Long(6L)}; + final Object[] params = new Object[] { 6L }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Long(12L), result); - boolean ok = false; + assertEquals(12L, result); try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, passing a @@ -447,8 +429,8 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testStringParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testStringParam(providers[i]); + for (ClientProvider provider : providers) { + testStringParam(provider); } } @@ -467,8 +449,8 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testNullableStringParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testNullableStringParam(providers[i]); + for (ClientProvider provider : providers) { + testNullableStringParam(provider); } } @@ -483,13 +465,11 @@ public class BaseTest extends XmlRpcTestCase { final Object[] nullParams = new Object[]{null}; result = client.execute(getExConfig(pProvider), methodName, nullParams); assertEquals("", result); - boolean ok = false; try { client.execute(getConfig(pProvider), methodName, nullParams); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, returning a @@ -497,8 +477,8 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testNullableStringResult() throws Exception { - for (int i = 0; i < providers.length; i++) { - testNullableStringResult(providers[i]); + for (ClientProvider provider : providers) { + testNullableStringResult(provider); } } @@ -512,62 +492,56 @@ public class BaseTest extends XmlRpcTestCase { assertEquals("abcabc", result); final Object[] nullParams = new Object[]{null}; result = client.execute(getExConfig(pProvider), methodName, nullParams); - assertEquals(null, result); - boolean ok = false; + assertNull(result); try { client.execute(getConfig(pProvider), methodName, nullParams); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, passing a float value. * @throws Exception The test failed. */ public void testFloatParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testFloatParam(providers[i]); + for (ClientProvider provider : providers) { + testFloatParam(provider); } } private void testFloatParam(ClientProvider pProvider) throws Exception { final String methodName = "Remote.floatParam"; - final Object[] params = new Object[]{new Float(0.4)}; + final Object[] params = new Object[] { (float) 0.4 }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(8, Math.round(((Double) result).doubleValue()*10)); - boolean ok = false; + assertEquals(8, Math.round((Double) result *10)); try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, returning a float value. * @throws Exception The test failed. */ public void testFloatResult() throws Exception { - for (int i = 0; i < providers.length; i++) { - testFloatResult(providers[i]); + for (ClientProvider provider : providers) { + testFloatResult(provider); } } private void testFloatResult(ClientProvider pProvider) throws Exception { final String methodName = "Remote.floatResult"; - final Object[] params = new Object[]{new Float(0.4)}; + final Object[] params = new Object[] { (float) 0.4 }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Float(0.8), result); - boolean ok = false; + assertEquals((float) 0.8, result); try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, passing a @@ -575,19 +549,19 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testDoubleParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testDoubleParam(providers[i]); + for (ClientProvider provider : providers) { + testDoubleParam(provider); } } private void testDoubleParam(ClientProvider pProvider) throws Exception { final String methodName = "Remote.doubleParam"; - final Object[] params = new Object[]{new Double(0.6)}; + final Object[] params = new Object[] { 0.6 }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getConfig(pProvider), methodName, params); - assertEquals(new Double(1.2), result); + assertEquals(1.2, result); result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Double(1.2), result); + assertEquals(1.2, result); } /** Test, whether we can invoke a method, returning a @@ -595,19 +569,19 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testDoubleResult() throws Exception { - for (int i = 0; i < providers.length; i++) { - testDoubleResult(providers[i]); + for (ClientProvider provider : providers) { + testDoubleResult(provider); } } private void testDoubleResult(ClientProvider pProvider) throws Exception { final String methodName = "Remote.doubleResult"; - final Object[] params = new Object[]{new Double(0.6)}; + final Object[] params = new Object[]{ 0.6 }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getConfig(pProvider), methodName, params); - assertEquals(new Double(1.2), result); + assertEquals(1.2, result); result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Double(1.2), result); + assertEquals(1.2, result); } /** Test, whether we can invoke a method, passing a @@ -615,20 +589,20 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testByteArrayParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testByteArrayParam(providers[i]); + for (ClientProvider provider : providers) { + testByteArrayParam(provider); } } private void testByteArrayParam(ClientProvider pProvider) throws Exception { final byte[] bytes = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; final String methodName = "Remote.byteArrayParam"; - final Object[] params = new Object[]{bytes}; + final Object[] params = new Object[] { bytes }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getConfig(pProvider), methodName, params); - assertEquals(new Integer(0+1+2+3+4+5+6+7+8+9), result); + assertEquals(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9, result); result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Integer(0+1+2+3+4+5+6+7+8+9), result); + assertEquals(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9, result); } /** Test, whether we can invoke a method, returning a @@ -636,15 +610,15 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testByteArrayResult() throws Exception { - for (int i = 0; i < providers.length; i++) { - testByteArrayResult(providers[i]); + for (ClientProvider provider : providers) { + testByteArrayResult(provider); } } private void testByteArrayResult(ClientProvider pProvider) throws Exception { final byte[] bytes = new byte[]{0, 1, 2, 3, 4, 5, 6, 7}; final String methodName = "Remote.byteArrayResult"; - final Object[] params = new Object[]{new Integer(8)}; + final Object[] params = new Object[] { 8 }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getConfig(pProvider), methodName, params); assertTrue(Arrays.equals(bytes, (byte[]) result)); @@ -657,14 +631,13 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testObjectArrayParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testObjectArrayParam(providers[i]); + for (ClientProvider provider : providers) { + testObjectArrayParam(provider); } } private void testObjectArrayParam(ClientProvider pProvider) throws Exception { - final Object[] objects = new Object[]{new Byte((byte) 1), new Short((short) 2), - new Integer(3), new Long(4), "5"}; + final Object[] objects = new Object[]{(byte) 1, (short) 2, 3, 4L, "5"}; final String methodName = "Remote.objectArrayParam"; final Object[] params = new Object[]{objects}; final XmlRpcClient client = pProvider.getClient(); @@ -676,7 +649,7 @@ public class BaseTest extends XmlRpcTestCase { } assertTrue(ok); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Integer(15), result); + assertEquals(15, result); } /** Test, whether we can invoke a method, returning an @@ -684,16 +657,15 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testObjectArrayResult() throws Exception { - for (int i = 0; i < providers.length; i++) { - testObjectArrayResult(providers[i]); + for (ClientProvider provider : providers) { + testObjectArrayResult(provider); } } private void testObjectArrayResult(ClientProvider pProvider) throws Exception { - final Object[] objects = new Object[]{new Integer(0), new Integer(1), - new Integer(2), new Integer(3)}; + final Object[] objects = new Object[]{0, 1, 2, 3}; final String methodName = "Remote.objectArrayResult"; - final Object[] params = new Object[]{new Integer(4)}; + final Object[] params = new Object[] { 4 }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getConfig(pProvider), methodName, params); assertTrue(Arrays.equals(objects, (Object[]) result)); @@ -705,49 +677,50 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testMapParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testMapParam(providers[i]); + for (ClientProvider provider : providers) { + testMapParam(provider); } } private void testMapParam(ClientProvider pProvider) throws Exception { - final Map map = new HashMap(); - map.put("2", new Integer(3)); - map.put("3", new Integer(5)); + final Map map = new HashMap<>(); + map.put("2", 3); + map.put("3", 5); final String methodName = "Remote.mapParam"; - final Object[] params = new Object[]{map}; + final Object[] params = new Object[]{ map }; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getConfig(pProvider), methodName, params); - assertEquals(new Integer(21), result); + assertEquals(21, result); result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Integer(21), result); + assertEquals(21, result); } - private void checkMap(Map pResult) { + private void checkMap(Map pResult) { assertEquals(4, pResult.size()); - assertEquals(new Integer(0), pResult.get("0")); - assertEquals(new Integer(1), pResult.get("1")); - assertEquals(new Integer(2), pResult.get("2")); - assertEquals(new Integer(3), pResult.get("3")); + assertEquals(0, pResult.get("0")); + assertEquals(1, pResult.get("1")); + assertEquals(2, pResult.get("2")); + assertEquals(3, pResult.get("3")); } /** Test, whether we can invoke a method, returning a map. * @throws Exception The test failed. */ public void testMapResult() throws Exception { - for (int i = 0; i < providers.length; i++) { - testMapResult(providers[i]); + for (ClientProvider provider : providers) { + testMapResult(provider); } } + @SuppressWarnings("unchecked") private void testMapResult(ClientProvider pProvider) throws Exception { final String methodName = "Remote.mapResult"; - final Object[] params = new Object[]{new Integer(4)}; + final Object[] params = new Object[] { 4 }; final XmlRpcClient client = pProvider.getClient(); - Object result = client.execute(getConfig(pProvider), methodName, params); - checkMap((Map) result); - result = client.execute(getExConfig(pProvider), methodName, params); - checkMap((Map) result); + Map result = (Map) client.execute(getConfig(pProvider), methodName, params); + checkMap(result); + result = (Map) client.execute(getExConfig(pProvider), methodName, params); + checkMap(result); } /** Test, whether we can invoke a method, passing a DOM @@ -755,13 +728,15 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testNodeParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testNodeParam(providers[i]); + for (ClientProvider provider : providers) { + testNodeParam(provider); } } private static final String ROOT_TAG = "root"; + private static final String INT_TAG = "int"; + private static final String INT_URI = "http://ws.apache.org/xmlrpc/namespaces/testNodeParam"; private void testNodeParam(ClientProvider pProvider) throws Exception { @@ -782,13 +757,11 @@ public class BaseTest extends XmlRpcTestCase { final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); assertEquals(1 + 2 + 3 + 4 + 5, result); - boolean ok = false; try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } /** Test, whether we can invoke a method, passing an instance of @@ -796,8 +769,8 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testSerializableParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testSerializableParam(providers[i]); + for (ClientProvider provider : providers) { + testSerializableParam(provider); } } @@ -809,43 +782,14 @@ public class BaseTest extends XmlRpcTestCase { final Object[] params = new Object[]{new Remote.CalendarWrapper(cal)}; final XmlRpcClient client = pProvider.getClient(); Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(new Long(cal.getTime().getTime()), result); - boolean ok = false; + assertEquals(cal.getTime().getTime(), result); try { client.execute(getConfig(pProvider), methodName, params); } catch (XmlRpcExtensionException e) { - ok = true; + fail(); } - assertTrue(ok); } - /** Tests, whether we can invoke a method, passing an instance of - * {@link Calendar} as a parameter. - * @throws Exception The test failed. - */ - public void testCalendarParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testCalendarParam(providers[i]); - } - } - - private void testCalendarParam(ClientProvider pProvider) throws Exception { - final String methodName = "Remote.calendarParam"; - Calendar cal1 = newCalendarParam(); - Calendar cal2 = newCalendarResult(); - final Object[] params = new Object[]{cal1}; - final XmlRpcClient client = pProvider.getClient(); - Object result = client.execute(getExConfig(pProvider), methodName, params); - assertEquals(cal2.getTime(), ((Calendar) result).getTime()); - boolean ok = false; - try { - client.execute(getConfig(pProvider), methodName, params); - } catch (XmlRpcExtensionException e) { - ok = true; - } - assertTrue(ok); - } - private Calendar newCalendarResult() { Calendar cal2 = Calendar.getInstance(TimeZone.getDefault()); cal2.set(2005, 5, 24, 0, 0, 0); @@ -865,9 +809,9 @@ public class BaseTest extends XmlRpcTestCase { * @throws Exception The test failed. */ public void testDateParam() throws Exception { - for (int i = 0; i < providers.length; i++) { - testDateParam(providers[i]); - } + for (ClientProvider provider : providers) { + testDateParam(provider); + } } private void testDateParam(ClientProvider pProvider) throws Exception { @@ -887,9 +831,9 @@ public class BaseTest extends XmlRpcTestCase { * trapped by the client. */ public void testCatchNPE() throws Exception { - for (int i = 0; i < providers.length; i++) { - testCatchNPE(providers[i]); - } + for (ClientProvider provider : providers) { + testCatchNPE(provider); + } } private void testCatchNPE(ClientProvider pProvider) throws Exception { diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientIpTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientIpTest.java index 0a49318..a69c3a9 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientIpTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientIpTest.java @@ -1,38 +1,18 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.common.XmlRpcException; +import org.xbib.netty.http.xmlrpc.common.XmlRpcHandler; +import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; +import org.xbib.netty.http.xmlrpc.server.XmlRpcNoSuchHandlerException; +import org.xbib.netty.http.xmlrpc.servlet.XmlRpcServlet; + import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.xmlrpc.XmlRpcException; -import org.apache.xmlrpc.XmlRpcHandler; -import org.apache.xmlrpc.XmlRpcRequest; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.server.XmlRpcHandlerMapping; -import org.apache.xmlrpc.server.XmlRpcNoSuchHandlerException; -import org.apache.xmlrpc.webserver.XmlRpcServlet; - - /** * Test case for reading the clients IP address. */ @@ -65,14 +45,16 @@ public class ClientIpTest extends XmlRpcTestCase { * object. */ public static class ClientInfoServlet extends XmlRpcServlet { + private static final long serialVersionUID = 8210342625908021538L; - private static ThreadLocal clientInfo = new ThreadLocal(); + + private static final ThreadLocal clientInfo = new ThreadLocal<>(); /** * Returns the current threads. client info object. */ - public static ClientInfo getClientInfo() { - return (ClientInfo) clientInfo.get(); + static ClientInfo getClientInfo() { + return clientInfo.get(); } public void doPost(HttpServletRequest pRequest, @@ -102,20 +84,17 @@ public class ClientIpTest extends XmlRpcTestCase { }; } - protected XmlRpcHandlerMapping getHandlerMapping() throws IOException, - XmlRpcException { - final XmlRpcHandler handler = new XmlRpcHandler(){ - public Object execute(XmlRpcRequest pRequest) throws XmlRpcException { - final ClientInfo clientInfo = ClientInfoServlet.getClientInfo(); - if (clientInfo == null) { - return ""; - } - final String ip = clientInfo.getIpAddress(); - if (ip == null) { - return ""; - } - return ip; + protected XmlRpcHandlerMapping getHandlerMapping() { + final XmlRpcHandler handler = pRequest -> { + final ClientInfo clientInfo = ClientInfoServlet.getClientInfo(); + if (clientInfo == null) { + return ""; } + final String ip = clientInfo.getIpAddress(); + if (ip == null) { + return ""; + } + return ip; }; return new XmlRpcHandlerMapping(){ public XmlRpcHandler getHandler(String pHandlerName) diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientProvider.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientProvider.java index 53ee97b..260f370 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientProvider.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientProvider.java @@ -4,6 +4,8 @@ import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfigImpl; import org.xbib.netty.http.xmlrpc.server.XmlRpcServer; +import java.io.IOException; + /** This interface allows to perform a unit test with various * transports. Basically, the implementation creates the client, * including the transport, and the server, if required. @@ -27,5 +29,5 @@ public interface ClientProvider { /** Performs a shutdown of the server. */ - void shutdown(); + void shutdown() throws IOException; } diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientProviderImpl.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientProviderImpl.java index 521b6d8..c245cec 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientProviderImpl.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ClientProviderImpl.java @@ -1,6 +1,5 @@ package org.xbib.netty.http.xmlrpc.client.test; - import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfigImpl; import org.xbib.netty.http.xmlrpc.client.XmlRpcTransportFactory; @@ -10,8 +9,11 @@ import org.xbib.netty.http.xmlrpc.server.XmlRpcServer; /** Abstract base implementation of {@link ClientProvider}. */ public abstract class ClientProviderImpl implements ClientProvider { + protected final XmlRpcHandlerMapping mapping; + protected XmlRpcClientConfigImpl clientConfig; + protected abstract XmlRpcTransportFactory getTransportFactory(XmlRpcClient pClient); /** Creates a new instance. @@ -21,15 +23,17 @@ public abstract class ClientProviderImpl implements ClientProvider { mapping = pMapping; } - protected XmlRpcServer getXmlRpcServer() throws Exception { + protected XmlRpcServer getXmlRpcServer() { XmlRpcServer server = new XmlRpcServer(); server.setHandlerMapping(mapping); return server; } public XmlRpcClientConfigImpl getConfig() throws Exception { - XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); - return config; + if (clientConfig == null) { + clientConfig = new XmlRpcClientConfigImpl(); + } + return clientConfig; } public XmlRpcClient getClient() { diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/CommonsProvider.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/CommonsProvider.java index 01e9cca..2de3791 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/CommonsProvider.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/CommonsProvider.java @@ -1,6 +1,7 @@ package org.xbib.netty.http.xmlrpc.client.test; import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcCommonsTransport; import org.xbib.netty.http.xmlrpc.client.XmlRpcCommonsTransportFactory; import org.xbib.netty.http.xmlrpc.client.XmlRpcTransportFactory; import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/CustomTypesTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/CustomTypesTest.java index 208e926..2a764a7 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/CustomTypesTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/CustomTypesTest.java @@ -1,21 +1,3 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; import java.io.IOException; @@ -25,26 +7,25 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; -import org.apache.ws.commons.util.NamespaceContextImpl; -import org.apache.xmlrpc.XmlRpcException; -import org.apache.xmlrpc.XmlRpcRequest; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; -import org.apache.xmlrpc.client.XmlRpcClientRequestImpl; -import org.apache.xmlrpc.common.TypeFactory; -import org.apache.xmlrpc.common.TypeFactoryImpl; -import org.apache.xmlrpc.common.XmlRpcController; -import org.apache.xmlrpc.common.XmlRpcStreamConfig; -import org.apache.xmlrpc.parser.DateParser; -import org.apache.xmlrpc.parser.TypeParser; -import org.apache.xmlrpc.serializer.DateSerializer; -import org.apache.xmlrpc.serializer.TypeSerializer; -import org.apache.xmlrpc.server.PropertyHandlerMapping; -import org.apache.xmlrpc.server.XmlRpcHandlerMapping; -import org.apache.xmlrpc.server.XmlRpcServer; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfigImpl; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClientRequestImpl; +import org.xbib.netty.http.xmlrpc.common.TypeFactory; +import org.xbib.netty.http.xmlrpc.common.TypeFactoryImpl; +import org.xbib.netty.http.xmlrpc.common.XmlRpcController; +import org.xbib.netty.http.xmlrpc.common.XmlRpcException; +import org.xbib.netty.http.xmlrpc.common.XmlRpcRequest; +import org.xbib.netty.http.xmlrpc.common.XmlRpcStreamConfig; +import org.xbib.netty.http.xmlrpc.common.parser.DateParser; +import org.xbib.netty.http.xmlrpc.common.parser.TypeParser; +import org.xbib.netty.http.xmlrpc.common.serializer.DateSerializer; +import org.xbib.netty.http.xmlrpc.common.serializer.TypeSerializer; +import org.xbib.netty.http.xmlrpc.common.util.NamespaceContextImpl; +import org.xbib.netty.http.xmlrpc.server.PropertyHandlerMapping; +import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; +import org.xbib.netty.http.xmlrpc.server.XmlRpcServer; import org.xml.sax.SAXException; - /** * Test suite for working with custom types. */ diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/DynamicProxyTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/DynamicProxyTest.java index 1eec24a..80f4985 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/DynamicProxyTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/DynamicProxyTest.java @@ -1,32 +1,13 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; import java.io.IOException; -import org.apache.xmlrpc.XmlRpcException; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.util.ClientFactory; -import org.apache.xmlrpc.server.XmlRpcHandlerMapping; +import org.xbib.netty.http.xmlrpc.client.ClientFactory; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.common.XmlRpcException; +import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; import org.xml.sax.SAXException; - /** Test case for the {@link ClientFactory}. */ public class DynamicProxyTest extends XmlRpcTestCase { diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/JiraTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/JiraTest.java index 6eeb4ee..1d9d274 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/JiraTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/JiraTest.java @@ -1,21 +1,3 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; import java.io.IOException; @@ -26,22 +8,22 @@ import java.io.Writer; import java.lang.reflect.UndeclaredThrowableException; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.Hashtable; -import java.util.Iterator; import java.util.Map; import java.util.Properties; import java.util.Vector; -import org.apache.xmlrpc.XmlRpcException; -import org.apache.xmlrpc.client.TimingOutCallback; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.XmlRpcHttpClientConfig; -import org.apache.xmlrpc.client.util.ClientFactory; -import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig; -import org.apache.xmlrpc.parser.XmlRpcResponseParser; -import org.apache.xmlrpc.server.XmlRpcHandlerMapping; -import org.apache.xmlrpc.util.SAXParsers; +import org.xbib.netty.http.xmlrpc.client.ClientFactory; +import org.xbib.netty.http.xmlrpc.client.TimingOutCallback; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcHttpClientConfig; +import org.xbib.netty.http.xmlrpc.common.XmlRpcException; +import org.xbib.netty.http.xmlrpc.common.XmlRpcStreamRequestConfig; +import org.xbib.netty.http.xmlrpc.common.parser.XmlRpcResponseParser; +import org.xbib.netty.http.xmlrpc.common.util.SAXParsers; +import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; @@ -56,12 +38,12 @@ public class JiraTest extends XmlRpcTestCase { /** * Returns the reversed vector. */ - Vector reverse(Vector pVector); + Vector reverse(Vector pVector); /** * Returns the same hashtable, but doubles the * values. */ - Hashtable doubledValues(Hashtable pMap); + Hashtable doubledValues(Hashtable pMap); /** * Returns the same properties, but doubles the * values. @@ -73,22 +55,21 @@ public class JiraTest extends XmlRpcTestCase { * Handler for {@link JiraTest#testXMLRPC89()} */ public static class XMLRPC89HandlerImpl implements XMLRPC89Handler { - public Vector reverse(Vector pVector) { - Vector result = new Vector(pVector.size()); + public Vector reverse(Vector pVector) { + Vector result = new Vector<>(pVector.size()); result.addAll(pVector); Collections.reverse(result); return result; } - public Hashtable doubledValues(Hashtable pMap) { - final Hashtable result; + public Hashtable doubledValues(Hashtable pMap) { + final Hashtable result; if (pMap instanceof Properties) { result = new Properties(); } else { - result = new Hashtable(); + result = new Hashtable<>(); } result.putAll(pMap); - for (Iterator iter = result.entrySet().iterator(); iter.hasNext(); ) { - Map.Entry entry = (Map.Entry) iter.next(); + for (Map.Entry entry : result.entrySet()) { Object value = entry.getValue(); final Integer i; if (pMap instanceof Properties) { @@ -96,7 +77,7 @@ public class JiraTest extends XmlRpcTestCase { } else { i = (Integer) value; } - Integer iDoubled = new Integer(i.intValue()*2); + Integer iDoubled = i * 2; if (pMap instanceof Properties) { entry.setValue(iDoubled.toString()); } else { @@ -120,19 +101,19 @@ public class JiraTest extends XmlRpcTestCase { * XMLRPC-89 */ public void testXMLRPC89() throws Exception { - for (int i = 0; i < providers.length; i++) { - testXMLRPC89Vector(providers[i]); - testXMLRPC89Hashtable(providers[i]); - testXMLRPC89Properties(providers[i]); + for (ClientProvider provider : providers) { + testXMLRPC89Vector(provider); + testXMLRPC89Hashtable(provider); + testXMLRPC89Properties(provider); } } private void testXMLRPC89Vector(ClientProvider pProvider) throws Exception { - Vector values = new Vector(); + Vector values = new Vector<>(); for (int i = 0; i < 3; i++) { - values.add(new Integer(i)); + values.add(i); } - Vector params = new Vector(); + Vector params = new Vector<>(); params.add(values); XmlRpcClient client = pProvider.getClient(); client.setConfig(getConfig(pProvider)); @@ -141,20 +122,20 @@ public class JiraTest extends XmlRpcTestCase { assertNotNull(result); assertEquals(3, result.length); for (int i = 0; i < 3; i++) { - assertEquals(new Integer(2-i), result[i]); + assertEquals(2 - i, result[i]); } ClientFactory factory = new ClientFactory(client); XMLRPC89Handler handler = (XMLRPC89Handler) factory.newInstance(XMLRPC89Handler.class); - Vector resultVector = handler.reverse(values); + Vector resultVector = handler.reverse(values); assertNotNull(resultVector); assertEquals(3, resultVector.size()); for (int i = 0; i < 3; i++) { - assertEquals(new Integer(2-i), resultVector.get(i)); + assertEquals(2 - i, resultVector.get(i)); } } - private void verifyXMLRPC89Hashtable(Map pMap) { + private void verifyXMLRPC89Hashtable(Map pMap) { assertNotNull(pMap); assertEquals(3, pMap.size()); for (int i = 0; i < 3; i++) { @@ -163,23 +144,24 @@ public class JiraTest extends XmlRpcTestCase { } } + @SuppressWarnings("unchecked") private void testXMLRPC89Hashtable(ClientProvider pProvider) throws Exception { - Hashtable values = new Hashtable(); + Hashtable values = new Hashtable<>(); for (int i = 0; i < 3; i++) { - values.put(String.valueOf(i), new Integer(i)); + values.put(String.valueOf(i), i); } XmlRpcClient client = pProvider.getClient(); client.setConfig(getConfig(pProvider)); - Object res = client.execute(XMLRPC89Handler.class.getName() + ".doubledValues", new Object[]{values}); - verifyXMLRPC89Hashtable((Map) res); + Map res = (Map) client.execute(XMLRPC89Handler.class.getName() + ".doubledValues", new Object[]{values}); + verifyXMLRPC89Hashtable(res); ClientFactory factory = new ClientFactory(client); XMLRPC89Handler handler = (XMLRPC89Handler) factory.newInstance(XMLRPC89Handler.class); - Hashtable result = handler.doubledValues(values); + Hashtable result = handler.doubledValues(values); verifyXMLRPC89Hashtable(result); } - private void verifyXMLRPC89Properties(Map pMap) { + private void verifyXMLRPC89Properties(Map pMap) { assertNotNull(pMap); assertEquals(3, pMap.size()); for (int i = 0; i < 3; i++) { @@ -188,6 +170,7 @@ public class JiraTest extends XmlRpcTestCase { } } + @SuppressWarnings("unchecked") private void testXMLRPC89Properties(ClientProvider pProvider) throws Exception { Properties values = new Properties(); for (int i = 0; i < 3; i++) { @@ -195,19 +178,20 @@ public class JiraTest extends XmlRpcTestCase { } XmlRpcClient client = pProvider.getClient(); client.setConfig(getConfig(pProvider)); - Object res = client.execute(XMLRPC89Handler.class.getName() + ".doubledPropertyValues", new Object[]{values}); - verifyXMLRPC89Properties((Map) res); - + Map res = (Map) client.execute(XMLRPC89Handler.class.getName() + ".doubledPropertyValues", new Object[]{values}); + verifyXMLRPC89Properties(res); ClientFactory factory = new ClientFactory(client); XMLRPC89Handler handler = (XMLRPC89Handler) factory.newInstance(XMLRPC89Handler.class); Properties result = handler.doubledPropertyValues(values); verifyXMLRPC89Properties(result); } - /** Handler for XMLRPC-96 + /** + * Handler for XMLRPC-96 */ public static class XMLRPC96Handler { - /** Returns the "Hello, world!" string. + /** + * Returns the "Hello, world!" string. */ public String getHelloWorld() { return "Hello, world!"; @@ -219,8 +203,8 @@ public class JiraTest extends XmlRpcTestCase { * XMLRPC-96 */ public void testXMLRPC96() throws Exception { - for (int i = 0; i < providers.length; i++) { - testXMLRPC96(providers[i]); + for (ClientProvider provider : providers) { + testXMLRPC96(provider); } } @@ -238,8 +222,8 @@ public class JiraTest extends XmlRpcTestCase { * XMLRPC-112 */ public void testXMLRPC112() throws Exception { - for (int i = 0; i < providers.length; i++) { - testXMLRPC112(providers[i]); + for (ClientProvider provider : providers) { + testXMLRPC112(provider); } } @@ -248,8 +232,8 @@ public class JiraTest extends XmlRpcTestCase { * XMLRPC-113 */ public void testXMLRPC113() throws Exception { - for (int i = 0; i < providers.length; i++) { - testXMLRPC113(providers[i]); + for (ClientProvider provider : providers) { + testXMLRPC113(provider); } } @@ -306,7 +290,7 @@ public class JiraTest extends XmlRpcTestCase { XMLRPC113Handler handler = (XMLRPC113Handler) new ClientFactory(client).newInstance(XMLRPC113Handler.class); for (int i = 0; i < 5; i++) { try { - client.execute(XMLRPC113Handler.class.getName() + ".throwCode", new Object[]{new Integer(i)}); + client.execute(XMLRPC113Handler.class.getName() + ".throwCode", new Object[] { i }); fail("Excpected exception"); } catch (XmlRpcException e) { assertEquals(i, e.code); @@ -336,8 +320,8 @@ public class JiraTest extends XmlRpcTestCase { * XMLRPC-115 */ public void testXMLRPC115() throws Exception { - for (int i = 0; i < providers.length; i++) { - testXMLRPC115(providers[i]); + for (ClientProvider provider : providers) { + testXMLRPC115(provider); } } @@ -352,7 +336,7 @@ public class JiraTest extends XmlRpcTestCase { conn.setRequestMethod("POST"); conn.setRequestProperty("content-type", "text/xml"); OutputStream ostream = conn.getOutputStream(); - Writer w = new OutputStreamWriter(ostream, "UTF-8"); + Writer w = new OutputStreamWriter(ostream, StandardCharsets.UTF_8); w.write("" + XMLRPC115Handler.class.getName() + ".ping" + ""); w.close(); @@ -372,8 +356,8 @@ public class JiraTest extends XmlRpcTestCase { * XMLRPC-119 */ public void testXMLRPC119() throws Exception { - for (int i = 0; i < providers.length; i++) { - testXMLRPC119(providers[i]); + for (ClientProvider provider : providers) { + testXMLRPC119(provider); } } @@ -383,7 +367,7 @@ public class JiraTest extends XmlRpcTestCase { /** Returns a string with a length of "num" Kilobytes. */ public String getString(int pSize) { - StringBuffer sb = new StringBuffer(pSize*1024); + StringBuilder sb = new StringBuilder(pSize*1024); for (int i = 0; i < pSize*1024; i++) { sb.append('&'); } @@ -395,7 +379,8 @@ public class JiraTest extends XmlRpcTestCase { XmlRpcClient client = pProvider.getClient(); client.setConfig(getConfig(pProvider)); for (int i = 0; i < 100; i+= 10) { - String s = (String) client.execute(XMLRPC119Handler.class.getName() + ".getString", new Object[]{new Integer(i)}); + String s = (String) client.execute(XMLRPC119Handler.class.getName() + ".getString", + new Object[] { i }); assertEquals(i*1024, s.length()); } } diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LiteTransportProvider.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LiteTransportProvider.java index dbda079..55d1c45 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LiteTransportProvider.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LiteTransportProvider.java @@ -1,31 +1,13 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.XmlRpcLiteHttpTransportFactory; -import org.apache.xmlrpc.client.XmlRpcTransportFactory; -import org.apache.xmlrpc.server.XmlRpcHandlerMapping; - +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcLiteHttpTransport; +import org.xbib.netty.http.xmlrpc.client.XmlRpcLiteHttpTransportFactory; +import org.xbib.netty.http.xmlrpc.client.XmlRpcTransportFactory; +import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; /** Provider for testing the - * {@link org.apache.xmlrpc.client.XmlRpcLiteHttpTransport}. + * {@link XmlRpcLiteHttpTransport}. */ public class LiteTransportProvider extends WebServerProvider { /** Creates a new instance. diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LocalStreamTransportProvider.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LocalStreamTransportProvider.java index 83ed431..f0c25e8 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LocalStreamTransportProvider.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LocalStreamTransportProvider.java @@ -1,33 +1,15 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.XmlRpcLocalStreamTransportFactory; -import org.apache.xmlrpc.client.XmlRpcTransportFactory; -import org.apache.xmlrpc.server.XmlRpcHandlerMapping; -import org.apache.xmlrpc.server.XmlRpcLocalStreamServer; -import org.apache.xmlrpc.server.XmlRpcServer; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcLocalStreamTransport; +import org.xbib.netty.http.xmlrpc.client.XmlRpcLocalStreamTransportFactory; +import org.xbib.netty.http.xmlrpc.client.XmlRpcTransportFactory; +import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; +import org.xbib.netty.http.xmlrpc.server.XmlRpcLocalStreamServer; +import org.xbib.netty.http.xmlrpc.server.XmlRpcServer; - -/** Implementation of {@link org.apache.xmlrpc.test.BaseTest} - * for testing the {@link org.apache.xmlrpc.client.XmlRpcLocalStreamTransport}. +/** Implementation of {@link BaseTest} + * for testing the {@link XmlRpcLocalStreamTransport}. */ public class LocalStreamTransportProvider extends LocalTransportProvider { private XmlRpcLocalStreamServer server; diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LocalTransportProvider.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LocalTransportProvider.java index 47ab738..ad22782 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LocalTransportProvider.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/LocalTransportProvider.java @@ -1,33 +1,16 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; -import org.apache.xmlrpc.client.XmlRpcLocalTransportFactory; -import org.apache.xmlrpc.client.XmlRpcTransportFactory; -import org.apache.xmlrpc.server.XmlRpcHandlerMapping; -import org.apache.xmlrpc.server.XmlRpcServer; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfigImpl; +import org.xbib.netty.http.xmlrpc.client.XmlRpcLocalTransport; +import org.xbib.netty.http.xmlrpc.client.XmlRpcLocalTransportFactory; +import org.xbib.netty.http.xmlrpc.client.XmlRpcTransportFactory; +import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; +import org.xbib.netty.http.xmlrpc.server.XmlRpcServer; - -/** Implementation of {@link org.apache.xmlrpc.test.BaseTest} - * for testing the {@link org.apache.xmlrpc.client.XmlRpcLocalTransport}. +/** + * Implementation of {@link BaseTest} + * for testing the {@link XmlRpcLocalTransport}. */ public class LocalTransportProvider extends ClientProviderImpl { private XmlRpcServer server; diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/MetadataTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/MetadataTest.java index f1bdbb3..63baac8 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/MetadataTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/MetadataTest.java @@ -1,42 +1,23 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; -import java.io.IOException; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfig; +import org.xbib.netty.http.xmlrpc.common.XmlRpcException; +import org.xbib.netty.http.xmlrpc.server.PropertyHandlerMapping; +import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; +import org.xbib.netty.http.xmlrpc.server.XmlRpcSystemImpl; + import java.text.Collator; import java.util.Arrays; import java.util.Locale; -import org.apache.xmlrpc.XmlRpcException; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.XmlRpcClientConfig; -import org.apache.xmlrpc.metadata.XmlRpcSystemImpl; -import org.apache.xmlrpc.server.PropertyHandlerMapping; -import org.apache.xmlrpc.server.XmlRpcHandlerMapping; - - /** * Test class for the introspection stuff. */ public class MetadataTest extends XmlRpcTestCase { - protected XmlRpcHandlerMapping getHandlerMapping() throws IOException, - XmlRpcException { + + @Override + protected XmlRpcHandlerMapping getHandlerMapping() throws XmlRpcException { PropertyHandlerMapping mapping = new PropertyHandlerMapping(); mapping.addHandler("Adder", AuthenticationTest.AdderImpl.class); XmlRpcSystemImpl.addSystemHandler(mapping); @@ -47,8 +28,8 @@ public class MetadataTest extends XmlRpcTestCase { * Test, whether the actual handlers are working. */ public void testAdder() throws Exception { - for (int i = 0; i < providers.length; i++) { - testAdder(providers[i]); + for (ClientProvider provider : providers) { + testAdder(provider); } } @@ -56,16 +37,16 @@ public class MetadataTest extends XmlRpcTestCase { XmlRpcClient client = pProvider.getClient(); XmlRpcClientConfig config = getConfig(pProvider); client.setConfig(config); - Object o = client.execute("Adder.add", new Object[]{new Integer(3), new Integer(5)}); - assertEquals(new Integer(8), o); + Object o = client.execute("Adder.add", new Object[]{3, 5}); + assertEquals(8, o); } /** * Test for system.listMethods. */ public void testListMethods() throws Exception { - for (int i = 0; i < providers.length; i++) { - testListMethods(providers[i]); + for (ClientProvider provider : providers) { + testListMethods(provider); } } @@ -87,8 +68,8 @@ public class MetadataTest extends XmlRpcTestCase { * Test for system.methodHelp. */ public void testMethodHelp() throws Exception { - for (int i = 0; i < providers.length; i++) { - testMethodHelp(providers[i]); + for (ClientProvider provider : providers) { + testMethodHelp(provider); } } @@ -97,15 +78,15 @@ public class MetadataTest extends XmlRpcTestCase { XmlRpcClientConfig config = getConfig(pProvider); client.setConfig(config); String help = (String) client.execute("system.methodHelp", new Object[]{"Adder.add"}); - assertEquals("Invokes the method org.apache.xmlrpc.test.AuthenticationTest$AdderImpl.add(int, int).", help); + assertEquals("Invokes the method org.xbib.netty.http.xmlrpc.client.test.AuthenticationTest$AdderImpl.add(int, int).", help); } /** * Test for system.methodSignature. */ public void testMethodSignature() throws Exception { - for (int i = 0; i < providers.length; i++) { - testMethodSignature(providers[i]); + for (ClientProvider provider : providers) { + testMethodSignature(provider); } } diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ParserTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ParserTest.java index 5e7ee5a..847fafe 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ParserTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ParserTest.java @@ -1,21 +1,3 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; import java.io.IOException; @@ -26,17 +8,17 @@ import java.util.TimeZone; import junit.framework.TestCase; -import org.apache.xmlrpc.XmlRpcException; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; -import org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl; -import org.apache.xmlrpc.common.XmlRpcStreamConfig; -import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig; -import org.apache.xmlrpc.parser.DateParser; -import org.apache.xmlrpc.parser.XmlRpcRequestParser; -import org.apache.xmlrpc.parser.XmlRpcResponseParser; -import org.apache.xmlrpc.util.SAXParsers; -import org.apache.xmlrpc.util.XmlRpcDateTimeFormat; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfigImpl; +import org.xbib.netty.http.xmlrpc.common.XmlRpcException; +import org.xbib.netty.http.xmlrpc.common.XmlRpcHttpRequestConfigImpl; +import org.xbib.netty.http.xmlrpc.common.XmlRpcStreamConfig; +import org.xbib.netty.http.xmlrpc.common.XmlRpcStreamRequestConfig; +import org.xbib.netty.http.xmlrpc.common.parser.DateParser; +import org.xbib.netty.http.xmlrpc.common.parser.XmlRpcRequestParser; +import org.xbib.netty.http.xmlrpc.common.parser.XmlRpcResponseParser; +import org.xbib.netty.http.xmlrpc.common.util.SAXParsers; +import org.xbib.netty.http.xmlrpc.common.util.XmlRpcDateTimeFormat; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ScalabilityTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ScalabilityTest.java index fb942a0..6feff23 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ScalabilityTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ScalabilityTest.java @@ -1,45 +1,31 @@ -/* - * 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.xbib.netty.http.xmlrpc.client.test; +import java.io.IOException; import java.net.URL; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; -import org.apache.xmlrpc.XmlRpcException; -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; -import org.apache.xmlrpc.server.PropertyHandlerMapping; -import org.apache.xmlrpc.server.XmlRpcHandlerMapping; -import org.apache.xmlrpc.util.ThreadPool; -import org.apache.xmlrpc.webserver.ServletWebServer; -import org.apache.xmlrpc.webserver.WebServer; -import org.apache.xmlrpc.webserver.XmlRpcServlet; - import junit.framework.TestCase; - +import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfigImpl; +import org.xbib.netty.http.xmlrpc.common.XmlRpcException; +import org.xbib.netty.http.xmlrpc.server.PropertyHandlerMapping; +import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; +import org.xbib.netty.http.xmlrpc.servlet.ServletWebServer; +import org.xbib.netty.http.xmlrpc.servlet.ThreadPool; +import org.xbib.netty.http.xmlrpc.servlet.WebServer; +import org.xbib.netty.http.xmlrpc.servlet.XmlRpcServlet; /** * Tests the frameworks scalability. */ public class ScalabilityTest extends TestCase { + + private static final Logger logger = Logger.getLogger(ScalabilityTest.class.getName()); + /** * Primitive handler class */ @@ -52,43 +38,18 @@ public class ScalabilityTest extends TestCase { } } - private class MyServletWebServer extends ServletWebServer { - protected ThreadPool pool; - MyServletWebServer(HttpServlet pServlet, int pPort) - throws ServletException { - super(pServlet, pPort); - } - public ThreadPool newThreadPool(){ - pool = new ThreadPool(getXmlRpcServer().getMaxThreads(), "XML-RPC"){ - }; - return pool; - } - int getNumThreads() { - return pool.getNumThreads(); - } - } - - private class MyWebServer extends WebServer { - protected ThreadPool pool; - MyWebServer(int pPort) { - super(pPort); - } - public ThreadPool newThreadPool(){ - pool = new ThreadPool(getXmlRpcServer().getMaxThreads(), "XML-RPC"){ - }; - return pool; - } - int getNumThreads() { - return pool.getNumThreads(); - } - } - private static final int BASE = 1; - private static final Integer THREE = new Integer(3); - private static final Integer FIVE = new Integer(5); - private static final Integer EIGHT = new Integer(8); + + private static final Integer THREE = 3; + + private static final Integer FIVE = 5; + + private static final Integer EIGHT = 8; + private XmlRpcServlet servlet; + private MyServletWebServer server; + private MyWebServer webServer; private XmlRpcHandlerMapping newXmlRpcHandlerMapping() throws XmlRpcException { @@ -98,50 +59,48 @@ public class ScalabilityTest extends TestCase { } private void initServletWebServer() throws Exception { - servlet = new XmlRpcServlet(){ - private static final long serialVersionUID = -2040521497373327817L; - protected XmlRpcHandlerMapping newXmlRpcHandlerMapping() - throws XmlRpcException { - return ScalabilityTest.this.newXmlRpcHandlerMapping(); + servlet = new XmlRpcServlet() { + private static final long serialVersionUID = -2040521497373327817L; + + @Override + protected XmlRpcHandlerMapping newXmlRpcHandlerMapping() throws XmlRpcException { + return ScalabilityTest.this.newXmlRpcHandlerMapping(); } - }; - server = new MyServletWebServer(servlet, 0); + server = new MyServletWebServer(servlet, 8080); server.getXmlRpcServer().setMaxThreads(25); server.start(); } - private void shutdownServletWebServer() { + private void shutdownServletWebServer() throws IOException { server.shutdown(); } private void initWebServer() throws Exception { - webServer = new MyWebServer(0); + webServer = new MyWebServer(8080); webServer.getXmlRpcServer().setHandlerMapping(newXmlRpcHandlerMapping()); webServer.getXmlRpcServer().setMaxThreads(25); webServer.start(); } - private void shutdownWebServer() { + private void shutdownWebServer() throws IOException { webServer.shutdown(); } /** - * Runs the test with a single client. + * Runs the servlet test with a single client. */ - public void testSingleClient() throws Exception { + public void testSingleServletClient() throws Exception { initServletWebServer(); - boolean ok = false; try { long now = System.currentTimeMillis(); servlet.getXmlRpcServletServer().setMaxThreads(1); - new Client(100*BASE, server.getPort()).run(); - System.out.println("Single client: " + (System.currentTimeMillis()-now) + ", " + server.getNumThreads()); - shutdownServletWebServer(); - ok = true; + new MyClient(100 * BASE, server.getPort()).run(); + logger.log(Level.INFO, + "Single servlet client: " + (System.currentTimeMillis() - now) + ", " + server.getNumThreads()); } finally { - if (!ok) { try { shutdownServletWebServer(); } catch (Throwable t) {} } + shutdownServletWebServer(); } } @@ -150,38 +109,14 @@ public class ScalabilityTest extends TestCase { */ public void testSingleWebServerClient() throws Exception { initWebServer(); - boolean ok = false; try { long now = System.currentTimeMillis(); webServer.getXmlRpcServer().setMaxThreads(1); - new Client(100*BASE, webServer.getPort()).run(); - System.out.println("Single client: " + (System.currentTimeMillis()-now) + ", " + webServer.getNumThreads()); - shutdownWebServer(); - ok = true; + new MyClient(100 * BASE, webServer.getPort()).run(); + logger.log(Level.INFO, + "Single web server client: " + (System.currentTimeMillis( ) -now) + ", " + webServer.getNumThreads()); } finally { - if (!ok) { try { shutdownWebServer(); } catch (Throwable t) {} } - } - } - - private static class Client implements Runnable { - private final int iterations; - private final int port; - Client(int pIterations, int pPort) { - iterations = pIterations; - port = pPort; - } - public void run() { - try { - XmlRpcClient client = new XmlRpcClient(); - XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); - config.setServerURL(new URL("http://127.0.0.1:" + port + "/")); - client.setConfig(config); - for (int i = 0; i < iterations; i++) { - assertEquals(EIGHT, client.execute("Adder.add", new Object[]{THREE, FIVE})); - } - } catch (Throwable t) { - t.printStackTrace(); - } + shutdownWebServer(); } } @@ -190,23 +125,90 @@ public class ScalabilityTest extends TestCase { */ public void testTenClient() throws Exception { initServletWebServer(); - boolean ok = false; try { final Thread[] threads = new Thread[10]; servlet.getXmlRpcServletServer().setMaxThreads(10); long now = System.currentTimeMillis(); for (int i = 0; i < threads.length; i++) { - threads[i] = new Thread(new Client(10*BASE, server.getPort())); + threads[i] = new Thread(new MyClient(10 * BASE, server.getPort())); threads[i].start(); } - for (int i = 0; i < threads.length; i++) { - threads[i].join(); + for (Thread thread : threads) { + thread.join(); } - System.out.println("Ten clients: " + (System.currentTimeMillis() - now) + ", " + server.getNumThreads()); + logger.log(Level.INFO, "Ten clients: " + (System.currentTimeMillis() - now) + ", " + server.getNumThreads()); shutdownServletWebServer(); - ok = false; } finally { - if (!ok) { try { shutdownServletWebServer(); } catch (Throwable t) {} } + shutdownServletWebServer(); } } + + private static class MyClient implements Runnable { + + private final int iterations; + + private final int port; + + MyClient(int pIterations, int pPort) { + iterations = pIterations; + port = pPort; + } + + @Override + public void run() { + int i = 0; + try { + XmlRpcClient client = new XmlRpcClient(); + XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); + config.setServerURL(new URL("http://localhost:" + port + "/")); + client.setConfig(config); + for (i = 0; i < iterations; i++) { + assertEquals(EIGHT, client.execute("Adder.add", new Object[] { + THREE, FIVE + })); + } + } catch (Throwable t) { + throw new RuntimeException("i=" + i, t); + } + } + } + + private class MyServletWebServer extends ServletWebServer { + + ThreadPool pool; + + MyServletWebServer(HttpServlet pServlet, int pPort) throws ServletException { + super(pServlet, pPort); + } + + @Override + public ThreadPool newThreadPool(){ + pool = new ThreadPool(getXmlRpcServer().getMaxThreads(), "XML-RPC"); + return pool; + } + + int getNumThreads() { + return pool.getNumThreads(); + } + } + + private class MyWebServer extends WebServer { + + ThreadPool pool; + + MyWebServer(int pPort) { + super(pPort); + } + + @Override + public ThreadPool newThreadPool(){ + pool = new ThreadPool(getXmlRpcServer().getMaxThreads(), "XML-RPC"); + return pool; + } + + int getNumThreads() { + return pool.getNumThreads(); + } + } + } diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/SerializerTest.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/SerializerTest.java index ce362a1..3a84a4e 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/SerializerTest.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/SerializerTest.java @@ -3,6 +3,7 @@ package org.xbib.netty.http.xmlrpc.client.test; import java.io.StringReader; import java.util.Calendar; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.TimeZone; @@ -26,104 +27,100 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; -import static org.junit.jupiter.api.Assertions.assertEquals; - - /** A test case for the various serializers. */ public class SerializerTest extends TestCase { - private final XmlRpcClient client; + private final XmlRpcClient client; - /** Creates a new instance. - */ - public SerializerTest() { - client = new XmlRpcClient(); - client.setTransportFactory(new XmlRpcSunHttpTransportFactory(client)); - } + /** Creates a new instance. + */ + public SerializerTest() { + client = new XmlRpcClient(); + client.setTransportFactory(new XmlRpcSunHttpTransportFactory(client)); + } - protected XmlRpcClientConfigImpl getConfig() { - XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); - return config; - } + protected XmlRpcClientConfigImpl getConfig() { + XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); + return config; + } - protected XmlRpcStreamRequestConfig getExConfig() { - XmlRpcClientConfigImpl config = getConfig(); - config.setEnabledForExtensions(true); - return config; - } + protected XmlRpcStreamRequestConfig getExConfig() { + XmlRpcClientConfigImpl config = getConfig(); + config.setEnabledForExtensions(true); + return config; + } - protected String writeRequest(XmlRpcStreamRequestConfig pConfig, XmlRpcRequest pRequest) - throws SAXException { + protected String writeRequest(XmlRpcStreamRequestConfig pConfig, XmlRpcRequest pRequest) + throws SAXException { client.setConfig((XmlRpcClientConfig) pConfig); return XmlRpcTestCase.writeRequest(client, pRequest); - } + } - /** Test serialization of a byte parameter. - * @throws Exception The test failed. - */ - public void testByteParam() throws Exception { - XmlRpcStreamRequestConfig config = getExConfig(); - XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "byteParam", new Object[]{new Byte((byte)3)}); - String got = writeRequest(config, request); - String expect = - "" - + "" - + "byteParam3"; - assertEquals(expect, got); - } + /** Test serialization of a byte parameter. + * @throws Exception The test failed. + */ + public void testByteParam() throws Exception { + XmlRpcStreamRequestConfig config = getExConfig(); + XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "byteParam", new Object[] { (byte) 3} ); + String got = writeRequest(config, request); + String expect = + "" + + "" + + "byteParam3"; + assertEquals(expect, got); + } - /** Test serialization of an integer parameter. - * @throws Exception The test failed. - */ - public void testIntParam() throws Exception { - XmlRpcStreamRequestConfig config = getConfig(); - XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "intParam", new Object[]{new Integer(3)}); - String got = writeRequest(config, request); - String expect = - "" - + "" - + "intParam3"; - assertEquals(expect, got); - } + /** Test serialization of an integer parameter. + * @throws Exception The test failed. + */ + public void testIntParam() throws Exception { + XmlRpcStreamRequestConfig config = getConfig(); + XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "intParam", new Object[] { 3 } ); + String got = writeRequest(config, request); + String expect = + "" + + "" + + "intParam3"; + assertEquals(expect, got); + } - /** Test serialization of a byte array. - * @throws Exception The test failed. - */ - public void testByteArrayParam() throws Exception { - byte[] bytes = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - XmlRpcStreamRequestConfig config = getConfig(); - XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "byteArrayParam", new Object[]{bytes}); - String got = writeRequest(config, request); - String expect = - "" - + "" - + "byteArrayParamAAECAwQFBgcICQ=="; - assertEquals(expect, got); - } + /** Test serialization of a byte array. + * @throws Exception The test failed. + */ + public void testByteArrayParam() throws Exception { + byte[] bytes = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + XmlRpcStreamRequestConfig config = getConfig(); + XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "byteArrayParam", new Object[]{ bytes }); + String got = writeRequest(config, request); + String expect = + "" + + "" + + "byteArrayParamAAECAwQFBgcICQ=="; + assertEquals(expect, got); + } - /** Test serialization of a map. - * @throws Exception The test failed. - */ - public void testMapParam() throws Exception { - final Map map = new HashMap(); - map.put("2", new Integer(3)); - map.put("3", new Integer(5)); - final Object[] params = new Object[]{map}; - XmlRpcStreamRequestConfig config = getConfig(); - XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "mapParam", params); - String got = writeRequest(config, request); - String expect = - "" - + "mapParam" - + "" - + "35" - + "23" - + ""; - assertEquals(expect, got); - } + /** Test serialization of a map. + * @throws Exception The test failed. + */ + public void testMapParam() throws Exception { + final Map map = new LinkedHashMap<>(); + map.put("2", 3); + map.put("3", 5); + final Object[] params = new Object[]{map}; + XmlRpcStreamRequestConfig config = getConfig(); + XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "mapParam", params); + String got = writeRequest(config, request); + String expect = "" + + "mapParam" + + "" + + "23" + + "35" + + ""; + assertEquals(expect, got); + } - /** Tests serialization of a calendar instance. - */ + /** Tests serialization of a calendar instance. + */ public void testCalendarParam() throws Exception { TimeZone tz = TimeZone.getTimeZone("GMT"); Calendar cal1 = Calendar.getInstance(tz); @@ -136,12 +133,12 @@ public class SerializerTest extends TestCase { XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "dateParam", new Object[]{cal1, cal2.getTime()}); String got = writeRequest(config, request); String expect = - "" - + "" - + "dateParam" - + "1933-06-12T11:07:21.311Z" - + "19330612T11:07:21" - + ""; + "" + + "" + + "dateParam" + + "1933-06-12T11:07:21.311Z" + + "19330612T11:07:21" + + ""; assertEquals(expect, got); } @@ -149,23 +146,23 @@ public class SerializerTest extends TestCase { * Test for XMLRPC-127: Is it possible to transmit a * map with integers as the keys? */ + @SuppressWarnings("unchecked") public void testIntegerKeyMap() throws Exception { - Map map = new HashMap(); - map.put(new Integer(1), "one"); + Map map = new HashMap<>(); + map.put(1, "one"); XmlRpcStreamRequestConfig config = getExConfig(); XmlRpcRequest request = new XmlRpcClientRequestImpl(config, "integerKeyMap", new Object[]{map}); String got = writeRequest(config, request); String expect = - "" - + "" - + "integerKeyMap" - + "" - + "1" - + "one" - + "" - + ""; + "" + + "" + + "integerKeyMap" + + "" + + "1" + + "one" + + "" + + ""; assertEquals(expect, got); - XmlRpcServer server = new XmlRpcServer(); XmlRpcServerConfigImpl serverConfig = new XmlRpcServerConfigImpl(); serverConfig.setEnabledForExtensions(true); @@ -178,10 +175,10 @@ public class SerializerTest extends TestCase { xr.setContentHandler(parser); xr.parse(new InputSource(new StringReader(expect))); assertEquals("integerKeyMap", parser.getMethodName()); - List params = parser.getParams(); + List params = parser.getParams(); assertEquals(1, params.size()); - Map paramMap = (Map) params.get(0); + Map paramMap = (Map) params.get(0); assertEquals(1, paramMap.size()); - assertEquals("one", paramMap.get(new Integer(1))); + assertEquals("one", paramMap.get(1)); } } diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ServletWebServerProvider.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ServletWebServerProvider.java index 1f0a117..fdf2af7 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ServletWebServerProvider.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/ServletWebServerProvider.java @@ -18,10 +18,14 @@ import java.net.URL; * A provider class for testing the {@link ServletWebServer}. */ public class ServletWebServerProvider extends ClientProviderImpl { + protected final ServletWebServer webServer; - protected final XmlRpcServlet servlet; + + protected final XmlRpcServlet servlet; + private final boolean contentLength; - private final int port; + + private int port; /** * Creates a new instance of {@link XmlRpcServlet}. @@ -40,18 +44,22 @@ public class ServletWebServerProvider extends ClientProviderImpl { contentLength = pContentLength; servlet = newXmlRpcServlet(); webServer = new ServletWebServer(servlet, 0); - XmlRpcServer server = servlet.getXmlRpcServletServer(); - server.setHandlerMapping(mapping); - XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) server.getConfig(); - serverConfig.setEnabledForExtensions(true); - serverConfig.setContentLengthOptional(!contentLength); - serverConfig.setEnabledForExceptions(true); - webServer.start(); - port = webServer.getPort(); + try { + XmlRpcServer server = servlet.getXmlRpcServletServer(); + server.setHandlerMapping(mapping); + XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) server.getConfig(); + serverConfig.setEnabledForExtensions(true); + serverConfig.setContentLengthOptional(!contentLength); + serverConfig.setEnabledForExceptions(true); + webServer.start(); + port = webServer.getPort(); + } catch (Exception e) { + webServer.shutdown(); + } } public final XmlRpcClientConfigImpl getConfig() throws Exception { - return getConfig(new URL("http://127.0.0.1:" + port + "/")); + return getConfig(new URL("http://localhost:" + port + "/")); } protected XmlRpcClientConfigImpl getConfig(URL pServerURL) throws Exception { @@ -69,7 +77,7 @@ public class ServletWebServerProvider extends ClientProviderImpl { return servlet.getXmlRpcServletServer(); } - public void shutdown() { + public void shutdown() throws IOException { webServer.shutdown(); } } diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/SunHttpTransportProvider.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/SunHttpTransportProvider.java index 3b56237..5322f26 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/SunHttpTransportProvider.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/SunHttpTransportProvider.java @@ -1,6 +1,7 @@ package org.xbib.netty.http.xmlrpc.client.test; import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; +import org.xbib.netty.http.xmlrpc.client.XmlRpcSunHttpTransport; import org.xbib.netty.http.xmlrpc.client.XmlRpcSunHttpTransportFactory; import org.xbib.netty.http.xmlrpc.client.XmlRpcTransportFactory; import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/WebServerProvider.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/WebServerProvider.java index 9ec0e4b..7780c37 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/WebServerProvider.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/WebServerProvider.java @@ -6,53 +6,57 @@ import org.xbib.netty.http.xmlrpc.server.XmlRpcServer; import org.xbib.netty.http.xmlrpc.server.XmlRpcServerConfigImpl; import org.xbib.netty.http.xmlrpc.servlet.WebServer; +import java.io.IOException; import java.net.URL; /** Abstract base class for providers, which require a webserver. */ public abstract class WebServerProvider extends ClientProviderImpl { - protected final WebServer webServer = new WebServer(0); - private boolean isActive; - private final boolean contentLength; - /** Creates a new instance. - * @param pMapping The test servers handler mapping. - */ - protected WebServerProvider(XmlRpcHandlerMapping pMapping, boolean pContentLength) { - super(pMapping); - contentLength = pContentLength; - } + private WebServer webServer; - public final XmlRpcClientConfigImpl getConfig() throws Exception { - initWebServer(); - return getConfig(new URL("http://127.0.0.1:" + webServer.getPort() + "/")); - } + private final boolean contentLength; - protected XmlRpcClientConfigImpl getConfig(URL pServerURL) throws Exception { - XmlRpcClientConfigImpl config = super.getConfig(); - config.setServerURL(pServerURL); - config.setContentLengthOptional(!contentLength); - return config; - } - - protected void initWebServer() throws Exception { - if (!isActive) { - XmlRpcServer server = webServer.getXmlRpcServer(); - server.setHandlerMapping(mapping); - XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) server.getConfig(); - serverConfig.setEnabledForExtensions(true); - serverConfig.setContentLengthOptional(!contentLength); - serverConfig.setEnabledForExceptions(true); - webServer.start(); - isActive = true; - } - } - - public XmlRpcServer getServer() { - return webServer.getXmlRpcServer(); + /** Creates a new instance. + * @param pMapping The test servers handler mapping. + */ + WebServerProvider(XmlRpcHandlerMapping pMapping, boolean pContentLength) { + super(pMapping); + contentLength = pContentLength; } - public void shutdown() { - webServer.shutdown(); + public final XmlRpcClientConfigImpl getConfig() throws Exception { + initWebServer(); + return getConfig(new URL("http://localhost:" + webServer.getPort() + "/")); + } + + protected XmlRpcClientConfigImpl getConfig(URL pServerURL) throws Exception { + XmlRpcClientConfigImpl config = super.getConfig(); + config.setServerURL(pServerURL); + config.setContentLengthOptional(!contentLength); + return config; + } + + private void initWebServer() throws Exception { + if (webServer == null || webServer.isShutDown()) { + webServer = new WebServer(0); + XmlRpcServer server = webServer.getXmlRpcServer(); + server.setHandlerMapping(mapping); + XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) server.getConfig(); + serverConfig.setEnabledForExtensions(true); + serverConfig.setContentLengthOptional(!contentLength); + serverConfig.setEnabledForExceptions(true); + webServer.start(); + } + } + + @Override + public XmlRpcServer getServer() { + return webServer.getXmlRpcServer(); + } + + @Override + public void shutdown() throws IOException { + webServer.shutdown(); } } diff --git a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/XmlRpcTestCase.java b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/XmlRpcTestCase.java index 577c61a..5b28fad 100644 --- a/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/XmlRpcTestCase.java +++ b/netty-http-xmlrpc-client/src/test/java/org/xbib/netty/http/xmlrpc/client/test/XmlRpcTestCase.java @@ -3,6 +3,7 @@ package org.xbib.netty.http.xmlrpc.client.test; import java.io.IOException; import java.io.StringWriter; +import junit.framework.TestCase; import org.xbib.netty.http.xmlrpc.client.XmlRpcClient; import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfig; import org.xbib.netty.http.xmlrpc.client.XmlRpcClientConfigImpl; @@ -18,6 +19,8 @@ import org.xbib.netty.http.xmlrpc.server.PropertyHandlerMapping; import org.xbib.netty.http.xmlrpc.server.XmlRpcHandlerMapping; import org.xml.sax.SAXException; +import javax.servlet.ServletException; + /** * Abstract base class for deriving test cases. */ @@ -31,14 +34,14 @@ public abstract class XmlRpcTestCase extends TestCase { return pProvider.getConfig(); } - protected XmlRpcClientConfig getExConfig(ClientProvider pProvider) throws Exception { + XmlRpcClientConfig getExConfig(ClientProvider pProvider) throws Exception { XmlRpcClientConfigImpl config = getConfig(pProvider); config.setEnabledForExtensions(true); config.setEnabledForExceptions(true); return config; } - protected XmlRpcHandlerMapping getHandlerMapping(String pResource) throws IOException, XmlRpcException { + XmlRpcHandlerMapping getHandlerMapping(String pResource) throws IOException, XmlRpcException { PropertyHandlerMapping mapping = new PropertyHandlerMapping(); mapping.setVoidMethodEnabled(true); mapping.load(getClass().getClassLoader(), getClass().getResource(pResource)); @@ -49,27 +52,29 @@ public abstract class XmlRpcTestCase extends TestCase { protected ClientProvider[] initProviders(XmlRpcHandlerMapping pMapping) throws ServletException, IOException { return new ClientProvider[]{ new LocalTransportProvider(pMapping), - new LocalStreamTransportProvider(pMapping), - new LiteTransportProvider(pMapping, true), - // new LiteTransportProvider(mapping, false), Doesn't support HTTP/1.1 - new SunHttpTransportProvider(pMapping, true), - new SunHttpTransportProvider(pMapping, false), - new CommonsProvider(pMapping), - new ServletWebServerProvider(pMapping, true), - new ServletWebServerProvider(pMapping, false) + //new LocalStreamTransportProvider(pMapping), + //new LiteTransportProvider(pMapping, true), + //// new LiteTransportProvider(mapping, false), Doesn't support HTTP/1.1 + //new SunHttpTransportProvider(pMapping, true), + //new SunHttpTransportProvider(pMapping, false), + //new CommonsProvider(pMapping), + //new ServletWebServerProvider(pMapping, true), + //new ServletWebServerProvider(pMapping, false) }; } + @Override public void setUp() throws Exception { if (providers == null) { providers = initProviders(getHandlerMapping()); } } - public void tearDown() throws Exception { + @Override + public void tearDown() throws IOException { if (providers != null) { - for (int i = 0; i < providers.length; i++) { - providers[i].shutdown(); + for (ClientProvider provider : providers) { + provider.shutdown(); } } } diff --git a/netty-http-xmlrpc-client/src/test/resources/logging.properties b/netty-http-xmlrpc-client/src/test/resources/logging.properties new file mode 100644 index 0000000..b955428 --- /dev/null +++ b/netty-http-xmlrpc-client/src/test/resources/logging.properties @@ -0,0 +1,5 @@ +handlers = java.util.logging.ConsoleHandler +.level = FINE +java.util.logging.ConsoleHandler.level = FINE +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter +java.util.logging.SimpleFormatter.format = %1$tFT%1$tT.%1$tL%1$tz [%4$-11s] [%3$s] %5$s %6$s%n diff --git a/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/AuthenticationTest.properties b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/AuthenticationTest.properties new file mode 100644 index 0000000..d16d888 --- /dev/null +++ b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/AuthenticationTest.properties @@ -0,0 +1 @@ +org.xbib.netty.http.xmlrpc.client.test.AuthenticationTest$Adder=org.xbib.netty.http.xmlrpc.client.test.AuthenticationTest$AdderImpl diff --git a/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/BaseTest.properties b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/BaseTest.properties new file mode 100644 index 0000000..7a9ed28 --- /dev/null +++ b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/BaseTest.properties @@ -0,0 +1 @@ +Remote=org.xbib.netty.http.xmlrpc.client.test.BaseTest$Remote diff --git a/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/DynamicProxyTest.properties b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/DynamicProxyTest.properties new file mode 100644 index 0000000..d557968 --- /dev/null +++ b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/DynamicProxyTest.properties @@ -0,0 +1 @@ +org.xbib.netty.http.xmlrpc.client.test.DynamicProxyTest$Adder=org.xbib.netty.http.xmlrpc.client.test.DynamicProxyTest$AdderImpl diff --git a/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/JiraTest.properties b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/JiraTest.properties new file mode 100644 index 0000000..77b230a --- /dev/null +++ b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/client/test/JiraTest.properties @@ -0,0 +1,5 @@ +org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC89Handler=org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC89HandlerImpl +org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC96Handler=org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC96Handler +org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC113Handler=org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC113HandlerImpl +org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC115Handler=org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC115Handler +org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC119Handler=org.xbib.netty.http.xmlrpc.client.test.JiraTest$XMLRPC119Handler diff --git a/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/servlet/XmlRpcServlet.properties b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/servlet/XmlRpcServlet.properties new file mode 100644 index 0000000..7a9ed28 --- /dev/null +++ b/netty-http-xmlrpc-client/src/test/resources/org/xbib/netty/http/xmlrpc/servlet/XmlRpcServlet.properties @@ -0,0 +1 @@ +Remote=org.xbib.netty.http.xmlrpc.client.test.BaseTest$Remote diff --git a/netty-http-xmlrpc-server/src/main/java/org/xbib/netty/http/xmlrpc/server/XmlRpcErrorLogger.java b/netty-http-xmlrpc-server/src/main/java/org/xbib/netty/http/xmlrpc/server/XmlRpcErrorLogger.java index 8e9c375..e9ca631 100644 --- a/netty-http-xmlrpc-server/src/main/java/org/xbib/netty/http/xmlrpc/server/XmlRpcErrorLogger.java +++ b/netty-http-xmlrpc-server/src/main/java/org/xbib/netty/http/xmlrpc/server/XmlRpcErrorLogger.java @@ -8,19 +8,20 @@ import java.util.logging.Logger; * error logging. */ public class XmlRpcErrorLogger { + private static final Logger log = Logger.getLogger(XmlRpcErrorLogger.class.getName()); /** * Called to log the given error. */ public void log(String pMessage, Throwable pThrowable) { - log.log(Level.SEVERE, pMessage, pThrowable); + log.log(Level.INFO, pMessage, pThrowable); } /** * Called to log the given error message. */ public void log(String pMessage) { - log.log(Level.SEVERE, pMessage); + log.log(Level.INFO, pMessage); } } diff --git a/netty-http-xmlrpc-server/src/main/java/org/xbib/netty/http/xmlrpc/server/XmlRpcStreamServer.java b/netty-http-xmlrpc-server/src/main/java/org/xbib/netty/http/xmlrpc/server/XmlRpcStreamServer.java index 360e785..433080e 100644 --- a/netty-http-xmlrpc-server/src/main/java/org/xbib/netty/http/xmlrpc/server/XmlRpcStreamServer.java +++ b/netty-http-xmlrpc-server/src/main/java/org/xbib/netty/http/xmlrpc/server/XmlRpcStreamServer.java @@ -5,8 +5,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -34,8 +32,6 @@ import org.xml.sax.XMLReader; public abstract class XmlRpcStreamServer extends XmlRpcServer implements XmlRpcStreamRequestProcessor { - private static final Logger log = Logger.getLogger(XmlRpcStreamServer.class.getName()); - private XmlWriterFactory writerFactory = new DefaultXMLWriterFactory(); private static final XmlRpcErrorLogger theErrorLogger = new XmlRpcErrorLogger(); @@ -173,17 +169,16 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer return false; } - /** Returns, whether the - /** Processes a "connection". The "connection" is an opaque object, which is + /** + * Processes a "connection". The "connection" is an opaque object, which is * being handled by the subclasses. * @param pConfig The request configuration. * @param pConnection The "connection" being processed. * @throws XmlRpcException Processing the request failed. */ - public void execute(XmlRpcStreamRequestConfig pConfig, - ServerStreamConnection pConnection) + @Override + public void execute(XmlRpcStreamRequestConfig pConfig, ServerStreamConnection pConnection) throws XmlRpcException { - log.log(Level.FINE, "execute: ->"); try { Object result; Throwable error; @@ -195,13 +190,18 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer istream.close(); istream = null; error = null; - log.log(Level.FINE, "execute: Request performed successfully"); } catch (Throwable t) { logError(t); result = null; error = t; } finally { - if (istream != null) { try { istream.close(); } catch (Throwable ignore) {} } + if (istream != null) { + try { + istream.close(); + } catch (Throwable ignore) { + // + } + } } boolean contentLengthRequired = isContentLengthRequired(pConfig); ByteArrayOutputStream baos; @@ -223,7 +223,13 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer ostream.close(); ostream = null; } finally { - if (ostream != null) { try { ostream.close(); } catch (Throwable ignore) {} } + if (ostream != null) { + try { + ostream.close(); + } catch (Throwable ignore) { + + } + } } if (baos != null) { OutputStream dest = getOutputStream(pConfig, pConnection, baos.size()); @@ -232,18 +238,27 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer dest.close(); dest = null; } finally { - if (dest != null) { try { dest.close(); } catch (Throwable ignore) {} } + if (dest != null) { + try { + dest.close(); + } catch (Throwable ignore) { + + } + } } } pConnection.close(); pConnection = null; } catch (IOException e) { - throw new XmlRpcException("I/O error while processing request: " - + e.getMessage(), e); + throw new XmlRpcException("I/O error while processing request: " + e.getMessage(), e); } finally { - if (pConnection != null) { try { pConnection.close(); } catch (Throwable ignore) {} } + if (pConnection != null) { + try { + pConnection.close(); } catch (Throwable ignore) { + + } + } } - log.log(Level.FINE, "execute: <-"); } protected void logError(Throwable t) { diff --git a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/Connection.java b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/Connection.java index 8c44b9f..0e7023a 100644 --- a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/Connection.java +++ b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/Connection.java @@ -14,30 +14,40 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.UnsupportedEncodingException; import java.net.Socket; import java.net.SocketException; import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Map; import java.util.StringTokenizer; +import java.util.logging.Level; +import java.util.logging.Logger; - -/** Handler for a single clients connection. This implementation +/** + * Handler for a single clients connection. This implementation * is able to do HTTP keepalive. In other words, it can serve * multiple requests via a single, physical connection. */ public class Connection implements ThreadPool.InterruptableTask, ServerStreamConnection { - private static final String US_ASCII = "US-ASCII"; + + private static final Logger logger = Logger.getLogger(Connection.class.getName()); + private static final byte[] ctype = toHTTPBytes("Content-Type: text/xml\r\n"); + private static final byte[] clength = toHTTPBytes("Content-Length: "); + private static final byte[] newline = toHTTPBytes("\r\n"); + private static final byte[] doubleNewline = toHTTPBytes("\r\n\r\n"); + private static final byte[] conkeep = toHTTPBytes("Connection: Keep-Alive\r\n"); + private static final byte[] conclose = toHTTPBytes("Connection: close\r\n"); + private static final byte[] ok = toHTTPBytes(" 200 OK\r\n"); + private static final byte[] serverName = toHTTPBytes("Server: Apache XML-RPC 1.0\r\n"); + private static final byte[] wwwAuthenticate = toHTTPBytes("WWW-Authenticate: Basic realm=XML-RPC\r\n"); private static abstract class RequestException extends IOException { @@ -48,6 +58,7 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon super(pMessage); requestData = pData; } + RequestData getRequestData() { return requestData; } } @@ -109,10 +120,12 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon * Closing the input stream must not occur, because * that would close the whole socket. So we suppress it. */ - public void close() throws IOException { + @Override + public void close() { } }; output = new BufferedOutputStream(socket.getOutputStream()); + headers = new LinkedHashMap<>(); } /** Returns the connections request configuration by @@ -122,41 +135,36 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon */ private RequestData getRequestConfig() throws IOException { requestData = new RequestData(this); - if (headers != null) { - headers.clear(); - } + headers.clear(); firstByte = true; XmlRpcHttpServerConfig serverConfig = (XmlRpcHttpServerConfig) server.getConfig(); requestData.setBasicEncoding(serverConfig.getBasicEncoding()); requestData.setContentLengthOptional(serverConfig.isContentLengthOptional()); requestData.setEnabledForExtensions(serverConfig.isEnabledForExtensions()); requestData.setEnabledForExceptions(serverConfig.isEnabledForExceptions()); - - // reset user authentication String line = readLine(); if (line == null && firstByte) { return null; } - // Netscape sends an extra \n\r after bodypart, swallow it if (line != null && line.length() == 0) { line = readLine(); if (line == null || line.length() == 0) { return null; } } - - // tokenize first line of HTTP request - StringTokenizer tokens = new StringTokenizer(line); - String method = tokens.nextToken(); - if (!"POST".equalsIgnoreCase(method)) { - throw new BadRequestException(requestData, method); + if (line != null) { + StringTokenizer tokens = new StringTokenizer(line); + String method = tokens.nextToken(); + if (!"POST".equalsIgnoreCase(method)) { + throw new BadRequestException(requestData, method); + } + requestData.setMethod(method); + tokens.nextToken(); // Skip URI + String httpVersion = tokens.nextToken(); + requestData.setHttpVersion(httpVersion); + requestData.setKeepAlive(serverConfig.isKeepAliveEnabled() + && WebServer.HTTP_11.equals(httpVersion)); } - requestData.setMethod(method); - tokens.nextToken(); // Skip URI - String httpVersion = tokens.nextToken(); - requestData.setHttpVersion(httpVersion); - requestData.setKeepAlive(serverConfig.isKeepAliveEnabled() - && WebServer.HTTP_11.equals(httpVersion)); do { line = readLine(); if (line != null) { @@ -166,7 +174,7 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon requestData.setContentLength(Integer.parseInt(cLength.trim())); } else if (lineLower.startsWith("connection:")) { requestData.setKeepAlive(serverConfig.isKeepAliveEnabled() - && lineLower.indexOf("keep-alive") > -1); + && lineLower.contains("keep-alive")); } else if (lineLower.startsWith("authorization:")) { String credentials = line.substring("authorization:".length()); HttpUtil.parseAuthorization(requestData, credentials); @@ -180,13 +188,13 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon } } while (line != null && line.length() != 0); - return requestData; } + @Override public void run() { try { - for (int i = 0; ; i++) { + while (true) { RequestData data = getRequestConfig(); if (data == null) { break; @@ -203,16 +211,28 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon writeErrorHeader(e.requestData, e, -1); output.flush(); } catch (IOException e1) { - /* Ignore me */ + logger.log(Level.WARNING, e1.getMessage(), e1); } } catch (Throwable t) { if (!shuttingDown) { webServer.log(t); } } finally { - try { output.close(); } catch (Throwable ignore) {} - try { input.close(); } catch (Throwable ignore) {} - try { socket.close(); } catch (Throwable ignore) {} + try { + output.close(); + } catch (Throwable ignore) { + // + } + try { + input.close(); + } catch (Throwable ignore) { + // + } + try { + socket.close(); + } catch (Throwable ignore) { + // + } } } @@ -243,7 +263,7 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon throw new IOException("HTTP Header too long"); } } - return new String(buffer, 0, count, US_ASCII); + return new String(buffer, 0, count, StandardCharsets.US_ASCII); } /** Writes the response header and the response to the @@ -365,12 +385,11 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon * Sets a response header value. */ public void setResponseHeader(String pHeader, String[] pValue) { - if (headers != null) { - headers.put(pHeader, pValue); - } + headers.put(pHeader, pValue); } - public OutputStream newOutputStream() throws IOException { + @Override + public OutputStream newOutputStream() { boolean useContentLength; useContentLength = !requestData.isEnabledForExtensions() || !((XmlRpcHttpRequestConfig) requestData).isContentLengthOptional(); @@ -381,7 +400,8 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon } } - public InputStream newInputStream() throws IOException { + @Override + public InputStream newInputStream() { int contentLength = requestData.getContentLength(); if (contentLength == -1) { return input; @@ -390,9 +410,11 @@ public class Connection implements ThreadPool.InterruptableTask, ServerStreamCon } } - public void close() throws IOException { + @Override + public void close() { } + @Override public void shutdown() throws Throwable { shuttingDown = true; socket.close(); diff --git a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/HttpServletRequestImpl.java b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/HttpServletRequestImpl.java index 182baaa..be66bba 100644 --- a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/HttpServletRequestImpl.java +++ b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/HttpServletRequestImpl.java @@ -131,19 +131,18 @@ public class HttpServletRequestImpl implements HttpServletRequest { void readHttpHeaders() throws IOException { byte[] buffer = new byte[2048]; String line = readLine(buffer); - StringTokenizer tokens = - line != null ? new StringTokenizer(line) : null; + StringTokenizer tokens = line != null ? new StringTokenizer(line) : null; if (tokens == null || !tokens.hasMoreTokens()) { - throw new ServletWebServer.Exception(400, "Bad Request", "Unable to parse requests first line (should" + + throw new ServletWebServer.ServletWebServerException(400, "Bad Request", "Unable to parse requests first line (should" + " be 'METHOD uri HTTP/version', was empty."); } method = tokens.nextToken(); if (!"POST".equalsIgnoreCase(method)) { - throw new ServletWebServer.Exception(400, "Bad Request", "Expected 'POST' method, got " + + throw new ServletWebServer.ServletWebServerException(400, "Bad Request", "Expected 'POST' method, got " + method); } if (!tokens.hasMoreTokens()) { - throw new ServletWebServer.Exception(400, "Bad Request", "Unable to parse requests first line (should" + + throw new ServletWebServer.ServletWebServerException(400, "Bad Request", "Unable to parse requests first line (should" + " be 'METHOD uri HTTP/version', was: " + line); } String u = tokens.nextToken(); @@ -155,26 +154,23 @@ public class HttpServletRequestImpl implements HttpServletRequest { uri = u; queryString = null; } - String httpVersion; if (tokens.hasMoreTokens()) { String v = tokens.nextToken().toUpperCase(); if (tokens.hasMoreTokens()) { - throw new ServletWebServer.Exception(400, "Bad Request", "Unable to parse requests first line (should" + - " be 'METHOD uri HTTP/version', was: " + line); + throw new ServletWebServer.ServletWebServerException(400, "Bad Request", + "Unable to parse requests first line (should" + " be 'METHOD uri HTTP/version', was: " + line); } else { int index = v.indexOf('/'); if (index == -1) { - throw new ServletWebServer.Exception(400, "Bad Request", "Unable to parse requests first line (should" + - " be 'METHOD uri HTTP/version', was: " + line); + throw new ServletWebServer.ServletWebServerException(400, "Bad Request", + "Unable to parse requests first line (should" + " be 'METHOD uri HTTP/version', was: " + line); } protocol = v.substring(0, index).toUpperCase(); - httpVersion = v.substring(index + 1); } } else { - httpVersion = "1.0"; protocol = "HTTP"; } - for (;;) { + while (true) { line = HttpUtil.readLine(istream, buffer); if (line.length() == 0) { break; @@ -183,8 +179,8 @@ public class HttpServletRequestImpl implements HttpServletRequest { if (off > 0) { addHeader(line.substring(0, off), line.substring(off + 1).trim()); } else { - throw new ServletWebServer.Exception(400, "Bad Request", "Unable to parse header line: " + - line); + throw new ServletWebServer.ServletWebServerException(400, "Bad Request", + "Unable to parse header line: " + line); } } contentBytesRemaining = getIntHeader("content-length"); @@ -196,7 +192,7 @@ public class HttpServletRequestImpl implements HttpServletRequest { return null; } if (res == pBuffer.length && pBuffer[pBuffer.length - 1] != '\n') { - throw new ServletWebServer.Exception(400, "Bad Request", + throw new ServletWebServer.ServletWebServerException(400, "Bad Request", "maximum header size of " + pBuffer.length + " characters exceeded"); } return new String(pBuffer, 0, res, StandardCharsets.US_ASCII); @@ -242,7 +238,7 @@ public class HttpServletRequestImpl implements HttpServletRequest { public String getHeader(String pHeader) { String key = pHeader.toLowerCase(); String[] strings = headers.get(key); - return strings != null ? strings[0] : null; + return strings != null && strings.length > 0 ? strings[0] : null; } @Override @@ -253,7 +249,9 @@ public class HttpServletRequestImpl implements HttpServletRequest { @Override public Enumeration getHeaders(String pHeader) { String key = pHeader.toLowerCase(); - return Collections.enumeration(Arrays.asList(headers.get(key))); + String[] values = headers.get(key); + return values != null && values.length > 0 ? + Collections.enumeration(Arrays.asList(values)) : Collections.emptyEnumeration(); } @Override diff --git a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/HttpServletResponseImpl.java b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/HttpServletResponseImpl.java index 0b19b30..d09f946 100644 --- a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/HttpServletResponseImpl.java +++ b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/HttpServletResponseImpl.java @@ -28,8 +28,6 @@ public class HttpServletResponseImpl implements HttpServletResponse { static final int BUFFER_SIZE = 8192; - private final Socket socket; - private final OutputStream ostream; private final Map headers = new HashMap<>(); @@ -50,9 +48,8 @@ public class HttpServletResponseImpl implements HttpServletResponse { * @param pSocket The clients socket. * @throws IOException Accessing the sockets output stream failed. */ - public HttpServletResponseImpl(Socket pSocket) throws IOException { - socket = pSocket; - ostream = socket.getOutputStream(); + HttpServletResponseImpl(Socket pSocket) throws IOException { + ostream = pSocket.getOutputStream(); } @Override @@ -79,7 +76,7 @@ public class HttpServletResponseImpl implements HttpServletResponse { public String getHeader(String pHeader) { String key = pHeader.toLowerCase(); String[] strings = headers.get(key); - return strings != null ? strings[0] : null; + return strings != null && strings.length > 0 ? strings[0] : null; } @Override @@ -125,8 +122,7 @@ public class HttpServletResponseImpl implements HttpServletResponse { sendError(pStatusCode, pMessage, null); } - protected void sendError(int pStatusCode, String pMessage, String pDescription) - throws IOException { + protected void sendError(int pStatusCode, String pMessage, String pDescription) throws IOException { if (isCommitted()) { throw new IllegalStateException("Can't send an error message, if the response has already been committed."); } diff --git a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ServletConnection.java b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ServletConnection.java index 4318977..f9b16a2 100644 --- a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ServletConnection.java +++ b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ServletConnection.java @@ -5,27 +5,31 @@ import java.net.Socket; import javax.servlet.http.HttpServlet; -/** {@link ServletWebServer ServletWebServer's} - * {@link ThreadPool.Task} for handling a single +/** {@link ServletWebServer ServletWebServer's} {@link Runnable} for handling a single * servlet connection. */ public class ServletConnection implements ThreadPool.InterruptableTask { + private final HttpServlet servlet; + private final Socket socket; + private final HttpServletRequestImpl request; + private final HttpServletResponseImpl response; - private boolean shuttingDown; + + private boolean shuttingDown; /** Creates a new instance. * @param pServlet The servlet, which ought to handle the request. * @param pSocket The socket, to which the client is connected. * @throws IOException */ - public ServletConnection(HttpServlet pServlet, Socket pSocket) throws IOException { + ServletConnection(HttpServlet pServlet, Socket pSocket) throws IOException { servlet = pServlet; socket = pSocket; - request = new HttpServletRequestImpl(socket); - response = new HttpServletResponseImpl(socket); + request = new HttpServletRequestImpl(pSocket); + response = new HttpServletResponseImpl(pSocket); } @Override @@ -40,6 +44,7 @@ public class ServletConnection implements ThreadPool.InterruptableTask { } } + @Override public void shutdown() throws Throwable { shuttingDown = true; socket.close(); diff --git a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ServletWebServer.java b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ServletWebServer.java index 60e84aa..0a4e0b6 100644 --- a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ServletWebServer.java +++ b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ServletWebServer.java @@ -29,46 +29,12 @@ import javax.servlet.http.HttpServlet; * org/apache/xmlrpc/server/webserver/XmlRpcServlet.properties.

*
  *   final int port = 8088;
- *
  *   XmlRpcServlet servlet = new XmlRpcServlet();
  *   ServletWebServer webServer = new ServletWebServer(servlet, port);
  *   webServer.start();
  * 
*/ public class ServletWebServer extends WebServer { - /** This exception is thrown by the request handling classes, - * advising the server, that it should return an error response. - */ - public static class Exception extends IOException { - private static final long serialVersionUID = 49879832748972394L; - private final int statusCode; - private final String description; - - /** Creates a new instance. - * @param pStatusCode The HTTP status code being sent to the client. - * @param pMessage The HTTP status message being sent to the client. - * @param pDescription The error description being sent to the client - * in the response body. - */ - public Exception(int pStatusCode, String pMessage, String pDescription) { - super(pMessage); - statusCode = pStatusCode; - description = pDescription; - } - - public String getMessage() { return statusCode + " " + super.getMessage(); } - - /** Returns the error description. The server will send the description - * as plain text in the response body. - * @return The error description. - */ - public String getDescription() { return description; } - - /** Returns the HTTP status code. - * @return The status code. - */ - public int getStatusCode() { return statusCode; } - } private final HttpServlet servlet; @@ -91,22 +57,34 @@ public class ServletWebServer extends WebServer { * @param pAddr The servers IP address. * @throws ServletException Initializing the servlet failed. */ - public ServletWebServer(HttpServlet pServlet, int pPort, InetAddress pAddr) - throws ServletException { + public ServletWebServer(HttpServlet pServlet, int pPort, InetAddress pAddr) throws ServletException { super(pPort, pAddr); servlet = pServlet; - servlet.init(new ServletConfig(){ + servlet.init(new ServletConfig() { + + @Override public String getServletName() { return servlet.getClass().getName(); } + + @Override public ServletContext getServletContext() { throw new IllegalStateException("Context not available"); } + + @Override public String getInitParameter(String pArg0) { return null; } + @Override public Enumeration getInitParameterNames() { return new Enumeration(){ - public boolean hasMoreElements() { return false; } + + @Override + public boolean hasMoreElements() { + return false; + } + + @Override public String nextElement() { throw new NoSuchElementException(); } @@ -122,4 +100,42 @@ public class ServletWebServer extends WebServer { Socket pSocket) throws IOException { return new ServletConnection(servlet, pSocket); } + + /** This exception is thrown by the request handling classes, + * advising the server, that it should return an error response. + */ + public static class ServletWebServerException extends IOException { + + private static final long serialVersionUID = 49879832748972394L; + + private final int statusCode; + + private final String description; + + /** Creates a new instance. + * @param pStatusCode The HTTP status code being sent to the client. + * @param pMessage The HTTP status message being sent to the client. + * @param pDescription The error description being sent to the client + * in the response body. + */ + ServletWebServerException(int pStatusCode, String pMessage, String pDescription) { + super(pMessage); + statusCode = pStatusCode; + description = pDescription; + } + + public String getMessage() { return statusCode + " " + super.getMessage(); } + + /** Returns the error description. The server will send the description + * as plain text in the response body. + * @return The error description. + */ + public String getDescription() { return description; } + + /** Returns the HTTP status code. + * @return The status code. + */ + public int getStatusCode() { return statusCode; } + } + } diff --git a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ThreadPool.java b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ThreadPool.java index d13706d..b137e8d 100644 --- a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ThreadPool.java +++ b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/ThreadPool.java @@ -2,6 +2,8 @@ package org.xbib.netty.http.xmlrpc.servlet; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** Simple thread pool. A task is executed by obtaining a thread from * the pool @@ -11,50 +13,54 @@ public class ThreadPool { /** A task, which may be interrupted, if the pool is shutting down. */ public interface InterruptableTask extends Runnable { + /** Interrupts the task. * @throws Throwable Shutting down the task failed. */ void shutdown() throws Throwable; } - private class Poolable extends Thread implements Runnable{ + private class Poolable extends Thread implements Runnable { - private volatile boolean shuttingDown; + private final Logger logger = Logger.getLogger(Poolable.class.getName()); + + private volatile boolean shuttingDown; private Runnable task; Poolable(ThreadGroup pGroup, int pNum) { - super(pGroup, pGroup.getName() + "-" + pNum); - super.start(); - } + super(pGroup, pGroup.getName() + "-" + pNum); + super.start(); + } - @Override - public void run() { - while (!shuttingDown) { - final Runnable t = getTask(); - if (t == null) { - try { - synchronized (this) { - if (!shuttingDown && getTask() == null) { - wait(); - } - } - } catch (InterruptedException e) { - // Do nothing - } - } else { - try { - t.run(); - resetTask(); - repool(Poolable.this); - } catch (Throwable e) { - remove(Poolable.this); - Poolable.this.shutdown(); - resetTask(); - } - } - } - } + @Override + public void run() { + while (!shuttingDown) { + final Runnable t = getTask(); + if (t == null) { + try { + synchronized (this) { + if (!shuttingDown && getTask() == null) { + wait(); + } + } + } catch (InterruptedException e) { + // Do nothing + } + } else { + try { + t.run(); + resetTask(); + repool(Poolable.this); + } catch (Throwable e) { + logger.log(Level.SEVERE, e.getMessage(), e); + remove(Poolable.this); + Poolable.this.shutdown(); + resetTask(); + } + } + } + } synchronized void shutdown() { shuttingDown = true; @@ -88,7 +94,7 @@ public class ThreadPool { } } - private final ThreadGroup threadGroup; + private final ThreadGroup threadGroup; private final int maxSize; @@ -101,66 +107,66 @@ public class ThreadPool { private int num; - /** Creates a new instance. - * @param pMaxSize Maximum number of concurrent threads. - * @param pName Thread group name. - */ - public ThreadPool(int pMaxSize, String pName) { - maxSize = pMaxSize; - threadGroup = new ThreadGroup(pName); - } + /** Creates a new instance. + * @param pMaxSize Maximum number of concurrent threads. + * @param pName Thread group name. + */ + public ThreadPool(int pMaxSize, String pName) { + maxSize = pMaxSize; + threadGroup = new ThreadGroup(pName); + } - private synchronized void remove(Poolable pPoolable) { + private synchronized void remove(Poolable pPoolable) { runningThreads.remove(pPoolable); waitingThreads.remove(pPoolable); - } + } - private void repool(Poolable pPoolable) { - boolean discarding = false; - Runnable task = null; - Poolable poolable = null; - synchronized (this) { - if (runningThreads.remove(pPoolable)) { - if (maxSize != 0 && runningThreads.size() + waitingThreads.size() >= maxSize) { - discarding = true; - } else { - waitingThreads.add(pPoolable); - if (waitingTasks.size() > 0) { - task = waitingTasks.remove(waitingTasks.size() - 1); - poolable = getPoolable(task, false); - } - } - } else { - discarding = true; - } - if (discarding) { - remove(pPoolable); - } - } - if (poolable != null) { - poolable.start(task); - } - if (discarding) { - pPoolable.shutdown(); - } - } + private void repool(Poolable pPoolable) { + boolean discarding = false; + Runnable task = null; + Poolable poolable = null; + synchronized (this) { + if (runningThreads.remove(pPoolable)) { + if (maxSize != 0 && runningThreads.size() + waitingThreads.size() >= maxSize) { + discarding = true; + } else { + waitingThreads.add(pPoolable); + if (waitingTasks.size() > 0) { + task = waitingTasks.remove(waitingTasks.size() - 1); + poolable = getPoolable(task, false); + } + } + } else { + discarding = true; + } + if (discarding) { + remove(pPoolable); + } + } + if (poolable != null) { + poolable.start(task); + } + if (discarding) { + pPoolable.shutdown(); + } + } - /** - * Starts a task immediately. - * @param pTask The task being started. - * @return True, if the task could be started immediately. False, if - * the maxmimum number of concurrent tasks was exceeded. - */ - public boolean startTask(Runnable pTask) { - final Poolable poolable = getPoolable(pTask, false); - if (poolable == null) { - return false; - } - poolable.start(pTask); - return true; - } + /** + * Starts a task immediately. + * @param pTask The task being started. + * @return True, if the task could be started immediately. False, if + * the maxmimum number of concurrent tasks was exceeded. + */ + public boolean startTask(Runnable pTask) { + final Poolable poolable = getPoolable(pTask, false); + if (poolable == null) { + return false; + } + poolable.start(pTask); + return true; + } - private synchronized Poolable getPoolable(Runnable pTask, boolean pQueue) { + private synchronized Poolable getPoolable(Runnable pTask, boolean pQueue) { if (maxSize != 0 && runningThreads.size() >= maxSize) { if (pQueue) { waitingTasks.add(pTask); @@ -175,28 +181,28 @@ public class ThreadPool { } runningThreads.add(poolable); return poolable; - } - - /** - * Adds a task for immediate or deferred execution. - * @param pTask The task being added. - * @return True, if the task was started immediately. False, if - * the task will be executed later. - * @deprecated No longer in use. - */ - @Deprecated - public boolean addTask(Runnable pTask) { - final Poolable poolable = getPoolable(pTask, true); - if (poolable != null) { - poolable.start(pTask); - return true; - } - return false; - } + } - /** Closes the pool. - */ - public synchronized void shutdown() { + /** + * Adds a task for immediate or deferred execution. + * @param pTask The task being added. + * @return True, if the task was started immediately. False, if + * the task will be executed later. + * @deprecated No longer in use. + */ + @Deprecated + public boolean addTask(Runnable pTask) { + final Poolable poolable = getPoolable(pTask, true); + if (poolable != null) { + poolable.start(pTask); + return true; + } + return false; + } + + /** Closes the pool. + */ + public synchronized void shutdown() { while (!waitingThreads.isEmpty()) { Poolable poolable = (Poolable) waitingThreads.remove(waitingThreads.size()-1); poolable.shutdown(); @@ -205,15 +211,15 @@ public class ThreadPool { Poolable poolable = (Poolable) runningThreads.remove(runningThreads.size()-1); poolable.shutdown(); } - } + } - /** Returns the maximum number of concurrent threads. - * @return Maximum number of threads. - */ - public int getMaxThreads() { return maxSize; } + /** Returns the maximum number of concurrent threads. + * @return Maximum number of threads. + */ + public int getMaxThreads() { return maxSize; } - /** Returns the number of threads, which have actually been created, + /** Returns the number of threads, which have actually been created, * as opposed to the number of currently running threads. - */ + */ public synchronized int getNumThreads() { return num; } } diff --git a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/WebServer.java b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/WebServer.java index 9d9bfd6..241b26e 100644 --- a/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/WebServer.java +++ b/netty-http-xmlrpc-servlet/src/main/java/org/xbib/netty/http/xmlrpc/servlet/WebServer.java @@ -5,11 +5,9 @@ import org.xbib.netty.http.xmlrpc.server.XmlRpcStreamServer; import java.io.IOException; import java.io.InterruptedIOException; -import java.net.BindException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; -import java.net.SocketException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; @@ -52,50 +50,9 @@ import java.util.StringTokenizer; */ public class WebServer implements Runnable { - private class AddressMatcher { + protected ServerSocket serverSocket; - private final int[] pattern; - - AddressMatcher(String pAddress) { - try { - pattern = new int[4]; - StringTokenizer st = new StringTokenizer(pAddress, "."); - if (st.countTokens() != 4) { - throw new IllegalArgumentException(); - } - for (int i = 0; i < 4; i++) { - String next = st.nextToken(); - if ("*".equals(next)) { - pattern[i] = 256; - } else { - /* Note: *Not* pattern[i] = Integer.parseInt(next); - * See XMLRPC-145 - */ - pattern[i] = (byte) Integer.parseInt(next); - } - } - } catch (Exception e) { - throw new IllegalArgumentException("\"" + pAddress - + "\" does not represent a valid IP address"); - } - } - - boolean matches(byte[] pAddress) { - for (int i = 0; i < 4; i++) { - if (pattern[i] > 255) { - continue; // Wildcard - } - if (pattern[i] != pAddress[i]) { - return false; - } - } - return true; - } - } - - protected ServerSocket serverSocket; - - private Thread listener; + private final WebServerThread webServerThread; private ThreadPool pool; @@ -105,304 +62,335 @@ public class WebServer implements Runnable { protected final XmlRpcStreamServer server = newXmlRpcStreamServer(); - protected XmlRpcStreamServer newXmlRpcStreamServer(){ - return new ConnectionServer(); - } + protected XmlRpcStreamServer newXmlRpcStreamServer(){ + return new ConnectionServer(); + } - // Inputs to setupServerSocket() - private InetAddress address; - private int port; - - private boolean paranoid; - - static final String HTTP_11 = "HTTP/1.1"; - /** Creates a web server at the specified port number. - * @param pPort Port number; 0 for a random port, choosen by the - * operating system. - */ - public WebServer(int pPort) { - this(pPort, null); - } - - /** Creates a web server at the specified port number and IP address. - * @param pPort Port number; 0 for a random port, choosen by the - * operating system. - * @param pAddr Local IP address; null for all available IP addresses. - */ - public WebServer(int pPort, InetAddress pAddr) { - address = pAddr; - port = pPort; - } - - /** - * Factory method to manufacture the server socket. Useful as a - * hook method for subclasses to override when they desire - * different flavor of socket (i.e. a SSLServerSocket). - * - * @param pPort Port number; 0 for a random port, choosen by the operating - * system. - * @param backlog - * @param addr If null, binds to - * INADDR_ANY, meaning that all network interfaces on - * a multi-homed host will be listening. - * @exception IOException Error creating listener socket. - */ - protected ServerSocket createServerSocket(int pPort, int backlog, InetAddress addr) - throws IOException { - return new ServerSocket(pPort, backlog, addr); - } - - /** - * Initializes this server's listener socket with the specified - * attributes, assuring that a socket timeout has been set. The - * {@link #createServerSocket(int, int, InetAddress)} method can - * be overridden to change the flavor of socket used. - * - * @see #createServerSocket(int, int, InetAddress) - */ - private synchronized void setupServerSocket(int backlog) throws IOException { - // Since we can't reliably set SO_REUSEADDR until JDK 1.4 is - // the standard, try to (re-)open the server socket several - // times. Some OSes (Linux and Solaris, for example), hold on - // to listener sockets for a brief period of time for security - // reasons before relinquishing their hold. - for (int i = 1; ; i++) { - try { - serverSocket = createServerSocket(port, backlog, address); - // A socket timeout must be set. - if (serverSocket.getSoTimeout() <= 0) { - serverSocket.setSoTimeout(4096); - } - return; - } catch (BindException e) { - if (i == 10) { - throw e; - } else { - long waitUntil = System.currentTimeMillis() + 1000; - for (;;) { - long l = waitUntil - System.currentTimeMillis(); - if (l > 0) { - try { - Thread.sleep(l); - } catch (InterruptedException ex) { - } - } else { - break; + // Inputs to setupServerSocket() + private InetAddress address; + + private int port; + + private boolean paranoid; + + static final String HTTP_11 = "HTTP/1.1"; + /** Creates a web server at the specified port number. + * @param pPort Port number; 0 for a random port, choosen by the + * operating system. + */ + public WebServer(int pPort) { + this(pPort, null); + } + + /** Creates a web server at the specified port number and IP address. + * @param pPort Port number; 0 for a random port, choosen by the + * operating system. + * @param pAddr Local IP address; null for all available IP addresses. + */ + public WebServer(int pPort, InetAddress pAddr) { + address = pAddr; + port = pPort; + webServerThread = new WebServerThread(this, "XML-RPC Weblistener"); + } + + /** + * Factory method to manufacture the server socket. Useful as a + * hook method for subclasses to override when they desire + * different flavor of socket (i.e. a SSLServerSocket). + * + * @param pPort Port number; 0 for a random port, choosen by the operating + * system. + * @param backlog + * @param addr If null, binds to + * INADDR_ANY, meaning that all network interfaces on + * a multi-homed host will be listening. + * @exception IOException Error creating listener socket. + */ + protected ServerSocket createServerSocket(int pPort, int backlog, InetAddress addr) + throws IOException { + return new ServerSocket(pPort, backlog, addr); + } + + /** + * Initializes this server's listener socket with the specified + * attributes, assuring that a socket timeout has been set. The + * {@link #createServerSocket(int, int, InetAddress)} method can + * be overridden to change the flavor of socket used. + * + * @see #createServerSocket(int, int, InetAddress) + */ + private synchronized void setupServerSocket(int backlog) throws IOException { + serverSocket = createServerSocket(port, backlog, address); + // A socket timeout must be set. + if (serverSocket.getSoTimeout() <= 0) { + serverSocket.setSoTimeout(4096); + } + } + + /** + * Spawns a new thread which binds this server to the port it's + * configured to accept connections on. + * + * @see #run() + * @throws IOException Binding the server socket failed. + */ + public void start() throws IOException { + setupServerSocket(50); + // Not marked as daemon thread since run directly via main(). + webServerThread.start(); + } + + /** + * Switch client filtering on/off. + * @param pParanoid True to enable filtering, false otherwise. + * @see #acceptClient(String) + * @see #denyClient(String) + */ + public void setParanoid(boolean pParanoid) { + paranoid = pParanoid; + } + + /** + * Returns the client filtering state. + * @return True, if client filtering is enabled, false otherwise. + * @see #acceptClient(String) + * @see #denyClient(String) + */ + protected boolean isParanoid() { + return paranoid; + } + + /** Add an IP address to the list of accepted clients. The parameter can + * contain '*' as wildcard character, e.g. "192.168.*.*". You must call + * setParanoid(true) in order for this to have any effect. + * @param pAddress The IP address being enabled. + * @see #denyClient(String) + * @see #setParanoid(boolean) + * @throws IllegalArgumentException Parsing the address failed. + */ + public void acceptClient(String pAddress) { + accept.add(new AddressMatcher(pAddress)); + } + + /** + * Add an IP address to the list of denied clients. The parameter can + * contain '*' as wildcard character, e.g. "192.168.*.*". You must call + * setParanoid(true) in order for this to have any effect. + * @param pAddress The IP address being disabled. + * @see #acceptClient(String) + * @see #setParanoid(boolean) + * @throws IllegalArgumentException Parsing the address failed. + */ + public void denyClient(String pAddress) { + deny.add(new AddressMatcher(pAddress)); + } + + /** + * Checks incoming connections to see if they should be allowed. + * If not in paranoid mode, always returns true. + * + * @param s The socket to inspect. + * @return Whether the connection should be allowed. + */ + protected boolean allowConnection(Socket s) { + if (!paranoid) { + return true; + } + int l = deny.size(); + byte[] addr = s.getInetAddress().getAddress(); + for (int i = 0; i < l; i++) { + AddressMatcher match = deny.get(i); + if (match.matches(addr)) { + return false; + } + } + l = accept.size(); + for (int i = 0; i < l; i++) { + AddressMatcher match = accept.get(i); + if (match.matches(addr)) { + return true; + } + } + return false; + } + + protected Runnable newTask(WebServer pServer, XmlRpcStreamServer pXmlRpcServer, + Socket pSocket) throws IOException { + return new Connection(pServer, pXmlRpcServer, pSocket); + } + + /** + * Listens for client requests until stopped. Call {@link + * #start()} to invoke this method, and {@link #shutdown()} to + * break out of it. + * + * @throws RuntimeException Generally caused by either an + * UnknownHostException or BindException + * with the vanilla web server. + * + * @see #start() + * @see #shutdown() + */ + @Override + public void run() { + pool = newThreadPool(); + try { + while (!webServerThread.closed) { + if (serverSocket.isClosed()) { + break; + } + Socket socket = null; + try { + socket = serverSocket.accept(); + socket.setTcpNoDelay(true); + if (allowConnection(socket)) { + // set read timeout to 1 seconds + socket.setSoTimeout(1000); + Runnable task = newTask(this, server, socket); + if (pool.startTask(task)) { + socket = null; + } else { + log("Maximum load of " + pool.getMaxThreads() + + " exceeded, rejecting client"); } - } - } - } - } - } - - /** - * Spawns a new thread which binds this server to the port it's - * configured to accept connections on. - * - * @see #run() - * @throws IOException Binding the server socket failed. - */ - public void start() throws IOException { - setupServerSocket(50); - - // The listener reference is released upon shutdown(). - if (listener == null) { - listener = new Thread(this, "XML-RPC Weblistener"); - // Not marked as daemon thread since run directly via main(). - listener.start(); - } - } - - /** - * Switch client filtering on/off. - * @param pParanoid True to enable filtering, false otherwise. - * @see #acceptClient(String) - * @see #denyClient(String) - */ - public void setParanoid(boolean pParanoid) { - paranoid = pParanoid; - } + } + } catch (InterruptedIOException e) { + // + } catch (Throwable t) { + log(t); + throw new RuntimeException(t); + } finally { + if (socket != null) { + try { + log("closing client socket"); + socket.close(); + } catch (Throwable ignore) { - /** - * Returns the client filtering state. - * @return True, if client filtering is enabled, false otherwise. - * @see #acceptClient(String) - * @see #denyClient(String) - */ - protected boolean isParanoid() { - return paranoid; - } - - /** Add an IP address to the list of accepted clients. The parameter can - * contain '*' as wildcard character, e.g. "192.168.*.*". You must call - * setParanoid(true) in order for this to have any effect. - * @param pAddress The IP address being enabled. - * @see #denyClient(String) - * @see #setParanoid(boolean) - * @throws IllegalArgumentException Parsing the address failed. - */ - public void acceptClient(String pAddress) { - accept.add(new AddressMatcher(pAddress)); - } - - /** - * Add an IP address to the list of denied clients. The parameter can - * contain '*' as wildcard character, e.g. "192.168.*.*". You must call - * setParanoid(true) in order for this to have any effect. - * @param pAddress The IP address being disabled. - * @see #acceptClient(String) - * @see #setParanoid(boolean) - * @throws IllegalArgumentException Parsing the address failed. - */ - public void denyClient(String pAddress) { - deny.add(new AddressMatcher(pAddress)); - } - - /** - * Checks incoming connections to see if they should be allowed. - * If not in paranoid mode, always returns true. - * - * @param s The socket to inspect. - * @return Whether the connection should be allowed. - */ - protected boolean allowConnection(Socket s) { - if (!paranoid) { - return true; - } - - int l = deny.size(); - byte[] addr = s.getInetAddress().getAddress(); - for (int i = 0; i < l; i++) { - AddressMatcher match = deny.get(i); - if (match.matches(addr)) - { - return false; - } - } - l = accept.size(); - for (int i = 0; i < l; i++) { - AddressMatcher match = accept.get(i); - if (match.matches(addr)) { - return true; - } - } - return false; - } - - protected Runnable newTask(WebServer pServer, XmlRpcStreamServer pXmlRpcServer, - Socket pSocket) throws IOException { - return new Connection(pServer, pXmlRpcServer, pSocket); - } - - /** - * Listens for client requests until stopped. Call {@link - * #start()} to invoke this method, and {@link #shutdown()} to - * break out of it. - * - * @throws RuntimeException Generally caused by either an - * UnknownHostException or BindException - * with the vanilla web server. - * - * @see #start() - * @see #shutdown() - */ - @Override - public void run() { - pool = newThreadPool(); - try { - while (listener != null) { - try { - Socket socket = serverSocket.accept(); - try { - socket.setTcpNoDelay(true); - } catch (SocketException socketOptEx) { - log(socketOptEx); - } - - try { - if (allowConnection(socket)) { - // set read timeout to 30 seconds - socket.setSoTimeout(30000); - Runnable task = newTask(this, server, socket); - if (pool.startTask(task)) { - socket = null; - } else { - log("Maximum load of " + pool.getMaxThreads() - + " exceeded, rejecting client"); - } - } - } finally { - if (socket != null) { try { socket.close(); } catch (Throwable ignore) {} } - } - } catch (InterruptedIOException checkState) { - // Timeout while waiting for a client (from - // SO_TIMEOUT)...try again if still listening. - } catch (Throwable t) { - log(t); - } - } - } finally { - if (serverSocket != null) { - try { - serverSocket.close(); - } catch (IOException e) { - log(e); - } - } - - // Shutdown our Runner-based threads - pool.shutdown(); - } - } + } + } + } + } + } finally { + pool.shutdown(); + if (serverSocket != null && !serverSocket.isClosed()) { + try { + log("closing server socket"); + serverSocket.close(); + } catch (IOException e) { + log(e); + } + } + } + } protected ThreadPool newThreadPool() { return new ThreadPool(server.getMaxThreads(), "XML-RPC"); } - - /** - * Stop listening on the server port. Shutting down our {@link - * #listener} effectively breaks it out of its {@link #run()} - * loop. - * - * @see #run() - */ - public synchronized void shutdown() { - // Stop accepting client connections - if (listener != null) { - Thread l = listener; - listener = null; - l.interrupt(); - if (pool != null) { - pool.shutdown(); + + /** + * Stop listening on the server port. + * Shutting down our {@link #webServerThread} effectively breaks it out of its {@link #run()} loop. + * + * @see #run() + */ + public synchronized void shutdown() throws IOException { + webServerThread.closed = true; + webServerThread.interrupt(); + // wait for server socket down + while (serverSocket != null && !serverSocket.isClosed()) { + try { + Thread.sleep(25L); + } catch (InterruptedException e) { + // } - } - } - - /** Returns the port, on which the web server is running. - * This method may be invoked after {@link #start()} only. - * @return Servers port number - */ - public int getPort() { return serverSocket.getLocalPort(); } + } + serverSocket = null; + try { + Thread.sleep(25L); + } catch (InterruptedException e) { + // + } + log("shutdown complete"); + } - /** Logs an error. - * @param pError The error being logged. - */ - public void log(Throwable pError) { - final String msg = pError.getMessage() == null ? pError.getClass().getName() : pError.getMessage(); - server.getErrorLogger().log(msg, pError); - } + public boolean isShutDown() { + return serverSocket.isClosed(); + } - /** Logs a message. - * @param pMessage The being logged. - */ - public void log(String pMessage) { + /** Returns the port, on which the web server is running. + * This method may be invoked after {@link #start()} only. + * @return Servers port number + */ + public int getPort() { + return serverSocket.getLocalPort(); + } + + /** Logs an error. + * @param pError The error being logged. + */ + public void log(Throwable pError) { + String msg = pError.getMessage() == null ? pError.getClass().getName() : pError.getMessage(); + server.getErrorLogger().log(msg, pError); + } + + /** Logs a message. + * @param pMessage The being logged. + */ + public void log(String pMessage) { server.getErrorLogger().log(pMessage); - } + } + + /** Returns the {@link XmlRpcServer}. + * @return The server object. + */ + public XmlRpcStreamServer getXmlRpcServer() { + return server; + } + + private class WebServerThread extends Thread { + volatile boolean closed = false; + + WebServerThread(Runnable runnable, String name) { + super(runnable, name); + } + } + + private class AddressMatcher { + + private final int[] pattern; + + AddressMatcher(String pAddress) { + try { + pattern = new int[4]; + StringTokenizer st = new StringTokenizer(pAddress, "."); + if (st.countTokens() != 4) { + throw new IllegalArgumentException(); + } + for (int i = 0; i < 4; i++) { + String next = st.nextToken(); + if ("*".equals(next)) { + pattern[i] = 256; + } else { + pattern[i] = (byte) Integer.parseInt(next); + } + } + } catch (Exception e) { + throw new IllegalArgumentException("\"" + pAddress + + "\" does not represent a valid IP address"); + } + } + + boolean matches(byte[] pAddress) { + for (int i = 0; i < 4; i++) { + if (pattern[i] > 255) { + continue; // Wildcard + } + if (pattern[i] != pAddress[i]) { + return false; + } + } + return true; + } + } - /** Returns the {@link XmlRpcServer}. - * @return The server object. - */ - public XmlRpcStreamServer getXmlRpcServer() { - return server; - } } diff --git a/settings.gradle b/settings.gradle index b6d4758..d1add36 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,7 +3,7 @@ include 'netty-http-client' include 'netty-http-server' include 'netty-http-server-reactive' include 'netty-http-server-rest' -//include 'netty-http-xmlrpc-common' -//include 'netty-http-xmlrpc-server' -//include 'netty-http-xmlrpc-servlet' -//include 'netty-http-xmlrpc-client' +include 'netty-http-xmlrpc-common' +include 'netty-http-xmlrpc-server' +include 'netty-http-xmlrpc-servlet' +include 'netty-http-xmlrpc-client'