Category Archives: Java

Using the ShrinkWrap Maven Resolver for Arquillian Tests

arquillianThis post assumes that you’re familiar with using Arquillian for testing Java applications. If you’re not familiar with Arquillian, then I suggest you check out the guides at http://www.arquillian.org/ where you’ll learn how to write Java tests that can run on the server and are much easier to write and maintain.

When writing an Arquillian test, you create a deployment as in the following code sample:

@Deployment
public static Archive<?> createTestArchive() {
    return ShrinkWrap.create(JavaArchive.class, "test.jar")
    .addClasses(RandomNumberBean.class);
}

It’s not uncommon to see a lot of calls to .addClasses() or .addPackages(). When working with third party libraries, this list of classes/packages added to the archive can grow and grow (and can be a bit of a trial and error process to get a complete list of dependencies). The ShrinkWrap Maven Resolver overcomes this issue by allowing you to specify Maven dependencies in the createTestArchive() method rather than having to add each class/package at a time.

To use the ShrinkWrap Maven Resolver, the first stage is to add the relevant dependency to you Maven project’s pom.xml file.

<dependency>
    <groupId>org.jboss.shrinkwrap.resolver</groupId>
    <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
    <scope>test</scope>
</dependency>

Having configured Maven, you’re ready to go and add dependencies to your Arquillian archive via code as shown in the sample below. In this sample, I’ve added the Apache Commons Math library to the Arquillian archive.

@Deployment
public static Archive<?> createTestArchive() {
    MavenDependencyResolver resolver = DependencyResolvers.use(
    MavenDependencyResolver.class).loadMetadataFromPom("pom.xml");
 
    return ShrinkWrap
        .create(WebArchive.class, "test.war")
        .addClasses(RandomNumberBeanCommons.class)
        .addAsLibraries(
            resolver.artifact("org.apache.commons:commons-math")
        .resolveAsFiles());
}

Looking at the code, you can see that the first stage is to create a MavenDependencyResolver from the project’s pom.xml file. Then all you need to do, is invoke the .addAsLibraries() method on the Arquillian deployment specifying which Maven dependency to resolve.

Hopefully, you can see that this technique allows you to create your Arquillian tests much faster and more reliably than without using the ShrinkWrap Maven Resolver.

Choosing a Java Version on Ubuntu

When you have got multiple versions of Java installed, you can choose which one you want to use by running the update-alternatives command.

Running this command shows a list of installed Java JDKs and JREs allowing one to be selected as the default that is used when java needs to be executed.

$ sudo update-alternatives --config javac

If you prefer to use a gui instead of the command line, you can execute galternatives instead and define the default versions of software with the following dialog.

$ sudo galternatives

Getting Logged On User in a Spring-Web Application

In a web application, it can be useful to get the logged on user’s name and display it within a web page, for example as a link to allow the user to edit their profile.  In a Spring Web application the username can easily be obtained in a controller and passed via a map to the user interface.

To get the username in a controller class, we would use theSecurityContextHolder.getContext().getAuthentication().getPrincipal() method to get hold of the principal. We can then call the .getUsername() method to get the username of the currently logged on user.

@Controllerpublic class PageController {
 
  @RequestMapping(method = RequestMethod.GET)
 
  public ModelAndView handleRequest() {
    User user = (User) SecurityContextHolder.getContext()
       .getAuthentication().getPrincipal();
    Map userModel = new HashMap();
    userModel.put("username", user.getUsername());
    return new ModelAndView("page", "model", userModel);
  }
}

The username can then be displayed in an HTML page as:

<c:out value="${model.username}" />

Creating Calendar Based Timers in Java EE 6

Java EE 6 allows developers to create application timers that are initialized when either a Stateless Session Bean, a Singleton Bean or a Message Driven Bean are deployed to the application server.

To indicate that a method on any of these beans is to be invoked on a timed basis, the method must be annotated with either the @Schedule annotation (for single timer schedules), or the @Schedules annotation (for multiple timer schedules).

