📄 xmlintrospectorhelper.java
字号:
package org.apache.commons.betwixt.digester;
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed 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.
*/
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.betwixt.AttributeDescriptor;
import org.apache.commons.betwixt.ElementDescriptor;
import org.apache.commons.betwixt.NodeDescriptor;
import org.apache.commons.betwixt.XMLIntrospector;
import org.apache.commons.betwixt.expression.IteratorExpression;
import org.apache.commons.betwixt.expression.MapEntryAdder;
import org.apache.commons.betwixt.expression.MethodExpression;
import org.apache.commons.betwixt.expression.MethodUpdater;
import org.apache.commons.betwixt.strategy.PluralStemmer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* <p><code>XMLIntrospectorHelper</code> a helper class for
* common code shared between the digestor and introspector.</p>
*
* TODO this class will be deprecated soon
* need to move the isLoop and isPrimitiveType but probably need to
* think about whether they need replacing with something different.
* @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
* @author <a href="mailto:martin@mvdb.net">Martin van den Bemt</a>
*/
public class XMLIntrospectorHelper {
/** Log used for logging (Doh!) */
protected static Log log = LogFactory.getLog( XMLIntrospectorHelper.class );
/** Base constructor */
public XMLIntrospectorHelper() {
}
/**
* <p>Gets the current logging implementation.</p>
*
* @return current log
*/
public static Log getLog() {
return log;
}
/**
* <p>Sets the current logging implementation.</p>
*
* @param aLog use this <code>Log</code>
*/
public static void setLog(Log aLog) {
log = aLog;
}
/**
* Process a property.
* Go through and work out whether it's a loop property, a primitive or a standard.
* The class property is ignored.
*
* @param propertyDescriptor create a <code>NodeDescriptor</code> for this property
* @param useAttributesForPrimitives write primitives as attributes (rather than elements)
* @param introspector use this <code>XMLIntrospector</code>
* @return a correctly configured <code>NodeDescriptor</code> for the property
* @throws IntrospectionException when bean introspection fails
* @deprecated 0.5 this method has been replaced by {@link XMLIntrospector#createDescriptor}
*/
public static NodeDescriptor createDescriptor(
PropertyDescriptor propertyDescriptor,
boolean useAttributesForPrimitives,
XMLIntrospector introspector
) throws IntrospectionException {
String name = propertyDescriptor.getName();
Class type = propertyDescriptor.getPropertyType();
if (log.isTraceEnabled()) {
log.trace("Creating descriptor for property: name="
+ name + " type=" + type);
}
NodeDescriptor nodeDescriptor = null;
Method readMethod = propertyDescriptor.getReadMethod();
Method writeMethod = propertyDescriptor.getWriteMethod();
if ( readMethod == null ) {
if (log.isTraceEnabled()) {
log.trace( "No read method for property: name="
+ name + " type=" + type);
}
return null;
}
if ( log.isTraceEnabled() ) {
log.trace( "Read method=" + readMethod.getName() );
}
// choose response from property type
// XXX: ignore class property ??
if ( Class.class.equals( type ) && "class".equals( name ) ) {
log.trace( "Ignoring class property" );
return null;
}
if ( isPrimitiveType( type ) ) {
if (log.isTraceEnabled()) {
log.trace( "Primitive type: " + name);
}
if ( useAttributesForPrimitives ) {
if (log.isTraceEnabled()) {
log.trace( "Adding property as attribute: " + name );
}
nodeDescriptor = new AttributeDescriptor();
} else {
if (log.isTraceEnabled()) {
log.trace( "Adding property as element: " + name );
}
nodeDescriptor = new ElementDescriptor(true);
}
nodeDescriptor.setTextExpression( new MethodExpression( readMethod ) );
if ( writeMethod != null ) {
nodeDescriptor.setUpdater( new MethodUpdater( writeMethod ) );
}
} else if ( isLoopType( type ) ) {
if (log.isTraceEnabled()) {
log.trace("Loop type: " + name);
log.trace("Wrap in collections? " + introspector.isWrapCollectionsInElement());
}
ElementDescriptor loopDescriptor = new ElementDescriptor();
loopDescriptor.setContextExpression(
new IteratorExpression( new MethodExpression( readMethod ) )
);
loopDescriptor.setWrapCollectionsInElement(
introspector.isWrapCollectionsInElement());
// XXX: need to support some kind of 'add' or handle arrays, Lists or indexed properties
//loopDescriptor.setUpdater( new MethodUpdater( writeMethod ) );
if ( Map.class.isAssignableFrom( type ) ) {
loopDescriptor.setQualifiedName( "entry" );
// add elements for reading
loopDescriptor.addElementDescriptor( new ElementDescriptor( "key" ) );
loopDescriptor.addElementDescriptor( new ElementDescriptor( "value" ) );
}
ElementDescriptor elementDescriptor = new ElementDescriptor();
elementDescriptor.setWrapCollectionsInElement(
introspector.isWrapCollectionsInElement());
elementDescriptor.setElementDescriptors( new ElementDescriptor[] { loopDescriptor } );
nodeDescriptor = elementDescriptor;
} else {
if (log.isTraceEnabled()) {
log.trace( "Standard property: " + name);
}
ElementDescriptor elementDescriptor = new ElementDescriptor();
elementDescriptor.setContextExpression( new MethodExpression( readMethod ) );
if ( writeMethod != null ) {
elementDescriptor.setUpdater( new MethodUpdater( writeMethod ) );
}
nodeDescriptor = elementDescriptor;
}
if (nodeDescriptor instanceof AttributeDescriptor) {
// we want to use the attributemapper only when it is an attribute..
nodeDescriptor.setLocalName(
introspector.getAttributeNameMapper().mapTypeToElementName( name ) );
} else {
nodeDescriptor.setLocalName(
introspector.getElementNameMapper().mapTypeToElementName( name ) );
}
nodeDescriptor.setPropertyName( propertyDescriptor.getName() );
nodeDescriptor.setPropertyType( type );
// XXX: associate more bean information with the descriptor?
//nodeDescriptor.setDisplayName( propertyDescriptor.getDisplayName() );
//nodeDescriptor.setShortDescription( propertyDescriptor.getShortDescription() );
if (log.isTraceEnabled()) {
log.trace("Created descriptor:");
log.trace(nodeDescriptor);
}
return nodeDescriptor;
}
/**
* Configure an <code>ElementDescriptor</code> from a <code>PropertyDescriptor</code>.
* This uses default element updater (the write method of the property).
*
* @param elementDescriptor configure this <code>ElementDescriptor</code>
* @param propertyDescriptor configure from this <code>PropertyDescriptor</code>
* @deprecated 0.6 unused
*/
public static void configureProperty(
ElementDescriptor elementDescriptor,
PropertyDescriptor propertyDescriptor ) {
configureProperty( elementDescriptor, propertyDescriptor, null, null);
}
/**
* Configure an <code>ElementDescriptor</code> from a <code>PropertyDescriptor</code>.
* A custom update method may be set.
*
* @param elementDescriptor configure this <code>ElementDescriptor</code>
* @param propertyDescriptor configure from this <code>PropertyDescriptor</code>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -