
net.sf.jstuff.integration.spring.SpringHttpServicesServlet Maven / Gradle / Ivy
/*
* Copyright 2010-2022 by Sebastian Thomschke and contributors.
* SPDX-License-Identifier: EPL-2.0
*/
package net.sf.jstuff.integration.spring;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeansException;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import net.sf.jstuff.core.logging.Logger;
/**
* applicationContext.xml:
*
*
* <bean name="/UserService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter" lazy-init="false">
* <property name="service" ref="userService" />
* <property name="serviceInterface" value="com.acme.services.UserService" />
* </bean>
* <bean name="/GroupService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter" lazy-init="false">
* <property name="service" ref="groupService" />
* <property name="serviceInterface" value="com.acme.services.GroupService" />
* </bean>
*
*
* web.xml:
*
*
* <servlet>
* <servlet-name>httpServicesServlet</servlet-name>
* <servlet-class>net.sf.jstuff.integration.spring.SpringHttpServicesServlet</servlet-class>
* </servlet>
* <servlet-mapping>
* <servlet-name>httpServicesServlet</servlet-name>
* <url-pattern>/remoting/*</url-pattern>
* </servlet-mapping>
*
*
* @author Sebastian Thomschke
*/
public class SpringHttpServicesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger LOG = Logger.create();
private boolean showIndex = true;
public SpringHttpServicesServlet() {
LOG.infoNew(this);
}
@Override
protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
final String relativePath = request.getPathInfo();
final WebApplicationContext springContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
if (relativePath == null || "/".equals(relativePath)) {
if (showIndex) {
final Map beans = springContext.getBeansOfType(HttpRequestHandler.class);
final PrintWriter pw = response.getWriter();
pw.write("");
pw.write("Available services:
");
pw.write("");
String contextRoot = request.getRequestURI();
if (!contextRoot.endsWith("/")) {
contextRoot += "/";
}
for (final Entry entry : beans.entrySet()) {
if (!entry.getKey().startsWith("/")) {
continue;
}
final String serviceID = entry.getKey().substring(1);
pw.write("- ");
pw.write("" + serviceID + "");
pw.write("
");
}
pw.write("
");
pw.flush();
pw.close();
} else {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
}
return;
}
try {
// going backwards to the relativePath to find the best matching bean
String beanName = relativePath;
while (beanName.contains("/")) {
if (springContext.containsBean(beanName)) {
request.setAttribute("beanName", beanName);
springContext.getBean(beanName, HttpRequestHandler.class).handleRequest(request, response);
return;
}
beanName = StringUtils.substringBeforeLast(beanName, "/");
}
} catch (final BeansException ex) {
LOG.error(ex, "Unexpected exception occured while retrieving bean [%s].", relativePath);
}
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
public void setShowIndex(final boolean showIndex) {
this.showIndex = showIndex;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy