Wednesday, February 15, 2012

DevNexus 2012 - March 21-22 - Schedule Published


DevNexus 2012 is only 5 weeks away and will take place March 21-22. As of late, we have been super-busy organizing and confirming the best minds of our industry. We are happy to announce the preliminary schedule at


Again, this year will mark our biggest DevNexus conference event, yet! Compared to last year, we added 2 more tracks to the conference, bringing the total to 6 tracks. 30+ speakers will deliver 48 sessions equipping you with the critical knowledge to take your career to the next level. And if this is not enough, we have 3 wonderful keynote speakers as well:

  • Patrick Curran, Chair of the Java Community Process organization will present "Java User Groups and the Java Community Process: a winning combination"
  • Barry Hawkins, a veteran in our industry will present "How We Got Here, And What To Do About It", and we also are delighted to have
  • Ben Galbraith, founder of Ajaxian.com and now running mobile architecture and engineering at Walmart.com.

This year we will have an incredible breadth of topics. Besides covering core Java topics (e.g. Java 7+8, Joda Time, Guava) as well as JVM Languages (Groovy and Scala), we will also extensively cover Mobile topics (including HTML5). Furthermore, we will dive into Cloud related topics, covering Platform as a service (PaaS) providers such as Cloud Foundry, Google App Engine and Heroku. Here is a more comprehensive list of covered topics:

  • Core Java (Java 7+8, Joda-Time, Guava)
  • Spring (Spring 3.1, Spring MVC 3.1, Spring Integration)
  • JBoss (DeltaSpike)
  • Mobile (jQuery Mobile, PhoneGap, Android, Appcelerator Titanium)
  • HTML5
  • JavaScript (Node.js, jQuery), 
  • Cloud (Heroku, Cloud Foundry, Google App Engine)
  • Gradle
  • Groovy
  • Git
  • Scala
  • NoSQL (Neo4J, Cassandra)
  • Play Framework
  • Caching (EhCache  and JSR107)
  • REST
  • Continuous deployment
  • Talks on Agile Methodologies and Architecture

With this session line-up on the horizon, attending DevNexus should be a priority - This is also the South-East’s best, yet affordable, developer's conference!

We, the volunteers from the Atlanta Java Users Group would be delighted to see you all at DevNexus! Learn, network and have fun -

Please register today at: http://www.devnexus.com

We would like to thank our Sponsors that help us greatly to keep DevNexus super-affordable ($185 group-ticket / $200 regular ticket). We also welcome two new DevNexus Gold Sponsors:

  • SpringSource, a division of VMware
  • GCA Technology Services and Oracle University 

GCA Technology Services and Oracle University are thrilled to be sponsors of AJUG again this year. GCA specializes in Identity and Access Management (IAM) consulting and education. We partner with Oracle to provide industry leading solutions for user provisioning, role management, rights management, single sign-on, multi-factor authentication, governance and compliance. We deliver training for Oracle Solaris, Java, Oracle Identity and Access Management as well as other Oracle Applications and technologies. We believe that the blended approach by providing expert consultants who also educate our customers in the products we implement, allows us to achieve consistently positive results. Oracle's Java based IAM solutions lead the industry. Let us work with your team to create a training and IAM consulting solution that gets the results you want. Contact us at http://www.gca.net/oracle or 770-643-0443. We look forward to seeing everyone at Devnexus!

The DevNexus Gold Sponsors:

  • Terracotta
  • IntercontinentalExchange (ICE)
  • JBoss
  • The Intersect Group
  • GCA Technology Services and Oracle University
  • SpringSource, a division of VMware

Silver Sponsors:

  • Apex Systems
  • Anteo Group
  • 4t Networks

Cocktail Hour Sponsor:

  • MATRIX Resources

We are looking forward seeing you all in March!!!

Cheers,

Gunnar Hillert
President, Atlanta Java Users Group (AJUG)

PS:

If you have any question let us know at info at ajug.org and please follows us
on Twitter at http://twitter.com/devnexus for news and updates.

Monday, January 30, 2012

