/* 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.internal;
import com.db4o.reflect.*;
/**
* @exclude
*/
class ObjectAnalyzer {
private final ObjectContainerBase _container;
private final Object _obj;
private ClassMetadata _classMetadata;
private ObjectReference _ref;
private boolean _notStorable;
ObjectAnalyzer(ObjectContainerBase container, Object obj){
_container = container;
_obj = obj;
}
void analyze(Transaction trans){
_ref = trans.referenceForObject(_obj);
if (_ref != null) {
_classMetadata = _ref.classMetadata();
return;
}
ReflectClass claxx = _container.reflector().forObject(_obj);
if(claxx == null){
notStorable(_obj, claxx);
return;
}
if(!detectClassMetadata(trans, claxx)){
return;
}
if (isValueType(_classMetadata) ) {
notStorable(_obj, _classMetadata.classReflector(), " Value types can only be stored embedded in parent objects.");
}
}
private boolean detectClassMetadata(Transaction trans, ReflectClass claxx) {
_classMetadata = _container.getActiveClassMetadata(claxx);
if (_classMetadata != null) {
if (!_classMetadata.isStorable()) {
notStorable(_obj, claxx);
return false;
}
return true;
}
_classMetadata = _container.produceClassMetadata(claxx);
if ( _classMetadata == null
|| !_classMetadata.isStorable()){
notStorable(_obj, claxx);
return false;
}
// The following may return a reference if the object is held
// in a static variable somewhere ( often: Enums) that gets
// stored or associated on initialization of the ClassMetadata.
_ref = trans.referenceForObject(_obj);
return true;
}
private void notStorable(Object obj, ReflectClass claxx) {
notStorable(obj, claxx, null);
}
private void notStorable(Object obj, ReflectClass claxx, String message) {
_container.notStorable(claxx, obj, message);
_notStorable = true;
}
boolean notStorable(){
return _notStorable;
}
private final boolean isValueType(ClassMetadata classMetadata) {
return classMetadata.isValueType();
}
ObjectReference objectReference() {
return _ref;
}
public ClassMetadata classMetadata() {
return _classMetadata;
}
}