TRINIDAD-1177
This fix dynamically creates <!ELEMENT> tags for all the custom metadata blocks found in the document. This way the plugin will not have to change for every new element.
diff --git a/maven-faces-plugin/src/main/resources/org/apache/myfaces/trinidadbuild/plugin/faces/resources/transform.xsl b/maven-faces-plugin/src/main/resources/org/apache/myfaces/trinidadbuild/plugin/faces/resources/transform.xsl
index 57f8f98..77347e2 100644
--- a/maven-faces-plugin/src/main/resources/org/apache/myfaces/trinidadbuild/plugin/faces/resources/transform.xsl
+++ b/maven-faces-plugin/src/main/resources/org/apache/myfaces/trinidadbuild/plugin/faces/resources/transform.xsl
@@ -31,8 +31,8 @@
<xsl:param name="typePrefix" />
<xsl:param name="removeRenderers" />
- <xsl:variable name="doctype" ><![CDATA[
- <!DOCTYPE faces-config PUBLIC
+ <xsl:variable name="doctype-start"><![CDATA[
+<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd"[
<!ELEMENT component-metadata ANY>
@@ -40,31 +40,13 @@
<!ELEMENT property-metadata ANY>
<!ELEMENT facet-metadata ANY>
<!ELEMENT renderer-metadata ANY>
- <!ELEMENT accepts-child-components (#PCDATA)>
<!ELEMENT attribute-values (#PCDATA)>
- <!ELEMENT base-component-type (#PCDATA)>
- <!ELEMENT deprecated (#PCDATA)>
- <!ELEMENT no-op (#PCDATA)>
- <!ELEMENT display-order (#PCDATA)>
- <!ELEMENT expert (#PCDATA)>
- <!ELEMENT favorite-property (#PCDATA)>
- <!ELEMENT group (#PCDATA)>
- <!ELEMENT help-topic (#PCDATA)>
- <!ELEMENT hidden (#PCDATA)>
- <!ELEMENT initial-value (#PCDATA)>
- <!ELEMENT preferred (#PCDATA)>
- <!ELEMENT preferred-children (#PCDATA)>
- <!ELEMENT allowable-children (#PCDATA)>
- <!ELEMENT preferred-component-types (#PCDATA)>
- <!ELEMENT property-editor (#PCDATA)>
- <!ELEMENT short-description (#PCDATA)>
- <!ELEMENT translatable (#PCDATA)>
- <!ELEMENT scoped-id-holder (#PCDATA)>
- <!ELEMENT multi-scoped-id-holder (#PCDATA)>
- <!ELEMENT unsupported-agents (#PCDATA)>
- <!ATTLIST component-metadata component-type CDATA #IMPLIED>
-]>
-]]></xsl:variable>
+ <!ATTLIST component-metadata component-type CDATA #IMPLIED>]]></xsl:variable>
+ <xsl:variable name="doctype-end"><![CDATA[]>]]></xsl:variable>
+
+ <xsl:variable name="entity-elem-start"><![CDATA[
+ <!ELEMENT ]]></xsl:variable>
+ <xsl:variable name="entity-elem-end"><![CDATA[ (#PCDATA)>]]></xsl:variable>
<xsl:key name="component-type"
match="javaee:component"
@@ -76,9 +58,146 @@
<!-- switch off default text processing -->
<xsl:template match="//text()" />
+
+ <xsl:template
+ match="mfp:property-metadata|mfp:facet-metadata|mfp:component-metadata"
+ mode="generate-entities"
+ priority="1">
+ <xsl:apply-templates
+ select="./*[namespace-uri() != 'http://java.sun.com/xml/ns/javaee']"
+ mode="generate-entities-metadata"/>
+ </xsl:template>
+
+ <xsl:template
+ match="javaee:property-extension|javaee:facet-extension|javaee:component-extension"
+ mode="generate-entities"
+ priority="1">
+ <xsl:apply-templates
+ select="./*[
+ namespace-uri() != 'http://java.sun.com/xml/ns/javaee'
+ and (
+ namespace-uri() != 'http://myfaces.apache.org/maven-faces-plugin'
+ or (
+ name() != 'mfp:property-metadata'
+ and name() != 'mfp:facet-metadata'
+ and name() != 'mfp:component-metadata'
+ )
+ )]"
+ mode="generate-entities-metadata"/>
+ </xsl:template>
+
+ <xsl:template match="@*|node()" mode="generate-entities" priority="-1">
+ <!-- Block matches outside this mode -->
+ </xsl:template>
+
+ <!-- do not create elements with J2EE names -->
+ <xsl:template match="*[local-name() = 'faces-config'
+ or local-name() = 'application'
+ or local-name() = 'factory'
+ or local-name() = 'attribute'
+ or local-name() = 'attribute-extension'
+ or local-name() = 'component'
+ or local-name() = 'component-extension'
+ or local-name() = 'facet'
+ or local-name() = 'facet-extension'
+ or local-name() = 'facet-name'
+ or local-name() = 'converter'
+ or local-name() = 'icon'
+ or local-name() = 'lifecycle'
+ or local-name() = 'locale-config'
+ or local-name() = 'managed-bean'
+ or local-name() = 'managed-property'
+ or local-name() = 'map-entry'
+ or local-name() = 'map-entries'
+ or local-name() = 'message-bundle'
+ or local-name() = 'navigation-case'
+ or local-name() = 'navigation-rule'
+ or local-name() = 'property'
+ or local-name() = 'property-extension'
+ or local-name() = 'referenced-bean'
+ or local-name() = 'render-kit'
+ or local-name() = 'renderer'
+ or local-name() = 'renderer-extension'
+ or local-name() = 'validator'
+ or local-name() = 'list-entries'
+ or local-name() = 'action-listener'
+ or local-name() = 'application-factory'
+ or local-name() = 'attribute-class'
+ or local-name() = 'attribute-name'
+ or local-name() = 'component-class'
+ or local-name() = 'component-family'
+ or local-name() = 'component-type'
+ or local-name() = 'converter-class'
+ or local-name() = 'converter-for-class'
+ or local-name() = 'converter-id'
+ or local-name() = 'default-render-kit-id'
+ or local-name() = 'default-locale'
+ or local-name() = 'default-value'
+ or local-name() = 'description'
+ or local-name() = 'display-name'
+ or local-name() = 'faces-context-factory'
+ or local-name() = 'from-action'
+ or local-name() = 'from-outcome'
+ or local-name() = 'from-view-id'
+ or local-name() = 'key'
+ or local-name() = 'key-class'
+ or local-name() = 'large-icon'
+ or local-name() = 'lifecycle-factory'
+ or local-name() = 'managed-bean-class'
+ or local-name() = 'managed-bean-name'
+ or local-name() = 'managed-bean-scope'
+ or local-name() = 'navigation-handler'
+ or local-name() = 'phase-listener'
+ or local-name() = 'redirect'
+ or local-name() = 'suggested-value'
+ or local-name() = 'view-handler'
+ or local-name() = 'state-manager'
+ or local-name() = 'null-value'
+ or local-name() = 'property-class'
+ or local-name() = 'property-name'
+ or local-name() = 'property-resolver'
+ or local-name() = 'referenced-bean-class'
+ or local-name() = 'referenced-bean-name'
+ or local-name() = 'render-kit-id'
+ or local-name() = 'render-kit-class'
+ or local-name() = 'renderer-class'
+ or local-name() = 'render-kit-factory'
+ or local-name() = 'renderer-type'
+ or local-name() = 'small-icon'
+ or local-name() = 'supported-locale'
+ or local-name() = 'to-view-id'
+ or local-name() = 'validator-class'
+ or local-name() = 'validator-id'
+ or local-name() = 'value'
+ or local-name() = 'value-class'
+ or local-name() = 'variable-resolver']"
+ mode="generate-entities-metadata"
+ priority="2" />
+
+ <xsl:template match="*"
+ mode="generate-entities-metadata"
+ priority="1">
+ <!-- Ensure unique entities -->
+ <xsl:variable name="curName" select="name()" />
+ <xsl:variable name="curId" select="generate-id()" />
+ <xsl:if test="not(local-name() = 'renderer-type')
+ and not(local-name() = 'component-family')
+ and not(preceding::*[name() = $curName])">
+ <xsl:value-of
+ disable-output-escaping="yes"
+ select="concat($entity-elem-start, local-name(), $entity-elem-end)" />
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="@*|node()" mode="generate-entities-metadata" priority="-1">
+ <!-- Block matches outside this mode -->
+ </xsl:template>
<xsl:template match="/javaee:faces-config" >
- <xsl:value-of disable-output-escaping="yes" select="$doctype" />
+ <xsl:value-of disable-output-escaping="yes" select="$doctype-start" />
+ <!-- add ELEMENT declarations for any non-javaee namespaces in the metadata blocks -->
+ <xsl:apply-templates select="//*" mode="generate-entities"/>
+ <xsl:value-of disable-output-escaping="yes" select="$doctype-end" />
<xsl:element name="faces-config"
namespace="http://java.sun.com/JSF/Configuration" >
<xsl:apply-templates select="javaee:application" />