DevNexus 2012 Early Bird Ends in 48 Hours!

This is a friendly reminder that the Early Bird pricing for DevNexus 2012 ends in 48 hours on February 1 at 11:59pm. Therefore, please register for DevNexus at http://www.devnexus.com/ in order to secure your ticket for this wonderful conference at the low price of $185.

Date: March 21-22, 2012
Place: Cobb Galleria, Atlanta, GA
Cost: $185 (early bird price), $200 after February 1st.

DevNexus is the South-East's biggest conference for Java developers! We provide the best software professional development content at the lowest possible
price, bringing some of the world's best speakers & most interesting topics to Atlanta!

For 2012, we have an amazing line-up of speakers and sessions. Here is what you can expect:
  • 2 days
  • 6 tracks (2 more than last year!!)
  • 48 sessions
  • 3 keynote presentations
  • Food and beverages will be provided 
  • Cocktail-hour with free sponsored drinks at the end of the first day
  • Raffles and give-aways (e.g. books)
  • Great networking opportunities
  • Ridiculously cost-effective value
  • DevNexus is organized by community volunteers (pro-bono) for the community!
Here is a list of topics that we will cover:
  • Core Java (Java 7+8, Joda-Time, Guava)
  • Mobile (PhoneGap, Android, Titanium Mobile)
  • HTML5
  • JavaScript (Node.js, jQuery)
  • Spring (Spring 3.1, Spring MVC 3.1, Spring Integration)
  • JBoss (Delta Spike, JBoss 7)
  • Cloud (Heroku, Cloud Foundry, Google App Engine)
  • Gradle
  • Groovy
  • Git
  • Scala
  • NoSQL (Neo4J, Cassandra)
  • Play Framework
  • EhCache
  • REST
  • Continuous deployment
  • Talks on Agile Methodologies and Architecture
The DevNexus website already contains 32 session abstracts which you can browse at:

http://www.devnexus.com/s/presentations

More presentation abstracts will be added shortly. We are also super-excited to offer 3 keynote presentations at DevNexus 2012. The opening keynote presenter will be Patrick Curran, Chair of the Java Community Process organization (JCP):

"Java User Groups and the Java Community Process: a winning combination"

Our second keynote presenter will be our very own Barry Hawkins, a veteran in our industry as speaker, developer, and agile coach and mentor.

"How We Got Here, And What To Do About It"

Please find more information about our keynote speakers, including keynote details, on our website at:

http://www.devnexus.com/s/speakers

This is THE conference you must not miss. Therefore, come join us for this incredible event.

Don't hesitate, sign up for DevNexus 2012 today at: http://www.devnexus.com

We would also like to thank our Sponsors that greatly help us to keep DevNexus so affordable:

Gold Sponsors:
  • Terracotta
  • IntercontinentalExchange (ICE)
  • JBoss
  • The Intersect Group
Silver Sponsors:
  • Apex Systems
  • Anteo Group
Lastly, please feel free to send this note to your present & past co-workers in the local software development community. Group discounts of 5 or more apply.

If you have any questions please contact us at:

info at ajug dot org
678-908-9067

See you all at DevNexus 2012!!!!

Friday, January 13, 2012

Sonar and Gradle Multi-Module Projects

I love Sonar. It is a wonderful way to collect some metrics for your Java projects - hassle-free and wrapped in a sweet-looking UI.  For Maven-based projects Sonar literally works out of the box. Just start up your Sonar instance (assuming you are using the default settings running on localhost) and then you simply fire it off using:
$ mvn sonar:sonar 
A few moments later you should have the metrics available at:
http://localhost:9000/
Well, the past few days I was setting up a multi-module Gradle project for Sonar. Let me start by stating that Gradle is awesome. Having the ability to declare dependencies as one-liners and also being able to customize your scripts easily, yet having sensible defaults, is very nice. Kind of the best of both worlds.

Setting up Sonar for a multi module project, though, is unfortunately a bit more complicated, compared to what I am used to in the Maven world. It is not awfully complicated, but it took me a while to collect all the pieces of information.

Getting your Sonar plugin to just doing something is fairly simple. Just follow the basic steps outlined in the plugin documentation at:
One differentiator between the Sonar Plugin for Gradle and Maven is, that the Gradle version does not automatically run code coverage analysis. This needs to be manually setup. This is where the official doc just vaguely refers to Cobertura.

First, I tried using Cobertura for code coverage, but I seemed to run into difficulties for my multi-module projects. The Cobertura Plugin is here:
By chance I realized that the Sonar guys have a GitHub repository with samples on how to setup sonars for various build systems, including Gradle:
In their examples, they are using JaCoCo, which is not mentioned in the original Gradle docs and maybe I could have continued with Cobertura but it seemed that Sonar was preferring JaCoCo and thus I continued with that.

Some Gradle Sonar Plugin Limitations

The Gradle Sonar Plugin has an annoying limitation, where I can run it for the ROOT project OR for the sub-projects individually. See the following Gradle Jira ticket for details:
Furthermore, I hit the minor issue that I cannot set the links in the Sonar dashboard. This seems to be related to the following Sonar Jira issue:
The JaCoCo code coverage plugin is "slightly less" supported by the Gradle Sonar Plugin, e.g. the  Gradle Plugin does not have an explicit setter for the JacocoReportPath and it assumes the "target" folder as the build directory by default. Therefore you must set explicitly:
props["sonar.jacoco.reportPath"]  = "${buildDirName}/jacoco.exec"

Lastly, I deviated a bit from the SonarSource Gradle example, and instead of System properties, I wanted to use Gradle properties to allow for users to provide non-default Sonar configuration settings (databasem url, jdbc parameters etc.). Well, while setting that up I ran into yet another Gradle Jira issue:
But at the the end, I am happily able to run a multi-module Gradle project with Sonar and collecting Code Coverage statistics.  Here is the relavant code from my build.gradle file:

apply plugin: 'sonar'

sonar {

    if (rootProject.hasProperty('sonarHostUrl')) {
        server.url = rootProject.sonarHostUrl
    }

    database {
        if (rootProject.hasProperty('sonarJdbcUrl')) {
            url = rootProject.sonarJdbcUrl
        }
        if (rootProject.hasProperty('sonarJdbcDriver')) {
            driverClassName = rootProject.sonarJdbcDriver
        }
        if (rootProject.hasProperty('sonarJdbcUsername')) {
            username = rootProject.sonarJdbcUsername
        }
        if (rootProject.hasProperty('sonarJdbcPassword')) {
            password = rootProject.sonarJdbcPassword
        }
    }

    project {
        dynamicAnalysis  = "reuseReports"
        withProjectProperties { props ->
            props["sonar.core.codeCoveragePlugin"] = "jacoco"
            props["sonar.jacoco.reportPath"]       = "${buildDirName}/jacoco.exec"
        }
    }

    println("Sonar parameters used: server.url='${server.url}'; database.url='${database.url}'; database.driverClassName='${database.driverClassName}'; database.username='${database.username}'")

}

subprojects { subproject ->

    ...

    // See http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:configurations
    // and http://www.gradle.org/docs/current/dsl/org.gradle.api.artifacts.ConfigurationContainer.html
    configurations {
        jacoco //Configuration Group used by Sonar to provide Code Coverage using JaCoCo
    }

    // dependencies that are common across all java projects
    dependencies {
        ...
        jacoco group: "org.jacoco", name: "org.jacoco.agent", version: "0.5.3.201107060350", classifier: "runtime"
        ...
    }

    test {
        jvmArgs "-javaagent:${configurations.jacoco.asPath}=destfile=${buildDir}/jacoco.exec,includes=org.your.project.*"
    }
    ...
}
I hope this is useful information for all Gradle users out there. 

Friday, December 30, 2011

Method Validation With Spring 3.1 and Hibernate Validator 4.2

JSR 303 and Hibernate Validator have been some awesome additions to the Java ecosystem, giving you a standard way to validate your domain model across application layers. Combined with the annotations of the Java Persistence API (JPA) you have some very nice tools at your disposal to ensure that only valid data enters your database.

