Miles to go …

August 24, 2010

TOTD #144: CDI @Produces for container-managed @Resource

Filed under: General — arungupta @ 4:07 am

Contexts & Dependency Injection (CDI) in Java EE 6 provides type-safe dependency injection. The type-safety part comes from the fact that no String-based identifiers are used for dependency injection. Instead CDI runtime uses the typing information that is already available in the Java object model.

Java EE 5 already had resource injection available in terms of PersistenceContext, PersistenceUnit, Resource, and others. But they require String-based identifiers to identify the resource to be injected. For example:

  • @PersistenceUnit(unitName="SOME_NAME")
  • @Resource(name="JNDI_NAME")
  • @WebServiceRefs(lookup="JNDI_NAME_OF_WEB_SERVICE_REF")

The main proposition of CDI is type-safety. This Tip Of The Day explains how @Produces annotation provided by CDI can be used to centralize all these String-based resource injection and add a facade of type-safety on them. Specifically, it shows how type-safety can be achieved for @PersistenceUnit. A similar approach can be taken for other String-based resource injections as well.

  1. Create a Singleton-scoped bean or Application-scoped bean as:
    import javax.inject.Singleton;
    @Singleton
    public class ApplicationResources {
    }
    

    All the Java EE component environment references can be centralized in this bean.

  2. If the PersistenceUnit is currently initialized as:
    @PersistenceUnit(unitName="StatesPU") EntityManagerFactory statesEMF;
    

    in other Java EE components, such as Servlet, then it can be alternatively defined in the type-safe manner using the following steps:

    1. Define a new Qualifier as:
      import static java.lang.annotation.ElementType.TYPE;
      import static java.lang.annotation.ElementType.FIELD;
      import static java.lang.annotation.ElementType.PARAMETER;
      import static java.lang.annotation.ElementType.METHOD;
      import static java.lang.annotation.RetentionPolicy.RUNTIME;
      import java.lang.annotation.Retention;
      import java.lang.annotation.Target;
      import javax.inject.Qualifier;
      @Qualifier
      @Retention(RUNTIME)
      @Target({METHOD, FIELD, PARAMETER, TYPE})
      public @interface StatesDatabase {
      }
      
    2. Add the type-safe definition of "EntityManagerFactory" in "ApplicationResources" bean (defined above) as:
      @Produces @PersistenceUnit(unitName="StatesPU") @StatesDatabase EntityManagerFactory statesEMF;
      

    3. The "EntityManagerFactory" can now be injected in the Servlet in a type-safe manner as:
      @Inject @StatesDatabase EntityManagerFactory emf;
      

This procedure can be repeated for other String-based resources as well and thus centralize all of them at one place. And now your application becomes more type-safe! With this TOTD, you can use @Inject for injecting your container- and application-managed resources easily.

Read the latest documentation on Weld (Reference Implementation for CDI and included in GlassFish) for more details.

Technorati: totd cdi javaee6 glassfish weld produces typesafety

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • DZone
  • StumbleUpon
  • Technorati
  • Twitter
  • Slashdot

August 22, 2010

IndicThreads Cloud Computing 2010 Trip Report

Filed under: General — arungupta @ 4:15 am

IndicThreads.com had their inaugural conference on Upcoming Technology on Aug 20/21 in the city of Pune, India. As the name says, the goal of this conference is to talk about upcoming technologies and Cloud Computing was the chosen topic this time. Harshad & Sangeeta Oak – the driving forces behind Rightrix and this conference made it clear that this conference is not intended to be a training and the aim is to present the latest happening in the cloud world and get the attendees thinking. BTW, Harshad is also an Oracle ACE Director and a Java Champion. The theme of the conference was easily summarized in "Learn, Discuss, Debate, Argue".

Please provide feedback for the sessions at http://u10.indicthreads.com/feedback.

I gave a session on "Running your Java EE 6 applications in the Cloud" and the slides are available below:

Running your Java EE 6 applications in the Cloud

I continue to stick to my philosophy of "Code is king" and showed several code samples & screen snapshots. Several attendees told me afterwards that they liked the session because it was well grounded.

The conference had a single track which gives you the ability to attend all the sessions, and there were several of them. Here are my brief notes from some of the sessions I attended. All the slides from different sessions are given below:


And now some notes …

Cloud computing – making the right choice by Kalpak Shah

  • Why cloud ?
    • No capital expenditure, only operational expenses
    • Reduced IT administration
    • Elasticity – Fast & inherent scale up/down
    • Commoditization of IT – Only storage, only content delivery, only messaging
    • Automation using APIs
    • Pay-as-you-go for tools & ecosystem
    • Reduced time to market, focus on core competency
  • Explained the concept of Iaas, PaaS, SaaS, and then Storage-as-a-Service (yet another SaaS)
    • Consideration for IaaS
      • Combine Support & Infrastructure – Amazon is cheap for infrastructure, costly for support
      • Cores are much slower on Amazon, faster on Rackspace
      • Good matrix for comparing IaaS vendors
    • Comparing PaaS & SaaS vendors
      • Development language & available skill sets
      • Ease of deployment & maintenance
      • Size of vendor & ecosystem maturity
      • Tools, monitoring, connectors, adaptors
      • Maturity of API & bindings available
      • Does vendor allow private cloud integration ?
  • Ways to Cloudify
    • Public clouds – Large datacenters, provide many services (CPU, storage, CDN, databases, etc), can try it, but comes with security, latency & bandwidth issues
    • Private clouds Normal on-premise databcenters with cloud with all usual benefits of elasticity, self-service, pay-asyou-go, programmabilty, offerings from VMWare, IBM, Microsoft, Eucalyptus
    • Hybrid clouds SaaS Virtual desktops for training Cloud storage for backup etc
  • Interesting private cloud platforms
    • Eucalyptus – Open-source IaaS cloud computing platform, compatbile with AWS enabling almost seamless movement with AWS, Extremely flexible and easy to administer
    • VMWare vCloud – Take the private cloud image, drag/drop on the public cloud and it just works. Platform is consistent & mature and it just works
    • Appistry – Application platform for private, public, and hybrid clouds
    • Rackspace – OpenStack compute and OpenStack storage
    • VMOps
  • Azure
    • Cloud services operating system
    • Provide services across the entire cloud stack – IaaS, PaaS, SaaS
    • Development, service hosting & management
    • Integrated with exisitng on -premises environment
    • Private cloud integration
    • Reliance is using Azure for some of their projects

Architecture Challenges in Cloud Computing by Prabodh Navare

  • Design for auto-scaling, high performance, failover, data portability, pay-as-you-go
  • Vertical scalability – write algorithms that are efficient
  • Horizontal scalability – Have the applications as simple/replicable as possible
  • Options for private cloud in open Source – Eucalyptus, Ubuntu enterprise Cloud, Open nebula, Nimbus, redhat

Getting started with jClouds by Vikas Hazrati

  • Fog, Deltacloud – Ruby-based multicloud library
  • Libcloud – Python-based
  • Dasein uses jclouds as their base API
  • jClouds easy to start
    • Simple interface (Map object)
    • OSS
    • Runtime portability
    • Java & Clojure
    • Unit testability across clouds
    • High performance because of NIO
  • Blobstore (atmos, azure, rackspace, s3)
  • Compute (vcloud, ec2, gogrid, ibmdev, rackspace, rimu)
  • Not 100% but pragmatic portability, dig in with extensions
  • Integration with Apache VFS to see the listing of Blobstore

Preparing data for your cloud by Narinder Kumar

  • Advantages of Non-relational DBMS
    • Scalability
    • Replication / Availability (less feature set but more performant)
    • Performance
    • Deployment flexibility
    • Modeling flexibility
  • Disadvantages
    • Lack of transactional support
    • Data integrity is app’s responsibility
    • Data duplication is app dependent
    • Eventual consistent
    • No standardization
    • New technology
  • RDBMS & Cloud
    • MySQL, Oracle, PostgreSQL, DB2, SQL Server are cloud-capable RBDMS
    • Microsoft SQL Services and AWS RDS are cloud native RDBMS
  • SQL Azure is built on SQL Server and so very intuitive.
  • Non-relational DBMS
    • Key value stores – Amazon Dynamo (not for public consumption), S3, Project Voldemort, Redis, Scalaris, MemCacheDB, Tokyo Tyrant
    • Document stores – CouchDB, mongoDB, riak, Amazon SimpleDB
    • Column stores – Google Column Store, Cassandra, HBase, Hypertable
    • Graph stores

