[原创] Adding OSGi support to graniteds v1.1.0

[原创] Adding OSGi support to graniteds v1.1.0

There are sevral steps to OSGify the graniteds v1.1.0

Step1:
 create a adaptor serlvet which is used to register it in the OSGI env.
 

 1
  package  org.granite.adaptor;
 2 
 3  import  java.io.DataInputStream;
 4  import  java.io.DataOutputStream;
 5  import  java.io.IOException;
 6 
 7  import  javax.servlet.ServletConfig;
 8  import  javax.servlet.ServletException;
 9  import  javax.servlet.http.HttpServlet;
10  import  javax.servlet.http.HttpServletRequest;
11  import  javax.servlet.http.HttpServletResponse;
12 
13  import  org.granite.config.GraniteConfig;
14  import  org.granite.config.flex.ServicesConfig;
15  import  org.granite.context.AMFContextImpl;
16  import  org.granite.context.GraniteContext;
17  import  org.granite.messaging.amf.AMF0Message;
18  import  org.granite.messaging.amf.io.AMF0Deserializer;
19  import  org.granite.messaging.amf.io.AMF0Serializer;
20  import  org.granite.messaging.amf.process.AMF0MessageProcessor;
21  import  org.granite.messaging.webapp.HttpGraniteContext;
22 
23  /**
24   * 
25   *  @author  gembin
26   *
27    */
28  public   class  AMFServiceAdaptor  extends  HttpServlet {
29       //  for Granite Data Service(GDS)
30       private  GraniteConfig graniteConfig  =   null ;
31       private  ServicesConfig servicesConfig  =   null ;
32 
33       public   void  init(ServletConfig config) {
34           try  {
35               super .init(config);
36              graniteConfig  =  GraniteConfig.loadConfig(getServletContext());
37              servicesConfig  =  ServicesConfig.loadConfig(getServletContext());
38              
39          }  catch  (ServletException e) {
40              e.printStackTrace();
41          }
42      }
43      
44       public  ServicesConfig getServicesConfig(){
45            return  servicesConfig;
46      }
47      
48       protected   void  doPost(HttpServletRequest request,
49              HttpServletResponse response)  throws  ServletException, IOException {
50          System.out.println( " Start Processing AMF Request " + getServicesConfig());
51           try  {
52              GraniteContext context  =  HttpGraniteContext.createThreadIntance(
53                      graniteConfig, servicesConfig, getServletContext(),request,response);
54           
55               if  (context  ==   null )
56                   throw   new  ServletException( " GraniteContext not Initialized!! " );
57               
58              AMFContextImpl amf  =  (AMFContextImpl) context.getAMFContext();
59               // Phase1 Deserializing AMF0 request
60              System.out.println( " >>>>> Deserializing AMF0 request from " + request.getRequestURI());
61              AMF0Deserializer deserializer  =   new  AMF0Deserializer(
62                       new  DataInputStream(request.getInputStream()));
63              AMF0Message amf0Request  =  deserializer.getAMFMessage();
64              
65               // Phase2 Processing AMF0 request 
66              System.out.println( " >>>>> Processing AMF0 request:  "   +  amf0Request);
67              AMF0Message amf0Response  =  AMF0MessageProcessor.process(amf0Request);
68              System.out.println( " <<<<< Returning AMF0 response:  "   +  amf0Response);
69 
70               // Phase3 Send back response to the client
71              response.setContentType(AMF0Message.CONTENT_TYPE);
72              AMF0Serializer serializer  =   new  AMF0Serializer( new  DataOutputStream(response.getOutputStream()));
73              serializer.serializeMessage(amf0Response);
74              
75              System.out.println( " End of Processing AMF Request " );
76          }  catch  (Exception e) {
77              e.printStackTrace();
78               throw   new  ServletException(e);
79          }
80      }
81 
82  }
83



Step2:
   register the servlet in OSGi Container
HttpContext commonContext = httpService.createDefaultHttpContext();
Dictionary initparams 
=   new  Hashtable();
initparams.put(
" servlet-name " " AMFMessageServlet " );
httpService.registerServlet(
" /WebContent/graniteamf/amf " , new  AMFServiceAdaptor(), initparams, commonContext);

Step3:
    Ensure the servicesConfigPath(/WEB-INF/flex/services-config.xml) and graniteConfigPath(/WEB-INF/granite/granite-config.xml),otherwise, you need
modify the source code of ServicesConfig.java and GraniteConfig.java to put the good config files in your project!


finally:
   you've made it. it's time to create a testService to test it.
Sample:

  public class UserAuthenticateService{
     public boolean auth(String username,String pwd){
        if (pwd.equals("1234") && username.equals("gembin")) {
                return true;
         } 
       return false;
     }
  }
  put this service in the service-config.xml
   <services>
        <service
            id="granite-service"
            class="flex.messaging.services.RemotingService"
            messageTypes="flex.messaging.messages.RemotingMessage">
            <destination id="authenticateService">
                <channels>
                    <channel ref="my-graniteamf"/>
                </channels>
                <properties>
                    <scope>session</scope>
                    <source>net.blogjava.gembin.domain.services.security.UserAuthenticateService</source>
                </properties>
            </destination>
        </service>
    </services>

For the actionscript part, i just omit it. if you don't know how to use it to communicate to the data service or you have some questions, pls reply.

Next entry Dynamic DataService registration in OSGi Container for Graniteds v1.1.0

Enjoy it!!!

你可能感兴趣的:([原创] Adding OSGi support to graniteds v1.1.0)