All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.xmlrpc.webserver.ServletWebServer Maven / Gradle / Ivy

There is a newer version: 5.0.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.    
 */
package org.apache.xmlrpc.webserver;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Enumeration;
import java.util.NoSuchElementException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcStreamServer;
import org.apache.xmlrpc.util.ThreadPool;


/**
 * 

This is a subclass of the {@link WebServer}, which offers a minimal * servlet API. It is recommended that you use this class rather than the * {@link WebServer} because it offers a smooth migration path to a full blown * servlet engine.

*

Note that this class has the same limitations as its parent * {@link WebServer} in that it doesn't support HTTP keepalives and it doesn't * support chunked mode requests.

*

Use of the {@link ServletWebServer} goes like this: First of all, * create a servlet. It may be an instance of {@link XmlRpcServlet} or * a subclass thereof. Note, that servlets are stateless: One servlet * may be used by multiple threads (aka requests) concurrently. In * other words, the servlet must not have any instance variables, * other than those which are read only after the servlets * initialization.

*

The XmlRpcServlet is by default using a property file named * org/apache/xmlrpc/server/webserver/XmlRpcServlet.properties. * See the {@link PropertyHandlerMapping} for details on the property * file.

*
 *   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; /** Creates a new instance, which is listening on all * local IP addresses and the given port. * @param pServlet The servlet, which is handling requests. * @param pPort The servers port number; 0 for a random * port being choosen. * @throws ServletException Initializing the servlet failed. */ public ServletWebServer(HttpServlet pServlet, int pPort) throws ServletException { this(pServlet, pPort, null); } /** Creates a new instance, which is listening on the * given IP address and the given port. * @param pServlet The servlet, which is handling requests. * @param pPort The servers port number; 0 for a random * port being choosen. * @param pAddr The servers IP address. * @throws ServletException Initializing the servlet failed. */ public ServletWebServer(HttpServlet pServlet, int pPort, InetAddress pAddr) throws ServletException { super(pPort, pAddr); servlet = pServlet; servlet.init(new ServletConfig(){ public String getServletName() { return servlet.getClass().getName(); } public ServletContext getServletContext() { throw new IllegalStateException("Context not available"); } public String getInitParameter(String pArg0) { return null; } public Enumeration getInitParameterNames() { return new Enumeration(){ public boolean hasMoreElements() { return false; } public Object nextElement() { throw new NoSuchElementException(); } }; } }); } protected ThreadPool.Task newTask(WebServer pWebServer, XmlRpcStreamServer pXmlRpcServer, Socket pSocket) throws IOException { return new ServletConnection(servlet, pSocket); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy