}
}
private TagAttributes convertTagAttributes(Tag tag)
{
TagAttributes tagAttributes = tag.getAttributes();
TagAttribute elementNameTagAttribute = new TagAttributeImpl(
tag.getLocation(), PASS_THROUGH_NAMESPACE , Renderer.PASSTHROUGH_RENDERER_LOCALNAME_KEY,
P_ELEMENTNAME, tag.getLocalName() );
TagAttribute[] sourceTagAttributes = tag.getAttributes().getAll();
TagAttribute[] convertedTagAttributes = new TagAttribute[sourceTagAttributes.length+1];
boolean elementNameTagAttributeSet = false;
for (int i = 0; i < sourceTagAttributes.length; i++)
{
TagAttribute tagAttribute = sourceTagAttributes[i];
String convertedNamespace;
String qname;
String namespace = tagAttribute.getNamespace();
if (JSF_NAMESPACE.equals(namespace) || JSF_ALIAS_NAMESPACE.equals(namespace))
{
// "... If the current attribute's namespace is http://xmlns.jcp.org/jsf, convertedTagAttribute's
// qualified name must be the current attribute's local name and convertedTagAttribute's
// namespace must be the empty string. This will have the effect of setting the current
// attribute as a proper property on the UIComponent instance represented by this markup.
convertedNamespace = "";
qname = tagAttribute.getLocalName();
convertedTagAttributes[i] = new TagAttributeImpl(tagAttribute.getLocation(),
convertedNamespace, tagAttribute.getLocalName(), qname, tagAttribute.getValue());
if (Renderer.PASSTHROUGH_RENDERER_LOCALNAME_KEY.equals(tagAttribute.getLocalName()))
{
elementNameTagAttributeSet = true;
}
}
else if (namespace == null)
{
// should not happen, but let it because org.xml.sax.Attributes considers it
convertedTagAttributes[i] = tagAttribute;
}
else if (tagAttribute.getNamespace().length() == 0)
{
// "... If the current attribute's namespace is empty
// let the current attribute be convertedTagAttribute. ..."
convertedTagAttributes[i] = tagAttribute;
}
else if (!tag.getNamespace().equals(tagAttribute.getNamespace()))
{
// "... or different from the argument tag's namespace,
// let the current attribute be convertedTagAttribute. ..."
convertedTagAttributes[i] = tagAttribute;
}
else
{
// "... Otherwise, assume the current attribute's namespace is http://xmlns.jcp.org/jsf/passthrough.
// ConvertedTagAttribute's qualified name is the current attribute's local name prefixed by
// p:". convertedTagAttribute's namespace must be http://xmlns.jcp.org/jsf/passthrough.
convertedNamespace = PASS_THROUGH_NAMESPACE;
qname = "p:"+tagAttribute.getLocalName();
convertedTagAttributes[i] = new TagAttributeImpl(tagAttribute.getLocation(),
convertedNamespace, tagAttribute.getLocalName(), qname, tagAttribute.getValue());
}
}
if (elementNameTagAttributeSet)
{
// This is unlikely, but theorically possible.
return new TagAttributesImpl(Arrays.copyOf(convertedTagAttributes, sourceTagAttributes.length));
}
else
{
convertedTagAttributes[tagAttributes.getAll().length] = elementNameTagAttribute;
return new TagAttributesImpl(convertedTagAttributes);
}
}