| By Krishnan Viswanath | Article Rating: |
|
| March 9, 2005 12:00 AM EST | Reads: |
69,346 |
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.
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;
}
}
Published March 9, 2005 Reads 69,346
Copyright © 2005 SYS-CON Media, Inc. — All Rights Reserved.
Syndicated stories and blog feeds, all rights reserved by the author.
![]() |
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. Thanks, |
||||
![]() |
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. |
||||
- Kindle 2 vs Nook
- Why IBM’s Server Chief Got Busted
- Is Cloud Computing Like Teenage Sex?
- Industry Experts Discuss the State of Cloud Computing
- Performance Tuning Essentials for Java
- Confessions of a Ulitzer Addict
- Tactical Cloud Computing Panel at 1st Annual GovIT Expo
- It's the Java vs. C++ Shootout Revisited!
- Cloud Computing Can Revitalize Your Career as Software Developer
- IBM Could "Reinvent" Java: Mills
- Oracle & Cloud Computing: Exclusive Q&A with SVP Richard Sarwal
- A Brief History of Cloud Computing
- Kindle 2 vs Nook
- Cloud CEOs, CTOs & SVPs to Speak at 4th International Cloud Computing Expo
- Why IBM’s Server Chief Got Busted
- Is Cloud Computing Like Teenage Sex?
- Industry Experts Discuss the State of Cloud Computing
- Performance Tuning Essentials for Java
- The Difference Between Web Hosting and Cloud Computing
- Cloud Computing Expo: Exclusive Q&A with Yahoo! SVP Cloud Computing
- Ajax in RichFaces 3.3, JSF 2 and RichFaces 4
- Confessions of a Ulitzer Addict
- My Thoughts on Ulitzer
- Tactical Cloud Computing Panel at 1st Annual GovIT Expo
- A Cup of AJAX? Nay, Just Regular Java Please
- Java Developer's Journal Exclusive: 2006 "JDJ Editors' Choice" Awards
- The i-Technology Right Stuff
- JavaServer Faces (JSF) vs Struts
- Rich Internet Applications with Adobe Flex 2 and Java
- Java vs C++ "Shootout" Revisited
- Bean-Managed Persistence Using a Proxy List
- Reporting Made Easy with JasperReports and Hibernate
- Creating a Pet Store Application with JavaServer Faces, Spring, and Hibernate
- What's New in Eclipse?
- Why Do 'Cool Kids' Choose Ruby or PHP to Build Websites Instead of Java?
- i-Technology Predictions for 2007: Where's It All Headed?










































