Welcome!

Java Authors: Maureen O'Gara, Liz McMillan, Walter H. Pinson, III, Yakov Werde, Tony Bishop

Related Topics: Java

Java: Article

Java Annotation Facility - A Primer

JDK 5 Has Changed Source Code Generation in a Seminal Way

Annotation Processing Tool
The annotation processing tool (apt) found in JAVA_HOME/bin directory is a command-line utility that ships with JDK 5.0. This tool looks for annotation processors based on the annotation in the set of specified source files being examined. Essentially the annotation processor uses a set of reflective APIs and supporting infrastructure to process the annotations.

When invoked, the apt goes through the following sequence of operations: First, it determines what annotations are present in the source code being operated on. Next, it looks for annotation processor factories. It then asks the factories what annotations they process and, if the factory processes an annotation present in source files being operated on, the apt asks the factory to provide an annotation processor. Next, the annotation processors are run. If the processors have generated new source files, the apt will repeat this process until no new source files are generated. This high-level sequence is indicated in Figure 1.

To write a factory class, a developer has to rely on packages that aren't part of the standard SDK. The packages used are:

  • com.sun.mirror.apt: interfaces to interact with the tool.
  • com.sun.mirror.declaration: interfaces to model the source code declarations of fields, methods, classes, etc.
  • com.sun.mirror.type: interfaces to model types found in the source code.
  • com.sun.mirror.util: various utilities for processing types and declarations, including visitors.
These packages are bundled in tools.jar, and so this jar file needs to be set in the classpath to write and compile the factory class. Assuming that the path and the classpath are set correctly, the annotation processing tool can be invoked from the command prompt by typing 'apt' followed by the tools command-line parameters.

Using Annotation for Generating Struts-config.xml
For a concrete understanding of the technology it's imperative that we dive into writing code and see for ourselves how it works. We will look at how to go about generating struts-config.xml by annotating code and using the apt tool. This article assumes that the reader is familiar with the Open Source MVC framework struts. We will look at how to generate the configuration details and the declarative programming semantics provided in the struts-config.xml by annotating the source code.

Before we get to the nitty-gritty of annotating and generating configuration files, we need to understand why this needs to be done.

We need to do this because a developer who has to write code using the struts framework finds himself copying and pasting information from the source code to the deployment descriptor and vice versa. For instance, if we change the name of the Action class and don't change the XML file, the application doesn't work correctly. The way to sidestep this issue is to isolate the changes to one location and let the utility tool generate the deployment descriptor. We will cover how to use the metadata facility to achieve this automatic configuration file generation.

Before we start we have to make sure that we have the right development tools to do what we're trying to do. Currently very few IDEs support Java 5. Among Open Source IDEs, NetBeans 4.0 beta 2 looks promising (in spite of a few runtime exceptions) so most of the code in this article was written and tested with it. The first step in the process is defining the annotation types for the various elements that make up the struts framework. The component parts of the framework are: Action, Form bean (also known as Action Forms), Exceptions, Validator, Plug-ins etc.

The annotation type for Struts Action is as follows:


package com.jdj.article.atypes;
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface StrutsAction {
String name();
String path();
String scope() default "session";
String input() default "";
String roles() default "";
String validate() default "";
String parameter() default "";
StrutsActionForward[] forward();
StrutsActionException strutsAction
Exception();
}

As you can see, I have the annotation types as return types. This is necessary because we could have forward and exception elements defined by the action element. The XML snippet from that struts-config.xml that we're trying to generate will clarify the need for embedding other annotation types in the action annotation-type declaration.


<action path="/SubmitLogon"
type="example.LogonAction"
name="LogonForm"
scope="request"
input="logon">
<forward name="failure" path="/
MainMenu.do"/>
<forward name="success" path="/
someValidPage.jsp"/>
<exception key="expired.password"
type="example.Expired
PasswordException"
path="/ExpiredPassword.
do"/>
</action>

The next step is to annotate the code with the annotation type. In our case we will annotate a struts action class. This is done as follows:


package ....
import ....
@StrutsAction(
name=" example.LogonAction",
path="/SubmitLogon",
forward = {@StrutsActionForward(
name = "failure",
path = "/MainMenu.do" )},
strutsActionException =
@StrutsActionException(
key = "expired.password",
type = "example.ExpiredPassword
Exception",
path = "/ExpiredPassword.do"
)
)
public class ExampleAction extends Action {

/** Creates a new instance of ExampleAction */
public ExampleAction() {
}

public ActionForward execute(ActionMapping
mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
return null;
}
}

Comments (6) View Comments

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


Most Recent Comments
udaykirand 09/08/08 10:15:23 AM EDT

Really Excellent Information. But i have some doubts. initially i have some aversion towards annotations but after reading this article i develop some interest on it. later my R & D i want to create an annotation which is like @Singleton when ever i applied this annotation for a class then i want to make a class as singleton class. could you please help me out from this scenario.

in the same way @ThrowException(exceptionType="ArithmeticException.class")

many more ideas but i couldn't able to move in forward direction because there is no much information about annotations in Google also.
even no where i found the source code of this article. if you have any please send me complete source code with compilation and execution instructions. please please its really great help for me.my id is udaykiranmca@gmail.com

Thanks,
udaykiranmca@gmail.com
please send to this mail id .

Terry Corbet 08/06/06 06:00:49 PM EDT

This is a critique for the editor, not the author.

A primer that uses for an example something that requires experience with Struts is not what you should have provided. Ok, so the guy you got to do all the hard work happened to be interested in solving a Struts problem, but your job, as editor, should have been to carefully think through the issues of documenting this new Java facility and providing examples with as little dependence upon some specific toolkit-framework-environment as possible. With Mustang about to add to the value of annotation, I am sure there is much need for carefully-thought-out articles demonstrating valuable, incremental information. When K&R contrived 'Hello World', it was after thoughtful consideration about learning processes. Combined with the fact that the source code was not correctly provided, the overall impression is that you, as an editor, just thought you could get something for nothing and pass it along where enough Google hits would provide the mass of advertising that is blinking all around me as I enter this suggestion.

Vish 07/21/05 10:00:00 PM EDT

Bob,

Sorry about that. Can you send me an email at unicode@yahoo.com, and I will send you the src

Thanks,

Bob Shewan 07/21/05 05:40:07 PM EDT

As Neil noted there isn't any source code in the zip file. Would you be kind enough to send what you have.

Thanks

Bob Shewan

vish krishnan 03/13/05 10:23:16 AM EST

Neil, sorry about that. Send me an email and I will send you all the source that I have got. My email is unicode at yahoo dot com (OR) krviswanath at Deloitte dot com

thanks

Neil Hornbeck 03/11/05 07:33:41 AM EST

The source zip file Viswanth1003.zip only contains compiled code.