You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sk...@apache.org on 2008/03/25 21:36:13 UTC
svn commit: r640971 - in
/myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src:
main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/
test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/
test/resources/...
Author: skitching
Date: Tue Mar 25 13:36:12 2008
New Revision: 640971
URL: http://svn.apache.org/viewvc?rev=640971&view=rev
Log:
Add support for real java15 annotations.
Added:
myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple/goodfile.xml (with props)
myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/
myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/Foo.java (with props)
myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/goodfile.xml (with props)
Modified:
myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java
myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java
Modified: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java
URL: http://svn.apache.org/viewvc/myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java?rev=640971&r1=640970&r2=640971&view=diff
==============================================================================
--- myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java (original)
+++ myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java Tue Mar 25 13:36:12 2008
@@ -7,6 +7,7 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.maven.plugin.MojoExecutionException;
@@ -21,6 +22,7 @@
import com.thoughtworks.qdox.JavaDocBuilder;
import com.thoughtworks.qdox.model.AbstractJavaEntity;
+import com.thoughtworks.qdox.model.Annotation;
import com.thoughtworks.qdox.model.DocletTag;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaField;
@@ -38,15 +40,19 @@
private static final String DOC_PROPERTY = "JSFProperty";
- private static class JavaClassComparator implements Comparator {
+ private static final String ANNOTATION_BASE = "org.apache.myfaces.buildtools.annotation";
+
+ private static class JavaClassComparator implements Comparator
+ {
public int compare(Object arg0, Object arg1)
{
JavaClass c0 = (JavaClass) arg0;
JavaClass c1 = (JavaClass) arg1;
-
+
return (c0.getName().compareTo(c1.getName()));
}
}
+
/**
* Scan the source tree for doc-annotations, and build Model objects
* containing info extracted from the doc-annotation attributes and
@@ -79,7 +85,7 @@
System.out.println("CompileSourceRoots end..");
JavaClass[] classes = builder.getClasses();
-
+
// Sort the class array so that they are processed in a
// predictable order, regardless of how the source scanning
// returned them.
@@ -125,24 +131,79 @@
System.out.println("class:" + clazz.getName());
DocletTag tag;
+ Annotation anno;
+ // converters
tag = clazz.getTagByName(DOC_CONVERTER, false);
if (tag != null)
{
- processConverter(tag, clazz, model);
+ Map props = tag.getNamedParameterMap();
+ processConverter(props, tag.getContext(), clazz, model);
+ }
+ anno = getAnnotation(clazz, DOC_CONVERTER);
+ if (anno != null)
+ {
+ Map props = anno.getNamedParameterMap();
+ processConverter(props, anno.getContext(), clazz, model);
}
+ // validators
tag = clazz.getTagByName(DOC_VALIDATOR, false);
if (tag != null)
{
- processValidator(tag, clazz, model);
+ Map props = tag.getNamedParameterMap();
+ processValidator(props, tag.getContext(), clazz, model);
+ }
+ anno = getAnnotation(clazz, DOC_VALIDATOR);
+ if (anno != null)
+ {
+ Map props = anno.getNamedParameterMap();
+ processValidator(props, anno.getContext(), clazz, model);
}
+ // components
tag = clazz.getTagByName(DOC_COMPONENT, false);
if (tag != null)
{
- processComponent(tag, clazz, model);
+ Map props = tag.getNamedParameterMap();
+ processComponent(props, tag.getContext(), clazz, model);
}
+ anno = getAnnotation(clazz, DOC_COMPONENT);
+ if (anno != null)
+ {
+ Map props = anno.getNamedParameterMap();
+ processComponent(props, anno.getContext(), clazz, model);
+ }
+
+ }
+
+ private Annotation getAnnotation(AbstractJavaEntity entity, String annoName)
+ {
+ Annotation[] annos = entity.getAnnotations();
+ if (annos == null)
+ {
+ return null;
+ }
+ // String wanted = ANNOTATION_BASE + "." + annoName;
+ for (int i = 0; i < annos.length; ++i)
+ {
+ Annotation thisAnno = annos[i];
+ // Ideally, here we would check whether the fully-qualified name of
+ // the annotation
+ // class matches ANNOTATION_BASE + "." + annoName. However it
+ // appears that qdox 1.6.3
+ // does not correctly expand @Foo using the class import statements;
+ // method
+ // Annotation.getType.getJavaClass.getFullyQualifiedName still just
+ // returns the short
+ // class name. So for now, just check for the short name.
+ String thisAnnoName = thisAnno.getType().getJavaClass().getName();
+ if (thisAnnoName.equals(annoName))
+ {
+ return thisAnno;
+ }
+ }
+ return null;
}
/**
@@ -151,13 +212,14 @@
* Qdox comments like <code>@foo val= "bar"</code> return a value with leading whitespace and
* quotes, so remove them.
*/
- private String clean(String src)
+ private String clean(Object srcObj)
{
- if (src == null)
+ if (srcObj == null)
{
return null;
}
+ String src = srcObj.toString();
int start = 0;
int end = src.length();
while (start <= end)
@@ -188,10 +250,9 @@
* is the class the annotation is attached to; only used when
* reporting errors.
*/
- private String getString(JavaClass clazz, String key, DocletTag tag,
- String dflt)
+ private String getString(JavaClass clazz, String key, Map map, String dflt)
{
- String val = clean(tag.getNamedParameter(key));
+ String val = clean(map.get(key));
if (val != null)
{
return val;
@@ -209,10 +270,10 @@
* is the class the annotation is attached to; only used when
* reporting errors.
*/
- private Boolean getBoolean(JavaClass clazz, String key, DocletTag tag,
+ private Boolean getBoolean(JavaClass clazz, String key, Map map,
Boolean dflt)
{
- String val = clean(tag.getNamedParameter(key));
+ String val = clean(map.get(key));
if (val == null)
{
return dflt;
@@ -263,7 +324,8 @@
modelItem.setInterfaceClassNames(ifaceNames);
}
- private void processConverter(DocletTag tag, JavaClass clazz, Model model)
+ private void processConverter(Map props, AbstractJavaEntity ctx,
+ JavaClass clazz, Model model)
{
String longDescription = clazz.getComment();
String descDflt = getFirstSentence(longDescription);
@@ -271,9 +333,9 @@
{
descDflt = "no description";
}
- String shortDescription = getString(clazz, "desc", tag, descDflt);
+ String shortDescription = getString(clazz, "desc", props, descDflt);
- String converterId = getString(clazz, "id", tag, null);
+ String converterId = getString(clazz, "id", props, null);
ConverterModel converter = new ConverterModel();
converter.setClassName(clazz.getName());
@@ -283,7 +345,8 @@
model.addConverter(converter);
}
- private void processValidator(DocletTag tag, JavaClass clazz, Model model)
+ private void processValidator(Map props, AbstractJavaEntity ctx,
+ JavaClass clazz, Model model)
{
String longDescription = clazz.getComment();
String descDflt = getFirstSentence(longDescription);
@@ -291,9 +354,9 @@
{
descDflt = "no description";
}
- String shortDescription = getString(clazz, "desc", tag, descDflt);
+ String shortDescription = getString(clazz, "desc", props, descDflt);
- String validatorId = getString(clazz, "id", tag, null);
+ String validatorId = getString(clazz, "id", props, null);
ValidatorModel validator = new ValidatorModel();
validator.setClassName(clazz.getName());
@@ -303,8 +366,8 @@
model.addValidator(validator);
}
- private void processComponent(DocletTag tag, JavaClass clazz, Model model)
- throws MojoExecutionException
+ private void processComponent(Map props, AbstractJavaEntity ctx,
+ JavaClass clazz, Model model) throws MojoExecutionException
{
String componentTypeDflt = null;
JavaField fieldComponentType = clazz.getFieldByName("COMPONENT_TYPE");
@@ -332,8 +395,9 @@
.getInitializationExpression());
}
- String componentName = getString(clazz, "name", tag, null);
- String componentClass = getString(clazz, "class", tag, clazz.getName());
+ String componentName = getString(clazz, "name", props, null);
+ String componentClass = getString(clazz, "class", props, clazz
+ .getName());
String longDescription = clazz.getComment();
String descDflt = getFirstSentence(longDescription);
@@ -341,19 +405,20 @@
{
descDflt = "no description";
}
- String shortDescription = getString(clazz, "desc", tag, descDflt);
+ String shortDescription = getString(clazz, "desc", props, descDflt);
- String componentFamily = getString(clazz, "family", tag,
+ String componentFamily = getString(clazz, "family", props,
componentTypeFamily);
- String componentType = getString(clazz, "type", tag, componentTypeDflt);
- String rendererType = getString(clazz, "defaultRendererType", tag,
+ String componentType = getString(clazz, "type", props,
+ componentTypeDflt);
+ String rendererType = getString(clazz, "defaultRendererType", props,
rendererTypeDflt);
- Boolean canHaveChildren = getBoolean(clazz, "canHaveChildren", tag,
+ Boolean canHaveChildren = getBoolean(clazz, "canHaveChildren", props,
Boolean.TRUE);
- String tagClass = getString(clazz, "tagClass", tag, null);
- String tagSuperclass = getString(clazz, "tagSuperclass", tag, null);
- String tagHandler = getString(clazz, "tagHandler", tag, null);
+ String tagClass = getString(clazz, "tagClass", props, null);
+ String tagSuperclass = getString(clazz, "tagSuperclass", props, null);
+ String tagHandler = getString(clazz, "tagHandler", props, null);
ComponentModel component = new ComponentModel();
initAncestry(model, clazz, component);
@@ -401,43 +466,56 @@
for (int i = 0; i < methods.length; ++i)
{
JavaMethod method = methods[i];
- DocletTag tag = method.getTagByName(DOC_PROPERTY);
+ DocletTag tag = method.getTagByName(DOC_PROPERTY);
if (tag != null)
{
- Boolean required = getBoolean(clazz, "required", tag,
- Boolean.FALSE);
- Boolean transientProp = getBoolean(clazz, "transient", tag,
- Boolean.FALSE);
- Boolean literalOnly = getBoolean(clazz, "literalOnly", tag,
- Boolean.FALSE);
-
- AbstractJavaEntity ctx = tag.getContext();
-
- String longDescription = ctx.getComment();
- String descDflt = getFirstSentence(longDescription);
- if ((descDflt == null) || (descDflt.length() < 2))
- {
- descDflt = "no description";
- }
- String shortDescription = getString(clazz, "desc", tag, descDflt);
-
- Type returnType = method.getReturns();
-
- PropertyModel p = new PropertyModel();
- p.setName(methodToPropName(method.getName()));
- p.setClassName(returnType.toString());
- p.setRequired(required.booleanValue());
- p.setTransient(transientProp.booleanValue());
- p.setLiteralOnly(literalOnly.booleanValue());
- p.setDescription(shortDescription);
- p.setLongDescription(longDescription);
+ Map props = tag.getNamedParameterMap();
+ processComponentProperty(props, tag.getContext(), clazz,
+ method, component);
+ }
- component.addProperty(p);
+ Annotation anno = getAnnotation(method, DOC_PROPERTY);
+ if (anno != null)
+ {
+ Map props = anno.getNamedParameterMap();
+ processComponentProperty(props, anno.getContext(), clazz,
+ method, component);
}
}
}
+ private void processComponentProperty(Map props, AbstractJavaEntity ctx,
+ JavaClass clazz, JavaMethod method, ComponentModel component)
+ {
+ Boolean required = getBoolean(clazz, "required", props, Boolean.FALSE);
+ Boolean transientProp = getBoolean(clazz, "transient", props,
+ Boolean.FALSE);
+ Boolean literalOnly = getBoolean(clazz, "literalOnly", props,
+ Boolean.FALSE);
+
+ String longDescription = ctx.getComment();
+ String descDflt = getFirstSentence(longDescription);
+ if ((descDflt == null) || (descDflt.length() < 2))
+ {
+ descDflt = "no description";
+ }
+ String shortDescription = getString(clazz, "desc", props, descDflt);
+
+ Type returnType = method.getReturns();
+
+ PropertyModel p = new PropertyModel();
+ p.setName(methodToPropName(method.getName()));
+ p.setClassName(returnType.toString());
+ p.setRequired(required.booleanValue());
+ p.setTransient(transientProp.booleanValue());
+ p.setLiteralOnly(literalOnly.booleanValue());
+ p.setDescription(shortDescription);
+ p.setLongDescription(longDescription);
+
+ component.addProperty(p);
+ }
+
/**
* Convert a method name to a property name.
*/
@@ -463,15 +541,20 @@
// getFooBar --> fooBar
// getURL --> url
// getURLLocation --> urlLocation
- for(int i=0; i<name.length(); ++i) {
+ for (int i = 0; i < name.length(); ++i)
+ {
char c = name.charAt(i);
- if (Character.isUpperCase(c)) {
+ if (Character.isUpperCase(c))
+ {
name.setCharAt(i, Character.toLowerCase(c));
- } else {
- if (i>1) {
+ }
+ else
+ {
+ if (i > 1)
+ {
// reset the previous char to uppercase
- c = name.charAt(i-1);
- name.setCharAt(i-1, Character.toUpperCase(c));
+ c = name.charAt(i - 1);
+ name.setCharAt(i - 1, Character.toUpperCase(c));
}
break;
}
Modified: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java
URL: http://svn.apache.org/viewvc/myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java?rev=640971&r1=640970&r2=640971&view=diff
==============================================================================
--- myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java (original)
+++ myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java Tue Mar 25 13:36:12 2008
@@ -49,8 +49,10 @@
assertEquals("fooBar", QdoxModelBuilder.methodToPropName("getFooBar"));
assertEquals("url", QdoxModelBuilder.methodToPropName("getUrl"));
assertEquals("url", QdoxModelBuilder.methodToPropName("getURL"));
- assertEquals("urlLocation", QdoxModelBuilder.methodToPropName("getUrlLocation"));
- assertEquals("urlLocation", QdoxModelBuilder.methodToPropName("getURLLocation"));
+ assertEquals("urlLocation", QdoxModelBuilder
+ .methodToPropName("getUrlLocation"));
+ assertEquals("urlLocation", QdoxModelBuilder
+ .methodToPropName("getURLLocation"));
}
public void testScan() throws Exception
@@ -76,11 +78,81 @@
}
/**
+ * Scan a very simple source tree, and compare the result (line by line)
+ * against a "known good" file.
+ */
+ public void testSimple() throws Exception
+ {
+ QdoxModelBuilder builder = new QdoxModelBuilder();
+
+ ClassLoader classLoader = this.getClass().getClassLoader();
+ URL sourceUrl = classLoader.getResource("builder/simple/Foo.java");
+ String parentDirName = new File(sourceUrl.getFile()).getParent();
+ File parentDir = new File(parentDirName);
+ List sourceDirs = new ArrayList();
+ sourceDirs.add(parentDir.getAbsolutePath());
+
+ Model model = new Model();
+ builder.buildModel(model, sourceDirs);
+
+ // basic sanity checks
+ assertTrue(model.getComponents().size() > 0);
+
+ // Now write it. Optionally, we could just write it to an in-memory
+ // buffer.
+ File outfile = new File("target/simple-out.xml");
+ IOUtils.saveModel(model, outfile);
+
+ StringWriter outbuf = new StringWriter();
+ IOUtils.writeModel(model, outbuf);
+ StringReader reader = new StringReader(outbuf.toString());
+
+ InputStream is = classLoader
+ .getResourceAsStream("builder/simple/goodfile.xml");
+ compareData(reader, new InputStreamReader(is));
+ }
+
+ /**
+ * Scan a very simple source tree that uses java15 annotations, and compare
+ * the result (line by line) against a "known good" file.
+ */
+ public void testSimple15() throws Exception
+ {
+ QdoxModelBuilder builder = new QdoxModelBuilder();
+
+ ClassLoader classLoader = this.getClass().getClassLoader();
+ URL sourceUrl = classLoader.getResource("builder/simple15/Foo.java");
+ String parentDirName = new File(sourceUrl.getFile()).getParent();
+ File parentDir = new File(parentDirName);
+ List sourceDirs = new ArrayList();
+ sourceDirs.add(parentDir.getAbsolutePath());
+
+ Model model = new Model();
+ builder.buildModel(model, sourceDirs);
+
+ // basic sanity checks
+ assertTrue(model.getComponents().size() > 0);
+
+ // Now write it. Optionally, we could just write it to an in-memory
+ // buffer.
+ File outfile = new File("target/simple15-out.xml");
+ IOUtils.saveModel(model, outfile);
+
+ StringWriter outbuf = new StringWriter();
+ IOUtils.writeModel(model, outbuf);
+ StringReader reader = new StringReader(outbuf.toString());
+
+ InputStream is = classLoader
+ .getResourceAsStream("builder/simple15/goodfile.xml");
+ compareData(reader, new InputStreamReader(is));
+ }
+
+ /**
* Scan a very complex source tree, containing all the different features in
* various combinations, then dump the result to a file and compare it (line
* by line) against a "known good" file.
*/
- public void testAll() throws Exception
+ public void testComplex() throws Exception
{
QdoxModelBuilder builder = new QdoxModelBuilder();
@@ -100,7 +172,7 @@
// Now write it. Optionally, we could just write it to an in-memory
// buffer.
- File outfile = new File("target/outfile.xml");
+ File outfile = new File("target/complex-out.xml");
IOUtils.saveModel(model, outfile);
StringWriter outbuf = new StringWriter();
Added: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple/goodfile.xml
URL: http://svn.apache.org/viewvc/myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple/goodfile.xml?rev=640971&view=auto
==============================================================================
--- myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple/goodfile.xml (added)
+++ myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple/goodfile.xml Tue Mar 25 13:36:12 2008
@@ -0,0 +1,34 @@
+<?xml version='1.0' ?>
+
+<model>
+ <component>
+ <className>Foo</className>
+ <name>foo</name>
+ <type>foo</type>
+ <family>foo</family>
+ <rendererType>FooRenderer</rendererType>
+ <desc>The Foo component</desc>
+ <longDesc>
+<![CDATA[
+The Foo component.
+<p>
+This is a foo component. It does nothing useful.
+]]>
+ </longDesc>
+ <property>
+ <name>prop1</name>
+ <className>java.lang.String</className>
+ <required>false</required>
+ <literalOnly>false</literalOnly>
+ <transient>false</transient>
+ <desc>The prop1 property</desc>
+ <longDesc>
+<![CDATA[
+The prop1 property.
+<p>
+Some dummy prop1 documentatoin.
+]]>
+ </longDesc>
+ </property>
+ </component>
+</model>
\ No newline at end of file
Propchange: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple/goodfile.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/Foo.java
URL: http://svn.apache.org/viewvc/myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/Foo.java?rev=640971&view=auto
==============================================================================
--- myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/Foo.java (added)
+++ myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/Foo.java Tue Mar 25 13:36:12 2008
@@ -0,0 +1,30 @@
+/**
+ * The Foo component.
+ * <p>
+ * This is a foo component. It does nothing useful.
+ *
+ * @mfp.component
+ * name="foo"
+ * type="foo"
+ * family="foo"
+ * defaultRendererType="FooRenderer"
+ */
+public class Foo
+{
+ String prop1;
+
+ /**
+ * The prop1 property.
+ * <p>
+ * Some dummy prop1 documentatoin.
+ *
+ * @mfp.property
+ */
+ public String getProp1() {
+ return prop1;
+ }
+
+ public void setProp1(String prop1) {
+ this.prop1 = prop1;
+ }
+}
Propchange: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/Foo.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/goodfile.xml
URL: http://svn.apache.org/viewvc/myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/goodfile.xml?rev=640971&view=auto
==============================================================================
--- myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/goodfile.xml (added)
+++ myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/goodfile.xml Tue Mar 25 13:36:12 2008
@@ -0,0 +1,34 @@
+<?xml version='1.0' ?>
+
+<model>
+ <component>
+ <className>Foo</className>
+ <name>foo</name>
+ <type>foo</type>
+ <family>foo</family>
+ <rendererType>FooRenderer</rendererType>
+ <desc>The Foo component defined via java15 annotations</desc>
+ <longDesc>
+<![CDATA[
+The Foo component defined via java15 annotations.
+<p>
+This is an annotated foo component. It does nothing useful.
+]]>
+ </longDesc>
+ <property>
+ <name>prop1</name>
+ <className>java.lang.String</className>
+ <required>false</required>
+ <literalOnly>false</literalOnly>
+ <transient>false</transient>
+ <desc>The prop1 property</desc>
+ <longDesc>
+<![CDATA[
+The prop1 property.
+<p>
+Some dummy prop1 documentatoin.
+]]>
+ </longDesc>
+ </property>
+ </component>
+</model>
\ No newline at end of file
Propchange: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/test/resources/builder/simple15/goodfile.xml
------------------------------------------------------------------------------
svn:eol-style = native