1   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
GlassFish REST Administration Back End
An Insider Look at a Real REST Application
John Clingan, Principal Product Manager, Oracle
 2   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
The following is intended to outline our general product direction.
    It is intended for information purposes only, and may not be
    incorporated into any contract. It is not a commitment to deliver
    any material, code, or functionality, and should not be relied upon
    in making purchasing decisions. The development, release, and
    timing of any features or functionality described for Oracle s
    products remains at the sole discretion of Oracle.




3   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Program Agenda

    •  Background
          –  JAX-RS
          –  GlassFish
    •  Implementation details
    •  Tips and Tricks
    •  Clients
    •  Future plans
    •  Q & A
4   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Program Agenda

    •  Background
          –  JAX-RS
          –  GlassFish
    •  Implementation details
    •  Tips and Tricks
    •  Clients
    •  Future plans
    •  Q & A
5   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Background
    JAX-RS
    •  JAX-RS
          –  Standard annotation-driven API that aims to help developers build
             RESTful Web services in Java
          –  JSR 311: JAX-RS 1.x released Nov 2009
    •  Jersey
          –  Reference implementation of JAX-RS
          –  Ships with GlassFish




6   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Background
    Sample JAX-RS resource
    1     @Path("myresource")

    2     @Produces({"application/html, application/xml, application/json"})

    3     public class MyResource {

    4

    5           @GET    /* curl -X GET http://example.com/myapp/myresource */

    6           public MyResource getMyResource() { . . . }

    7

    8           @Path("{Name}/") /* curl -X GET http://example.com/myapp/myresource/someChildName */

    9           public ChildResource getMyChildResource(@PathParam("Name") String name) { . . .}

    10

    11          @POST /* curl -X POST -d "attr1=value1:attr2=value2..." http://example.com/myapp/myresource */

    12          public Response createResource(HashMap<String, String> data) { . . . }

    13

    14          @DELETE /* curl -X DELETE http://.../myapp/myresource */

    15          public Response deleteResource() { . . . }

    16    }





7    Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Program Agenda

    •  Background
          –  JAX-RS
       •  GlassFish
    •  Implementation details
    •  Tips and Tricks
    •  Clients
    •  Future plans
    •  Q & A
8   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Background
    GlassFish
          –  Java EE reference implementation
          –  Highly modular
                   •  Leverages OSGI
                   •  Every container/service is a set of OSGI modules
                   •  Multiple distributions
                       –  Java EE Web Profile.
                       –  Java EE Full Profile
                   •  Extensible – add custom modules
          –  Administration using CLI, Console, REST API


9   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Background
     GlassFish Modular Architecture
           Full Profile Distribution
              MDB Container                             JMS Service               EJB Container              CMP             Java Mail         ACC



          Web Profile Distribution
                                                  EJB Lite                     Java            Transaction         Naming
            Web Container                                                                                                      Deployment   JDBC Service
                                                  Container                 Persistence          Service           Service


          GlassFish Nucleus
                   Config                                   CLI                                          Monitoring           REST           Security
                                                                                     Grizzly
                 Framework                               Framework                                       Framework           Backend         Service


                                                                                                  HK2
                                                                                          OSGI Runtime
                                                                                               Java SE

10   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Background
     GlassFish Configuration
     •  domain.xml file
           –  Persistence storage for configuration
           –  Dynamic structure and content.
                    •  GlassFish is highly modular
                    •  Defined at run time depending on modules installed




11   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Background
     GlassFish domain.xml snippet
     1 <domain log-root="${com.sun.aas.instanceRoot}/logs" ... >

     2   <applications>...</applications>

     3   <resources>

     4     <jdbc-connection-pool datasource-classname="..." res-type="javax.sql.XADataSource" name="__TimerPool">        

     5       <property name="connectionAttributes" value=";create=true"></property>

     6       ...

     7     </jdbc-connection-pool>

     8     <jdbc-connection-pool datasource-classname="..." res-type="javax.sql.XADataSource" name="MyPool">      

     9       <property name="MyProperty" value="MyValue"></property>

     10    </jdbc-connection-pool>

     11      ...

     12   <jdbc-resource pool-name="TimerPool" jndi-name="jdbc/__TimerPool" object-type="system-admin"></jdbc-resource>

     13      ...

     14 </resources>

     15 <configs>

     16    <config name="server-config">

     17      <http-service> ... </http-service>

     18      <ejb-container session-store="${com.sun.aas.instanceRoot}/session-store">

     19        <ejb-timer-service>...</ejb-timer-service>

     20      </ejb-container>

     21       ...

     22    </config>

     23      ...

     24 </configs>

     25 ...

     26 </domain>"


12    Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Program Agenda

     •  Background
           –  JAX-RS
           –  GlassFish
     •  Implementation details
     •  Tips and Tricks
     •  Clients
     •  Future plans
     •  Q & A
13   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     GlassFish Config Beans
     •  Annotated POJOs
     •  Each module uses Config Beans to define its
        configuration




14   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     Example Config Bean
     @Configured"
     public interface JdbcConnectionPool extends ConfigBeanProxy {"
        @Attribute(key=true) "
        String getName(); "
        void setName(String value);"

          @Attribute "
          String getDatasourceClassname();"
          ..."
          @Element "
          List<Property> getProperty();"
          ..."
     }"




15   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     Example Config Bean
     @Configured"
     public interface JdbcConnectionPool extends ConfigBeanProxy {"
        @Attribute(key=true) "
        String getName(); "
        @Attribute "
        String getDatasourceClassname();"
        ..."
        @Element "
         List<Property> getProperty();"
         ..."
     }"

     Corresponding snippet from domain.xml
     <jdbc-connection-pool name=" ... " datasource-classname=" ... " >"
           <property name="..." value="..."/ >   "
           <property name="..." value="..."/ >   "
     </jdbc-connection-pool>"




16    Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     GlassFish Command Line Interface (CLI)
     •  The gateway to manipulate GlassFish configuration
           –  Transaction
           –  Replication
     •  Examples
           –  Create a jdbc connection pool
                    $       asadmin create-jdbc-connection-pool 

                                     --datasourceclassname oracle.jdbc.pool.OracleDataSource 

                                     --property User=scott:Password=tiger:URL=jdbc:oracle:thin ..."
                                                    MyOraclePool"

           –  Delete a jdbc connection pool
                    $       asadmin delete-jdbc-connection-pool MyOraclePool"



17   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     GlassFish Command Line Interface (CLI)
     1     @org.glassfish.api.admin.ExecuteOn(RuntimeType.ALL)

     2     @Service(name="create-jdbc-connection-pool")

     3      ...

     4     public class CreateJdbcConnectionPool implements AdminCommand { 

     5       @Param(name="jdbc_connection_pool_id", alias = "name", primary=true)

     6       String jdbc_connection_pool_id;

     7

     8           @Param(name = "datasourceClassname",                        optional=true)

     9           String datasourceclassname;

     10

     11          @Param(name="property", optional=true, separator=':')

     12          Properties properties;

     13

     14          public void execute(AdminCommandContext context) {

     15             create_internal_data_structures();

     16             persist_into_configuration();

     17          }

     18    }



18    Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     GlassFish admin REST backend
     •  Management
                                                                            GlassFish Server Instance
           –  Access to configuration                                              REST Backend

           –  GET to access and navigate                                                    POST     DELETE


              configuration tree                                                GET        GlassFish CLI


           –  POST/DELETE to mutate configuration                                     Config Beans

                    •  Wraps CLI to mutate configuration
                       objects                                                        domain.xml




19   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     GlassFish admin REST backend
     •  Monitoring                                                          GlassFish Server Instance
           –  Data available as a tree in                                           REST Backend

              running GlassFish VM                                                   GET

           –  GET to access and navigate                                    Monitoring Tree

              the tree