However, one piece of missing functionality was the ability to also validate method calls. For example, wouldn't it be nice if you could use normal JSR 303 annotations to safeguard business layer calls as well?

Of course you can enforce constraints programmatically, e.g. prevent the passing of Null parameters. Spring for instance provides the org.springframework.util.Assert class. However, it would be desirable, if constraints placed on input parameters as well as return values were part of the method contract.

Enter Hibernate Validator 4.2, which was released in June of 2011. It provides now method validation and Gunnar Morling, one of the committers, has an excellent write-up on this on his blog at:
Also, check out the Hibernate validator documentation regarding method validation. Gunnar Morling also provides some preliminary Spring support available at GitHub:
But the news for Spring aficionados is getting even better - Direct support for Method Validation With Hibernate Validator is now available in the lastest Spring 3.1 release that went GA just two weeks ago.

Specifically Spring 3.1 provides the following support in regards to method validation:
In order to get started, make sure that you are using Spring 3.1.0.RELEASE and that you have Hibernate Validator 4.2 in your classpath. That's all what you need to begin using JSR 303 annotations on the method level. For example, now you can annotate your methods using e.g.:

@Validated
public interface BusinessService {
    @NotNull String convertToUpperCase(@NotEmpty String input);
}
The @Validated Annotation indicates that the methods in the class are to be included for method validation. Keep in mind that you can specify your own annotation that will be enabling method level validation for the annotated class. Specify your own annotation by calling setValidatedAnnotationType on the MethodValidationPostProcessor.

However, placing the annotations themselves will not enforce the constraints 'automagically'. In fact Spring will be using AOP (Aspect Oriented Programming) Advices under the covers that delegate to Hibernate Validator. The easiest way to enable these advices is to declare a MethodValidationPostProcessor bean in your Spring application context as shown below.
 
<?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:context="http://www.springframework.org/schema/context"
 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">

 <context:component-scan base-package="com.hillert.spring.validation" />

    <bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
      
    <bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
    
</beans>
 
For more details, I have published a small project over at GitHub that illustrates method level validation using Hibernate Validator:
In order to get get started:
  1. Clone the repository using $ git clone git://github.com/ghillert/spring-hibernate-validator-sample.git 
  2. $ cd spring-hibernate-validator-sample
  3. Build the sample using Maven $ mvn clean package
  4. Run it with $ mvn exec:java 
The command-line based sample provides a simple String conversion service, that converts Strings to upper-case. You can insert those Strings from the command line. The Service layer will enforce the following constraints using method level Hibernate Validator annotations:
  • The input String must not be empty (not null and not an empty String)
  • The conversion service will never return null
In order to trigger validation exceptions you can enter some special strings:
  • Pressing just enter (no string entered) will cause an empty String parameter to be set
  • Submitting "null" (The String), will cause a null parameter to be set
  • When entering "returnnull", the underlying business method will return Null
The Main method will catch the occurring MethodConstraintViolationExceptions and print some details to the command prompt.

Lastly, the current method validator support via Spring is specifically targetting Hibernate Validator. However, there are standardization efforts underway as part of the Bean Validation 1.1 specification (JSR-349). In order to follow the progress, please follow also http://beanvalidation.org/.

Spring will provide support for JSR-349 as soon as the official standard has been ratified. In order to track inclusion into the Spring framework, please follow also Spring Framework Jira ticket SPR-8199 . As of today this feature should be available in the next Spring 3.2 release.

I hope this blog entry and the accompanying sample have showed you how easy it is to get started with  method level validation using Spring and Hibernate Validator. Please let me know if you have further questions or run into issues.

Tuesday, December 27, 2011

Java Print Service Frustrations

This is probably not the most exciting "toy" to play with for the holidays, but I wanted to explore some use-cases that involve printing through Java back-end services. Basically, in an enterprise environment you may run into requirements, where the documents you receive or generate also are required to be printed out for whatever reasons. In all honesty, I never had to deal with Java's print Apis and thus started from scratch.

