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    }