Day 2 had interesting sessions on Azure by Janakiram M from Microsoft, EC2 by Simone Burnozzi from Amazon and multi-tenancy by Vikas from Inphina.

The Unconference at the end of Day 1 had some interesting topics like Cloud Standards, how Cloud can help fight massive scale diseases, and what a Java stack needs to provide in the cloud.

Over all, I had a great time, enjoyed some great conversations with Dhananjay Nene, Vikas Hazrati, Narinder Kumar, Rohit Naik, Navin Kabra, Manju, Amarpal Singh, and several others. I hope more attendees can join us for an impromptu social gathering in the evening. Anyway, looking forward to participate in the future Upcoming Technology conferences and others hosted by IndicThreads.

Here are some pics from the event:

And the complete album:

Technorati: conf indicthreads cloud india pune

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • DZone
  • StumbleUpon
  • Technorati
  • Twitter
  • Slashdot

August 14, 2010

Java EE 6 & GlassFish workshop delivered at San Francisco JUG – Slides & Demos available

Filed under: General — arungupta @ 3:35 am

Roberto and I delivered a 2-part Java EE 6 & GlassFish 3 workshop to a packed San Francisco JUG meetup last week. There were about 80 attendees on Day 1 and about 40 on Day 2. Over approximately 7 hours, we gave a preview of Java EE 6, explained the key technologies introduced in the platform, and did lot of coding using NetBeans IDE.

Roberto’s slides are given below:

Overview of Java EE 6 by Roberto Chinnici at SFJUG

And my slides are next:

JavaEE 6 and GlassFish v3 at SFJUG

The completed project from the workshop is now available here. This bundle contains the entire code sample built through out the workshop. The coding sessions are also available in screencast #30, also shown below:

Here is some feedback from the attendees:

The best JUG meeting I’ve ever attended. It was very informative, helpful and relevant. I particularly liked Arun’s follow-along coding demonstrations. I would suggest that the speakers be encouraged to use a mic. If I had not been sitting two rows from the front, then I would have had a hard time hearing Roberto.

It was interesting to hear from the source which parts of EE6 they thought were most valuable, and where new things overlapped with old, and what advantages there were in using standards-based solutions over frameworks like Spring, even when they tend to be behind in usability and power. Also liked the taste of NetBeans, being an Eclipse user.

Very fruitful evening. Thanks so much to the speakers and organizers.

I really enjoyed both nights. There were several JEE 6 (now I now the correct way to say it) technologies that I had heard of but quite didn’t understand … especially in regards to how they integrate. Now I do.…

Thanks aleksandar for organizing this JavaEE6 learning series. It was very helpful and head start on the cool features of EE6. Thanks to arun and Roberto for there well written presentations and hands on workshop. Will look forward for part 2 of this series.

Really enjoyed. Roberto gave a good high level overview of JavaEE (and he was funny) and Arun’s talk was educational and easy to follow along with. Very impressed with how easy it was to get the examples working with NetBeans. Looking forward to Thursday.

Really enjoyed both presentations. The fact that it was hands on added an extra dimension to the learning experience. Looking forward to the next session. Thanks to Roberto and Arun!

This was a fantastic intro to Java EE 6. I really liked Roberto’s down-to-earth overview of Java EE and its role in the enterprise Java world. In his workshop, Arun did an amazing job making Java EE 6 on GlassFish with NetBeans feel really approachable – if not too easy. Great participation from the audience.

The hands-on component worked great for me.

And the ratings are encouraging too …

As always, there is room for improvement and lessons to learn. However I enjoyed the fact that most of the attendees were able to follow the instructions and able to reproduce the code samples. One of the attendees even told me "I’ve no reason to not try Java EE 6 & NetBeans now that there is a complete environment on my laptop". And that indeed was the intention ;-)

Check out some pictures:

