/* 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.self; import com.db4o.internal.*; import com.db4o.reflect.*; public class SelfClass implements ReflectClass { private static final SelfField[] EMPTY_FIELDS = new SelfField[0]; private boolean _isAbstract; private SelfField[] _fields; private Reflector _parentReflector; private SelfReflectionRegistry _registry; private Class _class; private Class _superClass; // public SelfClass() { // super(); // } public SelfClass(Reflector parentReflector, SelfReflectionRegistry registry, Class clazz) { _parentReflector = parentReflector; _registry = registry; _class = clazz; } // TODO: Is this needed at all? public Class getJavaClass() { return _class; } public Reflector reflector() { return _parentReflector; } public ReflectClass getComponentType() { if (!isArray()) { return null; } return _parentReflector.forClass(_registry.componentType(_class)); } public ReflectField[] getDeclaredFields() { ensureClassInfoLoaded(); return _fields; } private void ensureClassInfoLoaded() { if (_fields == null) { ClassInfo classInfo = _registry.infoFor(_class); if (classInfo == null) { _fields = EMPTY_FIELDS; return; } _superClass = classInfo.superClass(); _isAbstract = classInfo.isAbstract(); FieldInfo[] fieldInfo = classInfo.fieldInfo(); if (fieldInfo == null) { _fields = EMPTY_FIELDS; return; } _fields = new SelfField[fieldInfo.length]; for (int idx = 0; idx < fieldInfo.length; idx++) { _fields[idx] = selfFieldFor(fieldInfo[idx]); } } } public ReflectField getDeclaredField(String name) { ensureClassInfoLoaded(); for (int idx = 0; idx < _fields.length; idx++) { if (_fields[idx].getName().equals(name)) { return _fields[idx]; } } return null; } private SelfField selfFieldFor(FieldInfo fieldInfo) { return new SelfField(fieldInfo.name(), _parentReflector .forClass(fieldInfo.type()), this, _registry); } public ReflectClass getDelegate() { return this; } public ReflectMethod getMethod(String methodName, ReflectClass[] paramClasses) { // TODO !!!! return null; } public String getName() { return _class.getName(); } public ReflectClass getSuperclass() { ensureClassInfoLoaded(); if (_superClass == null) { return null; } return _parentReflector.forClass(_superClass); } public boolean isAbstract() { ensureClassInfoLoaded(); return _isAbstract || isInterface(); } public boolean isArray() { return _class.isArray(); } public boolean isAssignableFrom(ReflectClass type) { if (!(type instanceof SelfClass)) { return false; } return _class.isAssignableFrom(((SelfClass) type).getJavaClass()); } public boolean isCollection() { return _parentReflector.isCollection(this); } public boolean isInstance(Object obj) { return _class.isInstance(obj); } public boolean isInterface() { return _class.isInterface(); } public boolean isPrimitive() { return _registry.isPrimitive(_class); } public Object newInstance() { try { return _class.newInstance(); } catch (Exception e) { e.printStackTrace(); } // Specialized exceptions break conversion to .NET // // // // } catch (InstantiationException e) { // e.printStackTrace(); // } catch (IllegalAccessException e) { // e.printStackTrace(); // } return null; } public Object nullValue() { return null; } public boolean ensureCanBeInstantiated() { return true; } public boolean isSimple() { return isPrimitive() || Platform4.isSimple(_class); } }