blob: b67e7ee63b49a7038d58227c203fd583ee2a2e85 [file] [log] [blame]
/**
*
* Copyright 2005-2006 The Apache Software Foundation or its licensors, as applicable.
*
* 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.
*
**/
package org.apache.xbean.spring.context.impl;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Properties;
import java.util.StringTokenizer;
/**
* A helper class which understands how to map an XML namespaced element to
* Spring bean configurations
*
* @author James Strachan
* @version $Id$
* @since 2.0
*/
public class MappingMetaData {
private Properties properties;
private String packageName;
/**
* Creates an empty MappingMetaData for the specified Java package.
* @param packageName the Java package to map
*/
public MappingMetaData(String packageName) {
this.packageName = packageName;
this.properties = new Properties();
}
/**
* Creates MappingMetaData using the specified properties which contan the package name.
* @param properties
*/
public MappingMetaData(Properties properties) {
this.properties = properties;
this.packageName = properties.getProperty("package", "");
}
/**
* Returns the Java class name for the given XML element name
*/
public String getClassName(String localName) {
String className = properties.getProperty(localName);
if (className == null) {
if (packageName.length() > 0) {
className = packageName + "." + localName;
}
else {
className = localName;
}
}
return className;
}
/**
* Returns the property name for the given element and attribute name
*
* @param elementName the XML local name of the element
* @param attributeName the XML local name of the attribute
* @return the property name to use or null if the attribute is not a valid property
*/
public String getPropertyName(String elementName, String attributeName) {
return properties.getProperty(elementName + ".alias." + attributeName, attributeName);
}
/**
* Returns a valid property name if the childElementName maps to a nested list property
*
* @param elementName the owner element
* @param childElementName is the child element name which maps to the nested list property
* @return the property name if available or null if it is not applicable
*/
public String getNestedListProperty(String elementName, String childElementName) {
return properties.getProperty(elementName + ".list." + childElementName);
}
/**
* Returns a valid property name if the childElementName maps to a nested bean property
*
* @param elementName the owner element
* @param childElementName is the child element name which maps to the nested bean property
* @return the property name if available or null if it is not applicable
*/
public String getNestedProperty(String elementName, String childElementName) {
return properties.getProperty(elementName + ".alias." + childElementName);
}
public boolean isDefaultConstructor(Constructor constructor) {
String property = properties.getProperty(constructorToPropertyName(constructor) + ".default");
if (property != null) {
return Boolean.valueOf(property).booleanValue();
}
return false;
}
public boolean isDefaultFactoryMethod(Class beanClass, Method factoryMethod) {
String property = properties.getProperty(methodToPropertyName(beanClass, factoryMethod) + ".default");
if (property != null) {
return Boolean.valueOf(property).booleanValue();
}
return false;
}
public String[] getParameterNames(Constructor constructor) {
String property = properties.getProperty(constructorToPropertyName(constructor) + ".parameterNames");
if (property != null) {
ArrayList names = Collections.list(new StringTokenizer(property, ", "));
return (String[]) names.toArray(new String[0]);
}
return null;
}
public String[] getParameterNames(Class beanClass, Method factoryMethod) {
String property = properties.getProperty(methodToPropertyName(beanClass, factoryMethod) + ".parameterNames");
if (property != null) {
ArrayList names = Collections.list(new StringTokenizer(property, ", "));
return (String[]) names.toArray(new String[0]);
}
return null;
}
public static String constructorToPropertyName(Constructor constructor) {
StringBuffer buf = new StringBuffer();
buf.append(constructor.getName()).append("(");
Class[] parameterTypes = constructor.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
Class parameterType = parameterTypes[i];
buf.append(parameterType.getName());
if (i < parameterTypes.length - 1) {
buf.append(",");
}
}
buf.append(")");
return buf.toString();
}
public static String methodToPropertyName(Class beanClass, Method method) {
StringBuffer buf = new StringBuffer();
buf.append(beanClass.getName()).append(".");
buf.append(method.getName()).append("(");
Class[] parameterTypes = method.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
Class parameterType = parameterTypes[i];
buf.append(parameterType.getName());
if (i < parameterTypes.length - 1) {
buf.append(",");
}
}
buf.append(")");
return buf.toString();
}
public String getInitMethodName(String elementName) {
return properties.getProperty(elementName + ".initMethod");
}
public String getDestroyMethodName(String elementName) {
return properties.getProperty(elementName + ".destroyMethod");
}
public String getFactoryMethodName(String elementName) {
return properties.getProperty(elementName + ".factoryMethod");
}
public String getContentProperty(String elementName) {
return properties.getProperty(elementName + ".contentProperty");
}
public String getMapEntryName(String elementName, String property) {
return properties.getProperty(elementName + "." + property + ".map.entryName");
}
public String getMapKeyName(String elementName, String property) {
return properties.getProperty(elementName + "." + property + ".map.keyName");
}
public String getFlatCollectionProperty(String elementName, String property)
{
return properties.getProperty(elementName + "." + property + ".flatCollection");
}
public boolean isFlatProperty(String elementName, String property) {
return properties.getProperty(elementName + "." + property + ".flat") != null;
}
}