Thank you Sasa for giving us an opportunity to talk about Java EE 6 & GlassFish 3 at San Francisco JUG! We had a great time and it seems like the attendees enjoyed too :-)

Technorati: conf sanfrancisco jug sfjug glassfish javaee6

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • DZone
  • StumbleUpon
  • Technorati
  • Twitter
  • Slashdot

August 4, 2010

TOTD #143: Retrieve Twitter user timeline using using Jersey and OAuth

Filed under: General — arungupta @ 10:06 pm

The Basic Authentication for authorizing with Twitter API will be turned off on Aug 16th. After that OAuth will be the only way to invoke the API.

Beginner’s guide to OAuth provide an excellent explanation to OAuth. The typical analogy for OAuth is a "valet key" to the car which is a stripped down version of your regular key. These keys are meant for valet drivers who don’t need to open trunk or glove compartment and don’t need to drive the car for longer distance. So even though they have access to the entire car but are restricted to the limited functionality.

OAuth is used to share your resources (photos, videos, bank accounts, etc) stored on one site with another site without having to share your username and password. The site storing the resources is "Service Provider", the site requesting the access is "Consumer", you are the "User", "Tokens" are "valet key" that provide required access to the resources.

This Tip Of The Day (TOTD) explains how Jersey, the Reference Implementation for JAX-RS, provides seamless support for OAuth by creating a simple desktop application that retrieves user timeline on Twitter using OAuth. This blog is going to combine the instructions outlined in Understanding the guts of Twitter’s OAuth for client apps and Using Jersey client OAuth support with Smugmug to achieve that.

