001/* 002 GRANITE DATA SERVICES 003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S. 004 005 This file is part of Granite Data Services. 006 007 Granite Data Services is free software; you can redistribute it and/or modify 008 it under the terms of the GNU Library General Public License as published by 009 the Free Software Foundation; either version 2 of the License, or (at your 010 option) any later version. 011 012 Granite Data Services is distributed in the hope that it will be useful, but 013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License 015 for more details. 016 017 You should have received a copy of the GNU Library General Public License 018 along with this library; if not, see <http://www.gnu.org/licenses/>. 019*/ 020package org.granite.osgi.adaptor; 021 022import java.io.DataInputStream; 023import java.io.DataOutputStream; 024import java.io.IOException; 025import java.util.Dictionary; 026import java.util.Hashtable; 027 028import javax.servlet.ServletConfig; 029import javax.servlet.ServletException; 030import javax.servlet.http.HttpServlet; 031import javax.servlet.http.HttpServletRequest; 032import javax.servlet.http.HttpServletResponse; 033 034import org.granite.logging.Logger; 035import org.granite.config.GraniteConfig; 036import org.granite.config.ServletGraniteConfig; 037import org.granite.config.api.Configuration; 038import org.granite.config.flex.ServicesConfig; 039import org.granite.config.flex.ServletServicesConfig; 040import org.granite.context.GraniteContext; 041import org.granite.messaging.amf.AMF0Message; 042import org.granite.messaging.amf.io.AMF0Deserializer; 043import org.granite.messaging.amf.io.AMF0Serializer; 044import org.granite.messaging.amf.process.AMF0MessageProcessor; 045import org.granite.messaging.webapp.HttpGraniteContext; 046import org.granite.osgi.Activator; 047import org.granite.osgi.constants.OSGIConstants; 048import org.granite.util.ContentType; 049import org.osgi.framework.BundleContext; 050import org.osgi.service.event.EventConstants; 051import org.osgi.service.event.EventHandler; 052 053/** 054 * @author <a href="mailto:gembin@gmail.com">gembin@gmail.com</a> 055 * @since 1.1.0 056 */ 057public class AMFServiceAdaptor extends HttpServlet { 058 059 private static final long serialVersionUID = 4777538296260511097L; 060 private static final Logger log=Logger.getLogger(AMFServiceAdaptor.class); 061 062 private GraniteConfig graniteConfig = null; 063 private ServicesConfig servicesConfig = null; 064 BundleContext context; 065 066 public AMFServiceAdaptor(BundleContext context){ 067 this.context=context; 068 } 069 /* 070 * (non-Javadoc) 071 * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) 072 */ 073 @Override 074 public void init(ServletConfig config) { 075 try { 076 super.init(config); 077 Configuration configuration = Activator.getConfigurationService(); 078 getServletContext().setAttribute(ServletGraniteConfig.GRANITE_CONFIG_CONFIGURATION_KEY, configuration); 079 graniteConfig = ServletGraniteConfig.loadConfig(getServletContext()); 080 servicesConfig = ServletServicesConfig.loadConfig(getServletContext()); 081 082 //register EventHandler ServicesConfig handle Add or Remove dataservice 083 Dictionary<String, Object> properties = new Hashtable<String, Object>(); 084 String[] topics = new String[] { OSGIConstants.TOPIC_GDS_ADD_SERVICE,OSGIConstants.TOPIC_GDS_REMOVE_SERVICE}; 085 properties.put(EventConstants.EVENT_TOPIC, topics); 086 context.registerService(EventHandler.class.getName(), new ServiceEventHandler(servicesConfig), properties); 087 088 } catch (ServletException e) { 089 log.error(e, "Could initialize OSGi service adaptor"); 090 } 091 } 092 093 public ServicesConfig getServicesConfig(){ 094 return servicesConfig; 095 } 096 /* 097 * (non-Javadoc) 098 * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 099 */ 100 @Override 101 protected void doPost(HttpServletRequest request, 102 HttpServletResponse response) throws ServletException, IOException { 103 if(log.isInfoEnabled()) 104 try { 105 GraniteContext context = HttpGraniteContext.createThreadIntance( 106 graniteConfig, servicesConfig, getServletContext(),request,response); 107 if (context == null) 108 throw new ServletException("GraniteContext not Initialized!!"); 109 110 //AMFContextImpl amf = (AMFContextImpl) context.getAMFContext(); 111 //Phase1 Deserializing AMF0 request 112 if(log.isInfoEnabled()) 113 log.info(">>>>> Deserializing AMF0 request from..."+request.getRequestURI()); 114 AMF0Deserializer deserializer = new AMF0Deserializer( 115 new DataInputStream(request.getInputStream())); 116 AMF0Message amf0Request = deserializer.getAMFMessage(); 117 118 //Phase2 Processing AMF0 request 119 if(log.isInfoEnabled()) 120 log.info(">>>>> Processing AMF0 request: " + amf0Request); 121 AMF0Message amf0Response = AMF0MessageProcessor.process(amf0Request); 122 if(log.isInfoEnabled()) 123 log.info("<<<<< Returning AMF0 response: " + amf0Response); 124 125 //Phase3 Send back response to the client 126 response.setContentType(ContentType.AMF.mimeType()); 127 AMF0Serializer serializer = new AMF0Serializer(new DataOutputStream(response.getOutputStream())); 128 serializer.serializeMessage(amf0Response); 129 if(log.isInfoEnabled()) 130 log.info("...End of Processing AMF Request......"); 131 } 132 catch (Exception e) { 133 log.error(e, "Could not handle AMF request"); 134 throw new ServletException(e); 135 } 136 } 137 138}