/
EhcacheTestHelper.java
150 lines (127 loc) · 5.81 KB
/
EhcacheTestHelper.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
* 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.ehcache.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.ehcache.Ehcache;
import org.hibernate.ogm.datastore.ehcache.EhcacheDialect;
import org.hibernate.ogm.datastore.ehcache.impl.Cache;
import org.hibernate.ogm.datastore.ehcache.impl.EhcacheDatastoreProvider;
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.impl.DefaultIdSourceKeyMetadata;
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;
/**
* @author Alex Snaps
*/
public class EhcacheTestHelper 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.getSize();
processedCaches.add( entityCache );
}
}
return entityCount;
}
public static Cache<?> getEntityCache(SessionFactory sessionFactory, EntityKeyMetadata entityKeyMetadata) {
EhcacheDatastoreProvider castProvider = getProvider( sessionFactory );
return castProvider.getCacheManager().getEntityCache( entityKeyMetadata );
}
@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.getSize();
processedCaches.add( associationCache );
}
}
return asscociationCount;
}
public static Cache<?> getAssociationCache(SessionFactory sessionFactory, AssociationKeyMetadata associationKeyMetadata) {
EhcacheDatastoreProvider castProvider = getProvider( sessionFactory );
return castProvider.getCacheManager().getAssociationCache( associationKeyMetadata );
}
public static Cache<?> getIdSourceCache(SessionFactory sessionFactory, String tableName) {
EhcacheDatastoreProvider castProvider = getProvider( sessionFactory );
return castProvider.getCacheManager().getIdSourceCache( DefaultIdSourceKeyMetadata.forTable( tableName, "sequence_name", "next_val" ) );
}
@Override
public Map<String,Object> extractEntityTuple(Session session, EntityKey key) {
SessionFactory sessionFactory = session.getSessionFactory();
Cache cache = getEntityCache( sessionFactory, key.getMetadata() );
Object cacheKey = getProvider( sessionFactory ).getKeyProvider().getEntityCacheKey( key );
return (Map<String, Object>) cache.get( cacheKey ).getObjectValue();
}
private static EhcacheDatastoreProvider getProvider(SessionFactory sessionFactory) {
DatastoreProvider provider = ( (SessionFactoryImplementor) sessionFactory ).getServiceRegistry()
.getService( DatastoreProvider.class );
if ( !( EhcacheDatastoreProvider.class.isInstance( provider ) ) ) {
throw new RuntimeException( "Not testing with Ehcache, cannot extract underlying cache" );
}
return EhcacheDatastoreProvider.class.cast( provider );
}
/**
* TODO - EHCache _is_ transactional. Turn this on. We could turn on XA or Local.
* Local will be faster. We will pick this up from the cache config.
*
* @return
*/
@Override
public boolean backendSupportsTransactions() {
return false;
}
@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 EhcacheDialect( (EhcacheDatastoreProvider) datastoreProvider );
}
@Override
public Class<? extends DatastoreConfiguration<?>> getDatastoreConfigurationType() {
return Ehcache.class;
}
}