20   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     GlassFish admin REST backend
     •  Demo
           –  Lets see REST backend in action




21   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     GlassFish Config Bean as REST resource
     1   public class ListJdbcConnectionPoolResource {

     2

     3   @Context protected ResourceContext resourceContext;

     4

     5   @GET 

     6   public Response get() {

     7       return Response.ok().entity(get_list_of_jdbc_resources()).build()

     8   }

     9

     10 @POST

     11     public Response createResource(HashMap<String, String> data) {

     12       RestActionReporter actionReport = ResourceUtil.runCommand(getPostCommand(), data, ...);

     13       return Response.ok(arr).build();

     14 }

     15

     16 @Path("{Name}/") 

     17 public JdbcConnectionPoolResource getJdbcConnectionPoolResource(@PathParam("Name") String id){

     18      JdbcConnectionPoolResource resource =        

     19            resourceContext.getResource(JdbcConnectionPoolResource.class);

     20      resource.setBeanByKey(entity, id);

     21      return resource;

     22 }

     23 }"

22    Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     GlassFish Config Bean as REST resource
     1   public class JDBCConnectionPoolResource {"
     2            ""
     3    @GET"
     4    public Response getEntity() {"
     5         return Response.ok(get_content_of_current_config_bean() )"
     6    } "
     7"
     8    @POST"
     9    public Response updateEntity(HashMap<String, String> data) {"
     10       RestActionReporter ar = Util.applyChanges(data, uriInfo, habitat); // calls asadmin set"
     11       return Response.ok(

     12              ResourceUtil.getActionReportResult(ar, successMessage, requestHeaders, uriInfo)).build();"
     13   }"
     14"
     15   @DELETE"
     16    public Response delete(HashMap<String, String> data) {"
     17         RestActionReporter actionReport = runCommand(getDeleteCommand(), data);"
     18    }"
     19"
     20 }"




23    Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     Code Generation
     •  Generate REST resources dynamically
           –  Visit each bean of GlassFish config model to drive generation
                    •  Bytecode
                        –  Uses ASM
                    •  Text – For development time debugging
                    •  Report – Generating usage report
           –  Abstract out most of the logic in handwritten base class
           –  REST enable newly added module transparently



24   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     Demo
     •  Lets go through real code to see this in action




25   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Implementation Details
     Bootstrapping
     •  Initialized lazily
           –  No startup penalty
     •  No dependency on servlet container
           –  Using Grizzly adapter




26   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Program Agenda

     •  Background
           –  JAX-RS
           –  GlassFish
     •  Implementation details
     •  Tips and Tricks
     •  Clients
     •  Future plans
     •  Q & A
27   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Tips And Tricks
     Enable Efficient Programmatic and Manual Consumption
     •  GlassFish REST interface is used by
           –  Users of GlassFish.
                    •  Prefer HTML
           –  GlassFish Admin GUI and other programmatic consumption
                    •  Prefer JSON/XML
     •  @Provider for various formats
           –  ActionReport[Html|Json|Xml]Provider
     •  com.sun.jersey….ResourceConfig#MediaTypeMapping
           –  Add mediatype mapping for “.xml” “.json” and “.html” for content
              negotiation
28   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Tips And Tricks
     Annotate domain model
     •  Enables modularity
           –  Associate commands that manipulate a config bean
                    @Configured "
                    @RestRedirects({"
                      @RestRedirect(opType = RestRedirect.OpType.POST, commandName = "create-jdbc-resource"),"
                      @RestRedirect(opType = RestRedirect.OpType.DELETE, commandName = "delete-jdbc-resource")"
                    })"
                "public interface JdbcResource extends ConfigBeanProxy,     Resource, .. { . . . }"

           –  Place a command at certain position in tree
                  @Service(name = "copy-config")"
                  @RestEndpoints({"
                      @RestEndpoint(configBean=Configs.class, opType=OpType.POST, path="copy-config",..)"
                    })"
                  public final class CopyConfigCommand ...{ ... }





