package com.googlecode.objectify.impl;
import com.google.appengine.api.datastore.Entity;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Ref;
/**
* <p>Gives us a slightly more organized interface for manipulating keys. While this is part of Objectify's
* public interface, you probably shouldn't use it. It's subject to change without notice. If you want to
* work with keys, use the Key.create() methods.</p>
*
* @author Jeff Schnitzer <jeff@infohazard.org>
*/
public class Keys
{
private final Registrar registrar;
/** */
public Keys(Registrar registrar) {
this.registrar = registrar;
}
/**
* @return the Key<?> for a registered pojo entity.
*/
public <T> Key<T> keyOf(T pojo) {
return Key.create(rawKeyOf(pojo));
}
/**
* @return the native datastore key for a registered pojo entity.
*/
public com.google.appengine.api.datastore.Key rawKeyOf(Object pojo) {
return getMetadataSafe(pojo).getRawKey(pojo);
}
// /**
// * @return the metadata for the pojo, returning null if type is not registered
// */
// @SuppressWarnings("unchecked")
// private <T> KeyMetadata<T> getMetadata(Class<T> clazz) {
// EntityMetadata<T> em = registrar.getMetadata(clazz);
// return em == null ? null : em.getKeyMetadata();
// }
/**
* @return the metadata for a registered pojo, or throw exception if none
* @throws IllegalStateException if the pojo class has not been registered
*/
public <T> KeyMetadata<T> getMetadataSafe(Class<T> clazz) {
return registrar.getMetadataSafe(clazz).getKeyMetadata();
}
/**
* @return the metadata for a registeerd pojo, or throw exception if none
* @throws IllegalStateException if the pojo class has not been registered
*/
@SuppressWarnings("unchecked")
public <T> KeyMetadata<T> getMetadataSafe(T pojo) {
return (KeyMetadata<T>)getMetadataSafe(pojo.getClass());
}
/**
* @return the metadata for a registered pojo, or null if there is none
*/
@SuppressWarnings("unchecked")
public <T> KeyMetadata<T> getMetadata(Key<T> key) {
EntityMetadata<T> em = registrar.getMetadata(key.getKind());
return em == null ? null : em.getKeyMetadata();
}
/**
* <p>Gets the Key<T> given an object that might be a Key, Key<T>, or entity.</p>
*
* @param keyOrEntity must be a Key, Key<T>, or registered entity.
* @throws NullPointerException if keyOrEntity is null
* @throws IllegalArgumentException if keyOrEntity is not a Key, Key<T>, or registered entity
*/
@SuppressWarnings("unchecked")
public <T> Key<T> anythingToKey(Object keyOrEntity) {
if (keyOrEntity instanceof Key<?>)
return (Key<T>)keyOrEntity;
else if (keyOrEntity instanceof com.google.appengine.api.datastore.Key)
return Key.create((com.google.appengine.api.datastore.Key)keyOrEntity);
else if (keyOrEntity instanceof Ref)
return ((Ref<T>)keyOrEntity).key();
else if (keyOrEntity instanceof Entity)
return Key.create(((Entity)keyOrEntity).getKey());
else
return keyOf((T)keyOrEntity);
}
/**
* <p>Gets the raw datstore Key given an object that might be a Key, Key<T>, or entity.</p>
*
* @param keyOrEntity must be a Key, Key<T>, or registered entity.
* @throws NullPointerException if keyOrEntity is null
* @throws IllegalArgumentException if keyOrEntity is not a Key, Key<T>, or registered entity
*/
public com.google.appengine.api.datastore.Key anythingToRawKey(Object keyOrEntity) {
if (keyOrEntity instanceof com.google.appengine.api.datastore.Key)
return (com.google.appengine.api.datastore.Key)keyOrEntity;
else if (keyOrEntity instanceof Key<?>)
return ((Key<?>)keyOrEntity).getRaw();
else if (keyOrEntity instanceof Ref)
return ((Ref<?>)keyOrEntity).key().getRaw();
else if (keyOrEntity instanceof Entity)
return ((Entity)keyOrEntity).getKey();
else
return rawKeyOf(keyOrEntity);
}
/**
* @return true of the entity has a null id which can be autogenerated on save
*/
public boolean requiresAutogeneratedId(Object entity) {
return getMetadataSafe(entity).requiresAutogeneratedId(entity);
}
}