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.granite.util.ContentType;
049 import org.osgi.framework.BundleContext;
050 import org.osgi.service.event.EventConstants;
051 import 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 */
057 public 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 }