More Related Content
Similar to GlassFish REST Administration Backend (20)
More from Arun Gupta (20)
GlassFish REST Administration Backend
- 1. 1 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
- 2. 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.
- 3. 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.
- 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 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.
- 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.