/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.datastore.infinispan.utils;
import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.ogm.datastore.document.options.AssociationStorageType;
import org.hibernate.ogm.datastore.infinispan.InfinispanDialect;
import org.hibernate.ogm.datastore.infinispan.InfinispanEmbedded;
import org.hibernate.ogm.datastore.infinispan.impl.InfinispanEmbeddedDatastoreProvider;
import org.hibernate.ogm.datastore.spi.DatastoreConfiguration;
import org.hibernate.ogm.datastore.spi.DatastoreProvider;
import org.hibernate.ogm.dialect.spi.GridDialect;
import org.hibernate.ogm.model.key.spi.AssociationKeyMetadata;
import org.hibernate.ogm.model.key.spi.EntityKey;
import org.hibernate.ogm.model.key.spi.EntityKeyMetadata;
import org.hibernate.ogm.persister.impl.OgmCollectionPersister;
import org.hibernate.ogm.persister.impl.OgmEntityPersister;
import org.hibernate.ogm.utils.GridDialectTestHelper;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.infinispan.Cache;
/**
* @author Sanne Grinovero <sanne@hibernate.org> (C) 2011 Red Hat Inc.
*/
public class InfinispanTestHelper implements GridDialectTestHelper {
@Override
public long getNumberOfEntities(Session session) {
return getNumberOfEntities( session.getSessionFactory() );
}
@Override
public long getNumberOfEntities(SessionFactory sessionFactory) {
int entityCount = 0;
Set<Cache<?, ?>> processedCaches = Collections.newSetFromMap( new IdentityHashMap<Cache<?, ?>, Boolean>() );
for ( EntityPersister entityPersister : ( (SessionFactoryImplementor) sessionFactory ).getEntityPersisters().values() ) {
Cache<?, ?> entityCache = getEntityCache( sessionFactory, ( (OgmEntityPersister) entityPersister ).getEntityKeyMetadata() );
if ( !processedCaches.contains( entityCache ) ) {
entityCount += entityCache.size();
processedCaches.add( entityCache );
}
}
return entityCount;
}
@Override
public long getNumberOfAssociations(Session session) {
return getNumberOfAssociations( session.getSessionFactory() );
}
@Override
public long getNumberOfAssociations(SessionFactory sessionFactory) {
int asscociationCount = 0;
Set<Cache<?, ?>> processedCaches = Collections.newSetFromMap( new IdentityHashMap<Cache<?, ?>, Boolean>() );
for ( CollectionPersister collectionPersister : ( (SessionFactoryImplementor) sessionFactory ).getCollectionPersisters().values() ) {
Cache<?, ?> associationCache = getAssociationCache( sessionFactory, ( (OgmCollectionPersister) collectionPersister ).getAssociationKeyMetadata() );
if ( !processedCaches.contains( associationCache ) ) {
asscociationCount += associationCache.size();
processedCaches.add( associationCache );
}
}
return asscociationCount;
}
@Override
public Map<String, Object> extractEntityTuple(Session session, EntityKey key) {
InfinispanEmbeddedDatastoreProvider provider = getProvider( session.getSessionFactory() );
return getEntityCache( session.getSessionFactory(), key.getMetadata() ).get( provider.getKeyProvider().getEntityCacheKey( key ) );
}
private static Cache<?, Map<String, Object>> getEntityCache(SessionFactory sessionFactory, EntityKeyMetadata entityKeyMetadata) {
InfinispanEmbeddedDatastoreProvider castProvider = getProvider( sessionFactory );
return castProvider.getCacheManager().getEntityCache( entityKeyMetadata );
}
public static InfinispanEmbeddedDatastoreProvider getProvider(SessionFactory sessionFactory) {
DatastoreProvider provider = ( (SessionFactoryImplementor) sessionFactory ).getServiceRegistry().getService( DatastoreProvider.class );
if ( !( InfinispanEmbeddedDatastoreProvider.class.isInstance( provider ) ) ) {
throw new RuntimeException( "Not testing with Infinispan, cannot extract underlying cache" );
}
return InfinispanEmbeddedDatastoreProvider.class.cast( provider );
}
private static Cache<?, ?> getAssociationCache(SessionFactory sessionFactory, AssociationKeyMetadata associationKeyMetadata) {
InfinispanEmbeddedDatastoreProvider castProvider = getProvider( sessionFactory );
return castProvider.getCacheManager().getAssociationCache( associationKeyMetadata );
}
@Override
public boolean backendSupportsTransactions() {
return true;
}
@Override
public void dropSchemaAndDatabase(SessionFactory sessionFactory) {
// Nothing to do
}
@Override
public Map<String, String> getAdditionalConfigurationProperties() {
return Collections.emptyMap();
}
@Override
public long getNumberOfAssociations(SessionFactory sessionFactory, AssociationStorageType type) {
throw new UnsupportedOperationException( "This datastore does not support different association storage strategies." );
}
@Override
public GridDialect getGridDialect(DatastoreProvider datastoreProvider) {
return new InfinispanDialect( (InfinispanEmbeddedDatastoreProvider) datastoreProvider );
}
@Override
public Class<? extends DatastoreConfiguration<?>> getDatastoreConfigurationType() {
return InfinispanEmbedded.class;
}
}