This is is a patch for a simple refactor of ServerServlet, breaking up
getServer() into three methods -- (1) the original getServer(), (2) one
to create the HttpServerHelper, and (3) one to create the Application.
No functionality has been changed; in my application I need to override
the mechanism for creating an Application to load it from a Spring
ApplicationContext as opposed to using reflection. This patch gives me
that extension point easier than trying to override the entire
getServer() method.
I've attached the patch to this email, as well as pasted it below.
Index:
module/com.noelios.restlet.ext.servlet_2.4/src/com/noelios/restlet/ext/servlet/ServerServlet.java
===================================================================
---
module/com.noelios.restlet.ext.servlet_2.4/src/com/noelios/restlet/ext/servlet/ServerServlet.java
(revision 1394)
+++
module/com.noelios.restlet.ext.servlet_2.4/src/com/noelios/restlet/ext/servlet/ServerServlet.java
(working copy)
@@ -21,6 +21,8 @@
import java.io.IOException;
import java.util.List;
+import java.lang.reflect.InvocationTargetException;
+
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -156,74 +158,20 @@
serverAttributeName);
if (result == null) {
- // Try to instantiate a new target application
- // First, find the application class name
- String applicationClassName = getInitParameter(
- NAME_APPLICATION_CLASS, null);
- if (applicationClassName != null) {
+ result = createServer(request);
+ if (result != null) {
+ // Starts the target Restlet
try {
- // Load the application class using the
given class
- // name
- Class targetClass = Class
- .forName(applicationClassName);
-
- // First, let's locate the closest component
- Component component = new Component();
- Server server = new
Server(component.getContext(),
- (List<Protocol>) null, request
- .getLocalAddr(), request
- .getLocalPort(), component);
- result = new HttpServerHelper(server);
- getServletContext().setAttribute(
- NAME_SERVER_ATTRIBUTE, result);
-
- if (component != null) {
- // Create a new instance of the
application
- // class
- Application application = (Application)
targetClass
- .getConstructor(Context.class)
-
.newInstance(component.getContext());
-
- // Set the Servlet context
- application
- .setContext(new
ServletContextAdapter(
- this, application,
component
- .getContext()));
-
- // Attach the application
- String uriPattern =
request.getContextPath()
- + request.getServletPath();
-
component.getDefaultHost().attach(uriPattern,
- application);
-
- // Starts the target Restlet
- result.start();
- } else {
- log("[Noelios Restlet Engine] - The
Restlet component couldn't be instantiated.");
- }
- } catch (ClassNotFoundException e) {
- log(
- "[Noelios Restlet Engine] - The
ServerServlet couldn't find the target class. Please check that your
classpath includes "
- + applicationClassName, e);
- } catch (InstantiationException e) {
- log(
- "[Noelios Restlet Engine] - The
ServerServlet couldn't instantiate the target class. Please check this
class has an empty constructor "
- + applicationClassName, e);
- } catch (IllegalAccessException e) {
- log(
- "[Noelios Restlet Engine] - The
ServerServlet couldn't instantiate the target class. Please check that
you have to proper access rights to "
- + applicationClassName, e);
- } catch (Exception e) {
- log(
- "[Noelios Restlet Engine] - The
ServerServlet couldn't start the target Restlet.",
- e);
+ result.start();
}
+ catch (Exception e) {
+ log("[Noelios Restlet Engine] - The
ServerServlet couldn't start the target Restlet.",e);
+ }
} else {
log("[Noelios Restlet Engine] - The
ServerServlet couldn't find the target class name. Please set the
initialization parameter called "
+ NAME_APPLICATION_CLASS);
}
}
-
this.helper = result;
}
}
@@ -232,6 +180,93 @@
}
/**
+ * Creates the associated HTTP server handling calls.
+ *
+ * @return The new HTTP server handling calls.
+ *
+ * @see #getServer()
+ */
+ protected HttpServerHelper createServer(HttpServletRequest request) {
+ HttpServerHelper result = null;
+
+ Component component = new Component();
+ Application application =
createApplication(component.getContext());
+ if (application != null) {
+ // First, let's locate the closest component
+ Server server = new Server(component.getContext(),
+ (List<Protocol>) null, request
+ .getLocalAddr(), request
+ .getLocalPort(), component);
+ result = new HttpServerHelper(server);
+ getServletContext().setAttribute(
+ NAME_SERVER_ATTRIBUTE, result);
+
+ // Set the Servlet context
+ application
+ .setContext(new ServletContextAdapter(
+ this, application, component
+ .getContext()));
+
+ // Attach the application
+ String uriPattern = request.getContextPath()
+ + request.getServletPath();
+ component.getDefaultHost().attach(uriPattern,
+ application);
+
+ }
+ return result;
+ }
+
+ /**
+ * Creates the single Application used by this Servlet.
+ *
+ * @param ctx the Context for the Application
+ *
+ * @return the newly created Application or null if unable to create
+ */
+ protected Application createApplication(Context ctx) {
+ // Try to instantiate a new target application
+ // First, find the application class name
+ String applicationClassName = getInitParameter(
+ NAME_APPLICATION_CLASS, null);
+ // Load the application class using the given class
+ // name
+ if (applicationClassName != null) {
+ try {
+ Class targetClass = Class
+ .forName(applicationClassName);
+
+ // Create a new instance of the application
+ // class
+ return (Application) targetClass
+ .getConstructor(Context.class)
+ .newInstance(ctx);
+ } catch (ClassNotFoundException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet
couldn't find the target class. Please check that your classpath includes "
+ + applicationClassName, e);
+ } catch (InstantiationException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet
couldn't instantiate the target class. Please check this class has an
empty constructor "
+ + applicationClassName, e);
+ } catch (IllegalAccessException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet
couldn't instantiate the target class. Please check that you have to
proper access rights to "
+ + applicationClassName, e);
+ } catch (NoSuchMethodException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet
couldn't invoke the constructor of the target class. Please check this
class has a constructor with a single parameter of Context "
+ + applicationClassName, e);
+ } catch (InvocationTargetException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet
couldn't instantiate the target class. An exception was thrown while
creating "
+ + applicationClassName, e);
+ }
+ }
+ return null;
+ }
+
+ /**
* Returns the value of a given initialization parameter, first
from the
* Servlet configuration, then from the Web Application context.
*
Index: module/com.noelios.restlet.ext.servlet_2.4/src/com/noelios/restlet/ext/servlet/ServerServlet.java
===================================================================
--- module/com.noelios.restlet.ext.servlet_2.4/src/com/noelios/restlet/ext/servlet/ServerServlet.java (revision 1394)
+++ module/com.noelios.restlet.ext.servlet_2.4/src/com/noelios/restlet/ext/servlet/ServerServlet.java (working copy)
@@ -21,6 +21,8 @@
import java.io.IOException;
import java.util.List;
+import java.lang.reflect.InvocationTargetException;
+
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -156,74 +158,20 @@
serverAttributeName);
if (result == null) {
- // Try to instantiate a new target application
- // First, find the application class name
- String applicationClassName = getInitParameter(
- NAME_APPLICATION_CLASS, null);
- if (applicationClassName != null) {
+ result = createServer(request);
+ if (result != null) {
+ // Starts the target Restlet
try {
- // Load the application class using the given class
- // name
- Class targetClass = Class
- .forName(applicationClassName);
-
- // First, let's locate the closest component
- Component component = new Component();
- Server server = new Server(component.getContext(),
- (List<Protocol>) null, request
- .getLocalAddr(), request
- .getLocalPort(), component);
- result = new HttpServerHelper(server);
- getServletContext().setAttribute(
- NAME_SERVER_ATTRIBUTE, result);
-
- if (component != null) {
- // Create a new instance of the application
- // class
- Application application = (Application) targetClass
- .getConstructor(Context.class)
- .newInstance(component.getContext());
-
- // Set the Servlet context
- application
- .setContext(new ServletContextAdapter(
- this, application, component
- .getContext()));
-
- // Attach the application
- String uriPattern = request.getContextPath()
- + request.getServletPath();
- component.getDefaultHost().attach(uriPattern,
- application);
-
- // Starts the target Restlet
- result.start();
- } else {
- log("[Noelios Restlet Engine] - The Restlet component couldn't be instantiated.");
- }
- } catch (ClassNotFoundException e) {
- log(
- "[Noelios Restlet Engine] - The ServerServlet couldn't find the target class. Please check that your classpath includes "
- + applicationClassName, e);
- } catch (InstantiationException e) {
- log(
- "[Noelios Restlet Engine] - The ServerServlet couldn't instantiate the target class. Please check this class has an empty constructor "
- + applicationClassName, e);
- } catch (IllegalAccessException e) {
- log(
- "[Noelios Restlet Engine] - The ServerServlet couldn't instantiate the target class. Please check that you have to proper access rights to "
- + applicationClassName, e);
- } catch (Exception e) {
- log(
- "[Noelios Restlet Engine] - The ServerServlet couldn't start the target Restlet.",
- e);
+ result.start();
}
+ catch (Exception e) {
+ log("[Noelios Restlet Engine] - The ServerServlet couldn't start the target Restlet.",e);
+ }
} else {
log("[Noelios Restlet Engine] - The ServerServlet couldn't find the target class name. Please set the initialization parameter called "
+ NAME_APPLICATION_CLASS);
}
}
-
this.helper = result;
}
}
@@ -232,6 +180,93 @@
}
/**
+ * Creates the associated HTTP server handling calls.
+ *
+ * @return The new HTTP server handling calls.
+ *
+ * @see #getServer()
+ */
+ protected HttpServerHelper createServer(HttpServletRequest request) {
+ HttpServerHelper result = null;
+
+ Component component = new Component();
+ Application application = createApplication(component.getContext());
+ if (application != null) {
+ // First, let's locate the closest component
+ Server server = new Server(component.getContext(),
+ (List<Protocol>) null, request
+ .getLocalAddr(), request
+ .getLocalPort(), component);
+ result = new HttpServerHelper(server);
+ getServletContext().setAttribute(
+ NAME_SERVER_ATTRIBUTE, result);
+
+ // Set the Servlet context
+ application
+ .setContext(new ServletContextAdapter(
+ this, application, component
+ .getContext()));
+
+ // Attach the application
+ String uriPattern = request.getContextPath()
+ + request.getServletPath();
+ component.getDefaultHost().attach(uriPattern,
+ application);
+
+ }
+ return result;
+ }
+
+ /**
+ * Creates the single Application used by this Servlet.
+ *
+ * @param ctx the Context for the Application
+ *
+ * @return the newly created Application or null if unable to create
+ */
+ protected Application createApplication(Context ctx) {
+ // Try to instantiate a new target application
+ // First, find the application class name
+ String applicationClassName = getInitParameter(
+ NAME_APPLICATION_CLASS, null);
+ // Load the application class using the given class
+ // name
+ if (applicationClassName != null) {
+ try {
+ Class targetClass = Class
+ .forName(applicationClassName);
+
+ // Create a new instance of the application
+ // class
+ return (Application) targetClass
+ .getConstructor(Context.class)
+ .newInstance(ctx);
+ } catch (ClassNotFoundException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet couldn't find the target class. Please check that your classpath includes "
+ + applicationClassName, e);
+ } catch (InstantiationException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet couldn't instantiate the target class. Please check this class has an empty constructor "
+ + applicationClassName, e);
+ } catch (IllegalAccessException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet couldn't instantiate the target class. Please check that you have to proper access rights to "
+ + applicationClassName, e);
+ } catch (NoSuchMethodException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet couldn't invoke the constructor of the target class. Please check this class has a constructor with a single parameter of Context "
+ + applicationClassName, e);
+ } catch (InvocationTargetException e) {
+ log(
+ "[Noelios Restlet Engine] - The ServerServlet couldn't instantiate the target class. An exception was thrown while creating "
+ + applicationClassName, e);
+ }
+ }
+ return null;
+ }
+
+ /**
* Returns the value of a given initialization parameter, first from the
* Servlet configuration, then from the Web Application context.
*