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 */
020 package org.granite.osgi.adaptor;
021
022 import java.io.DataInputStream;
023 import java.io.DataOutputStream;
024 import java.io.IOException;
025 import java.util.Dictionary;
026 import java.util.Hashtable;
027
028 import javax.servlet.ServletConfig;
029 import javax.servlet.ServletException;
030 import javax.servlet.http.HttpServlet;
031 import javax.servlet.http.HttpServletRequest;
032 import javax.servlet.http.HttpServletResponse;
033
034 import org.granite.logging.Logger;
035 import org.granite.config.GraniteConfig;
036 import org.granite.config.ServletGraniteConfig;
037 import org.granite.config.api.Configuration;
038 import org.granite.config.flex.ServicesConfig;
039 import org.granite.config.flex.ServletServicesConfig;
040 import org.granite.context.GraniteContext;
041 import org.granite.messaging.amf.AMF0Message;
042 import org.granite.messaging.amf.io.AMF0Deserializer;
043 import org.granite.messaging.amf.io.AMF0Serializer;
044 import org.granite.messaging.amf.process.AMF0MessageProcessor;
045 import org.granite.messaging.webapp.HttpGraniteContext;
046 import org.granite.osgi.Activator;
047 import org.granite.osgi.constants.OSGIConstants;
048 import org.osgi.framework.BundleContext;
049 import org.osgi.service.event.EventConstants;
050 import org.osgi.service.event.EventHandler;
051
052 /**
053 * @author <a href="mailto:gembin@gmail.com">gembin@gmail.com</a>
054 * @since 1.1.0
055 */
056 public class AMFServiceAdaptor extends HttpServlet {
057
058 private static final long serialVersionUID = 4777538296260511097L;
059 private static final Logger log=Logger.getLogger(AMFServiceAdaptor.class);
060
061 private GraniteConfig graniteConfig = null;
062 private ServicesConfig servicesConfig = null;
063 BundleContext context;
064
065 public AMFServiceAdaptor(BundleContext context){
066 this.context=context;
067 }
068 /*
069 * (non-Javadoc)
070 * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
071 */
072 @Override
073 public void init(ServletConfig config) {
074 try {
075 super.init(config);
076 Configuration configuration = Activator.getConfigurationService();
077 getServletContext().setAttribute(ServletGraniteConfig.GRANITE_CONFIG_CONFIGURATION_KEY, configuration);
078 graniteConfig = ServletGraniteConfig.loadConfig(getServletContext());
079 servicesConfig = ServletServicesConfig.loadConfig(getServletContext());
080
081 //register EventHandler ServicesConfig handle Add or Remove dataservice
082 Dictionary<String, Object> properties = new Hashtable<String, Object>();
083 String[] topics = new String[] { OSGIConstants.TOPIC_GDS_ADD_SERVICE,OSGIConstants.TOPIC_GDS_REMOVE_SERVICE};
084 properties.put(EventConstants.EVENT_TOPIC, topics);
085 context.registerService(EventHandler.class.getName(), new ServiceEventHandler(servicesConfig), properties);
086
087 } catch (ServletException e) {
088 log.error(e, "Could initialize OSGi service adaptor");
089 }
090 }
091
092 public ServicesConfig getServicesConfig(){
093 return servicesConfig;
094 }
095 /*
096 * (non-Javadoc)
097 * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
098 */
099 @Override
100 protected void doPost(HttpServletRequest request,
101 HttpServletResponse response) throws ServletException, IOException {
102 if(log.isInfoEnabled())
103 try {
104 GraniteContext context = HttpGraniteContext.createThreadIntance(
105 graniteConfig, servicesConfig, getServletContext(),request,response);
106 if (context == null)
107 throw new ServletException("GraniteContext not Initialized!!");
108
109 //AMFContextImpl amf = (AMFContextImpl) context.getAMFContext();
110 //Phase1 Deserializing AMF0 request
111 if(log.isInfoEnabled())
112 log.info(">>>>> Deserializing AMF0 request from..."+request.getRequestURI());
113 AMF0Deserializer deserializer = new AMF0Deserializer(
114 new DataInputStream(request.getInputStream()));
115 AMF0Message amf0Request = deserializer.getAMFMessage();
116
117 //Phase2 Processing AMF0 request
118 if(log.isInfoEnabled())
119 log.info(">>>>> Processing AMF0 request: " + amf0Request);
120 AMF0Message amf0Response = AMF0MessageProcessor.process(amf0Request);
121 if(log.isInfoEnabled())
122 log.info("<<<<< Returning AMF0 response: " + amf0Response);
123
124 //Phase3 Send back response to the client
125 response.setContentType(AMF0Message.CONTENT_TYPE);
126 AMF0Serializer serializer = new AMF0Serializer(new DataOutputStream(response.getOutputStream()));
127 serializer.serializeMessage(amf0Response);
128 if(log.isInfoEnabled())
129 log.info("...End of Processing AMF Request......");
130 }
131 catch (Exception e) {
132 log.error(e, "Could not handle AMF request");
133 throw new ServletException(e);
134 }
135 }
136
137 }