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}