Integration of Spring with
Blaze DS and Cairngorm UM
Deepdive by N.S.Devaraj

http://nsdevaraj.wordpress.com/
twitter : @nsdevaraj
Agenda for this season

    What is Spring?

    Why Spring with Flex?

    Why Spring BlazeDS Integration?

    What is & Why Cairngorm UM?

    What is & why generic DAO?

    What is & Why CairnSpring?
WHAT IS SPRING?

  The result is looser coupling between
 components. The Spring IoC container has
    proven to be a solid foundation for
  building robust enterprise applications.
                   `


The components managed by the Spring IoC
     container are called Spring beans.
WHAT IS SPRING?


The Spring framework includes several other
      modules in addition to its core IoC
                 container.
     http://www.springframework.org.
WHY WE NEED FLEX ACCESS
        SPRING?

Flex is the obvious choice when a Spring
Developer is looking at RIA.

Can reuse your server-side Spring to move
into RIA.
WHY WE NEED FLEX ACCESS
          SPRING?
 In scenario of the Remoting and Data
   Management Services approaches:

  It enable the tightest integration with
  Spring. There is no need to transform
 data, or to expose services in a certain
 way: the Flex application works directly
with the beans registered in the Spring IoC
                container.
WHY WE NEED FLEX ACCESS
         SPRING?
The BlazeDS Remoting enables binding your
 valueobjects with Java pojo Classes easily
               by metadata
 [RemoteClass(alias=”com.adobe.pojo.ob”]

  By using the Spring Security 2.0 we can
      make our application secured for
                transactions.
WHAT is BlazeDS?
BlazeDS provides a set of services that lets you connect
  a client-side application to server-side data, and pass
   data among multiple clients connected to the server.
   BlazeDS implements real-time messaging between
                           clients.
    Browser                           application
     or AIR
                                          .swf


                                                 http(s)
                       domain
                         blazeds server

      External                             Remote
      Services         Service
                                          Procedure        Messaging
                        Proxy
                                            Calls
BlazeDS Server
                                 servlet
                       /{context}/messagebroker/*
                                                                          core
              config
         proxy-config.xml

              config                                         config

       messaging-config.xml                         services-config.xml

              config
flex    remote-config.xml
                              domain
             library                                config
              .jar                                  .class
                                    Classes
Lib
BLAZE DS WAY
 Using the “dependency lookup” approach
of the SpringFactory feels opposite to the
"Spring Way"

The burden of configuration is multiplied.
Potential for deep integration beyond just
remoting is limited.
BLAZEDS SPRING INTEGRATION
 Bootstrap the BlazeDS MessageBroker as a
Spring-managed bean (no more web.xml or
 MessageBrokerServlet config needed).

Route http-based Flex messages to the
MessageBroker through the Spring
DispatcherServlet.

Expose Spring beans for remoting by namespace
TRADITIONAL BLAZE DS WAY

The BlazeDS configuration first imports the 'remoting-config.xml',The parameters in the URL 'server.name' and
    'server.port' are supplied by the Flex runtime. The 'context.root' parameter needs to be supplied during
    compilation using the 'context-root' compiler option.
    services-config.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <services-config>
       <services>
        <service-include file-path="remoting-config.xml" />
          <default-channels>
            <channel ref="person-amf"/>
          </default-channels>
       </services>
       <channels>
          <channel-definition id="person-amf" class="mx.messaging.channels.AMFChannel">
             <endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf"
    class="flex.messaging.endpoints.AMFEndpoint"/>
          </channel-definition>
       </channels>
    </services-config>
SPRING BLAZEDS INTEGRATION
Example:
 WEB.XML
 Spring BlazeDS Integration servlet
   <servlet>
      <servlet-name>spring-flex</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/flex-servlet-context.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
   </servlet>
 Mapping Spring BlazeDS Integration servlet to handle all requests to '/spring/*
   <servlet-mapping>
      <servlet-name>spring-flex</servlet-name>
      <url-pattern>/spring/*</url-pattern>
   </servlet-mapping>
SPRING BLAZE DS EXAMPLE
flex-servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="
    http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:flex="http://www.springframework.org/schema/flex"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/flex
    http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">
  <context:component-scan base-package="org.springbyexample.web.service" />
  <flex:message-broker/> ----Spring BlazeDS Integration configuration of the BlazeDS message broker, which
     handles remoting and messaging requests.
 <flex:remoting-destination ref="personDao" /> ---Exposes the personDao bean as a BlazeDS remoting destination
</beans>
SPRING BLAZEDS INTEGRATION
 PersonService.java
     @Service
     @RemotingDestination
     public class PersonService {
        private final PersonDao personDao;
        /**
         * Constructor
         */
        @Autowired
        public PersonService(PersonDao personDao) {
            this.personDao = personDao;
        }
        public void remove(int id) {
            Person person = personDao.findPersonById(id);
            personDao.delete(person);
        }
     }
 PersonDeleteCommand.as
          var ro:RemoteObject = new RemoteObject("personDao");
          ro.remove(id);
          ro.addEventListener(ResultEvent.RESULT, updateSearch);
Cairngorm with UM Extensions

    Universal Mind Cairngorm Extensions
( UM – CGX is easy to migrate from CG)

    Event – Business logic combined together

    Command logic can be aggregated to
    context-specific   command        classes
    (minimizes the number of classes)

    Support for easy queue of delegate calls
    (SequenceGenerator)
Cairngorm with UM Extensions

    Create Responder in view

    Add responder to event

    Cache/Store responder from event to
    command

    In Command, on success/failure call back
    these responders

    On view handle success/failure to control
    view states
Cairngorm with UM Extensions
  View Layer       Model Layer            Control Layer

                    ModelLocator            via IResponder
                                                               tcp/ip
                   via databinding
    View                              Command       Delegate            Server
               via eventdispatching

                MVC Classic Usage
  View Layer                      Business Layer
  via IResponder                            via IResponder
                                                               tcp/ip

    View                              Command       Delegate            Server
                   via eventdispatching



               Using View Notifications
J2EE – DAO INTRODUCTION

    All database access in the system is made
    through a DAO to achieve encapsulation.

    Each DAO instance is responsible for one
    primary domain object or entity. If a domain
    object has an independent lifecycle, it should
    have its own DAO.

    The DAO is responsible for creations, reads (by
    primary key), updates, and deletions -- that
    is, CRUD -- on the domain object.
generic DAO
 For creating a new DAO we need →
a Hibernate mapping file,
a plain old Java interface,
and 10 lines in your Spring configuration
  file.

Resource:
http://www.ibm.com/developerworks/java/library/j-
   genericdao.html
CairnSpring
The CairnSpring includes both Caringorm UM,
 Generic DAO along with the Spring BlazeDS
                Integration.

       It also enables Paging request.

  http://www.code.google.com/p/cairnspring
RemoteObject
Channels                      Producer                Consumer          Dataservice




                                              NIO Long         NIO
              HTTP          NIO Polling                                    RTMP
                                               Polling      Streaming

                                                Long
              AMF             Polling                       Streaming    Piggyback
                                               Polling



           Messaging              Remoting               Data Mgmt
                                                                           Proxy
Services




                                                          Change
              Pub/Sub                   RPC
                                                          Tracking

           Real Time Push               AMF               Data Sync
                                                                            PDF
Adapters




              JMS             SQL              Java         Hibernate    ColdFusion


             WSRP             Spring          Security
QUESTIONS

BlazeDS

  • 1.
    Integration of Springwith Blaze DS and Cairngorm UM Deepdive by N.S.Devaraj http://nsdevaraj.wordpress.com/ twitter : @nsdevaraj
  • 2.
    Agenda for thisseason  What is Spring?  Why Spring with Flex?  Why Spring BlazeDS Integration?  What is & Why Cairngorm UM?  What is & why generic DAO?  What is & Why CairnSpring?
  • 3.
    WHAT IS SPRING? The result is looser coupling between components. The Spring IoC container has proven to be a solid foundation for building robust enterprise applications. ` The components managed by the Spring IoC container are called Spring beans.
  • 4.
    WHAT IS SPRING? TheSpring framework includes several other modules in addition to its core IoC container. http://www.springframework.org.
  • 5.
    WHY WE NEEDFLEX ACCESS SPRING? Flex is the obvious choice when a Spring Developer is looking at RIA. Can reuse your server-side Spring to move into RIA.
  • 6.
    WHY WE NEEDFLEX ACCESS SPRING? In scenario of the Remoting and Data Management Services approaches: It enable the tightest integration with Spring. There is no need to transform data, or to expose services in a certain way: the Flex application works directly with the beans registered in the Spring IoC container.
  • 7.
    WHY WE NEEDFLEX ACCESS SPRING? The BlazeDS Remoting enables binding your valueobjects with Java pojo Classes easily by metadata [RemoteClass(alias=”com.adobe.pojo.ob”] By using the Spring Security 2.0 we can make our application secured for transactions.
  • 8.
    WHAT is BlazeDS? BlazeDSprovides a set of services that lets you connect a client-side application to server-side data, and pass data among multiple clients connected to the server. BlazeDS implements real-time messaging between clients. Browser application or AIR .swf http(s) domain blazeds server External Remote Services Service Procedure Messaging Proxy Calls
  • 9.
    BlazeDS Server servlet /{context}/messagebroker/* core config proxy-config.xml config config messaging-config.xml services-config.xml config flex remote-config.xml domain library config .jar .class Classes Lib
  • 10.
    BLAZE DS WAY Using the “dependency lookup” approach of the SpringFactory feels opposite to the "Spring Way" The burden of configuration is multiplied. Potential for deep integration beyond just remoting is limited.
  • 11.
    BLAZEDS SPRING INTEGRATION Bootstrap the BlazeDS MessageBroker as a Spring-managed bean (no more web.xml or MessageBrokerServlet config needed). Route http-based Flex messages to the MessageBroker through the Spring DispatcherServlet. Expose Spring beans for remoting by namespace
  • 12.
    TRADITIONAL BLAZE DSWAY The BlazeDS configuration first imports the 'remoting-config.xml',The parameters in the URL 'server.name' and 'server.port' are supplied by the Flex runtime. The 'context.root' parameter needs to be supplied during compilation using the 'context-root' compiler option. services-config.xml <?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service-include file-path="remoting-config.xml" /> <default-channels> <channel ref="person-amf"/> </default-channels> </services> <channels> <channel-definition id="person-amf" class="mx.messaging.channels.AMFChannel"> <endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>
  • 13.
    SPRING BLAZEDS INTEGRATION Example: WEB.XML Spring BlazeDS Integration servlet <servlet> <servlet-name>spring-flex</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/flex-servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> Mapping Spring BlazeDS Integration servlet to handle all requests to '/spring/* <servlet-mapping> <servlet-name>spring-flex</servlet-name> <url-pattern>/spring/*</url-pattern> </servlet-mapping>
  • 14.
    SPRING BLAZE DSEXAMPLE flex-servlet-context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:flex="http://www.springframework.org/schema/flex" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/flex http://www.springframework.org/schema/flex/spring-flex-1.0.xsd"> <context:component-scan base-package="org.springbyexample.web.service" /> <flex:message-broker/> ----Spring BlazeDS Integration configuration of the BlazeDS message broker, which handles remoting and messaging requests. <flex:remoting-destination ref="personDao" /> ---Exposes the personDao bean as a BlazeDS remoting destination </beans>
  • 15.
    SPRING BLAZEDS INTEGRATION PersonService.java @Service @RemotingDestination public class PersonService { private final PersonDao personDao; /** * Constructor */ @Autowired public PersonService(PersonDao personDao) { this.personDao = personDao; } public void remove(int id) { Person person = personDao.findPersonById(id); personDao.delete(person); } } PersonDeleteCommand.as var ro:RemoteObject = new RemoteObject("personDao"); ro.remove(id); ro.addEventListener(ResultEvent.RESULT, updateSearch);
  • 16.
    Cairngorm with UMExtensions  Universal Mind Cairngorm Extensions ( UM – CGX is easy to migrate from CG)  Event – Business logic combined together  Command logic can be aggregated to context-specific command classes (minimizes the number of classes)  Support for easy queue of delegate calls (SequenceGenerator)
  • 17.
    Cairngorm with UMExtensions  Create Responder in view  Add responder to event  Cache/Store responder from event to command  In Command, on success/failure call back these responders  On view handle success/failure to control view states
  • 19.
    Cairngorm with UMExtensions View Layer Model Layer Control Layer ModelLocator via IResponder tcp/ip via databinding View Command Delegate Server via eventdispatching MVC Classic Usage View Layer Business Layer via IResponder via IResponder tcp/ip View Command Delegate Server via eventdispatching Using View Notifications
  • 20.
    J2EE – DAOINTRODUCTION  All database access in the system is made through a DAO to achieve encapsulation.  Each DAO instance is responsible for one primary domain object or entity. If a domain object has an independent lifecycle, it should have its own DAO.  The DAO is responsible for creations, reads (by primary key), updates, and deletions -- that is, CRUD -- on the domain object.
  • 21.
    generic DAO Forcreating a new DAO we need → a Hibernate mapping file, a plain old Java interface, and 10 lines in your Spring configuration file. Resource: http://www.ibm.com/developerworks/java/library/j- genericdao.html
  • 22.
    CairnSpring The CairnSpring includesboth Caringorm UM, Generic DAO along with the Spring BlazeDS Integration. It also enables Paging request. http://www.code.google.com/p/cairnspring
  • 23.
    RemoteObject Channels Producer Consumer Dataservice NIO Long NIO HTTP NIO Polling RTMP Polling Streaming Long AMF Polling Streaming Piggyback Polling Messaging Remoting Data Mgmt Proxy Services Change Pub/Sub RPC Tracking Real Time Push AMF Data Sync PDF Adapters JMS SQL Java Hibernate ColdFusion WSRP Spring Security
  • 24.