Lets get started!

  1. Create a Maven project as:
    mvn -DarchetypeVersion=1.0 -DgroupId=org.glassfish.samples -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0-SNAPSHOT -DarchetypeGroupId=org.apache.maven.archetypes -Dpackage=org.glassfish.samples.twitter -DartifactId=twitter
    
  2. Update the generated "pom.xml" with the following fragments:
    <repositories>
    <repository>
    <id>glassfish-repository</id>
    <name>Java.net Repository for Glassfish</name>
    <url>http://download.java.net/maven/2/</url>
    </repository>
    </repositories>
    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.1.3-SNAPSHOT</version>
    </dependency>
    <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.1.3-SNAPSHOT</version>
    </dependency>
    <dependency>
    <groupId>com.sun.jersey.oauth</groupId>
    <artifactId>oauth-signature</artifactId>
    <version>1.1.2-ea-SNAPSHOT</version>
    </dependency>
    <dependency>
    <groupId>com.sun.jersey.oauth</groupId>
    <artifactId>oauth-client</artifactId>
    <version>1.1.2-ea-SNAPSHOT</version>
    </dependency>
    </dependencies>
    <build>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.0.2</version>
    <configuration>
    <source>1.6</source>
    <target>1.6</target>
    </configuration>
    </plugin>
    </plugins>
    </build>
    

    The Jersey dependencies add the core Jersey libraries and OAuth functionality in Jersey.

  3. Register your app with Twitter – Register your application with Twitter by clicking on Register a new application >>. The complete list of registered applications can be seen at Applications using Twitter. Select "Client" as the app type, select "Yes, use Twitter for login" and leave the "Callback URL" empty. The registration gives you "consumer key" and "consumer secret". These are used to obtain temporary credentials (or request tokens) from Twitter.
  4. Obtain Twitter OAuth credentials – Each OAuth request is an HTTP request with "Authorization" header specifying the information by OAuth service provider. Jersey provides a OAuthClientFilter to add this header to the outbound client request. Twitter API Wiki explains the authentication as multiple step process for desktop applications. Each step involves sending some parameters to twitter and getting a result back and the intent of each method/request is clearly explained in Understanding the guts of Twitter’s OAuth for client apps. In our case, each request is created by using Jersey Client API and attaching OAuthClientFilter and is explained next.
    1. Request temporary credentials, a.k.a request token, from Twitter using oauth/request_token.
      1. In "App.java", create an instance of Jersey client in the constructor and attach a LoggingFilter to dump inbound/outbound messages as:
        public App() {
        // Create a Jersey client
        client = Client.create();
        client.addFilter(new LoggingFilter());
        }
        
      2. Request temporary credentials by adding the following method:
        public void getRequestToken() {
        client.removeAllFilters();
        // Create a resource to be used to make Twitter API calls
        WebResource resource = client.resource(REQUEST_TOKEN_URL);
        // Set the OAuth parameters
        OAuthSecrets secrets = new OAuthSecrets().consumerSecret(CONSUMER_SECRET);
        OAuthParameters params = new OAuthParameters().consumerKey(CONSUMER_KEY).
        signatureMethod("HMAC-SHA1").version("1.0");
        // Create the OAuth client filter
        OAuthClientFilter oauthFilter =
        new OAuthClientFilter(client.getProviders(), params, secrets);
        // Add the filter to the resource
        resource.addFilter(oauthFilter);
        // make the request and print out the result
        System.out.println(resource.get(String.class));
        }
        

        Note, "OAuthClientFilter" is used to populate the "Authorization" header instead of handcrafting it. The REQUEST_TOKEN_URL is "http://twitter.com/oauth/request_token", CONSUMER_SECRET and CONSUMER_KEY are the values obtained from registering your application.

      3. Edit "AppTest.java" and change "testApp" method such that it looks like:
        public void testApp() {
        App app = new App();
        app.getRequestToken();
        }
        
      4. Obtain the temporary credentials by running this application as:
        mvn test
        

        and see an output as:

        oauth_token=REQUEST_OAUTH_TOKEN&oauth_token_secret=REQUEST_OAUTH_TOKEN_SECRET&oauth_callback_confirmed=true
        

        REQUEST_OAUTH_TOKEN, a temporary token, is used to authorize on twitter.com.

    2. Authorize the user and obtain PIN
      1. Go to "https://twitter.com/oauth/authorize?oauth_token=REQUEST_OAUTH_TOKEN" in a browser window.
      2. If not already logged in, enter your twitter credentials and click "Allow".
      3. Copy the PIN.
    3. Request permanent credentials, a.k.a access token, from Twitter using oauth/access_token.
      1. Request permanent credentials by adding the following method in "App.java"
        public void getAccessToken() {
        client.removeAllFilters();
        // Set the OAuth parameters
        OAuthSecrets secrets = new OAuthSecrets().consumerSecret(CONSUMER_SECRET);
        OAuthParameters params = new OAuthParameters().consumerKey(CONSUMER_KEY).
        signatureMethod("HMAC-SHA1").
        version("1.0").
        token(REQUEST_OAUTH_TOKEN).
        verifier(PIN);
        // Create the OAuth client filter
        OAuthClientFilter oauthFilter =
        new OAuthClientFilter(client.getProviders(), params, secrets);
        // Create a resource to be used to make Twitter API calls
        WebResource resource = client.resource(ACCESS_TOKEN_URL);
        // Add the filter to the resource
        resource.addFilter(oauthFilter);
        // make the request and print out the result
        System.out.println(resource.get(String.class));
        }
        

        REQUEST_OAUTH_TOKEN is the temporary token obtained earlier, ACCESS_TOKEN_URL is "https://twitter.com/oauth/access_token".

        Notice, REQUEST_OAUTH_TOKEN and PIN are now added to the OAuthClientFilter.

      2. Invoke this method by editing "AppTest.java" as:
        public void testApp() {
        App app = new App();
        //     app.getRequestToken();
        app.getAccessToken();
        }
        
      3. Obtain the permanent credentials by running this application as:
        mvn test
        

        and see an output as:

        oauth_token=ACCESS_OAUTH_TOKEN&oauth_token_secret=ACCESS_OAUTH_TOKEN_SECRET&user_id=USER_ID&screen_name=USER_NAME
        

        ACCESS_OAUTH_TOKEN is the authorized token that can be used for making any future requests, USER_ID and USER_NAME are identifiers for the user who signed in on twitter.com. 

  5. Get the last 20 status messages for the user from Twitter
    1. Add the following method in "App.java:
      public void getUserTimeline() {
      client.removeAllFilters();
      // Set the OAuth parameters
      OAuthSecrets secrets = new OAuthSecrets().consumerSecret(CONSUMER_SECRET);
      OAuthParameters params = new OAuthParameters().consumerKey(CONSUMER_KEY).
      signatureMethod("HMAC-SHA1").
      version("1.0").
      token(ACCESS_OAUTH_TOKEN);
      // Create the OAuth client filter
      OAuthClientFilter oauthFilter =
      new OAuthClientFilter(client.getProviders(), params, secrets);
      // Create a resource to be used to make Twitter API calls
      WebResource resource = client.resource(USER_TIMELINE_URL);
      // Add the filter to the resource
      resource.addFilter(oauthFilter);
      // Parse the JSON array
      JSONArray jsonArray = resource.get(JSONArray.class);
      List<String> statuses = new ArrayList<String>();
      try {
      for (int i = 0; i < jsonArray.length(); i++) {
      JSONObject jsonObject = (JSONObject) jsonArray.get(i);
      StringBuilder builder = new StringBuilder();
      builder.append(jsonObject.getString("text")).
      append(jsonObject.getString("created_at"));
      statuses.add(builder.toString());
      }
      } catch (JSONException ex) {
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
      }
      } 

      USER_TIMELINE_URL is "http://api.twitter.com/1/statuses/user_timeline.json". The "getTimelineElements" method can be updated to pick other elements from the return JSON object. The complete JSON schema for the response is described here.

    2. Edit "AppTest.java" as:
      public void testApp() {
      App app = new App();
      //    app.getRequestToken();
      //    app.getAccessToken();
      app.getUserTimeline();
      }
      
    3. Finally get the last 20 status updates by giving the command:
      mvn test
      

      and see the output similar to:

      Running org.glassfish.samples.twitter.AppTest
      [Developing OSGi-Enabled Java EE Applications- http://bit.ly/aOim34 (via
      @JavaOneConf) #javaone10Wed Aug 04 23:53:13 +0000 2010, Google Wave goes
      bye bye (via @google:)Update on Google Wave http://bit.ly/bIoDWAWed Aug
      04 21:16:07 +0000 2010, @gdaniels Yeah, I expected #wave to bye bye as
      well, but this is fairly quick!Wed Aug 04 21:15:41 +0000 2010,
      

