[RESOLVIDO] Logica VRaptor sendo chamada de uma Servlet?

Boa tarde a todos.

Recentemente tivemos a requisição de implementar uma Applet para Assinatura Digital, porém foi necessário implementar uma Servlet para capturar via Stream o todo o conteúdo que o servidor estará enviando, sendo o código abaixo:

Servlet: UploadFile.java

public class UploadFile extends HttpServlet {
	
	private static final long serialVersionUID = -6854308881497499691L;
	
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) {
		
		InputStream in;
		StringBuffer paramsApplet = null;
		try {
			
			in = request.getInputStream();
			paramsApplet=new StringBuffer();
			int d;
			while((d=in.read()) != -1){
				paramsApplet.append((char)d);
			}
			
			String params = paramsApplet.toString();
			
			
			////////////////////Obtendo o Map a partir dos parametros serializados////////////////////
			//---------------------------Chaves do map----------------------------------------------//
			//		texto																			//
			//		assinatura																		//
			//		nomeArquivo																		//
			//		extensaoArquivo																	//
			//		moduloCertificador																//
			//		projeto.id																		//
			//////////////////////////////////////////////////////////////////////////////////////////
			HashMap<String,String> paramsMap = this.getList(params);
			
			/*	O parametro texto contém o conteúdo codificado do pdf.
				O método Base64.decode decodifica essa String e converte em um array de Bytes,
				como a informação será persistida em banco o ideal é que vocês executem esse método
				somente quando necessário pois se o array for convertido em String o arquivo criado
				não estará integro.
				Isso acontece pois o conteúdo de um pdf possui determinados bytes não baseados
				no padrão UNICODE. Portanto não convertam para String!! Se vcs preferirem a String
				deixem o conteúdo em base64 e utilizem o método descrito acima para decodificar.
			 */
			
			
			request.setAttribute("texto", paramsMap.get("texto"));
			request.setAttribute("assinatura", paramsMap.get("assinatura"));
			request.setAttribute("nomeArquivo", paramsMap.get("nomeArquivo"));
			request.setAttribute("extensaoArquivo", paramsMap.get("extensaoArquivo"));
			request.setAttribute("moduloCertificador", paramsMap.get("moduloCertificador"));
			request.setAttribute("projeto.id", paramsMap.get("projeto.id"));
			
			/*
			System.out.println("texto " + texto );
			System.out.println("nome " + nomeArquivo );
			System.out.println("ext " + extensaoArquivo );
			System.out.println("assinatura " + assinatura );
			System.out.println("assinatura " + moduloCertificador );
			System.out.println("assinatura " + projetoID );
			 */
			
			/////////////////////////WRITE OUTPUT//////////////////////////////////////
			//                 O response é importante para Applet					//
			//       Pois ele determina o sucesso da operação e desocupa o link		//
			/////////////////////////////////////////////////////////////////////////////
			ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
			//write to output stream
			out.writeChars("Success!");
			out.flush();
			//close output stream
			out.close();
			
			
			//RequestDispatcher rd = request.getRequestDispatcher("/assinaturaDigital.assinarDocumento.logic");
			//rd.forward(request, response);
			
			ServletContext context = this.getServletContext();
			RequestDispatcher rd = context.getRequestDispatcher("/assinaturaDigital.assinarDocumento.logic");
			rd.include(request, response);
			
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
	
	private HashMap<String,String> getList(String param){
		HashMap<String, String> params = new HashMap<String,String>();
		
		String[] array = param.split("&");
		
		for(String s : array){
			
			String[] p = s.split("=");
			try {
				params.put(p[0], URLDecoder.decode(p[1], "UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			
		}
		return params;
	}
}

O Código acima esta sendo executado a contento, porém na parte em que preciso chamar uma lógica (vraptor) este não esta ocorrendo, sendo:

			ServletContext context = this.getServletContext();
			RequestDispatcher rd = context.getRequestDispatcher("/assinaturaDigital.assinarDocumento.logic");
			rd.include(request, response);

Utilizo VRator 2.6.0 + Picocontainer 2.14.1 + Hibernate 4.2.1

Minha classe de negócio esta assim,
Classe: AssinaturaDigitalAjax.java

@Component("assinaturadigital")
@InterceptedBy({ DaoInterceptor.class, LoginInterceptor.class, DownloadInterceptor.class })
public class AssinaturaDigitalAjax {

	private DaoFactory        daoFactory;
	private Usuario           usuarioConectado;
	private HttpSession       httpSession;
	private ClientOutput      clientOutput;
...
...
...
	public AssinaturaDigitalAjax(DaoFactory daoFactory, Usuario usuarioConectado, ClientOutput clientOutput, HttpSession httpSession) {
		this.daoFactory = daoFactory;
		this.usuarioConectado = usuarioConectado;
		this.httpSession = httpSession;
		this.clientOutput = clientOutput;
	}
...
...
...
	@Remotable
	@Logic(parameters = { "projeto", "moduloCertificador", "texto", "nomeArquivo", "extensaoArquivo", "assinatura" })
	public void assinarDocumento(Projeto projeto, String moduloCertificador, String texto, String nomeArquivo, String extensaoArquivo, String assinatura) throws IOException {
		if (!texto.trim().equals("") && !assinatura.trim().equals("")) {
...
...
...
		} else
			throw new RuntimeException("Arquivo sem assinatura digital.");
	}

Qualquer direcionamento será muito bem vindo…

pq vc não cria uma logica do vraptor que recebe o request e o response?

assim fica mais fácil uma lógica incluir a outra.

[quote=Lucas Cavalcanti]pq vc não cria uma logica do vraptor que recebe o request e o response?

assim fica mais fácil uma lógica incluir a outra.

[/quote]

Oi Lucas, obrigado por responder…

O código fonte da Applet não pertence a minha empresa, então não sei ao certo como é o funcionamento interno, de qualquer forma eu não havia pensado nesta opção (DI de request e o response); vou implementar e depois coloco o resultado aqui.

Obrigado.

***** RESOLVIDO *****

Lucas, tua dica foi muito esclarecedora, pois a Applet abre uma conexão HTTP internamente e devido ao fato do meu sistema ter um Interceptador de LOGIN, referente ao usuário conectado, ela não disparava a Lógica corretamente, já que estava sendo redirecionada para uma outra página de erro.

Novamente obrigado.

PS: Não existe mais a necessidade de uma Servlet, tudo ficou transparente, bastou eu remover LoginInterceptor.class:

@InterceptedBy({ DaoInterceptor.class/*, LoginInterceptor.class*/, DownloadInterceptor.class })
public class AssinaturaDigitalAjax {
...
...
...
}