29   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Tips And Tricks
     Security
     •  REST is stateless
           –  Authentication info travels with every request
                    •  GlassFish Admin GUI console (Client) needs to cache credentials
                    •  Security Risk if it caches userId + passWord
     •  Authentication tokens
           –  Self expiring
           –  Admin GUI requests a token with user supplied id and password
           –  Subsequent request only need to use the token


30   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Tips and Tricks                                                                  GET instance1                   GET instance2
                                                                                      data                            data
     Proxy-ing
     •  GlassFish Monitoring                                                                             DAS
                                                                                                      REST Backend

           –  Data collected on each                                           GET                                                     GET

              instance of cluster                                                                Monitoring Tree



     •  Proxy instance data
        through DAS
                                                                                                                        Instance2
           –  DAS proxies request to                                           Instance1
                                                                              REST Backend
                                                                                                                       REST Backend

              target instance
                                                                                                                     Monitoring Tree
           –  Provides transparency                                         Monitoring Tree


           –  Handles security

31   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Program Agenda

     •  Background
           –  JAX-RS
           –  GlassFish
     •  Implementation details
     •  Tips and Tricks
     •  Clients
     •  Future plans
     •  Q & A
32   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Clients Of GlassFish REST backend

     •  GlassFish Admin GUI console
     •  GlassFish NetBean plugin
     •  GlassFish Eclipse plugin
     •  GlassFish.next
           –  GlassFish PaaS console
     •  End Users
           –  Browser
           –  Demo from Adam Bien

33   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Program Agenda

     •  Background
           –  JAX-RS
           –  GlassFish
     •  Implementation details
     •  Tips and Tricks
     •  Clients
     •  Future plans
     •  Q & A
34   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Future Plans

     •  Provide client side library with various language bindings
     •  Backend of PaaS console for GlassFish.next
     •  Leverage planned work in Jersey to define REST
        resources without generating classes
     •  Improve HTML interface
     •  Internal clean up



35   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Resources

     •  GlassFish
           –  home page - http://glassfish.java.net/
           –  REST backend source code -
              https://svn.java.net/svn/glassfish~svn/trunk/main/nucleus/admin/rest/rest-service/
     •  JAX-RS
           –  JAX-RS 1.x - http://jcp.org/en/jsr/detail?id=311
           –  JAX-RS 2.0 - http://jcp.org/en/jsr/detail?id=339
           –  Jersey – http://jersey.java.net




36   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Q&A


37   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
Tokyo 2012
                                                                            April 4–6, 2012




38   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
39   Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

