You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2014/01/28 23:21:26 UTC

[16/96] [abbrv] [partial] Change package namespace to org.apache.usergrid

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/2c2acbe4/stack/core/src/main/java/org/usergrid/persistence/Schema.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/usergrid/persistence/Schema.java b/stack/core/src/main/java/org/usergrid/persistence/Schema.java
deleted file mode 100644
index 587a65f..0000000
--- a/stack/core/src/main/java/org/usergrid/persistence/Schema.java
+++ /dev/null
@@ -1,1788 +0,0 @@
-/*******************************************************************************
- * Copyright 2012 Apigee Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.usergrid.persistence;
-
-
-import java.beans.PropertyDescriptor;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.nio.ByteBuffer;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
-import javax.crypto.Cipher;
-import javax.crypto.KeyGenerator;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
-
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.codehaus.jackson.node.ObjectNode;
-import org.codehaus.jackson.smile.SmileFactory;
-import org.codehaus.jackson.type.TypeReference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
-import org.springframework.core.type.filter.AssignableTypeFilter;
-import org.usergrid.persistence.annotations.EntityCollection;
-import org.usergrid.persistence.annotations.EntityDictionary;
-import org.usergrid.persistence.annotations.EntityProperty;
-import org.usergrid.persistence.cassandra.CassandraPersistenceUtils;
-import org.usergrid.persistence.entities.Application;
-import org.usergrid.persistence.exceptions.PropertyTypeConversionException;
-import org.usergrid.persistence.schema.CollectionInfo;
-import org.usergrid.persistence.schema.DictionaryInfo;
-import org.usergrid.persistence.schema.EntityInfo;
-import org.usergrid.persistence.schema.PropertyInfo;
-import org.usergrid.utils.InflectionUtils;
-import org.usergrid.utils.JsonUtils;
-import org.usergrid.utils.MapUtils;
-
-import org.apache.commons.beanutils.PropertyUtils;
-import org.apache.commons.lang.reflect.FieldUtils;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-
-import me.prettyprint.hector.api.beans.ColumnSlice;
-import me.prettyprint.hector.api.beans.HColumn;
-import me.prettyprint.hector.api.beans.Row;
-
-import static org.apache.commons.lang.StringUtils.isNotBlank;
-import static org.usergrid.utils.ConversionUtils.bytebuffer;
-import static org.usergrid.utils.ConversionUtils.string;
-import static org.usergrid.utils.ConversionUtils.uuid;
-import static org.usergrid.utils.InflectionUtils.pluralize;
-import static org.usergrid.utils.InflectionUtils.singularize;
-import static org.usergrid.utils.JsonUtils.toJsonNode;
-import static org.usergrid.utils.MapUtils.hashMap;
-import static org.usergrid.utils.StringUtils.stringOrSubstringAfterLast;
-
-
-/**
- * The controller class for determining Entity relationships as well as properties types. This class loads the entity
- * schema definition from a YAML file called usergrid-schema.yaml at the root of the classpath.
- *
- * @author edanuff
- */
-public class Schema {
-
-    private static final Logger logger = LoggerFactory.getLogger( Schema.class );
-
-    public static final String DEFAULT_ENTITIES_PACKAGE = "org.usergrid.persistence.entities";
-
-    public static final String TYPE_APPLICATION = "application";
-    public static final String TYPE_ENTITY = "entity";
-    public static final String TYPE_ROLE = "role";
-    public static final String TYPE_CONNECTION = "connection";
-    public static final String TYPE_MEMBER = "member";
-
-    public static final String PROPERTY_ACTIVATED = "activated";
-    public static final String PROPERTY_COLLECTION_NAME = "collectionName";
-    public static final String PROPERTY_CREATED = "created";
-    public static final String PROPERTY_CONFIRMED = "confirmed";
-    public static final String PROPERTY_DISABLED = "disabled";
-    public static final String PROPERTY_UUID = "uuid";
-    public static final String PROPERTY_EMAIL = "email";
-    public static final String PROPERTY_ITEM = "item";
-    public static final String PROPERTY_ITEM_TYPE = "itemType";
-    public static final String PROPERTY_MEMBERSHIP = "membership";
-    public static final String PROPERTY_METADATA = "metadata";
-    public static final String PROPERTY_MODIFIED = "modified";
-    public static final String PROPERTY_NAME = "name";
-    public static final String PROPERTY_OWNER = "owner";
-    public static final String PROPERTY_OWNER_TYPE = "ownerType";
-    public static final String PROPERTY_PATH = "path";
-    public static final String PROPERTY_PICTURE = "picture";
-    public static final String PROPERTY_PUBLISHED = "published";
-    public static final String PROPERTY_SECRET = "secret";
-    public static final String PROPERTY_TIMESTAMP = "timestamp";
-    public static final String PROPERTY_TITLE = "title";
-    public static final String PROPERTY_TYPE = "type";
-    public static final String PROPERTY_URI = "uri";
-    public static final String PROPERTY_USERNAME = "username";
-    public static final String PROPERTY_INACTIVITY = "inactivity";
-
-    public static final String PROPERTY_CONNECTION = "connection";
-    public static final String PROPERTY_ASSOCIATED = "associated";
-    public static final String PROPERTY_CURSOR = "cursor";
-
-    public static final String COLLECTION_ROLES = "roles";
-    public static final String COLLECTION_USERS = "users";
-    public static final String COLLECTION_GROUPS = "groups";
-
-    public static final String INDEX_COLLECTIONS = "collections";
-    public static final String INDEX_CONNECTIONS = "connections";
-
-    public static final String DICTIONARY_PROPERTIES = "properties";
-    public static final String DICTIONARY_SETS = "sets";
-    public static final String DICTIONARY_COLLECTIONS = "collections";
-    public static final String DICTIONARY_CONNECTIONS = "connections";
-    public static final String DICTIONARY_INDEXES = "indexes";
-    public static final String DICTIONARY_CONNECTING_TYPES = "connecting_types";
-    public static final String DICTIONARY_CONNECTING_ENTITIES = "connecting_entities";
-    public static final String DICTIONARY_CONNECTED_TYPES = "connected_types";
-    public static final String DICTIONARY_CONNECTED_ENTITIES = "connected_entities";
-    public static final String DICTIONARY_CONTAINER_ENTITIES = "container_entities";
-    public static final String DICTIONARY_CREDENTIALS = "credentials";
-    public static final String DICTIONARY_ROLENAMES = "rolenames";
-    public static final String DICTIONARY_ROLETIMES = "roletimes";
-    public static final String DICTIONARY_PERMISSIONS = "permissions";
-    public static final String DICTIONARY_ID_SETS = "id_sets";
-    public static final String DICTIONARY_COUNTERS = "counters";
-    public static final String DICTIONARY_GEOCELL = "geocell";
-
-    private static List<String> entitiesPackage = new ArrayList<String>();
-    private static List<String> entitiesScanPath = new ArrayList<String>();
-
-    @SuppressWarnings("rawtypes")
-    public static Map<String, Class> DEFAULT_DICTIONARIES =
-            hashMap( DICTIONARY_PROPERTIES, ( Class ) String.class ).map( DICTIONARY_SETS, String.class )
-                    .map( DICTIONARY_INDEXES, String.class ).map( DICTIONARY_COLLECTIONS, String.class )
-                    .map( DICTIONARY_CONNECTIONS, String.class ).map( DICTIONARY_CONNECTING_TYPES, String.class )
-                    .map( DICTIONARY_CONNECTING_ENTITIES, String.class ).map( DICTIONARY_CONNECTED_TYPES, String.class )
-                    .map( DICTIONARY_CONNECTED_ENTITIES, String.class )
-                    .map( DICTIONARY_CONTAINER_ENTITIES, String.class )
-                    .map( DICTIONARY_CREDENTIALS, CredentialsInfo.class ).map( DICTIONARY_ROLENAMES, String.class )
-                    .map( DICTIONARY_ROLETIMES, Long.class ).map( DICTIONARY_PERMISSIONS, String.class )
-                    .map( DICTIONARY_ID_SETS, String.class );
-
-    private static LoadingCache<String, String> baseEntityTypes =
-            CacheBuilder.newBuilder().expireAfterAccess( 10, TimeUnit.MINUTES )
-                        .build( new CacheLoader<String, String>() {
-                            public String load( String key ) { // no checked exception
-                                return createNormalizedEntityType( key, true );
-                            }
-                        } );
-
-    private static LoadingCache<String, String> nonbaseEntityTypes =
-            CacheBuilder.newBuilder().expireAfterAccess( 10, TimeUnit.MINUTES )
-                        .build( new CacheLoader<String, String>() {
-                            public String load( String key ) { // no checked exception
-                                return createNormalizedEntityType( key, false );
-                            }
-                        } );
-
-    private static LoadingCache<String, String> collectionNameCache =
-            CacheBuilder.newBuilder().maximumSize( 1000 ).build( new CacheLoader<String, String>() {
-                public String load( String key ) { // no checked exception
-                    return _defaultCollectionName( key );
-                }
-            } );
-
-    private final ObjectMapper mapper = new ObjectMapper();
-
-    @SuppressWarnings("unused")
-    private final SmileFactory smile = new SmileFactory();
-
-    private final Map<String, Class<? extends Entity>> typeToEntityClass =
-            new ConcurrentHashMap<String, Class<? extends Entity>>();
-
-    private final Map<Class<? extends Entity>, String> entityClassToType =
-            new ConcurrentHashMap<Class<? extends Entity>, String>();
-
-    private final Map<Class<? extends Entity>, Map<String, PropertyDescriptor>> entityClassPropertyToDescriptor =
-            new ConcurrentHashMap<Class<? extends Entity>, Map<String, PropertyDescriptor>>();
-
-    private final Map<Class<? extends Entity>, EntityInfo> registeredEntityClasses =
-            new ConcurrentHashMap<Class<? extends Entity>, EntityInfo>();
-
-    Map<String, EntityInfo> entityMap = new TreeMap<String, EntityInfo>( String.CASE_INSENSITIVE_ORDER );
-    ;
-
-    Map<String, Map<String, Set<CollectionInfo>>> entityContainerCollections =
-            new TreeMap<String, Map<String, Set<CollectionInfo>>>( String.CASE_INSENSITIVE_ORDER );
-
-    Map<String, Map<String, Set<CollectionInfo>>> entityContainerCollectionsIndexingProperties =
-            new TreeMap<String, Map<String, Set<CollectionInfo>>>( String.CASE_INSENSITIVE_ORDER );
-    Map<String, Map<String, Set<CollectionInfo>>> entityContainerCollectionsIndexingDictionaries =
-            new TreeMap<String, Map<String, Set<CollectionInfo>>>( String.CASE_INSENSITIVE_ORDER );
-    Map<String, Map<String, Set<CollectionInfo>>> entityContainerCollectionsIndexingDynamicDictionaries =
-            new TreeMap<String, Map<String, Set<CollectionInfo>>>( String.CASE_INSENSITIVE_ORDER );
-
-    Map<String, Map<String, Map<String, Set<CollectionInfo>>>> entityPropertyContainerCollectionsIndexingProperty =
-            new TreeMap<String, Map<String, Map<String, Set<CollectionInfo>>>>( String.CASE_INSENSITIVE_ORDER );
-
-    Map<String, Map<String, Map<String, Set<CollectionInfo>>>> entityDictionaryContainerCollectionsIndexingDictionary =
-            new TreeMap<String, Map<String, Map<String, Set<CollectionInfo>>>>( String.CASE_INSENSITIVE_ORDER );
-
-    Map<String, PropertyInfo> allIndexedProperties = new TreeMap<String, PropertyInfo>( String.CASE_INSENSITIVE_ORDER );
-
-    Map<String, PropertyInfo> allProperties = new TreeMap<String, PropertyInfo>( String.CASE_INSENSITIVE_ORDER );
-
-    private static Schema instance;
-
-    boolean initialized = false;
-
-
-    public Schema() {
-        setDefaultSchema( this );
-
-        mapper.configure( SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false );
-    }
-
-
-    public static final Object initLock = new Object();
-
-
-    public static void setDefaultSchema( Schema instance ) {
-        synchronized ( initLock ) {
-            if ( Schema.instance == null ) {
-                Schema.instance = instance;
-            }
-        }
-    }
-
-
-    public static Schema getDefaultSchema() {
-        if ( instance == null ) {
-            synchronized ( initLock ) {
-                if ( instance == null ) {
-                    logger.info( "Initializing schema..." );
-                    instance = new Schema();
-                    instance.init();
-                    logger.info( "Schema initialized" );
-                }
-            }
-        }
-        return instance;
-    }
-
-
-    public void mapCollector( String entityType, String containerType, String collectionName,
-                              CollectionInfo collection ) {
-
-        MapUtils.addMapMapSet( entityContainerCollections, true, entityType, containerType, collection );
-
-        if ( !collection.getPropertiesIndexed().isEmpty() ) {
-            MapUtils.addMapMapSet( entityContainerCollectionsIndexingProperties, true, entityType, containerType,
-                    collection );
-            for ( String propertyName : collection.getPropertiesIndexed() ) {
-                MapUtils.addMapMapMapSet( entityPropertyContainerCollectionsIndexingProperty, true, entityType,
-                        propertyName, containerType, collection );
-            }
-        }
-
-        if ( !collection.getDictionariesIndexed().isEmpty() ) {
-            MapUtils.addMapMapSet( entityContainerCollectionsIndexingDictionaries, true, entityType, containerType,
-                    collection );
-            for ( String dictionaryName : collection.getDictionariesIndexed() ) {
-                MapUtils.addMapMapMapSet( entityDictionaryContainerCollectionsIndexingDictionary, true, entityType,
-                        dictionaryName, containerType, collection );
-            }
-        }
-
-        if ( collection.isIndexingDynamicDictionaries() ) {
-            MapUtils.addMapMapSet( entityContainerCollectionsIndexingDynamicDictionaries, true, entityType,
-                    containerType, collection );
-        }
-    }
-
-
-    private <T extends Annotation> T getAnnotation( Class<? extends Entity> entityClass, PropertyDescriptor descriptor,
-                                                    Class<T> annotationClass ) {
-        try {
-            if ( ( descriptor.getReadMethod() != null ) && descriptor.getReadMethod()
-                                                                     .isAnnotationPresent( annotationClass ) ) {
-                return descriptor.getReadMethod().getAnnotation( annotationClass );
-            }
-            if ( ( descriptor.getWriteMethod() != null ) && descriptor.getWriteMethod()
-                                                                      .isAnnotationPresent( annotationClass ) ) {
-                return descriptor.getWriteMethod().getAnnotation( annotationClass );
-            }
-            Field field = FieldUtils.getField( entityClass, descriptor.getName(), true );
-            if ( field != null ) {
-                if ( field.isAnnotationPresent( annotationClass ) ) {
-                    return field.getAnnotation( annotationClass );
-                }
-            }
-        }
-        catch ( Exception e ) {
-            logger.error( "Could not retrieve the annotations", e );
-        }
-        return null;
-    }
-
-
-    public synchronized void registerEntity( Class<? extends Entity> entityClass ) {
-        logger.info( "Registering {}", entityClass );
-        EntityInfo e = registeredEntityClasses.get( entityClass );
-        if ( e != null ) {
-            return;
-        }
-
-        Map<String, PropertyDescriptor> propertyDescriptors = entityClassPropertyToDescriptor.get( entityClass );
-        if ( propertyDescriptors == null ) {
-            EntityInfo entity = new EntityInfo();
-
-            String type = getEntityType( entityClass );
-
-            propertyDescriptors = new LinkedHashMap<String, PropertyDescriptor>();
-            Map<String, PropertyInfo> properties = new TreeMap<String, PropertyInfo>( String.CASE_INSENSITIVE_ORDER );
-            Map<String, CollectionInfo> collections =
-                    new TreeMap<String, CollectionInfo>( String.CASE_INSENSITIVE_ORDER );
-            Map<String, DictionaryInfo> sets = new TreeMap<String, DictionaryInfo>( String.CASE_INSENSITIVE_ORDER );
-
-            PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors( entityClass );
-
-            for ( PropertyDescriptor descriptor : descriptors ) {
-                String name = descriptor.getName();
-
-                EntityProperty propertyAnnotation = getAnnotation( entityClass, descriptor, EntityProperty.class );
-                if ( propertyAnnotation != null ) {
-                    if ( isNotBlank( propertyAnnotation.name() ) ) {
-                        name = propertyAnnotation.name();
-                    }
-                    propertyDescriptors.put( name, descriptor );
-
-                    PropertyInfo propertyInfo = new PropertyInfo( propertyAnnotation );
-                    propertyInfo.setName( name );
-                    propertyInfo.setType( descriptor.getPropertyType() );
-
-                    properties.put( name, propertyInfo );
-                    // logger.info(propertyInfo);
-                }
-
-                EntityCollection collectionAnnotation =
-                        getAnnotation( entityClass, descriptor, EntityCollection.class );
-                if ( collectionAnnotation != null ) {
-                    CollectionInfo collectionInfo = new CollectionInfo( collectionAnnotation );
-                    collectionInfo.setName( name );
-                    collectionInfo.setContainer( entity );
-
-                    collections.put( name, collectionInfo );
-                    // logger.info(collectionInfo);
-                }
-
-                EntityDictionary setAnnotation = getAnnotation( entityClass, descriptor, EntityDictionary.class );
-                if ( setAnnotation != null ) {
-                    DictionaryInfo setInfo = new DictionaryInfo( setAnnotation );
-                    setInfo.setName( name );
-                    // setInfo.setType(descriptor.getPropertyType());
-                    sets.put( name, setInfo );
-                    // logger.info(setInfo);
-                }
-            }
-
-            if ( !DynamicEntity.class.isAssignableFrom( entityClass ) ) {
-                entity.setProperties( properties );
-                entity.setCollections( collections );
-                entity.setDictionaries( sets );
-                entity.mapCollectors( this, type );
-
-                entityMap.put( type, entity );
-
-                allProperties.putAll( entity.getProperties() );
-
-                Set<String> propertyNames = entity.getIndexedProperties();
-                for ( String propertyName : propertyNames ) {
-                    PropertyInfo property = entity.getProperty( propertyName );
-                    if ( ( property != null ) && !allIndexedProperties.containsKey( propertyName ) ) {
-                        allIndexedProperties.put( propertyName, property );
-                    }
-                }
-            }
-
-            entityClassPropertyToDescriptor.put( entityClass, propertyDescriptors );
-
-            registeredEntityClasses.put( entityClass, entity );
-        }
-    }
-
-
-    public synchronized void init() {
-        if ( !initialized ) {
-            initialized = true;
-            addEntitiesPackage( DEFAULT_ENTITIES_PACKAGE );
-            scanEntities();
-        }
-    }
-
-
-    @SuppressWarnings("unchecked")
-    public void scanEntities() {
-        synchronized ( entitiesScanPath ) {
-            for ( String path : entitiesScanPath ) {
-                ClassPathScanningCandidateComponentProvider provider =
-                        new ClassPathScanningCandidateComponentProvider( true );
-                provider.addIncludeFilter( new AssignableTypeFilter( TypedEntity.class ) );
-
-                Set<BeanDefinition> components = provider.findCandidateComponents( path );
-                for ( BeanDefinition component : components ) {
-                    try {
-                        Class<?> cls = Class.forName( component.getBeanClassName() );
-                        if ( Entity.class.isAssignableFrom( cls ) ) {
-                            registerEntity( ( Class<? extends Entity> ) cls );
-                        }
-                    }
-                    catch ( ClassNotFoundException e ) {
-                        logger.error( "Unable to get entity class ", e );
-                    }
-                }
-                registerEntity( DynamicEntity.class );
-            }
-        }
-    }
-
-
-    public void addEntitiesPackage( String entityPackage ) {
-        if ( !entitiesPackage.contains( entityPackage ) ) {
-            entitiesPackage.add( entityPackage );
-            String path = entityPackage.replaceAll( "\\.", "/" );
-            synchronized ( entitiesScanPath ) {
-                entitiesScanPath.add( path );
-            }
-        }
-    }
-
-
-    public void removeEntitiesPackage( String entityPackage ) {
-        entitiesPackage.remove( entityPackage );
-        String path = entityPackage.replaceAll( "\\.", "/" );
-        synchronized ( entitiesScanPath ) {
-            entitiesScanPath.remove( path );
-        }
-    }
-
-
-    @SuppressWarnings("unchecked")
-    public List<String> getEntitiesPackage() {
-        return ( List<String> ) ( ( ArrayList<String> ) entitiesPackage ).clone();
-    }
-
-
-    /** @return value */
-    public Map<String, PropertyInfo> getAllIndexedProperties() {
-
-        return allIndexedProperties;
-    }
-
-
-    public Set<String> getAllIndexedPropertyNames() {
-
-        return allIndexedProperties.keySet();
-    }
-
-
-    public Set<String> getAllPropertyNames() {
-
-        return allProperties.keySet();
-    }
-
-
-    public String[] getAllPropertyNamesAsArray() {
-
-        return allProperties.keySet().toArray( new String[0] );
-    }
-
-
-    /** @return value */
-    public EntityInfo getEntityInfo( String entityType ) {
-
-        if ( entityType == null ) {
-            return null;
-        }
-
-        entityType = normalizeEntityType( entityType );
-
-        if ( "dynamicentity".equalsIgnoreCase( entityType ) ) {
-            throw new IllegalArgumentException( entityType + " is not a valid entity type" );
-        }
-
-        EntityInfo entity = entityMap.get( entityType );
-        if ( entity == null ) {
-            return getDynamicEntityInfo( entityType );
-        }
-        return entity;
-    }
-
-
-    public JsonNode getEntityJsonSchema( String entityType ) {
-        Class<?> cls = getEntityClass( entityType );
-        if ( cls == null ) {
-            cls = DynamicEntity.class;
-        }
-        try {
-            JsonNode schemaNode = mapper.generateJsonSchema( cls ).getSchemaNode();
-            if ( schemaNode != null ) {
-                JsonNode properties = schemaNode.get( "properties" );
-                if ( properties instanceof ObjectNode ) {
-                    Set<String> fieldsToRemove = new LinkedHashSet<String>();
-                    Iterator<String> i = properties.getFieldNames();
-                    while ( i.hasNext() ) {
-                        String propertyName = i.next();
-                        if ( !hasProperty( entityType, propertyName ) ) {
-                            fieldsToRemove.add( propertyName );
-                        }
-                        else {
-                            ObjectNode property = ( ObjectNode ) properties.get( propertyName );
-                            if ( isRequiredProperty( entityType, propertyName ) ) {
-                                property.put( "optional", false );
-                            }
-                        }
-                    }
-                    ( ( ObjectNode ) properties ).remove( fieldsToRemove );
-                }
-            }
-            return schemaNode;
-        }
-        catch ( Exception e ) {
-            logger.error( "Unable to get schema for entity type " + entityType, e );
-        }
-        return null;
-    }
-
-
-    public String getEntityType( Class<? extends Entity> cls ) {
-        String type = entityClassToType.get( cls );
-        if ( type != null ) {
-            return type;
-        }
-
-        String className = cls.getName();
-        boolean finded = false;
-        for ( String entityPackage : entitiesPackage ) {
-            String entityPackagePrefix = entityPackage + ".";
-            if ( className.startsWith( entityPackagePrefix ) ) {
-                type = className.substring( entityPackagePrefix.length() );
-                type = InflectionUtils.underscore( type );
-                finded = true;
-            }
-        }
-
-        if ( !finded ) {
-            type = className;
-        }
-
-        typeToEntityClass.put( type, cls );
-        entityClassToType.put( cls, type );
-        return type;
-    }
-
-
-    @SuppressWarnings("unchecked")
-    private Class<? extends Entity> entityClassForName( String className ) {
-        try {
-            @SuppressWarnings("rawtypes") Class cls = Class.forName( className );
-            if ( Entity.class.isAssignableFrom( cls ) ) {
-                return cls;
-            }
-        }
-        catch ( ClassNotFoundException e ) {
-        }
-        return null;
-    }
-
-
-    public Class<? extends Entity> getEntityClass( String type ) {
-        type = getAssociatedEntityType( type );
-        Class<? extends Entity> cls = typeToEntityClass.get( type );
-        if ( cls != null ) {
-            return cls;
-        }
-
-        for ( String entityPackage : entitiesPackage ) {
-            String entityPackagePrefix = entityPackage + ".";
-            cls = entityClassForName( entityPackagePrefix + InflectionUtils.camelCase( type, true ) );
-            if ( cls == null ) {
-                cls = entityClassForName( entityPackagePrefix + type );
-            }
-
-            if ( cls == null ) {
-                cls = entityClassForName( type );
-            }
-
-            if ( cls != null ) {
-                break;
-            }
-        }
-
-        if ( cls == null ) {
-            cls = DynamicEntity.class;
-        }
-
-        typeToEntityClass.put( type, cls );
-        entityClassToType.put( cls, type );
-        return cls;
-    }
-
-
-    /** @return value */
-    public boolean hasProperties( String entityType ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        return entity.hasProperties();
-    }
-
-
-    /** @return value */
-    public Set<String> getPropertyNames( String entityType ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return null;
-        }
-
-        return entity.getProperties().keySet();
-    }
-
-
-    /** @return value */
-    public String[] getPropertyNamesAsArray( String entityType ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return new String[0];
-        }
-
-        return entity.getProperties().keySet().toArray( new String[0] );
-    }
-
-
-    /** @return value */
-    public boolean hasProperty( String entityType, String propertyName ) {
-
-        if ( propertyName.equals( PROPERTY_UUID ) || propertyName.equals( PROPERTY_TYPE ) ) {
-            return true;
-        }
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        return entity.hasProperty( propertyName );
-    }
-
-
-    public String aliasProperty( String entityType ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return null;
-        }
-
-        return entity.getAliasProperty();
-    }
-
-
-    /** @return value */
-    public boolean isPropertyMutable( String entityType, String propertyName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        return entity.isPropertyMutable( propertyName );
-    }
-
-
-    public boolean isPropertyUnique( String entityType, String propertyName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        return entity.isPropertyUnique( propertyName );
-    }
-
-
-    public boolean isPropertyIndexed( String entityType, String propertyName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return true;
-        }
-
-        if ( entity.hasProperty( propertyName ) ) {
-            return entity.isPropertyIndexed( propertyName );
-        }
-
-        return true;
-    }
-
-
-    public boolean isPropertyFulltextIndexed( String entityType, String propertyName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return true;
-        }
-
-        if ( entity.hasProperty( propertyName ) ) {
-            return entity.isPropertyFulltextIndexed( propertyName );
-        }
-
-        return true;
-    }
-
-
-    public boolean isPropertyTimestamp( String entityType, String propertyName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        return entity.isPropertyTimestamp( propertyName );
-    }
-
-
-    /** @return value */
-    public Set<String> getRequiredProperties( String entityType ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return null;
-        }
-
-        return entity.getRequiredProperties();
-    }
-
-
-    /** @return value */
-    public boolean isRequiredProperty( String entityType, String propertyName ) {
-
-        if ( propertyName.equals( PROPERTY_UUID ) || propertyName.equals( PROPERTY_TYPE ) ) {
-            return true;
-        }
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        return entity.isPropertyRequired( propertyName );
-    }
-
-
-    /** @return value */
-    public Class<?> getPropertyType( String entityType, String propertyName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return null;
-        }
-
-        PropertyInfo property = entity.getProperty( propertyName );
-        if ( property == null ) {
-            return null;
-        }
-
-        return property.getType();
-    }
-
-
-    /** @return value */
-    public boolean isPropertyIndexedInCollection( String containerType, String collectionName, String propertyName ) {
-
-        CollectionInfo collection = getCollection( containerType, collectionName );
-        if ( collection == null ) {
-            return false;
-        }
-
-        return collection.isPropertyIndexed( propertyName );
-    }
-
-
-    /** @return value */
-    public boolean hasDictionaries( String entityType ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        return entity.hasDictionaries();
-    }
-
-
-    /** @return value */
-    public Set<String> getDictionaryNames( String entityType ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return null;
-        }
-
-        return entity.getDictionaries().keySet();
-    }
-
-
-    /** @return value */
-    public boolean hasDictionary( String entityType, String dictionaryName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        return entity.hasDictionary( dictionaryName );
-    }
-
-
-    /** @return value */
-    public Class<?> getDictionaryKeyType( String entityType, String dictionaryName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return null;
-        }
-
-        DictionaryInfo set = entity.getDictionary( dictionaryName );
-        if ( set == null ) {
-            return null;
-        }
-
-        return set.getKeyType();
-    }
-
-
-    public Class<?> getDictionaryValueType( String entityType, String dictionaryName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return null;
-        }
-
-        DictionaryInfo dictionary = entity.getDictionary( dictionaryName );
-        if ( dictionary == null ) {
-            return null;
-        }
-
-        return dictionary.getValueType();
-    }
-
-
-    /** @return value */
-    public boolean isDictionaryIndexedInConnections( String entityType, String dictionaryName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        DictionaryInfo dictionary = entity.getDictionary( dictionaryName );
-        if ( dictionary == null ) {
-            return false;
-        }
-
-        return dictionary.isKeysIndexedInConnections();
-    }
-
-
-    /** @return value */
-    public boolean isDictionaryIndexedInCollection( String containerType, String collectionName,
-                                                    String dictionaryName ) {
-
-        CollectionInfo collection = getCollection( containerType, collectionName );
-        if ( collection == null ) {
-            return false;
-        }
-
-        return collection.isDictionaryIndexed( dictionaryName );
-    }
-
-
-    /** @return value */
-    public boolean hasCollection( String containerType, String collectionName ) {
-
-        return getCollection( containerType, collectionName ) != null;
-    }
-
-
-    public boolean isCollectionPathBased( String containerType, String collectionName ) {
-
-        CollectionInfo collection = getCollection( containerType, collectionName );
-        if ( collection == null ) {
-            return false;
-        }
-
-        EntityInfo item = getEntityInfo( collection.getType() );
-        if ( item == null ) {
-            return false;
-        }
-
-        PropertyInfo property = item.getAliasPropertyObject();
-        if ( property == null ) {
-            return false;
-        }
-
-        return property.isPathBasedName();
-    }
-
-
-    public boolean isCollectionReversed( String containerType, String collectionName ) {
-
-        CollectionInfo collection = getCollection( containerType, collectionName );
-        if ( collection == null ) {
-            return false;
-        }
-
-        return collection.isReversed();
-    }
-
-
-    public String getCollectionSort( String containerType, String collectionName ) {
-
-        CollectionInfo collection = getCollection( containerType, collectionName );
-        if ( collection == null ) {
-            return null;
-        }
-
-        return collection.getSort();
-    }
-
-
-    /** @return value */
-    public CollectionInfo getCollection( String containerType, String collectionName ) {
-
-        containerType = normalizeEntityType( containerType, true );
-
-        EntityInfo entity = getEntityInfo( containerType );
-        if ( entity == null ) {
-            return null;
-        }
-
-        CollectionInfo collection = entity.getCollection( collectionName );
-
-        if ( ( collection == null ) && ( Application.ENTITY_TYPE.equalsIgnoreCase( containerType ) ) ) {
-            collection = getDynamicApplicationCollection( collectionName );
-        }
-
-        return collection;
-    }
-
-
-    private CollectionInfo getDynamicApplicationCollection( String collectionName ) {
-        EntityInfo entity = getEntityInfo( Application.ENTITY_TYPE );
-        if ( entity == null ) {
-            return null;
-        }
-
-        CollectionInfo collection = entity.getCollection( collectionName );
-
-        if ( collection != null ) {
-            return collection;
-        }
-
-        collection = new CollectionInfo();
-        collection.setName( collectionName );
-        collection.setContainer( entity );
-        collection.setType( normalizeEntityType( collectionName ) );
-        Set<String> properties = new LinkedHashSet<String>();
-        properties.add( PROPERTY_NAME );
-        properties.add( PROPERTY_CREATED );
-        properties.add( PROPERTY_MODIFIED );
-        collection.setPropertiesIndexed( properties );
-        // entity.getCollections().put(collectionName, collection);
-        // mapCollector(collection.getType(), Application.ENTITY_TYPE,
-        // collectionName, collection);
-
-        return collection;
-    }
-
-
-    public String getCollectionType( String containerType, String collectionName ) {
-
-        containerType = normalizeEntityType( containerType );
-
-        CollectionInfo collection = getCollection( containerType, collectionName );
-
-        if ( collection == null ) {
-
-            if ( Application.ENTITY_TYPE.equalsIgnoreCase( containerType ) ) {
-                return normalizeEntityType( collectionName );
-            }
-            return null;
-        }
-
-        return collection.getType();
-    }
-
-
-    /** @return value */
-    public Map<String, CollectionInfo> getCollections( String entityType ) {
-
-        EntityInfo entity = getEntityInfo( normalizeEntityType( entityType, true ) );
-        if ( entity == null ) {
-            return null;
-        }
-
-        return entity.getCollections();
-    }
-
-
-    public Set<String> getCollectionNames( String entityType ) {
-
-        EntityInfo entity = getEntityInfo( normalizeEntityType( entityType, true ) );
-        if ( entity == null ) {
-            return null;
-        }
-
-        Map<String, CollectionInfo> map = entity.getCollections();
-
-        if ( map != null ) {
-            return map.keySet();
-        }
-
-        return null;
-    }
-
-
-    public java.util.List<String> getCollectionNamesAsList( String entityType ) {
-        Set<String> set = getCollectionNames( normalizeEntityType( entityType, true ) );
-        if ( set != null ) {
-            return new ArrayList<String>( set );
-        }
-        return null;
-    }
-
-
-    private Map<String, Set<CollectionInfo>> addDynamicApplicationCollectionAsContainer(
-            Map<String, Set<CollectionInfo>> containers, String entityType ) {
-
-        Map<String, Set<CollectionInfo>> copy =
-                new TreeMap<String, Set<CollectionInfo>>( String.CASE_INSENSITIVE_ORDER );
-        if ( containers != null ) {
-            copy.putAll( containers );
-        }
-        containers = copy;
-
-        if ( !containers.containsKey( Application.ENTITY_TYPE ) ) {
-            MapUtils.addMapSet( containers, true, Application.ENTITY_TYPE,
-                    getCollection( Application.ENTITY_TYPE, defaultCollectionName( entityType ) ) );
-        }
-
-        return containers;
-    }
-
-
-    /** @return value */
-    public Map<String, Set<CollectionInfo>> getContainers( String entityType ) {
-
-        entityType = normalizeEntityType( entityType );
-
-        // Add the application as a container to all entities
-        return addDynamicApplicationCollectionAsContainer( entityContainerCollections.get( entityType ), entityType );
-    }
-
-
-    /** @return value */
-    public CollectionInfo getContainerCollectionLinkedToCollection( String containerType, String collectionName ) {
-
-        CollectionInfo collection = getCollection( containerType, collectionName );
-        if ( collection == null ) {
-            return null;
-        }
-
-        String linkedCollection = collection.getLinkedCollection();
-        if ( linkedCollection == null ) {
-            return null;
-        }
-
-        return getCollection( collection.getType(), linkedCollection );
-    }
-
-
-    /** @return value */
-    public Map<String, Set<CollectionInfo>> getContainersIndexingProperties( String entityType ) {
-
-        entityType = normalizeEntityType( entityType );
-
-        // Add the application as a container indexing some properties by
-        // default
-        return addDynamicApplicationCollectionAsContainer(
-                entityContainerCollectionsIndexingProperties.get( entityType ), entityType );
-    }
-
-
-    /** @return value */
-    public Map<String, Set<CollectionInfo>> getContainersIndexingDictionaries( String entityType ) {
-
-        entityType = normalizeEntityType( entityType );
-
-        // Application does index any sets by default
-        return entityContainerCollectionsIndexingDictionaries.get( entityType );
-    }
-
-
-    /** @return value */
-    public Map<String, Set<CollectionInfo>> getContainersIndexingDynamicSetInfos( String entityType ) {
-
-        entityType = normalizeEntityType( entityType );
-
-        // Application does index dynamic sets by default
-        return entityContainerCollectionsIndexingDynamicDictionaries.get( entityType );
-    }
-
-
-    /** @return value */
-    public Map<String, Set<CollectionInfo>> getContainersIndexingProperty( String entityType, String propertyName ) {
-
-        entityType = normalizeEntityType( entityType );
-
-        Map<String, Map<String, Set<CollectionInfo>>> propertyContainerCollectionsIndexingPropertyInfo =
-                entityPropertyContainerCollectionsIndexingProperty.get( entityType );
-
-        // Application indexes name property by default
-        if ( propertyName.equalsIgnoreCase( PROPERTY_NAME ) || propertyName.equalsIgnoreCase( PROPERTY_CREATED )
-                || propertyName.equalsIgnoreCase( PROPERTY_MODIFIED ) ) {
-            return addDynamicApplicationCollectionAsContainer(
-                    propertyContainerCollectionsIndexingPropertyInfo != null ?
-                    propertyContainerCollectionsIndexingPropertyInfo.get( propertyName ) : null, entityType );
-        }
-
-        if ( propertyContainerCollectionsIndexingPropertyInfo == null ) {
-            return null;
-        }
-
-        return propertyContainerCollectionsIndexingPropertyInfo.get( propertyName );
-    }
-
-
-    /** @return value */
-    public Map<String, Set<CollectionInfo>> getContainersIndexingDictionary( String entityType,
-                                                                             String dictionaryName ) {
-
-        entityType = normalizeEntityType( entityType );
-
-        /*
-         * if (entityType == null) { return null; }
-         */
-
-        Map<String, Map<String, Set<CollectionInfo>>> dictionaryContainerCollectionsIndexingDictionary =
-                entityDictionaryContainerCollectionsIndexingDictionary.get( entityType );
-
-        if ( dictionaryContainerCollectionsIndexingDictionary == null ) {
-            return null;
-        }
-
-        // Application does index any set by default
-        return dictionaryContainerCollectionsIndexingDictionary.get( dictionaryName );
-    }
-
-
-    public static String defaultCollectionName( String entityType ) {
-        try {
-            return collectionNameCache.get( entityType );
-        }
-        catch ( ExecutionException ex ) {
-            ex.printStackTrace();
-        }
-        return _defaultCollectionName( entityType );
-    }
-
-
-    private static String _defaultCollectionName( String entityType ) {
-        entityType = normalizeEntityType( entityType );
-        return pluralize( entityType );
-    }
-
-
-    public static String normalizeEntityType( String entityType ) {
-        return normalizeEntityType( entityType, false );
-    }
-
-
-    public static String getAssociatedEntityType( String entityType ) {
-        if ( entityType == null ) {
-            return null;
-        }
-        entityType = stringOrSubstringAfterLast( entityType, ':' );
-        return normalizeEntityType( entityType, false );
-    }
-
-
-    public static String normalizeEntityType( String entityType, boolean baseType ) {
-        if ( entityType == null ) {
-            return null;
-        }
-        return baseType ? baseEntityTypes.getUnchecked( entityType ) : nonbaseEntityTypes.getUnchecked( entityType );
-    }
-
-
-    /** uncached - use normalizeEntityType() */
-    private static String createNormalizedEntityType( String entityType, boolean baseType ) {
-        if ( baseType ) {
-            int i = entityType.indexOf( ':' );
-            if ( i >= 0 ) {
-                entityType = entityType.substring( 0, i );
-            }
-        }
-        entityType = entityType.toLowerCase();
-        if ( entityType.startsWith( "org.usergrid.persistence" ) ) {
-            entityType = stringOrSubstringAfterLast( entityType, '.' );
-        }
-        entityType = singularize( entityType );
-
-        if ( "dynamicentity".equalsIgnoreCase( entityType ) ) {
-            throw new IllegalArgumentException( entityType + " is not a valid entity type" );
-        }
-
-        // entityType = capitalizeDelimiter(entityType, '.', '_');
-        return entityType;
-    }
-
-
-    public static boolean isAssociatedEntityType( String entityType ) {
-        if ( entityType == null ) {
-            return false;
-        }
-        return entityType.indexOf( ':' ) != -1;
-    }
-
-
-    /** @return value */
-    public EntityInfo getDynamicEntityInfo( String entityType ) {
-
-        entityType = normalizeEntityType( entityType );
-
-        EntityInfo entity = new EntityInfo();
-        entity.setType( entityType );
-
-        Map<String, PropertyInfo> properties = new LinkedHashMap<String, PropertyInfo>();
-        PropertyInfo property = new PropertyInfo();
-        property.setName( PROPERTY_UUID );
-        property.setRequired( true );
-        property.setType( UUID.class );
-        property.setMutable( false );
-        property.setBasic( true );
-        properties.put( PROPERTY_UUID, property );
-
-        property = new PropertyInfo();
-        property.setName( PROPERTY_TYPE );
-        property.setRequired( true );
-        property.setType( String.class );
-        property.setMutable( false );
-        property.setBasic( true );
-        properties.put( PROPERTY_TYPE, property );
-
-        property = new PropertyInfo();
-        property.setName( PROPERTY_NAME );
-        property.setRequired( false );
-        property.setType( String.class );
-        property.setMutable( false );
-        property.setAliasProperty( true );
-        property.setIndexed( true );
-        property.setBasic( true );
-        property.setUnique( true );
-        properties.put( PROPERTY_NAME, property );
-
-        property = new PropertyInfo();
-        property.setName( PROPERTY_CREATED );
-        property.setRequired( true );
-        property.setType( Long.class );
-        property.setMutable( false );
-        property.setIndexed( true );
-        properties.put( PROPERTY_CREATED, property );
-
-        property = new PropertyInfo();
-        property.setName( PROPERTY_MODIFIED );
-        property.setRequired( true );
-        property.setType( Long.class );
-        property.setIndexed( true );
-        properties.put( PROPERTY_MODIFIED, property );
-
-        property = new PropertyInfo();
-        property.setName( PROPERTY_ITEM );
-        property.setRequired( false );
-        property.setType( UUID.class );
-        property.setMutable( false );
-        property.setAliasProperty( false );
-        property.setIndexed( false );
-        properties.put( PROPERTY_ITEM, property );
-
-        property = new PropertyInfo();
-        property.setName( PROPERTY_ITEM_TYPE );
-        property.setRequired( false );
-        property.setType( String.class );
-        property.setMutable( false );
-        property.setAliasProperty( false );
-        property.setIndexed( false );
-        properties.put( PROPERTY_ITEM_TYPE, property );
-
-        property = new PropertyInfo();
-        property.setName( PROPERTY_COLLECTION_NAME );
-        property.setRequired( false );
-        property.setType( String.class );
-        property.setMutable( false );
-        property.setAliasProperty( false );
-        property.setIndexed( false );
-        properties.put( PROPERTY_COLLECTION_NAME, property );
-
-        entity.setProperties( properties );
-
-        Map<String, DictionaryInfo> sets = new LinkedHashMap<String, DictionaryInfo>();
-
-        DictionaryInfo set = new DictionaryInfo();
-        set.setName( DICTIONARY_CONNECTIONS );
-        set.setKeyType( String.class );
-        sets.put( DICTIONARY_CONNECTIONS, set );
-
-        entity.setDictionaries( sets );
-
-        return entity;
-    }
-
-
-    public Map<String, Object> cleanUpdatedProperties( String entityType, Map<String, Object> properties ) {
-        return cleanUpdatedProperties( entityType, properties, false );
-    }
-
-
-    public Map<String, Object> cleanUpdatedProperties( String entityType, Map<String, Object> properties,
-                                                       boolean create ) {
-
-        if ( properties == null ) {
-            return null;
-        }
-
-        entityType = normalizeEntityType( entityType );
-
-        properties.remove( PROPERTY_UUID );
-        properties.remove( PROPERTY_TYPE );
-        properties.remove( PROPERTY_METADATA );
-        properties.remove( PROPERTY_MEMBERSHIP );
-        properties.remove( PROPERTY_CONNECTION );
-
-        Iterator<Entry<String, Object>> iterator = properties.entrySet().iterator();
-        while ( iterator.hasNext() ) {
-            Entry<String, Object> entry = iterator.next();
-            if ( hasProperty( entityType, entry.getKey() ) ) {
-                if ( !create && !isPropertyMutable( entityType, entry.getKey() ) ) {
-                    iterator.remove();
-                    continue;
-                }
-                Object propertyValue = entry.getValue();
-                if ( ( propertyValue instanceof String ) && ( ( ( String ) propertyValue ) == "" ) ) {
-                    propertyValue = null;
-                }
-                if ( ( propertyValue == null ) && isRequiredProperty( entityType, entry.getKey() ) ) {
-                    iterator.remove();
-                }
-            }
-        }
-        return properties;
-    }
-
-
-    public Object validateEntityPropertyValue( String entityType, String propertyName, Object propertyValue )
-            throws PropertyTypeConversionException {
-
-        entityType = normalizeEntityType( entityType );
-
-        if ( ( propertyValue instanceof String ) && ( ( String ) propertyValue ).equals( "" ) ) {
-            propertyValue = null;
-        }
-
-        if ( !hasProperty( entityType, propertyName ) ) {
-            return propertyValue;
-        }
-
-        /*
-         * if (PROPERTY_TYPE.equals(propertyName)) { return
-         * string(propertyValue); } else if (PROPERTY_ID.equals(propertyName)) {
-         * return uuid(propertyValue); }
-         */
-
-        Class<?> type = getPropertyType( entityType, propertyName );
-        if ( type != null ) {
-            // propertyValue = coerce(type, propertyValue);
-            try {
-                propertyValue = mapper.convertValue( propertyValue, type );
-            }
-            catch ( Exception e ) {
-                throw new PropertyTypeConversionException( entityType, propertyName, propertyValue, type, e );
-            }
-        }
-
-        return propertyValue;
-    }
-
-
-    public Object validateEntitySetValue( String entityType, String dictionaryName, Object elementValue ) {
-
-        entityType = normalizeEntityType( entityType );
-
-        if ( ( elementValue instanceof String ) && ( ( String ) elementValue ).equals( "" ) ) {
-            elementValue = null;
-        }
-
-        if ( !hasDictionary( entityType, dictionaryName ) ) {
-            return elementValue;
-        }
-
-        Class<?> type = getDictionaryKeyType( entityType, dictionaryName );
-        if ( type != null ) {
-            // elementValue = coerce(type, elementValue);
-            elementValue = mapper.convertValue( elementValue, type );
-        }
-
-        return elementValue;
-    }
-
-
-    public Entity toEntity( Map<String, Object> map ) {
-        Class<? extends Entity> entityClass = DynamicEntity.class;
-        String type = ( String ) map.get( PROPERTY_TYPE );
-        if ( type != null ) {
-            entityClass = getEntityClass( type );
-        }
-        if ( entityClass == null ) {
-            entityClass = DynamicEntity.class;
-        }
-        Entity entity = mapper.convertValue( map, entityClass );
-        return entity;
-    }
-
-    /*
-     * public Entity toEntity(Reader reader) { Entity entity =
-     * mapper.convertValue(reader, Entity.class); return entity; }
-     * 
-     * public Entity toEntity(InputStream input) { Entity entity =
-     * mapper.convertValue(input, Entity.class); return entity; }
-     * 
-     * public Entity toEntity(String string) { Entity entity =
-     * mapper.convertValue(string, Entity.class); return entity; }
-     */
-
-
-    public Map<String, Object> toMap( Entity entity ) {
-        Map<String, Object> map = mapper.convertValue( entity, new TypeReference<Map<String, Object>>() {} );
-        return map;
-    }
-
-
-    public Object convertToPropertyType( Class<? extends Entity> entityClass, String property, Object value ) {
-        Class<?> cls = getPropertyType( getEntityType( entityClass ), property );
-        if ( cls != null ) {
-            return mapper.convertValue( value, cls );
-        }
-        return value;
-    }
-
-
-    public Object convertToPropertyType( String type, String property, Object value ) {
-        Class<?> cls = getPropertyType( type, property );
-        if ( cls != null ) {
-            return mapper.convertValue( value, cls );
-        }
-        return value;
-    }
-
-
-    public PropertyDescriptor getDescriptorForEntityProperty( Class<? extends Entity> entityClass, String property ) {
-        Map<String, PropertyDescriptor> propertyDescriptors = entityClassPropertyToDescriptor.get( entityClass );
-        if ( propertyDescriptors == null ) {
-            return null;
-        }
-        return propertyDescriptors.get( property );
-    }
-
-
-    public void setEntityProperty( Entity entity, String property, Object value ) {
-        PropertyDescriptor descriptor = getDescriptorForEntityProperty( entity.getClass(), property );
-        if ( descriptor != null ) {
-            Class<?> cls = descriptor.getPropertyType();
-            if ( cls != null ) {
-                if ( ( value == null ) || ( cls.isAssignableFrom( value.getClass() ) ) ) {
-                    try {
-                        descriptor.getWriteMethod().invoke( entity, value );
-                        return;
-                    }
-                    catch ( Exception e ) {
-                        logger.error( "Unable to set entity property " + property, e );
-                    }
-                }
-                try {
-                    descriptor.getWriteMethod().invoke( entity, mapper.convertValue( value, cls ) );
-                    return;
-                }
-                catch ( Exception e ) {
-                    logger.error( "Unable to set entity property " + property, e );
-                }
-            }
-        }
-        entity.setDynamicProperty( property, value );
-    }
-
-
-    public Object getEntityProperty( Entity entity, String property ) {
-        PropertyDescriptor descriptor = getDescriptorForEntityProperty( entity.getClass(), property );
-        if ( descriptor != null ) {
-            try {
-                return descriptor.getReadMethod().invoke( entity );
-            }
-            catch ( Exception e ) {
-                logger.error( "Unable to get entity property " + property, e );
-            }
-            return null;
-        }
-        Map<String, Object> properties = entity.getDynamicProperties();
-        if ( properties != null ) {
-            return properties.get( property );
-        }
-        return null;
-    }
-
-
-    public Map<String, Object> getEntityProperties( Entity entity ) {
-        Map<String, Object> properties = new LinkedHashMap<String, Object>();
-        Map<String, PropertyDescriptor> propertyDescriptors = entityClassPropertyToDescriptor.get( entity.getClass() );
-
-        if ( propertyDescriptors == null ) {
-            registerEntity( entity.getClass() );
-            propertyDescriptors = entityClassPropertyToDescriptor.get( entity.getClass() );
-        }
-
-        for ( Entry<String, PropertyDescriptor> propertyEntry : propertyDescriptors.entrySet() ) {
-            String property = propertyEntry.getKey();
-            PropertyDescriptor descriptor = propertyEntry.getValue();
-            if ( descriptor != null ) {
-                try {
-                    Object value = descriptor.getReadMethod().invoke( entity );
-                    if ( value != null ) {
-                        properties.put( property, value );
-                    }
-                }
-                catch ( Exception e ) {
-                    logger.error( "Unable to get entity property " + property, e );
-                }
-            }
-        }
-        Map<String, Object> dynamicProperties = entity.getDynamicProperties();
-        if ( dynamicProperties != null ) {
-            properties.putAll( dynamicProperties );
-        }
-        return properties;
-    }
-
-
-    public static Map<String, Object> deserializeEntityProperties( Row<UUID, String, ByteBuffer> row ) {
-        if ( row == null ) {
-            return null;
-        }
-        ColumnSlice<String, ByteBuffer> slice = row.getColumnSlice();
-        if ( slice == null ) {
-            return null;
-        }
-        return deserializeEntityProperties( slice.getColumns(), true, false );
-    }
-
-
-    /** @return entity properties from columns as a map */
-    public static Map<String, Object> deserializeEntityProperties( List<HColumn<String, ByteBuffer>> columns ) {
-        return deserializeEntityProperties( CassandraPersistenceUtils.asMap( columns ), true, false );
-    }
-
-
-    public static Map<String, Object> deserializeEntityProperties( Map<String, ByteBuffer> columns ) {
-        return deserializeEntityProperties( columns, true, false );
-    }
-
-
-    public static Map<String, Object> deserializeEntityProperties( List<HColumn<String, ByteBuffer>> columns,
-                                                                   boolean checkId, boolean checkRequired ) {
-        return deserializeEntityProperties( CassandraPersistenceUtils.asMap( columns ), checkId, checkRequired );
-    }
-
-
-    /** @return entity properties from columns as a map */
-    public static Map<String, Object> deserializeEntityProperties( Map<String, ByteBuffer> columns, boolean checkId,
-                                                                   boolean checkRequired ) {
-
-        if ( columns == null ) {
-            return null;
-        }
-
-        String entityType = string( columns.get( PROPERTY_TYPE ) );
-        if ( entityType == null ) {
-            logger.debug( "deserializeEntityProperties(): No type for entity found, entity probably doesn't exist" );
-            return null;
-        }
-        if ( checkId && !columns.containsKey( PROPERTY_UUID ) ) {
-            logger.error( "No id for entity ( {} ) found!", entityType );
-            return null;
-        }
-
-        if ( checkRequired ) {
-            Set<String> required_properties = Schema.getDefaultSchema().getRequiredProperties( entityType );
-            if ( required_properties != null ) {
-                for ( String property_name : required_properties ) {
-                    if ( !columns.containsKey( property_name ) ) {
-                        logger.error( "Entity (" + entityType + ") missing required property: " + property_name,
-                                new Throwable() );
-                        return null;
-                    }
-                }
-            }
-        }
-
-        Map<String, Object> properties_map = new TreeMap<String, Object>( String.CASE_INSENSITIVE_ORDER );
-        for ( Entry<String, ByteBuffer> column : columns.entrySet() ) {
-            String propertyName = column.getKey();
-            Object propertyValue = deserializeEntityProperty( entityType, propertyName, column.getValue() );
-            properties_map.put( propertyName, propertyValue );
-        }
-        return properties_map;
-    }
-
-
-    /** @return object of correct type deserialize from column bytes */
-    public static Object deserializeEntityProperty( String entityType, String propertyName, ByteBuffer bytes ) {
-        Object propertyValue = null;
-        if ( PROPERTY_UUID.equals( propertyName ) ) {
-            propertyValue = uuid( bytes );
-        }
-        else if ( PROPERTY_TYPE.equals( propertyName ) ) {
-            propertyValue = string( bytes );
-        }
-        else {
-            if ( Schema.getDefaultSchema().isPropertyEncrypted( entityType, propertyName ) ) {
-                bytes = decrypt( bytes );
-            }
-            propertyValue = Schema.deserializePropertyValueFromJsonBinary( bytes );
-        }
-        return propertyValue;
-    }
-
-
-    public static ByteBuffer serializeEntityProperty( String entityType, String propertyName, Object propertyValue ) {
-        ByteBuffer bytes = null;
-        if ( PROPERTY_UUID.equals( propertyName ) ) {
-            bytes = bytebuffer( uuid( propertyValue ) );
-        }
-        else if ( PROPERTY_TYPE.equals( propertyName ) ) {
-            bytes = bytebuffer( string( propertyValue ) );
-        }
-        else {
-            bytes = Schema.serializePropertyValueToJsonBinary( toJsonNode( propertyValue ) );
-            if ( Schema.getDefaultSchema().isPropertyEncrypted( entityType, propertyName ) ) {
-                bytes.rewind();
-                bytes = encrypt( bytes );
-            }
-        }
-        return bytes;
-    }
-
-
-    public static ByteBuffer serializePropertyValueToJsonBinary( Object obj ) {
-        return JsonUtils.toByteBuffer( obj );
-    }
-
-
-    public static Object deserializePropertyValueFromJsonBinary( ByteBuffer bytes ) {
-        return JsonUtils.normalizeJsonTree( JsonUtils.fromByteBuffer( bytes ) );
-    }
-
-
-    public static Object deserializePropertyValueFromJsonBinary( ByteBuffer bytes, Class<?> classType ) {
-        return JsonUtils.normalizeJsonTree( JsonUtils.fromByteBuffer( bytes, classType ) );
-    }
-
-
-    public boolean isPropertyEncrypted( String entityType, String propertyName ) {
-
-        EntityInfo entity = getEntityInfo( entityType );
-        if ( entity == null ) {
-            return false;
-        }
-
-        PropertyInfo property = entity.getProperty( propertyName );
-        if ( property == null ) {
-            return false;
-        }
-
-        return property.isEncrypted();
-    }
-
-
-    private static final byte[] DEFAULT_ENCRYPTION_SEED =
-            "oWyWX?I2kZAhkKb_jQ8SZvjmgkiF4eGSjsfIkhnRetD4Dvtx2J".getBytes();
-    private static byte[] encryptionSeed =
-            ( System.getProperty( "encryptionSeed" ) != null ) ? System.getProperty( "encryptionSeed" ).getBytes() :
-            DEFAULT_ENCRYPTION_SEED;
-
-
-    public static ByteBuffer encrypt( ByteBuffer clear ) {
-        if ( clear == null || !clear.hasRemaining() ) {
-            return clear;
-        }
-        try {
-            SecretKeySpec sKeySpec = new SecretKeySpec( getRawKey( encryptionSeed ), "AES" );
-            Cipher cipher = Cipher.getInstance( "AES" );
-            cipher.init( Cipher.ENCRYPT_MODE, sKeySpec );
-            ByteBuffer encrypted = ByteBuffer.allocate( cipher.getOutputSize( clear.remaining() ) );
-            cipher.doFinal( clear, encrypted );
-            encrypted.rewind();
-            return encrypted;
-        }
-        catch ( Exception e ) {
-            throw new IllegalStateException( e );
-        }
-    }
-
-
-    public static ByteBuffer decrypt( ByteBuffer encrypted ) {
-        if ( encrypted == null || !encrypted.hasRemaining() ) {
-            return encrypted;
-        }
-        try {
-            SecretKeySpec sKeySpec = new SecretKeySpec( getRawKey( encryptionSeed ), "AES" );
-            Cipher cipher = Cipher.getInstance( "AES" );
-            cipher.init( Cipher.DECRYPT_MODE, sKeySpec );
-            ByteBuffer decrypted = ByteBuffer.allocate( cipher.getOutputSize( encrypted.remaining() ) );
-            cipher.doFinal( encrypted, decrypted );
-            decrypted.rewind();
-            return decrypted;
-        }
-        catch ( Exception e ) {
-            throw new IllegalStateException( e );
-        }
-    }
-
-
-    private static byte[] getRawKey( byte[] seed ) throws Exception {
-        KeyGenerator keyGenerator = KeyGenerator.getInstance( "AES" );
-        SecureRandom sr = SecureRandom.getInstance( "SHA1PRNG" );
-        sr.setSeed( seed );
-        keyGenerator.init( 128, sr ); // 192 and 256 bits may not be available
-        SecretKey secretKey = keyGenerator.generateKey();
-        return secretKey.getEncoded();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/2c2acbe4/stack/core/src/main/java/org/usergrid/persistence/SimpleCollectionRef.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/usergrid/persistence/SimpleCollectionRef.java b/stack/core/src/main/java/org/usergrid/persistence/SimpleCollectionRef.java
deleted file mode 100644
index dab819b..0000000
--- a/stack/core/src/main/java/org/usergrid/persistence/SimpleCollectionRef.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright 2012 Apigee Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.usergrid.persistence;
-
-
-import java.util.UUID;
-
-import org.usergrid.persistence.cassandra.CassandraPersistenceUtils;
-
-
-public class SimpleCollectionRef implements CollectionRef {
-
-    public static final String MEMBER_ENTITY_TYPE = "member";
-
-    protected final EntityRef ownerRef;
-    protected final String collectionName;
-    protected final EntityRef itemRef;
-    protected final String type;
-    protected final UUID id;
-
-
-    public SimpleCollectionRef( EntityRef ownerRef, String collectionName, EntityRef itemRef ) {
-        this.ownerRef = ownerRef;
-        this.collectionName = collectionName;
-        this.itemRef = itemRef;
-        type = itemRef.getType() + ":" + MEMBER_ENTITY_TYPE;
-        id = CassandraPersistenceUtils.keyID( ownerRef.getUuid(), collectionName, itemRef.getUuid() );
-    }
-
-
-    @Override
-    public EntityRef getOwnerEntity() {
-        return ownerRef;
-    }
-
-
-    @Override
-    public String getCollectionName() {
-        return collectionName;
-    }
-
-
-    @Override
-    public EntityRef getItemRef() {
-        return itemRef;
-    }
-
-
-    @Override
-    public UUID getUuid() {
-        return id;
-    }
-
-
-    @Override
-    public String getType() {
-        return type;
-    }
-
-
-    @Override
-    public String toString() {
-        if ( ( type == null ) && ( id == null ) ) {
-            return "CollectionRef(" + SimpleEntityRef.NULL_ID.toString() + ")";
-        }
-        if ( type == null ) {
-            return "CollectionRef(" + id.toString() + ")";
-        }
-        return type + "(" + id + "," + ownerRef + "," + collectionName + "," + itemRef + ")";
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/2c2acbe4/stack/core/src/main/java/org/usergrid/persistence/SimpleEntityRef.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/usergrid/persistence/SimpleEntityRef.java b/stack/core/src/main/java/org/usergrid/persistence/SimpleEntityRef.java
deleted file mode 100644
index 524bc5e..0000000
--- a/stack/core/src/main/java/org/usergrid/persistence/SimpleEntityRef.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright 2012 Apigee Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.usergrid.persistence;
-
-
-import java.util.UUID;
-
-
-public class SimpleEntityRef implements EntityRef {
-
-    public static final UUID NULL_ID = new UUID( 0, 0 );
-
-    protected final String type;
-
-    protected final UUID id;
-
-
-    public SimpleEntityRef( UUID id ) {
-        this.id = id;
-        type = null;
-    }
-
-
-    public SimpleEntityRef( String type, UUID id ) {
-        this.type = type;
-        this.id = id;
-    }
-
-
-    public SimpleEntityRef( EntityRef entityRef ) {
-        type = entityRef.getType();
-        id = entityRef.getUuid();
-    }
-
-
-    public static EntityRef ref() {
-        return new SimpleEntityRef( null, null );
-    }
-
-
-    @Override
-    public UUID getUuid() {
-        return id;
-    }
-
-
-    @Override
-    public String getType() {
-        return type;
-    }
-
-
-    public static EntityRef ref( String entityType, UUID entityId ) {
-        return new SimpleEntityRef( entityType, entityId );
-    }
-
-
-    public static EntityRef ref( UUID entityId ) {
-        return new SimpleEntityRef( null, entityId );
-    }
-
-
-    public static EntityRef ref( EntityRef ref ) {
-        return new SimpleEntityRef( ref );
-    }
-
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ( ( id == null ) ? 0 : id.hashCode() );
-        result = prime * result + ( ( type == null ) ? 0 : type.hashCode() );
-        return result;
-    }
-
-
-    @Override
-    public boolean equals( Object obj ) {
-        if ( this == obj ) {
-            return true;
-        }
-        if ( obj == null ) {
-            return false;
-        }
-        if ( getClass() != obj.getClass() ) {
-            return false;
-        }
-        SimpleEntityRef other = ( SimpleEntityRef ) obj;
-        if ( id == null ) {
-            if ( other.id != null ) {
-                return false;
-            }
-        }
-        else if ( !id.equals( other.id ) ) {
-            return false;
-        }
-        if ( type == null ) {
-            if ( other.type != null ) {
-                return false;
-            }
-        }
-        else if ( !type.equals( other.type ) ) {
-            return false;
-        }
-        return true;
-    }
-
-
-    @Override
-    public String toString() {
-        if ( ( type == null ) && ( id == null ) ) {
-            return "EntityRef(" + NULL_ID.toString() + ")";
-        }
-        if ( type == null ) {
-            return "EntityRef(" + id.toString() + ")";
-        }
-        return type + "(" + id + ")";
-    }
-
-
-    public static UUID getUuid( EntityRef ref ) {
-        if ( ref == null ) {
-            return null;
-        }
-        return ref.getUuid();
-    }
-
-
-    public static String getType( EntityRef ref ) {
-        if ( ref == null ) {
-            return null;
-        }
-        return ref.getType();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/2c2acbe4/stack/core/src/main/java/org/usergrid/persistence/SimpleRoleRef.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/usergrid/persistence/SimpleRoleRef.java b/stack/core/src/main/java/org/usergrid/persistence/SimpleRoleRef.java
deleted file mode 100644
index d77b23c..0000000
--- a/stack/core/src/main/java/org/usergrid/persistence/SimpleRoleRef.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright 2012 Apigee Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.usergrid.persistence;
-
-
-import java.util.UUID;
-
-import org.springframework.util.Assert;
-import org.usergrid.persistence.cassandra.CassandraPersistenceUtils;
-import org.usergrid.persistence.entities.Group;
-import org.usergrid.utils.StringUtils;
-import org.usergrid.utils.UUIDUtils;
-
-
-public class SimpleRoleRef implements RoleRef {
-
-    protected final UUID groupId;
-    protected final String roleName;
-    protected final UUID id;
-
-
-    public SimpleRoleRef( String roleName ) {
-        this( null, roleName );
-    }
-
-
-    public SimpleRoleRef( UUID groupId, String roleName ) {
-        Assert.notNull( roleName );
-        if ( groupId != null ) {
-            this.groupId = groupId;
-        }
-        else {
-            this.groupId = UUIDUtils.tryExtractUUID( roleName );
-        }
-        this.roleName = StringUtils.stringOrSubstringAfterLast( roleName.toLowerCase(), ':' );
-        if ( groupId == null ) {
-            id = CassandraPersistenceUtils.keyID( "role", this.groupId, this.roleName );
-        }
-        else {
-            id = CassandraPersistenceUtils.keyID( "role", this.roleName );
-        }
-    }
-
-
-    public static SimpleRoleRef forRoleEntity( Entity role ) {
-        if ( role == null ) {
-            return null;
-        }
-        UUID groupId = ( UUID ) role.getProperty( "group" );
-        String name = role.getName();
-        return new SimpleRoleRef( groupId, name );
-    }
-
-
-    public static SimpleRoleRef forRoleName( String roleName ) {
-        return new SimpleRoleRef( null, roleName );
-    }
-
-
-    public static SimpleRoleRef forGroupIdAndRoleName( UUID groupId, String roleName ) {
-        return new SimpleRoleRef( groupId, roleName );
-    }
-
-
-    public static UUID getIdForRoleName( String roleName ) {
-        return forRoleName( roleName ).getUuid();
-    }
-
-
-    public static UUID getIdForGroupIdAndRoleName( UUID groupId, String roleName ) {
-        return forGroupIdAndRoleName( groupId, roleName ).getUuid();
-    }
-
-
-    @Override
-    public UUID getUuid() {
-        return id;
-    }
-
-
-    @Override
-    public String getType() {
-        return "role";
-    }
-
-
-    @Override
-    public EntityRef getGroupRef() {
-        return new SimpleEntityRef( Group.ENTITY_TYPE, groupId );
-    }
-
-
-    @Override
-    public String getRoleName() {
-        return roleName;
-    }
-
-
-    @Override
-    public UUID getGroupId() {
-        return groupId;
-    }
-
-
-    @Override
-    public String getApplicationRoleName() {
-        if ( groupId == null ) {
-            return roleName;
-        }
-        return groupId + ":" + roleName;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/2c2acbe4/stack/core/src/main/java/org/usergrid/persistence/TypedEntity.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/usergrid/persistence/TypedEntity.java b/stack/core/src/main/java/org/usergrid/persistence/TypedEntity.java
deleted file mode 100644
index 6fdb409..0000000
--- a/stack/core/src/main/java/org/usergrid/persistence/TypedEntity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright 2012 Apigee Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.usergrid.persistence;
-
-
-import javax.xml.bind.annotation.XmlRootElement;
-
-
-/**
- * TypedEntity is the abstract superclass for all typed entities. A typed entity refers to an entity that has a concrete
- * Java class mapped to it. Entities do not need to have concrete typed classes, the service interacts with entities in
- * an entirely dynamic fashion and uses the Schema class to determine relationships and property types, however using
- * the typed entity classes can be more convenient.
- *
- * @author edanuff
- */
-@XmlRootElement
-public abstract class TypedEntity extends AbstractEntity {
-
-    @Override
-    public Entity toTypedEntity() {
-        return this;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/2c2acbe4/stack/core/src/main/java/org/usergrid/persistence/Update.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/usergrid/persistence/Update.java b/stack/core/src/main/java/org/usergrid/persistence/Update.java
deleted file mode 100644
index 0f5d018..0000000
--- a/stack/core/src/main/java/org/usergrid/persistence/Update.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright 2012 Apigee Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.usergrid.persistence;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class Update {
-
-    private List<UpdateOperation> operationList = new ArrayList<UpdateOperation>();
-
-
-    public class UpdateOperation {
-        String propertyName;
-        UpdateOperator operator;
-        Object value;
-
-
-        UpdateOperation( String propertyName, UpdateOperator operator, Object value ) {
-            this.propertyName = propertyName;
-            this.operator = operator;
-            this.value = value;
-        }
-
-
-        public String getPropertyName() {
-            return propertyName;
-        }
-
-
-        public UpdateOperator getOperator() {
-            return operator;
-        }
-
-
-        public Object getValue() {
-            return value;
-        }
-    }
-
-
-    public static enum UpdateOperator {
-        UPDATE, DELETE, ADD_TO_LIST, REMOVE_FROM_LIST;
-    }
-
-
-    public Update() {
-    }
-
-
-    public void add( String propertyName, UpdateOperator operator, Object value ) {
-        UpdateOperation operation = new UpdateOperation( propertyName, operator, value );
-        operationList.add( operation );
-    }
-
-
-    public void clear() {
-        operationList = new ArrayList<UpdateOperation>();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/2c2acbe4/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityCollection.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityCollection.java b/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityCollection.java
deleted file mode 100644
index 339a99a..0000000
--- a/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityCollection.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright 2012 Apigee Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.usergrid.persistence.annotations;
-
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-@Target(value = { ElementType.METHOD, ElementType.FIELD })
-@Retention(RetentionPolicy.RUNTIME)
-public @interface EntityCollection {
-    String type();
-
-    String[] dictionariesIndexed() default { };
-
-    boolean indexingDynamicDictionaries() default false;
-
-    String linkedCollection() default "";
-
-    boolean publicVisible() default true;
-
-    boolean reversed() default false;
-
-    boolean includedInExport() default true;
-
-    String sort() default "";
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/2c2acbe4/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityDictionary.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityDictionary.java b/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityDictionary.java
deleted file mode 100644
index 51f9ddb..0000000
--- a/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityDictionary.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright 2012 Apigee Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.usergrid.persistence.annotations;
-
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-@Target(value = { ElementType.METHOD, ElementType.FIELD })
-@Retention(RetentionPolicy.RUNTIME)
-public @interface EntityDictionary {
-
-    Class<?> keyType();
-
-    boolean keysIndexedInConnections() default false;
-
-    Class<?> valueType() default Object.class;
-
-    boolean publicVisible() default true;
-
-    boolean includedInExport() default true;
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/2c2acbe4/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityProperty.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityProperty.java b/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityProperty.java
deleted file mode 100644
index b38ced5..0000000
--- a/stack/core/src/main/java/org/usergrid/persistence/annotations/EntityProperty.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright 2012 Apigee Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.usergrid.persistence.annotations;
-
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-@Target(value = { ElementType.METHOD, ElementType.FIELD })
-@Retention(RetentionPolicy.RUNTIME)
-public @interface EntityProperty {
-
-    String name() default "";
-
-    boolean indexed() default true;
-
-    boolean basic() default false;
-
-    boolean required() default false;
-
-    boolean mutable() default true;
-
-    boolean unique() default false;
-
-    boolean aliasProperty() default false;
-
-    boolean pathBasedName() default false;
-
-    boolean fulltextIndexed() default false;
-
-    boolean publicVisible() default false;
-
-    boolean includedInExport() default true;
-
-    boolean timestamp() default false;
-
-    boolean encrypted() default false;
-}