It turns out, that there are 2 approaches (reminds me of the multitude of Date implementations...). One approach dates back to the 1990s and is called the Java 2 Print API and is tied more to User Interfaces (UI) triggering the printing process. With Java 1.4, the Java Print Service API (JPS) was introduced (JSR 6) which serves as a super-set of the the Java 2 Print Api.

The JPS Api is certainly workable but I ran into some serious trouble. For my initial use-case, I may receive simple text documents, e.g. XML that I want to send to a definable printer as plain text.

I was unable to get that to work on my Mac using Mac OS X 10.6.8. However, on my Windows JVM it worked flawlessly and my text files were printed out without any complaints. On my Mac, though, my little Java test application finishes without any errors but my printer queue states:

Error: pstopdffilter/pstocupsraster failed with err number -31000

Googling did not help much either. There seemed to be some anecdotal evidence that other people might have had trouble with text printing as well but I was unable to uncover definite answers (Many of the information is years old). The question I have is whether this is an issue with:
  • My Printer, which is a Brother HL-4070CDW
  • The Mac JVM (Mine is: build 1.6.0_29-b11-402-10M3527)
  • CUPS
  • something else
If any of the readers has encountered similar issues or is able to shed some more light into this issue, please let me know (THANKS!).

While searching for explanations, I stumbled across the following thread on stackoverflow.comhttp://stackoverflow.com/questions/1655297/print-to-specific-printer-ipp-uri-in-java. There they mentioned the following CUPS specific libraries:
Jipsi aparently changed names and moved to Google code:
As I need a generic solution that works not only on Mac using CUPS but also on Windows I have not experimented with any of the libraries above. Nevertheless I wanted to mention them.

I have also tried various other DocFlavors and settings but to no avail. What is interesting, though, is that the printing of PDF files works fine. Printing image files such as PNG or JPG fails as well.

Here is the trivial application that I am using:

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.Sides;

public class PrintPS {

  public static void main(String args[]) throws FileNotFoundException, PrintException {
    FileInputStream textStream = new FileInputStream(args[0]); 
    DocFlavor myFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
    Doc myDoc = new SimpleDoc(textStream, myFormat, null); 
  
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
  
    aset.add(new Copies(1)); 
    aset.add(Sides.ONE_SIDED); 
  
    PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
  
    System.out.println("Printing to default printer: " + printService.getName());
  
    DocPrintJob job = printService.createPrintJob(); 
    job.print(myDoc, aset); 

  }
}

Furthermore, I looked at the follwing Java-based Text editors to see how they accomplish printing (Which works fine on my Mac as well):
RTEXT uses the DocFlavor: DocFlavor.SERVICE_FORMATTED.PRINTABLE which in turn uses a component that implements the java.awt.print.Printable Interface. 

I guess, as a next step I have two options...go down into the trenches of Java2D or have some fun generating PDF files...And all I wanted was to print some simple text that works across Operating Systems. 

Wednesday, December 7, 2011

DevNexus 2012 - Registration is Open

The Atlanta Java Users Group is delighted to announce that registration for DevNexus 2012 is now open. In order to reserve your ticket, please go to:
DevNexus 2012 will be held on Wednesday, March 21st and Thursday, March 22nd at the Cobb Galleria Centre in Atlanta, GA. We already confirmed many amazing presenters covering a wide array of crucial technology topics.

In addition to providing great content for Java developers, DevNexus is a very valuable networking opportunity. This event attracts Java/JVM talent from diverse backgrounds, be it large corporations, consulting organizations or independent technology connoisseurs. You will have an opportunity to discover what other development teams are using as their favorite tools and practices.

Why should you attend DevNexus 2012:
  • Best Value: $185 Early Bird price (until Feb 1) for two full days of technology immersion and comaraderie.
  • Ask questions to world-class experts and fellow developers
  • Learn how to move your applications into the cloud (covering Cloud Foundry, Heroku, Google App Engine, OpenShift)
  • Learn Agile Best Practices & Tools
  • Learn more about core Java topics as well as other languages on the JVM
  • Learn more about building rich (mobile) web-application applications, e.g. using HTML5
  • Hear about the latest developments from JBoss and SpringSource