GlassFish REST Administration Backend

  • 1.
    1 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 2.
    GlassFish REST AdministrationBack End An Insider Look at a Real REST Application John Clingan, Principal Product Manager, Oracle 2 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 3.
    The following isintended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle s products remains at the sole discretion of Oracle. 3 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 4.
    Program Agenda •  Background –  JAX-RS –  GlassFish •  Implementation details •  Tips and Tricks •  Clients •  Future plans •  Q & A 4 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 5.
    Program Agenda •  Background –  JAX-RS –  GlassFish •  Implementation details •  Tips and Tricks •  Clients •  Future plans •  Q & A 5 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 6.
    Background JAX-RS •  JAX-RS –  Standard annotation-driven API that aims to help developers build RESTful Web services in Java –  JSR 311: JAX-RS 1.x released Nov 2009 •  Jersey –  Reference implementation of JAX-RS –  Ships with GlassFish 6 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 7.
    Background Sample JAX-RS resource 1 @Path("myresource")
 2 @Produces({"application/html, application/xml, application/json"})
 3 public class MyResource {
 4
 5 @GET /* curl -X GET http://example.com/myapp/myresource */
 6 public MyResource getMyResource() { . . . }
 7
 8 @Path("{Name}/") /* curl -X GET http://example.com/myapp/myresource/someChildName */
 9 public ChildResource getMyChildResource(@PathParam("Name") String name) { . . .}
 10
 11 @POST /* curl -X POST -d "attr1=value1:attr2=value2..." http://example.com/myapp/myresource */
 12 public Response createResource(HashMap<String, String> data) { . . . }
 13
 14 @DELETE /* curl -X DELETE http://.../myapp/myresource */
 15 public Response deleteResource() { . . . }
 16 }
 7 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 8.
    Program Agenda •  Background –  JAX-RS •  GlassFish •  Implementation details •  Tips and Tricks •  Clients •  Future plans •  Q & A 8 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 9.
    Background GlassFish –  Java EE reference implementation –  Highly modular •  Leverages OSGI •  Every container/service is a set of OSGI modules •  Multiple distributions –  Java EE Web Profile. –  Java EE Full Profile •  Extensible – add custom modules –  Administration using CLI, Console, REST API 9 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 10.
    Background GlassFish Modular Architecture Full Profile Distribution MDB Container JMS Service EJB Container CMP Java Mail ACC Web Profile Distribution EJB Lite Java Transaction Naming Web Container Deployment JDBC Service Container Persistence Service Service GlassFish Nucleus Config CLI Monitoring REST Security Grizzly Framework Framework Framework Backend Service HK2 OSGI Runtime Java SE 10 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 11.
    Background GlassFish Configuration •  domain.xml file –  Persistence storage for configuration –  Dynamic structure and content. •  GlassFish is highly modular •  Defined at run time depending on modules installed 11 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 12.
    Background GlassFish domain.xml snippet 1 <domain log-root="${com.sun.aas.instanceRoot}/logs" ... >
 2 <applications>...</applications>
 3 <resources>
 4 <jdbc-connection-pool datasource-classname="..." res-type="javax.sql.XADataSource" name="__TimerPool"> 
 5 <property name="connectionAttributes" value=";create=true"></property>
 6 ...
 7 </jdbc-connection-pool>
 8 <jdbc-connection-pool datasource-classname="..." res-type="javax.sql.XADataSource" name="MyPool"> 
 9 <property name="MyProperty" value="MyValue"></property>
 10 </jdbc-connection-pool>
 11 ...
 12 <jdbc-resource pool-name="TimerPool" jndi-name="jdbc/__TimerPool" object-type="system-admin"></jdbc-resource>
 13 ...
 14 </resources>
 15 <configs>
 16 <config name="server-config">
 17 <http-service> ... </http-service>
 18 <ejb-container session-store="${com.sun.aas.instanceRoot}/session-store">
 19 <ejb-timer-service>...</ejb-timer-service>
 20 </ejb-container>
 21 ...
 22 </config>
 23 ...
 24 </configs>
 25 ...
 26 </domain>" 12 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 13.
    Program Agenda •  Background –  JAX-RS –  GlassFish •  Implementation details •  Tips and Tricks •  Clients •  Future plans •  Q & A 13 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 14.
    Implementation Details GlassFish Config Beans •  Annotated POJOs •  Each module uses Config Beans to define its configuration 14 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 15.
    Implementation Details Example Config Bean @Configured" public interface JdbcConnectionPool extends ConfigBeanProxy {" @Attribute(key=true) " String getName(); " void setName(String value);" @Attribute " String getDatasourceClassname();" ..." @Element " List<Property> getProperty();" ..." }" 15 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 16.
    Implementation Details Example Config Bean @Configured" public interface JdbcConnectionPool extends ConfigBeanProxy {" @Attribute(key=true) " String getName(); " @Attribute " String getDatasourceClassname();" ..." @Element " List<Property> getProperty();" ..." }" Corresponding snippet from domain.xml <jdbc-connection-pool name=" ... " datasource-classname=" ... " >" <property name="..." value="..."/ > " <property name="..." value="..."/ > " </jdbc-connection-pool>" 16 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 17.
    Implementation Details GlassFish Command Line Interface (CLI) •  The gateway to manipulate GlassFish configuration –  Transaction –  Replication •  Examples –  Create a jdbc connection pool $ asadmin create-jdbc-connection-pool 
 --datasourceclassname oracle.jdbc.pool.OracleDataSource 
 --property User=scott:Password=tiger:URL=jdbc:oracle:thin ..." MyOraclePool" –  Delete a jdbc connection pool $ asadmin delete-jdbc-connection-pool MyOraclePool" 17 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 18.
    Implementation Details GlassFish Command Line Interface (CLI) 1 @org.glassfish.api.admin.ExecuteOn(RuntimeType.ALL)
 2 @Service(name="create-jdbc-connection-pool")
 3 ...
 4 public class CreateJdbcConnectionPool implements AdminCommand { 
 5 @Param(name="jdbc_connection_pool_id", alias = "name", primary=true)
 6 String jdbc_connection_pool_id;
 7
 8 @Param(name = "datasourceClassname", optional=true)
 9 String datasourceclassname;
 10
 11 @Param(name="property", optional=true, separator=':')
 12 Properties properties;
 13
 14 public void execute(AdminCommandContext context) {
 15 create_internal_data_structures();
 16 persist_into_configuration();
 17 }
 18 }
 18 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 19.
    Implementation Details GlassFish admin REST backend •  Management GlassFish Server Instance –  Access to configuration REST Backend –  GET to access and navigate POST DELETE configuration tree GET GlassFish CLI –  POST/DELETE to mutate configuration Config Beans •  Wraps CLI to mutate configuration objects domain.xml 19 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 20.
    Implementation Details GlassFish admin REST backend •  Monitoring GlassFish Server Instance –  Data available as a tree in REST Backend running GlassFish VM GET –  GET to access and navigate Monitoring Tree the tree 20 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 21.
    Implementation Details GlassFish admin REST backend •  Demo –  Lets see REST backend in action 21 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 22.
    Implementation Details GlassFish Config Bean as REST resource 1 public class ListJdbcConnectionPoolResource {
 2
 3 @Context protected ResourceContext resourceContext;
 4
 5 @GET 
 6 public Response get() {
 7 return Response.ok().entity(get_list_of_jdbc_resources()).build()
 8 }
 9
 10 @POST
 11 public Response createResource(HashMap<String, String> data) {
 12 RestActionReporter actionReport = ResourceUtil.runCommand(getPostCommand(), data, ...);
 13 return Response.ok(arr).build();
 14 }
 15
 16 @Path("{Name}/") 
 17 public JdbcConnectionPoolResource getJdbcConnectionPoolResource(@PathParam("Name") String id){
 18 JdbcConnectionPoolResource resource = 
 19 resourceContext.getResource(JdbcConnectionPoolResource.class);
 20 resource.setBeanByKey(entity, id);
 21 return resource;
 22 }
 23 }" 22 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 23.
    Implementation Details GlassFish Config Bean as REST resource 1 public class JDBCConnectionPoolResource {" 2 "" 3 @GET" 4 public Response getEntity() {" 5 return Response.ok(get_content_of_current_config_bean() )" 6 } " 7" 8 @POST" 9 public Response updateEntity(HashMap<String, String> data) {" 10 RestActionReporter ar = Util.applyChanges(data, uriInfo, habitat); // calls asadmin set" 11 return Response.ok(
 12 ResourceUtil.getActionReportResult(ar, successMessage, requestHeaders, uriInfo)).build();" 13 }" 14" 15 @DELETE" 16 public Response delete(HashMap<String, String> data) {" 17 RestActionReporter actionReport = runCommand(getDeleteCommand(), data);" 18 }" 19" 20 }" 23 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 24.
    Implementation Details Code Generation •  Generate REST resources dynamically –  Visit each bean of GlassFish config model to drive generation •  Bytecode –  Uses ASM •  Text – For development time debugging •  Report – Generating usage report –  Abstract out most of the logic in handwritten base class –  REST enable newly added module transparently 24 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 25.
    Implementation Details Demo •  Lets go through real code to see this in action 25 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 26.
    Implementation Details Bootstrapping •  Initialized lazily –  No startup penalty •  No dependency on servlet container –  Using Grizzly adapter 26 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 27.
    Program Agenda •  Background –  JAX-RS –  GlassFish •  Implementation details •  Tips and Tricks •  Clients •  Future plans •  Q & A 27 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 28.
    Tips And Tricks Enable Efficient Programmatic and Manual Consumption •  GlassFish REST interface is used by –  Users of GlassFish. •  Prefer HTML –  GlassFish Admin GUI and other programmatic consumption •  Prefer JSON/XML •  @Provider for various formats –  ActionReport[Html|Json|Xml]Provider •  com.sun.jersey….ResourceConfig#MediaTypeMapping –  Add mediatype mapping for “.xml” “.json” and “.html” for content negotiation 28 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 29.
    Tips And Tricks Annotate domain model •  Enables modularity –  Associate commands that manipulate a config bean @Configured " @RestRedirects({" @RestRedirect(opType = RestRedirect.OpType.POST, commandName = "create-jdbc-resource")," @RestRedirect(opType = RestRedirect.OpType.DELETE, commandName = "delete-jdbc-resource")" })" "public interface JdbcResource extends ConfigBeanProxy, Resource, .. { . . . }" –  Place a command at certain position in tree @Service(name = "copy-config")" @RestEndpoints({" @RestEndpoint(configBean=Configs.class, opType=OpType.POST, path="copy-config",..)" })" public final class CopyConfigCommand ...{ ... }
 29 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 30.
    Tips And Tricks Security •  REST is stateless –  Authentication info travels with every request •  GlassFish Admin GUI console (Client) needs to cache credentials •  Security Risk if it caches userId + passWord •  Authentication tokens –  Self expiring –  Admin GUI requests a token with user supplied id and password –  Subsequent request only need to use the token 30 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 31.
    Tips and Tricks GET instance1 GET instance2 data data Proxy-ing •  GlassFish Monitoring DAS REST Backend –  Data collected on each GET GET instance of cluster Monitoring Tree •  Proxy instance data through DAS Instance2 –  DAS proxies request to Instance1 REST Backend REST Backend target instance Monitoring Tree –  Provides transparency Monitoring Tree –  Handles security 31 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 32.
    Program Agenda •  Background –  JAX-RS –  GlassFish •  Implementation details •  Tips and Tricks •  Clients •  Future plans •  Q & A 32 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 33.
    Clients Of GlassFishREST backend •  GlassFish Admin GUI console •  GlassFish NetBean plugin •  GlassFish Eclipse plugin •  GlassFish.next –  GlassFish PaaS console •  End Users –  Browser –  Demo from Adam Bien 33 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 34.
    Program Agenda •  Background –  JAX-RS –  GlassFish •  Implementation details •  Tips and Tricks •  Clients •  Future plans •  Q & A 34 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 35.
    Future Plans •  Provide client side library with various language bindings •  Backend of PaaS console for GlassFish.next •  Leverage planned work in Jersey to define REST resources without generating classes •  Improve HTML interface •  Internal clean up 35 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 36.
    Resources •  GlassFish –  home page - http://glassfish.java.net/ –  REST backend source code - https://svn.java.net/svn/glassfish~svn/trunk/main/nucleus/admin/rest/rest-service/ •  JAX-RS –  JAX-RS 1.x - http://jcp.org/en/jsr/detail?id=311 –  JAX-RS 2.0 - http://jcp.org/en/jsr/detail?id=339 –  Jersey – http://jersey.java.net 36 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 37.
    Q&A 37 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 38.
    Tokyo 2012 April 4–6, 2012 38 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 39.
    39 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.