/*
* 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.geode.cache.client.internal;
import org.apache.geode.cache.AttributesFactory;
import org.apache.geode.cache.CacheListener;
import org.apache.geode.cache.CustomExpiry;
import org.apache.geode.cache.EvictionAttributes;
import org.apache.geode.cache.ExpirationAttributes;
import org.apache.geode.cache.InterestPolicy;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionAttributes;
import org.apache.geode.cache.RegionExistsException;
import org.apache.geode.cache.Scope;
import org.apache.geode.cache.SubscriptionAttributes;
import org.apache.geode.cache.client.ClientRegionFactory;
import org.apache.geode.cache.client.ClientRegionShortcut;
import org.apache.geode.cache.client.Pool;
import org.apache.geode.compression.Compressor;
import org.apache.geode.internal.cache.GemFireCacheImpl;
import org.apache.geode.internal.cache.LocalRegion;
import org.apache.geode.internal.cache.UserSpecifiedRegionAttributes;
/**
* The distributed system will always default to a loner on a client.
*
* @since GemFire 6.5
*/
public class ClientRegionFactoryImpl<K, V> implements ClientRegionFactory<K, V> {
private final AttributesFactory<K, V> attrsFactory;
private final GemFireCacheImpl cache;
/**
* Constructs a ClientRegionFactory by creating a DistributedSystem and a Cache. If no
* DistributedSystem exists it creates a loner DistributedSystem, otherwise it uses the existing
* DistributedSystem. A default pool will be used unless ... The Region configuration is
* initialized using the given region shortcut.
*
* @param pra the region shortcut to use
*/
public ClientRegionFactoryImpl(GemFireCacheImpl cache, ClientRegionShortcut pra) {
this.cache = cache;
RegionAttributes ra = cache.getRegionAttributes(pra.toString());
if (ra == null) {
throw new IllegalStateException(
"The region shortcut " + pra + " has been removed from " + cache.listRegionAttributes());
}
this.attrsFactory = new AttributesFactory<K, V>(ra);
initAttributeFactoryDefaults();
}
/**
* Constructs a ClientRegionFactory by creating a DistributedSystem and a Cache. If no
* DistributedSystem exists it creates a loner DistributedSystem, otherwise it uses the existing
* DistributedSystem. A default pool will be used unless ... The region configuration is
* initialized using a region attributes whose name was given as the refid.
*
* @param refid the name of the region attributes to use
*/
public ClientRegionFactoryImpl(GemFireCacheImpl cache, String refid) {
this.cache = cache;
RegionAttributes ra = cache.getRegionAttributes(refid);
if (ra == null) {
throw new IllegalStateException(
"The named region attributes \"" + refid + "\" has not been defined.");
}
this.attrsFactory = new AttributesFactory<K, V>(ra);
initAttributeFactoryDefaults();
}
private void initAttributeFactoryDefaults() {
this.attrsFactory.setScope(Scope.LOCAL);
this.attrsFactory.setSubscriptionAttributes(new SubscriptionAttributes(InterestPolicy.ALL));
// this.attrsFactory.setIgnoreJTA(true); in 6.6 and later releases client regions support JTA
}
/**
* Returns the cache used by this factory.
*/
private GemFireCacheImpl getCache() {
return this.cache;
}
private Pool getDefaultPool() {
return getCache().getDefaultPool();
}
public ClientRegionFactory<K, V> addCacheListener(CacheListener<K, V> aListener) {
this.attrsFactory.addCacheListener(aListener);
return this;
}
public ClientRegionFactory<K, V> initCacheListeners(CacheListener<K, V>[] newListeners) {
this.attrsFactory.initCacheListeners(newListeners);
return this;
}
public ClientRegionFactory<K, V> setEvictionAttributes(EvictionAttributes evictionAttributes) {
this.attrsFactory.setEvictionAttributes(evictionAttributes);
return this;
}
public ClientRegionFactory<K, V> setEntryIdleTimeout(ExpirationAttributes idleTimeout) {
this.attrsFactory.setEntryIdleTimeout(idleTimeout);
return this;
}
public ClientRegionFactory<K, V> setCustomEntryIdleTimeout(CustomExpiry<K, V> custom) {
this.attrsFactory.setCustomEntryIdleTimeout(custom);
return this;
}
public ClientRegionFactory<K, V> setEntryTimeToLive(ExpirationAttributes timeToLive) {
this.attrsFactory.setEntryTimeToLive(timeToLive);
return this;
}
public ClientRegionFactory<K, V> setCustomEntryTimeToLive(CustomExpiry<K, V> custom) {
this.attrsFactory.setCustomEntryTimeToLive(custom);
return this;
}
public ClientRegionFactory<K, V> setRegionIdleTimeout(ExpirationAttributes idleTimeout) {
this.attrsFactory.setRegionIdleTimeout(idleTimeout);
return this;
}
public ClientRegionFactory<K, V> setRegionTimeToLive(ExpirationAttributes timeToLive) {
this.attrsFactory.setRegionTimeToLive(timeToLive);
return this;
}
public ClientRegionFactory<K, V> setKeyConstraint(Class<K> keyConstraint) {
this.attrsFactory.setKeyConstraint(keyConstraint);
return this;
}
public ClientRegionFactory<K, V> setValueConstraint(Class<V> valueConstraint) {
this.attrsFactory.setValueConstraint(valueConstraint);
return this;
}
public ClientRegionFactory<K, V> setInitialCapacity(int initialCapacity) {
this.attrsFactory.setInitialCapacity(initialCapacity);
return this;
}
public ClientRegionFactory<K, V> setLoadFactor(float loadFactor) {
this.attrsFactory.setLoadFactor(loadFactor);
return this;
}
public ClientRegionFactory<K, V> setConcurrencyLevel(int concurrencyLevel) {
this.attrsFactory.setConcurrencyLevel(concurrencyLevel);
return this;
}
public void setConcurrencyChecksEnabled(boolean concurrencyChecksEnabled) {
this.attrsFactory.setConcurrencyChecksEnabled(concurrencyChecksEnabled);
}
public ClientRegionFactory<K, V> setDiskStoreName(String name) {
this.attrsFactory.setDiskStoreName(name);
return this;
}
public ClientRegionFactory<K, V> setDiskSynchronous(boolean isSynchronous) {
this.attrsFactory.setDiskSynchronous(isSynchronous);
return this;
}
public ClientRegionFactory<K, V> setStatisticsEnabled(boolean statisticsEnabled) {
this.attrsFactory.setStatisticsEnabled(statisticsEnabled);
return this;
}
public ClientRegionFactory<K, V> setCloningEnabled(boolean cloningEnable) {
this.attrsFactory.setCloningEnabled(cloningEnable);
return this;
}
public ClientRegionFactory<K, V> setPoolName(String poolName) {
this.attrsFactory.setPoolName(poolName);
return this;
}
@Override
public ClientRegionFactory<K, V> setCompressor(Compressor compressor) {
this.attrsFactory.setCompressor(compressor);
return this;
}
@SuppressWarnings("unchecked")
@Override
public Region<K, V> create(String name) throws RegionExistsException {
return getCache().basicCreateRegion(name, createRegionAttributes());
}
@SuppressWarnings("unchecked")
@Override
public Region<K, V> createSubregion(Region<?, ?> parent, String name)
throws RegionExistsException {
return ((LocalRegion) parent).createSubregion(name, createRegionAttributes());
}
@SuppressWarnings("deprecation")
private RegionAttributes<K, V> createRegionAttributes() {
RegionAttributes<K, V> ra = this.attrsFactory.create();
if (ra.getPoolName() == null || "".equals(ra.getPoolName())) {
UserSpecifiedRegionAttributes<K, V> ura = (UserSpecifiedRegionAttributes<K, V>) ra;
if (ura.requiresPoolName) {
Pool dp = getDefaultPool();
if (dp != null) {
this.attrsFactory.setPoolName(dp.getName());
ra = this.attrsFactory.create();
} else {
throw new IllegalStateException("The poolName must be set on a client.");
}
}
}
return ra;
}
// public ClientRegionFactory<K, V> addParallelGatewaySenderId(
// String parallelGatewaySenderId) {
// this.attrsFactory.addParallelGatewaySenderId(parallelGatewaySenderId);
// return this;
// }
//
// public ClientRegionFactory<K, V> addSerialGatewaySenderId(
// String serialGatewaySenderId) {
// this.attrsFactory.addSerialGatewaySenderId(serialGatewaySenderId);
// return this;
// }
}