package co.codewizards.cloudstore.ls.rest.server;
import static co.codewizards.cloudstore.core.util.AssertUtil.*;
import co.codewizards.cloudstore.ls.core.invoke.ObjectManager;
import co.codewizards.cloudstore.ls.core.invoke.ObjectRef;
import co.codewizards.cloudstore.ls.core.invoke.ObjectRefConverter;
import co.codewizards.cloudstore.ls.core.invoke.RemoteObjectProxy;
class ObjectRefConverterImpl implements ObjectRefConverter {
private final ObjectManager objectManager;
private InverseInvoker inverseInvoker;
public ObjectRefConverterImpl(final ObjectManager objectManager) {
this.objectManager = assertNotNull(objectManager, "objectManager");
}
@Override
public Object convertToObjectRefIfNeeded(Object object) {
if (object instanceof RemoteObjectProxy)
return assertNotNull(((RemoteObjectProxy)object).getObjectRef(), "object.getObjectRef()");
else
return objectManager.getObjectRefOrObject(object);
}
@Override
public Object convertFromObjectRefIfNeeded(Object object) {
if (object instanceof ObjectRef) {
final ObjectRef objectRef = (ObjectRef) object;
if (objectManager.getClientId().equals(objectRef.getClientId()))
return objectManager.getObjectOrFail(objectRef);
else // the reference is a remote object from the client-side => lookup or create proxy
return getInverseInvoker().getRemoteObjectProxyOrCreate(objectRef);
} else
return object;
}
protected InverseInvoker getInverseInvoker() {
if (inverseInvoker == null)
inverseInvoker = InverseInvoker.getInverseInvoker(objectManager);
return inverseInvoker;
}
}