/* This file is part of the db4o object database http://www.db4o.com
Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com
db4o is free software; you can redistribute it and/or modify it under
the terms of version 3 of the GNU General Public License as published
by the Free Software Foundation.
db4o is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/. */
package com.db4o.reflect.jdk;
import com.db4o.internal.*;
import com.db4o.reflect.*;
/**
* db4o wrapper for JDK reflector functionality
* @see com.db4o.ext.ExtObjectContainer#reflector()
* @see com.db4o.reflect.generic.GenericReflector
*
* @sharpen.ignore
*/
public class JdkReflector implements Reflector {
private final JdkLoader _classLoader;
protected Reflector _parent;
private ReflectArray _array;
private ReflectorConfiguration _config;
/**
* Constructor
* @param classLoader class loader
*/
public JdkReflector(ClassLoader classLoader){
this(new ClassLoaderJdkLoader(classLoader));
}
/**
* Constructor
* @param classLoader class loader
*/
public JdkReflector(JdkLoader classLoader){
this(classLoader, defaultConfiguration());
}
private JdkReflector(JdkLoader classLoader, ReflectorConfiguration config){
_classLoader = classLoader;
_config = config;
}
private static ReflectorConfiguration defaultConfiguration() {
return new ReflectorConfiguration() {
public boolean testConstructors() {
return false;
}
public boolean callConstructor(ReflectClass clazz) {
return false;
}
};
}
/**
* ReflectArray factory
* @return ReflectArray instance
*/
public ReflectArray array(){
if(_array == null){
_array = new JdkArray(parent());
}
return _array;
}
/**
* Creates a copy of the object
* @param obj object to copy
* @return object copy
*/
public Object deepClone(Object obj) {
return new JdkReflector(_classLoader, _config);
}
/**
* Returns ReflectClass for the specified class
* @param clazz class
* @return ReflectClass for the specified class
*/
public ReflectClass forClass(Class clazz){
return createClass(clazz);
}
/**
* Returns ReflectClass for the specified class name
* @param className class name
* @return ReflectClass for the specified class name
*/
public ReflectClass forName(String className) {
Class clazz = _classLoader.loadClass(className);
if (clazz == null) {
return null;
}
return createClass(clazz);
}
/**
* creates a Class reflector when passed a class.
* This method is protected to allow overriding in
* cusom reflectors that override JdkReflector.
* @param clazz the class
* @return the class reflector
*/
protected JdkClass createClass(Class clazz) {
if(clazz == null) {
return null;
}
return new JdkClass(parent(), this, clazz);
}
/**
* Returns ReflectClass for the specified class object
* @param a_object class object
* @return ReflectClass for the specified class object
*/
public ReflectClass forObject(Object a_object) {
if(a_object == null){
return null;
}
return parent().forClass(a_object.getClass());
}
/**
* Method stub. Returns false.
*/
public boolean isCollection(ReflectClass candidate) {
return false;
}
/**
* Method stub. Returns false.
*/
public boolean methodCallsSupported(){
return true;
}
/**
* Sets parent reflector
* @param reflector parent reflector
*/
public void setParent(Reflector reflector) {
_parent = reflector;
}
/**
* Creates ReflectClass[] array from the Class[]
* array using the reflector specified
* @param reflector reflector to use
* @param clazz class
* @return ReflectClass[] array
*/
public static ReflectClass[] toMeta(Reflector reflector, Class[] clazz){
ReflectClass[] claxx = null;
if(clazz != null){
claxx = new ReflectClass[clazz.length];
for (int i = 0; i < clazz.length; i++) {
if(clazz[i] != null){
claxx[i] = reflector.forClass(clazz[i]);
}
}
}
return claxx;
}
/**
* Creates Class[] array from the ReflectClass[]
* array
* @param claxx ReflectClass array
* @return Class[] array
*/
static Class[] toNative(ReflectClass[] claxx){
Class[] clazz = null;
if(claxx != null){
clazz = new Class[claxx.length];
for (int i = 0; i < claxx.length; i++) {
clazz[i] = toNative(claxx[i]);
}
}
return clazz;
}
/**
* Translates a ReflectClass into a native Class
* @param claxx ReflectClass to translate
* @return Class
*/
public static Class toNative(ReflectClass claxx){
if(claxx == null){
return null;
}
if(claxx instanceof JavaReflectClass){
return ((JavaReflectClass)claxx).getJavaClass();
}
ReflectClass d = claxx.getDelegate();
if(d == claxx){
return null;
}
return toNative(d);
}
public void configuration(ReflectorConfiguration config) {
_config = config;
}
public ReflectorConfiguration configuration(){
return _config;
}
Object nullValue(ReflectClass clazz) {
return Platform4.nullValue(toNative(clazz));
}
protected Reflector parent() {
if(_parent == null){
return this;
}
return _parent;
}
}