package org.neodatis.odb.impl.core.server.trigger;

import java.util.HashMap;
import java.util.Map;
import java.util.Observable;

import org.neodatis.odb.ODBRuntimeException;
import org.neodatis.odb.OID;
import org.neodatis.odb.ObjectRepresentation;
import org.neodatis.odb.OdbConfiguration;
import org.neodatis.odb.core.NeoDatisError;
import org.neodatis.odb.core.layers.layer1.introspector.IObjectIntrospector;
import org.neodatis.odb.core.layers.layer2.meta.AbstractObjectInfo;
import org.neodatis.odb.core.layers.layer2.meta.NonNativeObjectInfo;
import org.neodatis.odb.impl.core.layers.layer1.introspector.DefaultInstrumentationCallback;

public class DefaultObjectRepresentation extends Observable implements ObjectRepresentation {
	private final NonNativeObjectInfo nnoi;
	private Map changedValues;

	public DefaultObjectRepresentation(NonNativeObjectInfo nnoi){
		this.nnoi = nnoi;
		this.changedValues = new HashMap();
	}
	//neodatisee
	public Object getValueOf(String attributeName) {
		if(nnoi.isNull()){
			throw new ODBRuntimeException(NeoDatisError.TRIGGER_CALLED_ON_NULL_OBJECT.addParameter(nnoi.getClassInfo().getFullClassName()).addParameter(attributeName));
		}
		AbstractObjectInfo aoi = nnoi.getMetaValueOf(attributeName);
		
		if(aoi==null || aoi.isNull()){
			return null;
		}
		if(aoi.isAtomicNativeObject()){
			return aoi.getObject();
		}
		if(aoi.isNonNativeObject()){
			return new DefaultObjectRepresentation((NonNativeObjectInfo) aoi);
		}
		throw new ODBRuntimeException(NeoDatisError.NOT_YET_IMPLEMENTED.addParameter("getValueOf for " + aoi.getOdbType().getName()));
		
	}

	public void setValueOf(String attributeName, Object value) {
		//fixme : storage engine is null?
		IObjectIntrospector introspector = OdbConfiguration.getCoreProvider().getLocalObjectIntrospector(null);
		AbstractObjectInfo aoi = introspector.getMetaRepresentation(value, null, true, null, new DefaultInstrumentationCallback());
		nnoi.setValueOf(attributeName, aoi);
		changedValues.put(attributeName, value);
		setChanged();
		this.notifyObservers(new ChangedValueNotification(nnoi,nnoi.getOid(),attributeName,value));
	}
	public OID getOid() {
		return this.nnoi.getOid();
	}
	public String getObjectClassName() {
		return nnoi.getClassInfo().getFullClassName();
	}
	public final NonNativeObjectInfo getNnoi() {
		return nnoi;
	}
	public Map getChangedValues(){
		return changedValues;
	}

}

 

Ads help maintain this website.