|
|
Re: Custom Servlet => use SERVICES.getService(..) [message #1441805 is a reply to message #1441471] |
Fri, 10 October 2014 08:00 ![Go to previous message Go to previous message](theme/Solstice/images/up.png) ![Go to next message Go to next message](theme/Solstice/images/down.png) |
Dennis Geesen![Friend of Eclipse Friend](/donate/web-api/friends_decorator.php?email=develop%40indivon.de) Messages: 46 Registered: June 2014 |
Member |
|
|
I have a solution for calling server services:
Most of the code was copied from the ServiceTunnelServlet.
Would be nice if someone can varify that this is a solution that does not break any important concepts?!
package de.scout.rest.test.server;
import java.io.IOException;
import java.io.PrintWriter;
import javax.security.auth.Subject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.scout.commons.exception.ProcessingException;
import org.eclipse.scout.commons.security.SimplePrincipal;
import org.eclipse.scout.rt.server.IServerSession;
import org.eclipse.scout.rt.server.ServerJob;
import org.eclipse.scout.rt.server.commons.servletfilter.HttpServletEx;
import org.eclipse.scout.rt.server.services.common.session.IServerSessionRegistryService;
import org.eclipse.scout.rt.shared.ui.UserAgent;
import org.eclipse.scout.service.SERVICES;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import de.scout.rest.test.server.Activator;
import de.scout.rest.test.shared.ui.forms.CustomerSearchFormData;
import de.scout.rest.test.shared.ui.forms.ICustomerService;
public class TestServlet extends HttpServletEx {
private static final long serialVersionUID = 1L;
private Class<IServerSession> m_serverSessionClass;
@Override
protected void doGet(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
try {
lazyInit(request, response);
Subject subject = new Subject();
subject.getPrincipals().add(new SimplePrincipal("server"));
UserAgent agent = UserAgent.createDefault();
if (subject != null && agent != null) {
IServerSession session = lookupScoutServerSessionOnHttpSession(request, response, subject, agent);
ServerJob serverJob = new ServerJob("Transactional handler", session, subject) {
@Override
protected IStatus runTransaction(IProgressMonitor monitor) throws Exception {
try {
int count = SERVICES.getService(IMyTestService.class).getCount();
response.setContentType("application/json");
PrintWriter out = response.getWriter();
out.print("{");
out.print("\"count\": ");
out.print(count);
out.print("}");
out.close();
}
catch (ProcessingException e) {
e.printStackTrace();
}
return Status.OK_STATUS;
}
};
serverJob.setSystem(true);
serverJob.runNow(new NullProgressMonitor());
}
else {
throw new ServletException("could not create subject or agent!");
}
}
catch (ProcessingException ex) {
throw new ServletException(ex);
}
}
private IServerSession lookupScoutServerSessionOnHttpSession(HttpServletRequest req, HttpServletResponse res, Subject subject, UserAgent userAgent) throws ProcessingException, ServletException {
synchronized (req.getSession()) {
IServerSession serverSession = (IServerSession) req.getSession().getAttribute(IServerSession.class.getName());
if (serverSession == null) {
serverSession = SERVICES.getService(IServerSessionRegistryService.class).newServerSession(m_serverSessionClass, subject, userAgent);
req.getSession().setAttribute(IServerSession.class.getName(), serverSession);
}
return serverSession;
}
}
@SuppressWarnings("unchecked")
protected void lazyInit(HttpServletRequest req, HttpServletResponse res) throws ServletException {
if (m_serverSessionClass == null) {
String qname = getServletConfig().getInitParameter("session");
if (qname != null) {
int i = qname.lastIndexOf('.');
try {
m_serverSessionClass = (Class<IServerSession>) Platform.getBundle(qname.substring(0, i)).loadClass(qname);
}
catch (ClassNotFoundException e) {
throw new ServletException("Loading class " + qname, e);
}
}
}
if (m_serverSessionClass == null) {
// find bundle that defines this servlet
try {
Bundle bundle = findServletContributor(req.getServletPath());
if (bundle != null) {
m_serverSessionClass = (Class<IServerSession>) bundle.loadClass(bundle.getSymbolicName() + ".ServerSession");
}
}
catch (Throwable t) {
// nop
}
}
if (m_serverSessionClass == null) {
throw new ServletException("Expected init-param \"session\"");
}
}
@SuppressWarnings("unchecked")
private Bundle findServletContributor(String alias) throws CoreException {
BundleContext context = Activator.getDefault().getBundle().getBundleContext();
ServiceReference ref = context.getServiceReference(IExtensionRegistry.class.getName());
Bundle bundle = null;
if (ref != null) {
IExtensionRegistry reg = (IExtensionRegistry) context.getService(ref);
if (reg != null) {
IExtensionPoint xpServlet = reg.getExtensionPoint("org.eclipse.equinox.http.registry.servlets");
if (xpServlet != null) {
for (IExtension xServlet : xpServlet.getExtensions()) {
for (IConfigurationElement cServlet : xServlet.getConfigurationElements()) {
if (cServlet.getName().equals("servlet")) {
if (this.getClass().getName().equals(cServlet.getAttribute("class"))) {
// half match, go on looping
bundle = Platform.getBundle(xServlet.getContributor().getName());
if (alias.equals(cServlet.getAttribute("alias"))) {
// full match, return
return bundle;
}
}
}
}
}
}
}
}
return bundle;
}
}
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.04201 seconds