We have already lined-up some impressive speakers, with many more to be announced in the upcoming weeks:
  • Tim Berglund - Covering NoSQL topics
  • Patrick Curran - Chairman of the JCP, keynote speaker
  • Hans Dockter  - Founder of Gradle
  • Ben Evans - Covering various core Java topics including Java 8
  • Mark Fisher - Spring Integration Lead, covering Enterprise Integration Patterns (EIP) and Cloud Foundry
  • Barry Hawkins - Covering Agile Methodologies
  • Josh Long - Spring Developer Advocate
  • Pratik Patel - Mobile/Web, Java
  • Rossen Stoyanchev - Spring MVC Lead
  • James Ward - Covering Heroku and Play framework
Fore more details on speakers please visit:

http://www.devnexus.com/s/speakers

We also would like to thank our sponsors for their support in making DevNexus a success:

Gold Sponsors
Silver Sponsor
We hope to see you all at DevNexus, and please register for this incredibly valuable event at:


Thursday, December 1, 2011

Cloud Foundry for Spring Developers - Slides

Yesterday, I presented "Cloud Foundry for Spring Developers", at the Atlanta Spring User Group. I finally got around to upload the presentation slides to Slideshare:

http://www.slideshare.net/hillert/cloud-foundry-for-spring-developers

I would like to thank everyone for coming to the presentation! Cloud Foundry rocks!

Tuesday, November 29, 2011

Cloud Foundry for Spring Developers


I will be presenting at the Atlanta Spring User Group tonight (Nov 29, 2011) at 6:30pm. For more details, including directions, please visit:

http://www.meetup.com/AtlantaSpring/


Title: Cloud Foundry for Spring Developers

Session abstract:

This session provides an overview of how to build and deploy Spring-based applications to the Cloud Foundry platform.
The session will cover application configuration parameters, binding services to your application, deployment options using using STS, the vmc command tool, as well as the new Apache Maven plugin for Cloud Foundry. Gunnar will demonstrate how to deploy applications to both micro and public Cloud Foundry and will also show how debugging works with Cloud Foundry and how you can inspect services remotely using Caldecott.

Gunnar will also show various options to keep your War-files deployable to both Cloud Foundry and stand-alone Servlet Containers using Auto-Reconfiguration, the Cloud namespace, and Spring 3.1 profiles.

Lastly, he will give a high-level overview how you can use Cloud Foundry together with Spring Integration in order to create scalable Spring applications.

Wednesday, November 2, 2011

DevNexus 2012 - Call For Papers Now Open


The DevNexus™ 2012 developer conference is taking place March 21-22. We are delighted to announce the Call for Papers is now open. We are looking forward to receiving your amazing proposals covering one of the following topics:
  • Java and JVM Languages
  • Cloud
  • NoSQL
  • Web (incl. Mobile Development, HTML5, JavaScript)
  • Methodologies and Tools
We do not encourage overt marketing pitches. Sessions are 75 minutes long and we encourage breakout sessions, work-shops and case studies. Please include the following information:
  • Name
  • Job Title
  • Email
  • Twiter id
  • Company
  • Presentation Title
  • Audience Level (General, Beginner, Intermediate, Advanced)
  • Presentation Abstract
  • Your Bio
Please submit your proposals as soon as possible to info at ajug.org. The Call for Papers closes January 15, 2012.
The planning committee will carefully review your proposals, and you will get a confirmation whether your talks are selected or not for the DevNexus™ conference.
For more information, please visit: http://www.devnexus.com/

Thursday, September 22, 2011

Maven and Cloud Foundry - The plugin is here!

It has been an amazing time so far for me working at SpringSource for the past couple of months and today I have finally published my first blog post for the official SpringSource blog. The blog post also marks the Milestone 1 (M1) release of the Cloud Foundry Maven Plugin which will make it much easier for Maven users to deploy their applications to Cloud Foundry.

Thus, checkout the blog post, use the plugin and follow the project over at GitHub. Please provide plenty of feedback - it is highly appreciated!