/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
*/ | |
package org.apache.myfaces.buildtools.maven2.plugin.builder.trinidad.parse.rules; | |
import java.beans.PropertyDescriptor; | |
import javax.xml.namespace.QName; | |
import org.apache.myfaces.buildtools.maven2.plugin.builder.trinidad.parse.converters.QNameConverter; | |
import org.apache.commons.beanutils.BeanUtils; | |
import org.apache.commons.beanutils.PropertyUtils; | |
/** | |
* Extends Apache Commons Digester BeanPropertySetterRule to add QName support. | |
* | |
* A QName conveter is not sufficient because it requires contextual | |
* knowledge of the current prefix-to-namespace mappings. | |
*/ | |
public class BeanPropertySetterRule | |
extends org.apache.commons.digester.BeanPropertySetterRule | |
{ | |
public BeanPropertySetterRule( | |
String propertyName) | |
{ | |
super(propertyName); | |
} | |
public void end( | |
String namespace, | |
String name) throws Exception | |
{ | |
Object top = digester.peek(); | |
PropertyDescriptor descriptor = | |
PropertyUtils.getPropertyDescriptor(top, propertyName); | |
if (descriptor == null) | |
{ | |
throw new NoSuchMethodException("Missing bean property \"" + | |
propertyName + "\""); | |
} | |
Class propertyType = descriptor.getPropertyType(); | |
if (QName.class.equals(propertyType)) | |
{ | |
int colon = bodyText.indexOf(':'); | |
if (colon != -1) | |
{ | |
String namespaceURI = digester.findNamespaceURI(bodyText.substring(0, colon)); | |
bodyText = "{" + namespaceURI + "}" + bodyText.substring(colon + 1); | |
} | |
else if (bodyText.indexOf('{') == -1) | |
{ | |
String namespaceURI = digester.findNamespaceURI(""); | |
bodyText = "{" + namespaceURI + "}" + bodyText.substring(colon + 1); | |
} | |
BeanUtils.setProperty(top, propertyName, bodyText); | |
} | |
else | |
{ | |
super.end(namespace, name); | |
} | |
} | |
static | |
{ | |
QNameConverter.register(); | |
} | |
} |