package com.googlecode.objectify.impl.ref;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyService;
import com.googlecode.objectify.Ref;
import java.io.ObjectStreamException;
/**
* <p>Implementation of Refs which are "live" and connected to the datastore so they can fetch
* entity values even if they have not already been loaded. This is the standard Ref implementation.</p>
*
* @author Jeff Schnitzer <jeff@infohazard.org>
*/
public class LiveRef<T> extends Ref<T>
{
private static final long serialVersionUID = 1L;
/** So that Refs can be associated with a session */
protected transient Objectify ofy;
/** For GWT serialization */
protected LiveRef() {}
/**
* Create a Ref based on the key
*/
public LiveRef(Key<T> key) {
this(key, ObjectifyService.ofy());
}
/**
* Create a Ref based on the key, with the specified session
*/
public LiveRef(Key<T> key, Objectify ofy) {
super(key);
this.ofy = ofy;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.Ref#get()
*/
@Override
public T get() {
return ofy().load().now(key());
}
/* (non-Javadoc)
* @see com.googlecode.objectify.Ref#isLoaded()
*/
@Override
public boolean isLoaded() {
return ofy().isLoaded(key());
}
/**
* Get the current objectify instance associated with this ref
*/
private Objectify ofy() {
// If we have an expired transaction context, we need a new context
if (ofy == null || (ofy.getTransaction() != null && !ofy.getTransaction().isActive()))
ofy = ObjectifyService.ofy();
return ofy;
}
/**
* When this serializes, write out the DeadRef version. Use the getValue() for value so that
* if the value is not loaded, it serializes as null.
*/
protected Object writeReplace() throws ObjectStreamException {
return new DeadRef<>(key(), getValue());
}
}