code formatting for WW-1392
git-svn-id: https://svn.apache.org/repos/asf/struts/maven/trunk/struts-annotations@493585 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/struts/annotations/StrutsTag.java b/src/main/java/org/apache/struts/annotations/StrutsTag.java
index 7ead570..232f42f 100644
--- a/src/main/java/org/apache/struts/annotations/StrutsTag.java
+++ b/src/main/java/org/apache/struts/annotations/StrutsTag.java
@@ -26,11 +26,17 @@
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+/**
+ * An annotation to document a Struts jsp/freemarker/velocity tag
+ */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface StrutsTag {
- String name();
- String tldBodyContent() default "JSP";
- String tldTagClass();
- String description();
+ String name();
+
+ String tldBodyContent() default "JSP";
+
+ String tldTagClass();
+
+ String description();
}
diff --git a/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java b/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java
index 784fcdb..a1be85c 100644
--- a/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java
+++ b/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java
@@ -26,13 +26,21 @@
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+/**
+ * Documents an attribute to a Struts tag
+ */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface StrutsTagAttribute {
- String name() default "";
- boolean required() default false;
- boolean rtexprvalue() default true;
- String description();
- String defaultValue() default "";
- String type() default "String";
+ String name() default "";
+
+ boolean required() default false;
+
+ boolean rtexprvalue() default true;
+
+ String description();
+
+ String defaultValue() default "";
+
+ String type() default "String";
}
diff --git a/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java b/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java
index bb7585e..8e1b9e4 100644
--- a/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java
+++ b/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java
@@ -31,47 +31,45 @@
import com.sun.mirror.apt.AnnotationProcessors;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;
-public class TLDAnnotationProcessorFactory implements AnnotationProcessorFactory {
+public class TLDAnnotationProcessorFactory implements
+ AnnotationProcessorFactory {
- /**
- * Returns a TLD annotation processor.
- *
- * @return An annotation processor for note annotations if requested, otherwise, returns the NO_OP
- * annotation processor.
- */
- public AnnotationProcessor getProcessorFor(Set<AnnotationTypeDeclaration> declarations,
- AnnotationProcessorEnvironment env) {
- AnnotationProcessor result;
- if (declarations.isEmpty()) {
- result = AnnotationProcessors.NO_OP;
- } else {
- result = new TagAnnotationProcessor(env);
+ /**
+ * Returns a TLD annotation processor.
+ *
+ * @return An annotation processor for note annotations if requested,
+ * otherwise, returns the NO_OP annotation processor.
+ */
+ public AnnotationProcessor getProcessorFor(
+ Set<AnnotationTypeDeclaration> declarations,
+ AnnotationProcessorEnvironment env) {
+ AnnotationProcessor result;
+ if (declarations.isEmpty()) {
+ result = AnnotationProcessors.NO_OP;
+ } else {
+ result = new TagAnnotationProcessor(env);
+ }
+ return result;
}
- return result;
- }
- /**
- * This factory builds a processor for Tag and TagAttribute
- *
- * @return a collection containing StutsTag and StrutsTagAttribute
- */
- public Collection<String> supportedAnnotationTypes() {
- return Arrays.asList(TagAnnotationProcessor.TAG, TagAnnotationProcessor.TAG_ATTRIBUTE);
- }
+ /**
+ * This factory builds a processor for Tag and TagAttribute
+ *
+ * @return a collection containing StutsTag and StrutsTagAttribute
+ */
+ public Collection<String> supportedAnnotationTypes() {
+ return Arrays.asList(TagAnnotationProcessor.TAG,
+ TagAnnotationProcessor.TAG_ATTRIBUTE);
+ }
- /**
- * Options used to generate the TLD
- *
- * @return an empty list.
- */
- public Collection<String> supportedOptions() {
- return Arrays.asList("-AoutFile",
- "-AtlibVersion",
- "-AjspVersion",
- "-AshortName",
- "-Auri",
- "-Adescription",
- "-AdisplayName",
- "-outTemplatesDir");
- }
+ /**
+ * Options used to generate the TLD
+ *
+ * @return an empty list.
+ */
+ public Collection<String> supportedOptions() {
+ return Arrays.asList("-AoutFile", "-AtlibVersion", "-AjspVersion",
+ "-AshortName", "-Auri", "-Adescription", "-AdisplayName",
+ "-outTemplatesDir");
+ }
}
diff --git a/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java b/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java
index eb29474..09b2189 100644
--- a/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java
+++ b/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java
@@ -25,69 +25,68 @@
import java.util.Map;
public class Tag {
- private String name;
- private String tldBodyContent;
- private String tldTagClass;
- private String description;
- private boolean include = true;
- private String declaredType;
+ private String name;
+ private String tldBodyContent;
+ private String tldTagClass;
+ private String description;
+ private boolean include = true;
+ private String declaredType;
+ private Map<String, TagAttribute> attributes = new HashMap<String, TagAttribute>();
- private Map<String, TagAttribute> attributes = new HashMap<String, TagAttribute>();
+ public String getDescription() {
+ return description;
+ }
- public String getDescription() {
- return description;
- }
+ public void setDescription(String description) {
+ this.description = description;
+ }
- public void setDescription(String description) {
- this.description = description;
- }
+ public String getName() {
+ return name;
+ }
- public String getName() {
- return name;
- }
+ public void setName(String name) {
+ this.name = name;
+ }
- public void setName(String name) {
- this.name = name;
- }
+ public String getTldBodyContent() {
+ return tldBodyContent;
+ }
- public String getTldBodyContent() {
- return tldBodyContent;
- }
+ public void setTldBodyContent(String tldBodyContent) {
+ this.tldBodyContent = tldBodyContent;
+ }
- public void setTldBodyContent(String tldBodyContent) {
- this.tldBodyContent = tldBodyContent;
- }
+ public String getTldTagClass() {
+ return tldTagClass;
+ }
- public String getTldTagClass() {
- return tldTagClass;
- }
+ public void setTldTagClass(String tldTagClass) {
+ this.tldTagClass = tldTagClass;
+ }
- public void setTldTagClass(String tldTagClass) {
- this.tldTagClass = tldTagClass;
- }
+ public void addTagAttribute(TagAttribute attribute) {
+ if (!attributes.containsKey(attribute.getName()))
+ attributes.put(attribute.getName(), attribute);
+ }
- public void addTagAttribute(TagAttribute attribute) {
- if(!attributes.containsKey(attribute.getName()))
- attributes.put(attribute.getName(), attribute);
- }
+ public Collection<TagAttribute> getAttributes() {
+ return attributes.values();
+ }
- public Collection<TagAttribute> getAttributes() {
- return attributes.values();
- }
+ public boolean isInclude() {
+ return include;
+ }
- public boolean isInclude() {
- return include;
- }
+ public void setInclude(boolean include) {
+ this.include = include;
+ }
- public void setInclude(boolean include) {
- this.include = include;
- }
+ public String getDeclaredType() {
+ return declaredType;
+ }
- public String getDeclaredType() {
- return declaredType;
- }
-
- public void setDeclaredType(String declaredType) {
- this.declaredType = declaredType;
- }
+ public void setDeclaredType(String declaredType) {
+ this.declaredType = declaredType;
+ }
}
diff --git a/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java b/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java
index 47042da..47aea53 100644
--- a/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java
+++ b/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java
@@ -19,6 +19,7 @@
* under the License.
*/
package org.apache.struts.annotations.taglib.apt;
+
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
@@ -58,295 +59,324 @@
import freemarker.template.Template;
public class TagAnnotationProcessor implements AnnotationProcessor {
- public static final String TAG = "org.apache.struts.annotations.StrutsTag";
- public static final String TAG_ATTRIBUTE = "org.apache.struts.annotations.StrutsTagAttribute";
+ public static final String TAG = "org.apache.struts.annotations.StrutsTag";
+ public static final String TAG_ATTRIBUTE = "org.apache.struts.annotations.StrutsTagAttribute";
- private AnnotationProcessorEnvironment environment;
- private AnnotationTypeDeclaration tagDeclaration;
- private AnnotationTypeDeclaration tagAttributeDeclaration;
- private Map<String, Tag> tags = new HashMap<String, Tag>();
+ private AnnotationProcessorEnvironment environment;
+ private AnnotationTypeDeclaration tagDeclaration;
+ private AnnotationTypeDeclaration tagAttributeDeclaration;
+ private Map<String, Tag> tags = new HashMap<String, Tag>();
- public TagAnnotationProcessor(AnnotationProcessorEnvironment env) {
- environment = env;
- tagDeclaration = (AnnotationTypeDeclaration) environment.getTypeDeclaration(TAG);
- tagAttributeDeclaration = (AnnotationTypeDeclaration) environment
- .getTypeDeclaration(TAG_ATTRIBUTE);
- }
-
- public void process() {
- //make sure all paramters were set
- checkOptions();
-
- // tags
- Collection<Declaration> tagDeclarations = environment
- .getDeclarationsAnnotatedWith(tagDeclaration);
- Collection<Declaration> attributesDeclarations = environment
- .getDeclarationsAnnotatedWith(tagAttributeDeclaration);
-
- // find Tags
- for (Declaration declaration : tagDeclarations) {
- // type
- TypeDeclaration typeDeclaration = (TypeDeclaration) declaration;
- String typeName = typeDeclaration.getQualifiedName();
- HashMap<String, Object> values = getValues(typeDeclaration, tagDeclaration);
- // create Tag and apply values found
- Tag tag = new Tag();
- tag.setDescription((String) values.get("description"));
- tag.setName((String) values.get("name"));
- tag.setTldBodyContent((String) values.get("tldBodyContent"));
- tag.setTldTagClass((String) values.get("tldTagClass"));
- tag.setDeclaredType(typeName);
- // add to map
- tags.put(typeName, tag);
+ public TagAnnotationProcessor(AnnotationProcessorEnvironment env) {
+ environment = env;
+ tagDeclaration = (AnnotationTypeDeclaration) environment
+ .getTypeDeclaration(TAG);
+ tagAttributeDeclaration = (AnnotationTypeDeclaration) environment
+ .getTypeDeclaration(TAG_ATTRIBUTE);
}
- // find Tags Attributes
- for (Declaration declaration : attributesDeclarations) {
- // type
- MethodDeclaration methodDeclaration = (MethodDeclaration) declaration;
- String typeName = methodDeclaration.getDeclaringType().getQualifiedName();
- HashMap<String, Object> values = getValues(methodDeclaration, tagAttributeDeclaration);
- // create Attribute and apply values found
- TagAttribute attribute = new TagAttribute();
- attribute.setDescription((String) values.get("description"));
- String name = (String) values.get("name");
- if(name == null || name.length() == 0) {
- //get name from method
- String methodName = methodDeclaration.getSimpleName();
- name = String.valueOf(Character.toLowerCase(methodName.charAt(3))) + methodName.substring(4);
- }
- attribute.setName(name);
- attribute.setRequired((Boolean) values.get("required"));
- attribute.setRtexprvalue((Boolean) values.get("rtexprvalue"));
- attribute.setDefaultValue((String) values.get("defaultValue"));
- // add to map
- Tag parentTag = tags.get(typeName);
- if(parentTag != null)
- tags.get(typeName).addTagAttribute(attribute);
- else {
- //an abstract or base class
- parentTag = new Tag();
- parentTag.setDeclaredType(typeName);
- parentTag.setInclude(false);
- parentTag.addTagAttribute(attribute);
- tags.put(typeName, parentTag);
- }
- }
+ public void process() {
+ // make sure all paramters were set
+ checkOptions();
- //we can't process the hierarchy on the first pass because
- //apt does not garantees that the base classes will be processed
- //before their subclasses
- for(Map.Entry<String, Tag> entry : tags.entrySet()) {
- processHierarchy(entry.getValue());
- }
+ // tags
+ Collection<Declaration> tagDeclarations = environment
+ .getDeclarationsAnnotatedWith(tagDeclaration);
+ Collection<Declaration> attributesDeclarations = environment
+ .getDeclarationsAnnotatedWith(tagAttributeDeclaration);
- //save
- saveAsXml();
- saveTemplates();
- }
-
- private void processHierarchy(Tag tag) {
- try {
- Class clazz = Class.forName(tag.getDeclaredType());
- while((clazz = clazz.getSuperclass()) != null) {
- Tag parentTag = tags.get(clazz.getName());
- //copy parent annotations to this tag
- if(parentTag != null) {
- for(TagAttribute attribute : parentTag.getAttributes()) {
- tag.addTagAttribute(attribute);
- }
+ // find Tags
+ for (Declaration declaration : tagDeclarations) {
+ // type
+ TypeDeclaration typeDeclaration = (TypeDeclaration) declaration;
+ String typeName = typeDeclaration.getQualifiedName();
+ HashMap<String, Object> values = getValues(typeDeclaration,
+ tagDeclaration);
+ // create Tag and apply values found
+ Tag tag = new Tag();
+ tag.setDescription((String) values.get("description"));
+ tag.setName((String) values.get("name"));
+ tag.setTldBodyContent((String) values.get("tldBodyContent"));
+ tag.setTldTagClass((String) values.get("tldTagClass"));
+ tag.setDeclaredType(typeName);
+ // add to map
+ tags.put(typeName, tag);
}
- }
- } catch (ClassNotFoundException e) {
- throw new RuntimeException(e);
+
+ // find Tags Attributes
+ for (Declaration declaration : attributesDeclarations) {
+ // type
+ MethodDeclaration methodDeclaration = (MethodDeclaration) declaration;
+ String typeName = methodDeclaration.getDeclaringType()
+ .getQualifiedName();
+ HashMap<String, Object> values = getValues(methodDeclaration,
+ tagAttributeDeclaration);
+ // create Attribute and apply values found
+ TagAttribute attribute = new TagAttribute();
+ attribute.setDescription((String) values.get("description"));
+ String name = (String) values.get("name");
+ if (name == null || name.length() == 0) {
+ // get name from method
+ String methodName = methodDeclaration.getSimpleName();
+ name = String.valueOf(Character.toLowerCase(methodName
+ .charAt(3)))
+ + methodName.substring(4);
+ }
+ attribute.setName(name);
+ attribute.setRequired((Boolean) values.get("required"));
+ attribute.setRtexprvalue((Boolean) values.get("rtexprvalue"));
+ attribute.setDefaultValue((String) values.get("defaultValue"));
+ // add to map
+ Tag parentTag = tags.get(typeName);
+ if (parentTag != null)
+ tags.get(typeName).addTagAttribute(attribute);
+ else {
+ // an abstract or base class
+ parentTag = new Tag();
+ parentTag.setDeclaredType(typeName);
+ parentTag.setInclude(false);
+ parentTag.addTagAttribute(attribute);
+ tags.put(typeName, parentTag);
+ }
+ }
+
+ // we can't process the hierarchy on the first pass because
+ // apt does not garantees that the base classes will be processed
+ // before their subclasses
+ for (Map.Entry<String, Tag> entry : tags.entrySet()) {
+ processHierarchy(entry.getValue());
+ }
+
+ // save
+ saveAsXml();
+ saveTemplates();
}
- }
- private void checkOptions() {
- if(getOption("tlibVersion") == null)
- throw new IllegalArgumentException("'tlibVersion' is missing");
- if(getOption("jspVersion") == null)
- throw new IllegalArgumentException("'jspVersion' is missing");
- if(getOption("shortName") == null)
- throw new IllegalArgumentException("'shortName' is missing");
- if(getOption("description") == null)
- throw new IllegalArgumentException("'description' is missing");
- if(getOption("displayName") == null)
- throw new IllegalArgumentException("'displayName' is missing");
- if(getOption("uri") == null)
- throw new IllegalArgumentException("'uri' is missing");
- if(getOption("outTemplatesDir") == null)
- throw new IllegalArgumentException("'outTemplatesDir' is missing");
- if(getOption("outFile") == null)
- throw new IllegalArgumentException("'outFile' is missing");
- }
+ private void processHierarchy(Tag tag) {
+ try {
+ Class clazz = Class.forName(tag.getDeclaredType());
+ while ((clazz = clazz.getSuperclass()) != null) {
+ Tag parentTag = tags.get(clazz.getName());
+ // copy parent annotations to this tag
+ if (parentTag != null) {
+ for (TagAttribute attribute : parentTag.getAttributes()) {
+ tag.addTagAttribute(attribute);
+ }
+ }
+ }
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
- private void saveTemplates() {
- //freemarker configuration
- Configuration config = new Configuration();
- config.setClassForTemplateLoading(getClass(), "");
- config.setObjectWrapper(new DefaultObjectWrapper());
+ private void checkOptions() {
+ if (getOption("tlibVersion") == null)
+ throw new IllegalArgumentException("'tlibVersion' is missing");
+ if (getOption("jspVersion") == null)
+ throw new IllegalArgumentException("'jspVersion' is missing");
+ if (getOption("shortName") == null)
+ throw new IllegalArgumentException("'shortName' is missing");
+ if (getOption("description") == null)
+ throw new IllegalArgumentException("'description' is missing");
+ if (getOption("displayName") == null)
+ throw new IllegalArgumentException("'displayName' is missing");
+ if (getOption("uri") == null)
+ throw new IllegalArgumentException("'uri' is missing");
+ if (getOption("outTemplatesDir") == null)
+ throw new IllegalArgumentException("'outTemplatesDir' is missing");
+ if (getOption("outFile") == null)
+ throw new IllegalArgumentException("'outFile' is missing");
+ }
- try {
- //load template
- Template template = config.getTemplate("tag.ftl");
- String rootDir = (new File(getOption("outTemplatesDir"))).getAbsolutePath();
- for(Tag tag : tags.values()) {
- if(tag.isInclude()) {
- //model
- HashMap root = new HashMap();
- root.put("tag", tag);
+ private void saveTemplates() {
+ // freemarker configuration
+ Configuration config = new Configuration();
+ config.setClassForTemplateLoading(getClass(), "");
+ config.setObjectWrapper(new DefaultObjectWrapper());
- //save file
- BufferedWriter writer = new BufferedWriter(new FileWriter(new File(rootDir, tag.getName() + ".html")));
- try {
- template.process(root, writer);
- } finally {
- writer.close();
+ try {
+ // load template
+ Template template = config.getTemplate("tag.ftl");
+ String rootDir = (new File(getOption("outTemplatesDir")))
+ .getAbsolutePath();
+ for (Tag tag : tags.values()) {
+ if (tag.isInclude()) {
+ // model
+ HashMap root = new HashMap();
+ root.put("tag", tag);
+
+ // save file
+ BufferedWriter writer = new BufferedWriter(new FileWriter(
+ new File(rootDir, tag.getName() + ".html")));
+ try {
+ template.process(root, writer);
+ } finally {
+ writer.close();
+ }
+ }
+ }
+ } catch (Exception e) {
+ // oops we cannot throw checked exceptions
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void saveAsXml() {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder;
+
+ try {
+ // create xml document
+ builder = factory.newDocumentBuilder();
+ Document document = builder.newDocument();
+ document.setXmlVersion("1.0");
+
+ // taglib
+ Element tagLib = document.createElement("taglib");
+ document.appendChild(tagLib);
+ // tag lib attributes
+ appendTextNode(document, tagLib, "tlib-version",
+ getOption("tlibVersion"), false);
+ appendTextNode(document, tagLib, "jsp-version",
+ getOption("jspVersion"), false);
+ appendTextNode(document, tagLib, "short-name",
+ getOption("shortName"), false);
+ appendTextNode(document, tagLib, "uri", getOption("uri"), false);
+ appendTextNode(document, tagLib, "display-name",
+ getOption("displayName"), false);
+ appendTextNode(document, tagLib, "description",
+ getOption("description"), true);
+
+ // create tags
+ for (Map.Entry<String, Tag> entry : tags.entrySet()) {
+ Tag tag = entry.getValue();
+ if (tag.isInclude())
+ createElement(document, tagLib, tag);
+ }
+
+ // save to file
+ TransformerFactory tf = TransformerFactory.newInstance();
+ tf.setAttribute("indent-number", new Integer(2));
+ Transformer transformer = tf.newTransformer();
+ // if tiger would just format it :(
+ // formatting bug in tiger
+ // (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446)
+
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
+ "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN");
+ transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
+ "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd");
+ transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+
+ Source source = new DOMSource(document);
+ Result result = new StreamResult(new OutputStreamWriter(
+ new FileOutputStream(getOption("outFile"))));
+ transformer.transform(source, result);
+ } catch (Exception e) {
+ // oops we cannot throw checked exceptions
+ throw new RuntimeException(e);
+ }
+ }
+
+ private String getOption(String name) {
+ // there is a bug in the 1.5 apt implementation:
+ // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6258929
+ // this is a hack-around
+ if (environment.getOptions().containsKey(name))
+ return environment.getOptions().get(name);
+
+ for (Map.Entry<String, String> entry : environment.getOptions()
+ .entrySet()) {
+ String key = entry.getKey();
+ String[] splitted = key.split("=");
+ if (splitted[0].equals("-A" + name))
+ return splitted[1];
+ }
+ return null;
+ }
+
+ private void createElement(Document doc, Element tagLibElement, Tag tag) {
+ Element tagElement = doc.createElement("tag");
+ tagLibElement.appendChild(tagElement);
+ appendTextNode(doc, tagElement, "name", tag.getName(), false);
+ appendTextNode(doc, tagElement, "tag-class", tag.getTldTagClass(),
+ false);
+ appendTextNode(doc, tagElement, "body-content",
+ tag.getTldBodyContent(), false);
+ appendTextNode(doc, tagElement, "description", tag.getDescription(),
+ true);
+
+ // save attributes
+ for (TagAttribute attribute : tag.getAttributes()) {
+ createElement(doc, tagElement, attribute);
+ }
+
+ }
+
+ private void createElement(Document doc, Element tagElement,
+ TagAttribute attribute) {
+ Element attributeElement = doc.createElement("attribute");
+ tagElement.appendChild(attributeElement);
+ appendTextNode(doc, attributeElement, "name", attribute.getName(),
+ false);
+ appendTextNode(doc, attributeElement, "required", String
+ .valueOf(attribute.isRequired()), false);
+ appendTextNode(doc, attributeElement, "rtexprvalue", String
+ .valueOf(attribute.isRtexprvalue()), false);
+ appendTextNode(doc, attributeElement, "description", attribute
+ .getDescription(), true);
+ }
+
+ private void appendTextNode(Document doc, Element element, String name,
+ String text, boolean cdata) {
+ Text textNode = cdata ? doc.createCDATASection(text) : doc
+ .createTextNode(text);
+ Element newElement = doc.createElement(name);
+ newElement.appendChild(textNode);
+ element.appendChild(newElement);
+ }
+
+ /**
+ * Get values of annotation
+ *
+ * @param declaration
+ * @param type
+ * The type of the annotation
+ * @return name->value map of annotation values
+ */
+ private HashMap<String, Object> getValues(Declaration declaration,
+ AnnotationTypeDeclaration type) {
+ HashMap<String, Object> values = new HashMap<String, Object>();
+ Collection<AnnotationMirror> annotations = declaration
+ .getAnnotationMirrors();
+ // iterate over the mirrors.
+
+ for (AnnotationMirror mirror : annotations) {
+ // if the mirror in this iteration is for our note declaration...
+ if (mirror.getAnnotationType().getDeclaration().equals(type)) {
+ for (AnnotationTypeElementDeclaration annotationType : mirror
+ .getElementValues().keySet()) {
+ Object value = mirror.getElementValues()
+ .get(annotationType).getValue();
+ Object defaultValue = annotationType.getDefaultValue();
+ values.put(annotationType.getSimpleName(),
+ value != null ? value : defaultValue);
}
}
}
- } catch (Exception e) {
- //oops we cannot throw checked exceptions
- throw new RuntimeException(e);
- }
- }
-
- private void saveAsXml() {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder;
-
- try {
- // create xml document
- builder = factory.newDocumentBuilder();
- Document document = builder.newDocument();
- document.setXmlVersion("1.0");
-
- // taglib
- Element tagLib = document.createElement("taglib");
- document.appendChild(tagLib);
- // tag lib attributes
- appendTextNode(document, tagLib, "tlib-version", getOption("tlibVersion"), false);
- appendTextNode(document, tagLib, "jsp-version", getOption("jspVersion"), false);
- appendTextNode(document, tagLib, "short-name", getOption("shortName"), false);
- appendTextNode(document, tagLib, "uri", getOption("uri"), false);
- appendTextNode(document, tagLib, "display-name", getOption("displayName"), false);
- appendTextNode(document, tagLib, "description", getOption("description"), true);
-
- // create tags
- for (Map.Entry<String, Tag> entry : tags.entrySet()) {
- Tag tag = entry.getValue();
- if(tag.isInclude())
- createElement(document, tagLib, tag);
- }
-
- // save to file
- TransformerFactory tf = TransformerFactory.newInstance();
- tf.setAttribute("indent-number", new Integer(2));
- Transformer transformer = tf.newTransformer();
- //if tiger would just format it :(
- //formatting bug in tiger (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446)
-
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");
- transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN");
- transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd");
- transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-
- Source source = new DOMSource(document);
- Result result = new StreamResult(new OutputStreamWriter(new FileOutputStream(getOption("outFile"))));
- transformer.transform(source, result);
- } catch (Exception e) {
- // oops we cannot throw checked exceptions
- throw new RuntimeException(e);
- }
- }
-
- private String getOption(String name) {
- // there is a bug in the 1.5 apt implementation:
- // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6258929
- // this is a hack-around
- if (environment.getOptions().containsKey(name))
- return environment.getOptions().get(name);
-
- for (Map.Entry<String, String> entry : environment.getOptions().entrySet()) {
- String key = entry.getKey();
- String[] splitted = key.split("=");
- if (splitted[0].equals("-A" + name))
- return splitted[1];
- }
- return null;
- }
-
- private void createElement(Document doc, Element tagLibElement, Tag tag) {
- Element tagElement = doc.createElement("tag");
- tagLibElement.appendChild(tagElement);
- appendTextNode(doc, tagElement, "name", tag.getName(), false);
- appendTextNode(doc, tagElement, "tag-class", tag.getTldTagClass(), false);
- appendTextNode(doc, tagElement, "body-content", tag.getTldBodyContent(), false);
- appendTextNode(doc, tagElement, "description", tag.getDescription(), true);
-
- // save attributes
- for (TagAttribute attribute : tag.getAttributes()) {
- createElement(doc, tagElement, attribute);
- }
-
- }
-
- private void createElement(Document doc, Element tagElement, TagAttribute attribute) {
- Element attributeElement = doc.createElement("attribute");
- tagElement.appendChild(attributeElement);
- appendTextNode(doc, attributeElement, "name", attribute.getName(), false);
- appendTextNode(doc, attributeElement, "required", String.valueOf(attribute.isRequired()), false);
- appendTextNode(doc,
- attributeElement,
- "rtexprvalue",
- String.valueOf(attribute.isRtexprvalue()),
- false);
- appendTextNode(doc, attributeElement, "description", attribute.getDescription(), true);
- }
-
- private void appendTextNode(Document doc, Element element, String name, String text, boolean cdata) {
- Text textNode = cdata ? doc.createCDATASection(text) : doc.createTextNode(text);
- Element newElement = doc.createElement(name);
- newElement.appendChild(textNode);
- element.appendChild(newElement);
- }
-
- /**
- * Get values of annotation
- *
- * @param declaration
- * @param type
- * The type of the annotation
- * @return name->value map of annotation values
- */
- private HashMap<String, Object> getValues(Declaration declaration, AnnotationTypeDeclaration type) {
- HashMap<String, Object> values = new HashMap<String, Object>();
- Collection<AnnotationMirror> annotations = declaration.getAnnotationMirrors();
- // iterate over the mirrors.
-
- for (AnnotationMirror mirror : annotations) {
- // if the mirror in this iteration is for our note declaration...
- if (mirror.getAnnotationType().getDeclaration().equals(type)) {
- for(AnnotationTypeElementDeclaration annotationType : mirror.getElementValues().keySet()) {
- Object value = mirror.getElementValues().get(annotationType).getValue();
- Object defaultValue = annotationType.getDefaultValue();
- values.put(annotationType.getSimpleName(), value != null ? value : defaultValue);
+ // find default values...painful
+ for (AnnotationTypeElementDeclaration annotationType : type
+ .getMethods()) {
+ AnnotationValue value = annotationType.getDefaultValue();
+ if (value != null) {
+ String name = annotationType.getSimpleName();
+ if (!values.containsKey(name))
+ values.put(name, value.getValue());
+ }
}
- }
- }
- //find default values...painful
- for(AnnotationTypeElementDeclaration annotationType : type.getMethods()) {
- AnnotationValue value = annotationType.getDefaultValue();
- if(value != null) {
- String name = annotationType.getSimpleName();
- if(!values.containsKey(name))
- values.put(name, value.getValue());
- }
+ return values;
}
-
- return values;
- }
}
diff --git a/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java b/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java
index 2f05a50..b14d8e6 100644
--- a/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java
+++ b/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java
@@ -23,52 +23,52 @@
/**
* Used to hold tag attribute information for TLD generation
- *
+ *
*/
public class TagAttribute {
- private String name;
- private boolean required;
- private boolean rtexprvalue;
- private String description;
- private String defaultValue;
+ private String name;
+ private boolean required;
+ private boolean rtexprvalue;
+ private String description;
+ private String defaultValue;
- public String getDescription() {
- return description;
- }
+ public String getDescription() {
+ return description;
+ }
- public void setDescription(String description) {
- this.description = description;
- }
+ public void setDescription(String description) {
+ this.description = description;
+ }
- public String getName() {
- return name;
- }
+ public String getName() {
+ return name;
+ }
- public void setName(String name) {
- this.name = name;
- }
+ public void setName(String name) {
+ this.name = name;
+ }
- public boolean isRequired() {
- return required;
- }
+ public boolean isRequired() {
+ return required;
+ }
- public void setRequired(boolean required) {
- this.required = required;
- }
+ public void setRequired(boolean required) {
+ this.required = required;
+ }
- public boolean isRtexprvalue() {
- return rtexprvalue;
- }
+ public boolean isRtexprvalue() {
+ return rtexprvalue;
+ }
- public void setRtexprvalue(boolean rtexprvalue) {
- this.rtexprvalue = rtexprvalue;
- }
+ public void setRtexprvalue(boolean rtexprvalue) {
+ this.rtexprvalue = rtexprvalue;
+ }
- public String getDefaultValue() {
- return defaultValue;
- }
+ public String getDefaultValue() {
+ return defaultValue;
+ }
- public void setDefaultValue(String defaultValue) {
- this.defaultValue = defaultValue;
- }
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
}