package org.mongodb.morphia.mapping.lazy.proxy;
import com.thoughtworks.proxy.kit.ObjectReference;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Key;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
@SuppressWarnings({"rawtypes"})
public abstract class AbstractReference implements Serializable, ObjectReference, ProxiedReference {
private static final long serialVersionUID = 1L;
private final Datastore datastore;
protected final boolean ignoreMissing;
protected final Class referenceObjClass;
protected Object object;
private boolean isFetched;
protected AbstractReference(final Datastore datastore, final Class referenceObjClass, final boolean ignoreMissing) {
this.datastore = datastore;
this.referenceObjClass = referenceObjClass;
this.ignoreMissing = ignoreMissing;
}
@Override
public final Class __getReferenceObjClass() {
return referenceObjClass;
}
@Override
public final boolean __isFetched() {
return isFetched;
}
@Override
public Object __unwrap() {
return get();
}
@Override
public final synchronized Object get() {
if (isFetched) {
return object;
}
object = fetch();
isFetched = true;
return object;
}
@Override
public final void set(final Object arg0) {
throw new UnsupportedOperationException();
}
protected void beforeWriteObject() {
}
@SuppressWarnings("unchecked")
protected final Object fetch(final Key<?> id) {
return getDatastore().getByKey(referenceObjClass, id);
}
protected abstract Object fetch();
private void writeObject(final ObjectOutputStream out) throws IOException {
beforeWriteObject();
isFetched = false;
out.defaultWriteObject();
}
public Datastore getDatastore() {
return datastore;
}
}