You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlrpc-auto@ws.apache.org by jo...@apache.org on 2008/08/05 15:34:53 UTC
svn commit: r682709 - in /webservices/xmlrpc/trunk: ./
common/src/main/java/org/apache/xmlrpc/util/ src/changes/ src/site/apt/
src/site/fml/ tests/src/test/java/org/apache/xmlrpc/test/
Author: jochen
Date: Tue Aug 5 06:34:51 2008
New Revision: 682709
URL: http://svn.apache.org/viewvc?rev=682709&view=rev
Log:
Fixed the FAQ entry for obtaining the clients IP address.
Added:
webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ClientIpTest.java
Modified:
webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java
webservices/xmlrpc/trunk/pom.xml
webservices/xmlrpc/trunk/src/changes/changes.xml
webservices/xmlrpc/trunk/src/site/apt/types.apt
webservices/xmlrpc/trunk/src/site/fml/faq.fml
webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java
webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ServletWebServerProvider.java
Modified: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java?rev=682709&r1=682708&r2=682709&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java (original)
+++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java Tue Aug 5 06:34:51 2008
@@ -147,7 +147,7 @@
* @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. If so, you
- * might consider to use the {@link #addTask(Task)} method instead.
+ * might consider to use the {@link #addTask(ThreadPool.Task)} method instead.
*/
public synchronized boolean startTask(Task pTask) {
if (maxSize != 0 && runningThreads.size() > maxSize) {
Modified: webservices/xmlrpc/trunk/pom.xml
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/pom.xml?rev=682709&r1=682708&r2=682709&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/pom.xml (original)
+++ webservices/xmlrpc/trunk/pom.xml Tue Aug 5 06:34:51 2008
@@ -156,6 +156,10 @@
<email>bkarp@cs.ucl.ac.uk</email>
</contributor>
<contributor>
+ <name>Kay Tiong Khoo</name>
+ <email>kaytiong@gmail.com</email>
+ </contributor>
+ <contributor>
<name>Jimisola Laursen</name>
<email>jimisola@jimisola.com</email>
</contributor>
Modified: webservices/xmlrpc/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/src/changes/changes.xml?rev=682709&r1=682708&r2=682709&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/src/changes/changes.xml (original)
+++ webservices/xmlrpc/trunk/src/changes/changes.xml Tue Aug 5 06:34:51 2008
@@ -26,6 +26,9 @@
Added some clarification on the handling of Object[] and java.util.List to
the page on "XML-RPC Data Types".
</action>
+ <action dev="jochen" type="fix" issue="XMLRPC-157" due-to="Kay Tiong Khoo" due-to-email="kaytiong@gmail.com">
+ Minor grammar improvements.
+ </action>
</release>
<release version="3.1" date="2007-Aug-31">
<action dev="jochen" type="add">
Modified: webservices/xmlrpc/trunk/src/site/apt/types.apt
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/src/site/apt/types.apt?rev=682709&r1=682708&r2=682709&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/src/site/apt/types.apt (original)
+++ webservices/xmlrpc/trunk/src/site/apt/types.apt Tue Aug 5 06:34:51 2008
@@ -39,7 +39,7 @@
| java.util.List | | elements may be any valid data |
| | | type, including another array. |
| | | |
-| | | The server may other arrays (for |
+| | | The server may return other arrays (for
| | | example String[]) or lists (using |
| | | generics). However, the client will |
| | | always return an Object[], because |
Modified: webservices/xmlrpc/trunk/src/site/fml/faq.fml
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/src/site/fml/faq.fml?rev=682709&r1=682708&r2=682709&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/src/site/fml/faq.fml (original)
+++ webservices/xmlrpc/trunk/src/site/fml/faq.fml Tue Aug 5 06:34:51 2008
@@ -204,50 +204,31 @@
<answer>
<p>That's a similar question than the question on initializing handlers.
The main difference is, that in this case you want to initialize the
- handler with any request. So, here's how to do it: First of all,
- we assume that all handlers will implement an interface
- RequestInitializableHandler. This interface has an init method,
- which is being called to receive an object with the clients
- IP address:</p>
+ handler with any request. In other words, you might achieve the goal
+ by creating a RequestProcessorFactoryFactory, that provides the
+ necessary details. However, there is an easier solution, which we
+ will demonstrate here: Use a ThreadLocal.</p>
+ <p>The class ThreadLocal allows to create information at some point
+ in the source code and use this information at one or more completely
+ different and decoupled places. The only assumption is, that you
+ are in the same thread. This is exactly our situation: We create
+ the information when processing of the XML-RPC request starts
+ and read it within the handler.</p>
+ <p>In the example below, you'd obtain the clients IP address by
+ writing <code>ClientInfoServlet.getClientIpAddress()</code>.</p>
<source><![CDATA[
-public class MyConfig extends XmlRpcHttpRequestConfigImpl {
- private String clientIpAddress;
- public String getClientIpAddress() {
- return clientIpAddress;
- }
- public void setClientIpAddress(String pClientIpAddress) {
- clientIpAddress = pClientIpAddress;
- }
-}
+public static class ClientInfoServlet extends XmlRpcServlet {
+ private static ThreadLocal clientIpAddress = new ThreadLocal();
-public interface RequestInitializableRequestProcessor {
- public void init(MyConfig pConfig);
-}
+ public static String getClientIpAddress() {
+ return (String) clientIpAddress.get();
+ }
-public class MyXmlRpcServlet extends XmlRpcServlet {
- protected XmlRpcServletServer newXmlRpcServer(ServletConfig pConfig)
- throws XmlRpcException {
- return new XmlRpcServletServer(){
- protected XmlRpcHttpRequestConfigImpl newConfig(HttpServletRequest pRequest) {
- MyConfig config = new MyConfig();
- config.setClientIpAddress(pRequest.getRemoteAddr());
- return config;
- }
- };
- }
- protected PropertyHandlerMapping newPropertyHandlerMapping(URL url) throws IOException, XmlRpcException {
- PropertyHandlerMapping mapping = super.newPropertyHandlerMapping(url);
- RequestProcessorFactoryFactory factory = new RequestSpecificProcessorFactoryFactory(){
- protected Object getRequestProcessor(Class pClass, XmlRpcRequest pRequest) throws XmlRpcException {
- RequestInitializableRequestProcessor proc =
- (RequestInitializableRequestProcessor) super.getRequestProcessor(pClass, pRequest);
- proc.init((MyConfig) pRequest.getConfig());
- return proc;
- }
- };
- mapping.setRequestProcessorFactoryFactory(factory);
- return mapping;
- }
+ public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse)
+ throws IOException, ServletException {
+ clientIpAddress.set(pRequest.getRemoteAddr());
+ super.doPost(pRequest, pResponse);
+ }
}
]]></source>
</answer>
Added: webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ClientIpTest.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ClientIpTest.java?rev=682709&view=auto
==============================================================================
--- webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ClientIpTest.java (added)
+++ webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ClientIpTest.java Tue Aug 5 06:34:51 2008
@@ -0,0 +1,108 @@
+package org.apache.xmlrpc.test;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import junit.framework.Assert;
+
+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.
+ */
+public class ClientIpTest extends XmlRpcTestCase {
+ public static class ClientInfo {
+ private final String ipAddress;
+
+ public ClientInfo(String pIpAddress) {
+ ipAddress = pIpAddress;
+ }
+
+ public String getIpAddress() {
+ return ipAddress;
+ }
+ }
+
+ public static class ClientInfoServlet extends XmlRpcServlet {
+ private static ThreadLocal clientInfo = new ThreadLocal();
+
+ public static ClientInfo getClientInfo() {
+ return (ClientInfo) clientInfo.get();
+ }
+
+ public void doPost(HttpServletRequest pRequest,
+ HttpServletResponse pResponse) throws IOException,
+ ServletException {
+ clientInfo.set(new ClientInfo(pRequest.getRemoteAddr()));
+ super.doPost(pRequest, pResponse);
+ }
+ }
+
+ private static class ClientIpTestProvider extends ServletWebServerProvider {
+ ClientIpTestProvider(XmlRpcHandlerMapping pMapping, boolean pContentLength)
+ throws ServletException, IOException {
+ super(pMapping, pContentLength);
+ }
+
+ protected XmlRpcServlet newXmlRpcServlet() {
+ return new ClientInfoServlet();
+ }
+ }
+
+ protected ClientProvider[] initProviders(XmlRpcHandlerMapping pMapping)
+ throws ServletException, IOException {
+ return new ClientProvider[]{
+ new ClientIpTestProvider(pMapping, false),
+ new ClientIpTestProvider(pMapping, true)
+ };
+ }
+
+ 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;
+ }
+ };
+ return new XmlRpcHandlerMapping(){
+ public XmlRpcHandler getHandler(String pHandlerName)
+ throws XmlRpcNoSuchHandlerException, XmlRpcException {
+ return handler;
+ }
+ };
+ }
+
+ private void testClientIpAddress(ClientProvider pProvider) throws Exception {
+ final XmlRpcClient client = pProvider.getClient();
+ client.setConfig(getConfig(pProvider));
+ final String ip = (String) client.execute("getIpAddress", new Object[]{});
+ assertEquals("127.0.0.1", ip);
+ }
+
+ /** Test, whether we can invoke a method, returning a byte.
+ * @throws Exception The test failed.
+ */
+ public void testClientIpAddress() throws Exception {
+ for (int i = 0; i < providers.length; i++) {
+ testClientIpAddress(providers[i]);
+ }
+ }
+}
Modified: webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java?rev=682709&r1=682708&r2=682709&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java (original)
+++ webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java Tue Aug 5 06:34:51 2008
@@ -14,12 +14,10 @@
import org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl;
import org.apache.xmlrpc.common.XmlRpcStreamConfig;
import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig;
-import org.apache.xmlrpc.parser.CalendarParser;
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.XmlRpcDateTimeDateFormat;
import org.apache.xmlrpc.util.XmlRpcDateTimeFormat;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
Modified: webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ServletWebServerProvider.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ServletWebServerProvider.java?rev=682709&r1=682708&r2=682709&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ServletWebServerProvider.java (original)
+++ webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ServletWebServerProvider.java Tue Aug 5 06:34:51 2008
@@ -39,6 +39,13 @@
private final boolean contentLength;
private final int port;
+ /**
+ * Creates a new instance of {@link XmlRpcServlet}.
+ */
+ protected XmlRpcServlet newXmlRpcServlet() {
+ return new XmlRpcServlet();
+ }
+
/** Creates a new instance.
* @param pMapping The test servers handler mapping.
* @throws ServletException
@@ -47,7 +54,7 @@
protected ServletWebServerProvider(XmlRpcHandlerMapping pMapping, boolean pContentLength) throws ServletException, IOException {
super(pMapping);
contentLength = pContentLength;
- servlet = new XmlRpcServlet();
+ servlet = newXmlRpcServlet();
webServer = new ServletWebServer(servlet, 0);
XmlRpcServer server = servlet.getXmlRpcServletServer();
server.setHandlerMapping(mapping);