/* * Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com> * Licensed under the Apache License, Version 2.0 (the "License") * $Id: WebservicesHessian.java 3933 2008-04-25 20:41:45Z gbevin $ */ package com.uwyn.rife.engine.elements; import com.caucho.hessian.io.*; import com.caucho.services.server.ServiceContext; import com.uwyn.rife.engine.Element; import com.uwyn.rife.engine.ElementService; import com.uwyn.rife.engine.RequestMethod; import com.uwyn.rife.engine.annotations.Elem; import com.uwyn.rife.engine.exceptions.EngineException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @Elem public class WebservicesHessian extends Element { public Class getDeploymentClass() { return WebservicesHessianDeployer.class; } public void processElement() { if (!getMethod().equals(RequestMethod.POST)) { setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); setContentType("text/html"); print("<h1>Hessian Requires POST</h1>"); return; } WebservicesHessianDeployer deployer = (WebservicesHessianDeployer) getDeployer(); String service_id = getHttpServletRequest().getPathInfo(); String object_id = getHttpServletRequest().getParameter("id"); if (object_id == null) { object_id = getHttpServletRequest().getParameter("ejbid"); } try { ServiceContext.begin(getHttpServletRequest(), service_id, object_id); try { InputStream is = getHttpServletRequest().getInputStream(); OutputStream os = getOutputStream(); Hessian2Input in = new Hessian2Input(is); try { SerializerFactory serializer_factory = deployer.getSerializerFactory(); in.setSerializerFactory(serializer_factory); int code = in.read(); if (code != 'c') { // XXX: deflate throw new IOException("expected 'c' in hessian input at " + code); } int major = in.read(); int minor = in.read(); AbstractHessianOutput out; if (major >= 2) { out = new Hessian2Output(os); } else { out = new HessianOutput(os); } try { out.setSerializerFactory(serializer_factory); if (object_id != null) { Object service = deployer.getObject(); if (service instanceof ElementService) { ((ElementService) service).setRequestElement(this); } deployer.getObjectSkeleton().invoke(in, out); } else { Object service = deployer.getHome(); if (service instanceof ElementService) { ((ElementService) service).setRequestElement(this); } deployer.getHomeSkeleton().invoke(in, out); } } finally { out.close(); } } finally { in.close(); is.close(); } } catch (RuntimeException e) { throw e; } catch (Throwable e) { throw new EngineException(e); } finally { ServiceContext.end(); } } catch (ServletException e) { throw new EngineException(e); } } public boolean prohibitRawAccess() { return false; } }