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    }