The code below shows a very simple Stateless Session Bean configured with 2 scheduled timers. The first timer is configured with one schedule whereas the second is configured with 2 schedules.

package com.acme.timer;

import javax.ejb.Schedule;
import javax.ejb.Schedules;
import javax.ejb.Stateless;
import javax.ejb.Timer;

@Stateless
public class CalendarTimer {

  @SuppressWarnings("unused")
  @Schedule(second = "*/10",
            minute = "*",
            hour = "8-17",
            dayOfWeek = "Mon-Fri",
            dayOfMonth = "*",
            month = "*",
            year = "*",
            info = "Scheduled Timer")
  private void scheduledTimeout(final Timer t) {
    System.out.println(t.getInfo().toString() + " called at: " + new java.util.Date()); }

  @SuppressWarnings("unused")
  @Schedules({ 
    @Schedule(second = "15",
              minute = "*",
              hour = "8-17",
              dayOfWeek = "Mon-Fri",
              dayOfMonth = "*",
              month = "*",
              year = "*",
              info = "2nd Scheduled Timer"),
    @Schedule(second = "45",
              minute = "*",
              hour = "8-17",
              dayOfWeek = "Mon-Fri",
              dayOfMonth = "*",
              month = "*",
              year = "*",
              info = "2nd Scheduled Timer")
  })
  private void scheduledTimeout2(final Timer t) {
    System.out.println(t.getInfo().toString() + " called at: " + new java.util.Date()); System.out.println(); 
  }
}

As can be seen, the first timer is annotated with the @Schedule annotation. This annotation takes several parameters that define the timer schedule:

second Number of seconds: 0 through 59
minute Number of minutes: 0 through 59
hour Number of hours: 0 through 23
dayOfWeek Day of the week.  This can take textual values (Sun, Mon, Tue, Wed, Thu, Fri, Sat) or numerical values 0 through 7 (both 0 and 7 indicate Sunday)
dayOfMonth Day of the month. This can take textual values (1st, 2nd etc), or numeric values 1 through 31. Negative values can also be used to indicate days before the end of the month. The value Last can also be used to indicate the last day of the month.
month Month of the year. This can take textual values (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec) or numerical values 1 through 12
year The year. This can take numeric years in the format yyyy.
info Additional information passed to the timer function.

The table above shows the allowable values that can be used for each expression used to build up a schedule. These values can also be expanded into expressions to make more complex schedules.

Wildcard: A wildcard character (*) is used to indicate that the schedule will fire for every valid value of the specific operand. For example, setting the value second=”0″, minute=”*” would cause a timer to be invoked every minute at 0 seconds.

Lists: Comma separated lists of values allow timers to occur at every value in the list rather than at all valid values as specified by the wildcard character.  For example second=”0″, minute=”0, 15, 30, 45″ would cause a timer to be invoked every quarter of an hour.

Ranges: Hypen separated ranges allow timers to occur within the specified range.  For example dayOfMonth=”1-5″ would cause a timer to be invoked every day for the first 5 days of each month.

Intervals: Intervals are defined in the format start/interval and are valid only for hours, minutes and seconds.  An interval is defined as the start value for a timer and then the interval at which a timer will be invoked.  For example hour=”12/1″ would cause a timer to be invoked on the hour, every hour in an afternoon. It’s possible to combine the wildcard and interval expressions to cause a timer to be invoked every x hours, minutes or seconds.  For example  minute=”*/10″ would cause a timer to be invoked every 10 minutes.

The second method in the example above shows how 2 different schedules can be applied to a timer.  In this instance, the method is annotated with the @Schedules annotation rather than the @Schedule annotation.

Forthcoming Book Reviews

Packt Publishing have recently released two new books of interest to Java EE developers.

EJB 3.1 Cookbook and  Java EE6 With NetBeans 7 both look like good reads and Packt have graciously agreed to send me a copy of each of these books for review, which I’ll post on the site as soon as I’ve reviewed them.

Thanks to Nicole for sorting this out for me.