Author: mrdon Date: Sat Jan 6 13:54:37 2007 New Revision: 493585 URL: http://svn.apache.org/viewvc?view=rev&rev=493585 Log: code formatting for WW-1392
Modified: struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTag.java struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java Modified: struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTag.java URL: http://svn.apache.org/viewvc/struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTag.java?view=diff&rev=493585&r1=493584&r2=493585 ============================================================================== --- struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTag.java (original) +++ struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTag.java Sat Jan 6 13:54:37 2007 @@ -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(); } Modified: struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java URL: http://svn.apache.org/viewvc/struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java?view=diff&rev=493585&r1=493584&r2=493585 ============================================================================== --- struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java (original) +++ struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java Sat Jan 6 13:54:37 2007 @@ -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"; } Modified: struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java URL: http://svn.apache.org/viewvc/struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java?view=diff&rev=493585&r1=493584&r2=493585 ============================================================================== --- struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java (original) +++ struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java Sat Jan 6 13:54:37 2007 @@ -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"); + } } Modified: struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java URL: http://svn.apache.org/viewvc/struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java?view=diff&rev=493585&r1=493584&r2=493585 ============================================================================== --- struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java (original) +++ struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java Sat Jan 6 13:54:37 2007 @@ -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 Map<String, TagAttribute> attributes = new HashMap<String, TagAttribute>(); - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getTldBodyContent() { - return tldBodyContent; - } - - public void setTldBodyContent(String tldBodyContent) { - this.tldBodyContent = tldBodyContent; - } - - public String getTldTagClass() { - return 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 Collection<TagAttribute> getAttributes() { - return attributes.values(); - } - - public boolean isInclude() { - return include; - } - - public void setInclude(boolean include) { - this.include = include; - } - - public String getDeclaredType() { - return declaredType; - } - - public void setDeclaredType(String declaredType) { - this.declaredType = 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>(); + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTldBodyContent() { + return tldBodyContent; + } + + public void setTldBodyContent(String tldBodyContent) { + this.tldBodyContent = tldBodyContent; + } + + public String getTldTagClass() { + return 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 Collection<TagAttribute> getAttributes() { + return attributes.values(); + } + + public boolean isInclude() { + return include; + } + + public void setInclude(boolean include) { + this.include = include; + } + + public String getDeclaredType() { + return declaredType; + } + + public void setDeclaredType(String declaredType) { + this.declaredType = declaredType; + } } Modified: struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java URL: http://svn.apache.org/viewvc/struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java?view=diff&rev=493585&r1=493584&r2=493585 ============================================================================== --- struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java (original) +++ struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java Sat Jan 6 13:54:37 2007 @@ -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>(); + + 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); + } - 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); - } - - // 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 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 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); + } } - } - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - 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 saveTemplates() { - //freemarker configuration - Configuration config = new Configuration(); - config.setClassForTemplateLoading(getClass(), ""); - config.setObjectWrapper(new DefaultObjectWrapper()); - - 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(); + + // 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 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); } - } 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); + } + + 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 saveTemplates() { + // freemarker configuration + Configuration config = new Configuration(); + config.setClassForTemplateLoading(getClass(), ""); + config.setObjectWrapper(new DefaultObjectWrapper()); + + 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); } - } } - //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()); + 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); } } - return values; - } + 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()); + } + } + + return values; + } } Modified: struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java URL: http://svn.apache.org/viewvc/struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java?view=diff&rev=493585&r1=493584&r2=493585 ============================================================================== --- struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java (original) +++ struts/maven/trunk/struts-annotations/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java Sat Jan 6 13:54:37 2007 @@ -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; - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public boolean isRequired() { - return required; - } - - public void setRequired(boolean required) { - this.required = required; - } - - public boolean isRtexprvalue() { - return rtexprvalue; - } - - public void setRtexprvalue(boolean rtexprvalue) { - this.rtexprvalue = rtexprvalue; - } - - public String getDefaultValue() { - return defaultValue; - } - - public void setDefaultValue(String defaultValue) { - this.defaultValue = defaultValue; - } + private String name; + private boolean required; + private boolean rtexprvalue; + private String description; + private String defaultValue; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isRequired() { + return required; + } + + public void setRequired(boolean required) { + this.required = required; + } + + public boolean isRtexprvalue() { + return rtexprvalue; + } + + public void setRtexprvalue(boolean rtexprvalue) { + this.rtexprvalue = rtexprvalue; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } }