blob: fe6237a3ab8decc5640895516397a8967d60b438 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.ignite.cache.hibernate;
import org.apache.ignite.Ignite;
import org.hibernate.cache.CacheException;
import org.hibernate.cache.cfg.spi.CollectionDataCachingConfig;
import org.hibernate.cache.cfg.spi.DomainDataRegionBuildingContext;
import org.hibernate.cache.cfg.spi.DomainDataRegionConfig;
import org.hibernate.cache.cfg.spi.EntityDataCachingConfig;
import org.hibernate.cache.cfg.spi.NaturalIdDataCachingConfig;
import org.hibernate.cache.spi.CacheKeysFactory;
import org.hibernate.cache.spi.ExtendedStatisticsSupport;
import org.hibernate.cache.spi.RegionFactory;
import org.hibernate.cache.spi.access.AccessType;
import org.hibernate.cache.spi.access.CollectionDataAccess;
import org.hibernate.cache.spi.access.EntityDataAccess;
import org.hibernate.cache.spi.access.NaturalIdDataAccess;
import org.hibernate.cache.spi.support.AbstractDomainDataRegion;
/**
* Implementation of a region for cacheable domain data.
*/
public class IgniteDomainDataRegion extends AbstractDomainDataRegion implements ExtendedStatisticsSupport {
/** Cache proxy. */
private final HibernateCacheProxy cache;
/** Strategy factory. */
private HibernateAccessStrategyFactory stgyFactory;
/**
* @param regionCfg Domain data region configuration.
* @param regionFactory Region factory.
* @param defKeysFactory Default cache keys factory.
* @param buildingCtx Domain data region building context.
* @param stgyFactory Access strategy factory.
*/
public IgniteDomainDataRegion(DomainDataRegionConfig regionCfg,
RegionFactory regionFactory,
CacheKeysFactory defKeysFactory,
DomainDataRegionBuildingContext buildingCtx,
HibernateAccessStrategyFactory stgyFactory) {
super(regionCfg, regionFactory, defKeysFactory, buildingCtx);
this.stgyFactory = stgyFactory;
cache = stgyFactory.regionCache(getName());
completeInstantiation(regionCfg, buildingCtx);
}
/** {@inheritDoc} */
@Override protected EntityDataAccess generateEntityAccess(EntityDataCachingConfig entityAccessCfg) {
AccessType accessType = entityAccessCfg.getAccessType();
Ignite ignite = stgyFactory.node();
switch (accessType) {
case READ_ONLY:
HibernateAccessStrategyAdapter readOnlyStgy =
stgyFactory.createReadOnlyStrategy(cache);
return new IgniteEntityDataAccess(readOnlyStgy, accessType, getRegionFactory(),
this, ignite, cache);
case NONSTRICT_READ_WRITE:
HibernateAccessStrategyAdapter nonStrictReadWriteStgy =
stgyFactory.createNonStrictReadWriteStrategy(cache);
return new IgniteEntityDataAccess(nonStrictReadWriteStgy, accessType, getRegionFactory(),
this, ignite, cache);
case READ_WRITE:
HibernateAccessStrategyAdapter readWriteStgy =
stgyFactory.createReadWriteStrategy(cache);
return new IgniteEntityDataAccess(readWriteStgy, accessType, getRegionFactory(),
this, ignite, cache);
case TRANSACTIONAL:
HibernateAccessStrategyAdapter transactionalStgy =
stgyFactory.createTransactionalStrategy(cache);
return new IgniteEntityDataAccess(transactionalStgy, accessType, getRegionFactory(),
this, ignite, cache);
default:
throw new IllegalArgumentException("Unknown Hibernate access type: " + accessType);
}
}
/** {@inheritDoc} */
@Override protected CollectionDataAccess generateCollectionAccess(CollectionDataCachingConfig cachingCfg) {
HibernateCacheProxy cache = stgyFactory.regionCache(getName());
AccessType accessType = cachingCfg.getAccessType();
Ignite ignite = stgyFactory.node();
switch (accessType) {
case READ_ONLY:
HibernateAccessStrategyAdapter readOnlyStgy =
stgyFactory.createReadOnlyStrategy(cache);
return new IgniteCollectionDataAccess(readOnlyStgy, accessType, getRegionFactory(),
this, ignite, cache);
case NONSTRICT_READ_WRITE:
HibernateAccessStrategyAdapter nonStrictReadWriteStgy =
stgyFactory.createNonStrictReadWriteStrategy(cache);
return new IgniteCollectionDataAccess(nonStrictReadWriteStgy, accessType, getRegionFactory(),
this, ignite, cache);
case READ_WRITE:
HibernateAccessStrategyAdapter readWriteStgy =
stgyFactory.createReadWriteStrategy(cache);
return new IgniteCollectionDataAccess(readWriteStgy, accessType, getRegionFactory(),
this, ignite, cache);
case TRANSACTIONAL:
HibernateAccessStrategyAdapter transactionalStgy =
stgyFactory.createTransactionalStrategy(cache);
return new IgniteCollectionDataAccess(transactionalStgy, accessType, getRegionFactory(),
this, ignite, cache);
default:
throw new IllegalArgumentException("Unknown Hibernate access type: " + accessType);
}
}
/** {@inheritDoc} */
@Override protected NaturalIdDataAccess generateNaturalIdAccess(NaturalIdDataCachingConfig naturalIdAccessCfg) {
HibernateCacheProxy cache = stgyFactory.regionCache(getName());
AccessType accessType = naturalIdAccessCfg.getAccessType();
Ignite ignite = stgyFactory.node();
switch (accessType) {
case READ_ONLY:
HibernateAccessStrategyAdapter readOnlyStgy =
stgyFactory.createReadOnlyStrategy(cache);
return new IgniteNaturalIdDataAccess(readOnlyStgy, accessType, getRegionFactory(),
this, ignite, cache);
case NONSTRICT_READ_WRITE:
HibernateAccessStrategyAdapter nonStrictReadWriteStgy =
stgyFactory.createNonStrictReadWriteStrategy(cache);
return new IgniteNaturalIdDataAccess(nonStrictReadWriteStgy, accessType, getRegionFactory(),
this, ignite, cache);
case READ_WRITE:
HibernateAccessStrategyAdapter readWriteStgy =
stgyFactory.createReadWriteStrategy(cache);
return new IgniteNaturalIdDataAccess(readWriteStgy, accessType, getRegionFactory(),
this, ignite, cache);
case TRANSACTIONAL:
HibernateAccessStrategyAdapter transactionalStgy =
stgyFactory.createTransactionalStrategy(cache);
return new IgniteNaturalIdDataAccess(transactionalStgy, accessType, getRegionFactory(),
this, ignite, cache);
default:
throw new IllegalArgumentException("Unknown Hibernate access type: " + accessType);
}
}
/** {@inheritDoc} */
@Override public void destroy() throws CacheException {
// no-op
}
/** {@inheritDoc} */
@Override public long getElementCountInMemory() {
return cache.offHeapEntriesCount();
}
/** {@inheritDoc} */
@Override public long getElementCountOnDisk() {
return cache.sizeLong();
}
/** {@inheritDoc} */
@Override public long getSizeInMemory() {
return cache.offHeapAllocatedSize();
}
}