And that’s it!

This Tip Of The Day explained how to use Jersey to retrieve last 20 status messages that a user posted on twitter. Here are some other future possible additions:

  • POST status update
  • Integrate Search API using OAuth (is it possible ?)
  • Integrate Streaming API (need more investigation)
  • Create a web-base client that automatically redirects the user from application to twitter.com and then back to the application.

Jersey and OAuth wiki provides more details about how to use OAuth with Jersey.

Technorati: totd jaxrs jersey restful webservices oauth twitter glassfish

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • DZone
  • StumbleUpon
  • Technorati
  • Twitter
  • Slashdot

August 2, 2010

Screencast #31: Java EE 6 using GlassFish and Eclipse 3.6 – Oracle Enterprise Pack for Eclipse 11.1.1.6 is now available – 5 new screencasts

Filed under: General — arungupta @ 10:44 am

Oracle Enterprise Pack for Eclipse 11.1.1.6 is now available – download here.

This is a set of plugins for Eclipse 3.6 that provide support for Oracle Coherence, Weblogic Scripting Tool (WLST), WebLogic server JDBC deployment descriptor and Web services annotation editor, and now Java EE 6 & GlassFish as well!

The plugins can also be downloaded from Eclipse Marketplace.

This video tutorial shows:

  1. Getting started with GlassFish in OEPE
  2. A simple Java EE 6 application (JSP, Servlets, EJB)
  3. Reading database table using Java Persistence API 2
  4. Using Facelets with Java Server Faces 2
  5. RESTful Web services using JAX-RS

Enjoy!

Note, this is a playlist of all the videos so click on little arrows (shown as "<" or ">") to view the different videos.

Please give us feedback on GlassFish Forums.

Technorati: screencast javaee6 glassfish tutorial eclipse oepe oracle

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • DZone
  • StumbleUpon
  • Technorati
  • Twitter
  • Slashdot

The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.
Powered by WordPress