blob: 3870247cadf6f0c09572c73aeda385c6821e4871 [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.geode.internal.cache;
import java.util.List;
import org.apache.geode.annotations.Immutable;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.internal.cache.xmlcache.CacheServerCreation;
import org.apache.geode.pdx.PdxSerializer;
import org.apache.geode.pdx.ReflectionBasedAutoSerializer;
import org.apache.geode.security.PostProcessor;
import org.apache.geode.security.SecurityManager;
/**
* This is helper class used by CacheFactory to pass the cache configuration values to cache
* creation code.
*
* @since GemFire 6.6
*/
public class CacheConfig {
public static final boolean DEFAULT_PDX_READ_SERIALIZED = false;
@Immutable
public static final PdxSerializer DEFAULT_PDX_SERIALIZER = null;
public static final String DEFAULT_PDX_DISK_STORE = null;
public static final boolean DEFAULT_PDX_PERSISTENT = false;
public static final boolean DEFAULT_PDX_IGNORE_UNREAD_FIELDS = false;
private SecurityManager securityManager = null;
private PostProcessor postProcessor = null;
public boolean pdxReadSerialized = DEFAULT_PDX_READ_SERIALIZED;
/**
* cacheXMLDescription is used to reinitialize the cache after a reconnect. It overrides any
* cache.xml filename setting in distributed system properties.
*/
private String cacheXMLDescription = null;
/**
* list of cache servers to create after auto-reconnect if cluster configuration is being used
*/
private List<CacheServerCreation> cacheServerCreation;
/**
* This indicates if the pdxReadSerialized value is set by user. This is used during cache xml
* parsing. The value set by user api overrides the value set in cache.xml value.
*/
public boolean pdxReadSerializedUserSet = false;
public PdxSerializer pdxSerializer = DEFAULT_PDX_SERIALIZER;
public boolean pdxSerializerUserSet = false;
public String pdxDiskStore = DEFAULT_PDX_DISK_STORE;
public boolean pdxDiskStoreUserSet = false;
public boolean pdxPersistent = DEFAULT_PDX_PERSISTENT;
public boolean pdxPersistentUserSet = false;
public boolean pdxIgnoreUnreadFields = DEFAULT_PDX_IGNORE_UNREAD_FIELDS;
public boolean pdxIgnoreUnreadFieldsUserSet = false;
public boolean isPdxReadSerialized() {
return pdxReadSerialized;
}
public void setPdxReadSerialized(boolean pdxReadSerialized) {
this.pdxReadSerializedUserSet = true;
this.pdxReadSerialized = pdxReadSerialized;
}
public PdxSerializer getPdxSerializer() {
return pdxSerializer;
}
public SecurityManager getSecurityManager() {
return securityManager;
}
public void setSecurityManager(SecurityManager securityManager) {
this.securityManager = securityManager;
}
public void setPdxSerializer(PdxSerializer pdxSerializer) {
pdxSerializerUserSet = true;
this.pdxSerializer = pdxSerializer;
}
public PostProcessor getPostProcessor() {
return postProcessor;
}
public void setPostProcessor(PostProcessor postProcessor) {
this.postProcessor = postProcessor;
}
public String getPdxDiskStore() {
return pdxDiskStore;
}
public void setPdxDiskStore(String pdxDiskStore) {
this.pdxDiskStoreUserSet = true;
this.pdxDiskStore = pdxDiskStore;
}
public boolean isPdxPersistent() {
return pdxPersistent;
}
public void setPdxPersistent(boolean pdxPersistent) {
this.pdxPersistentUserSet = true;
this.pdxPersistent = pdxPersistent;
}
public boolean getPdxIgnoreUnreadFields() {
return this.pdxIgnoreUnreadFields;
}
public void setPdxIgnoreUnreadFields(boolean ignore) {
this.pdxIgnoreUnreadFields = ignore;
this.pdxIgnoreUnreadFieldsUserSet = true;
}
public String getCacheXMLDescription() {
return cacheXMLDescription;
}
public void setCacheXMLDescription(String cacheXMLDescription) {
this.cacheXMLDescription = cacheXMLDescription;
}
public List<CacheServerCreation> getCacheServerCreation() {
return this.cacheServerCreation;
}
public void setCacheServerCreation(List<CacheServerCreation> servers) {
this.cacheServerCreation = servers;
}
public void validateCacheConfig(GemFireCache cacheInstance) {
// To fix bug 44961 only validate our attributes against the existing cache
// if they have been explicitly set by the set.
// So all the following "ifs" check that "*UserSet" is true.
// If they have not then we might use a cache.xml that will specify them.
// Since we don't have the cache.xml info here we need to only complain
// if we are sure that we will be incompatible with the existing cache.
if (this.pdxReadSerializedUserSet
&& this.pdxReadSerialized != cacheInstance.getPdxReadSerialized()) {
throw new IllegalStateException(
String.format("Existing cache has different cache configuration, it has:%s",
"pdxReadSerialized: " + cacheInstance.getPdxReadSerialized()));
}
if (this.pdxDiskStoreUserSet && !equals(this.pdxDiskStore, cacheInstance.getPdxDiskStore())) {
throw new IllegalStateException(
String.format("Existing cache has different cache configuration, it has:%s",
"pdxDiskStore: " + cacheInstance.getPdxDiskStore()));
}
if (this.pdxPersistentUserSet && this.pdxPersistent != cacheInstance.getPdxPersistent()) {
throw new IllegalStateException(
String.format("Existing cache has different cache configuration, it has:%s",
"pdxPersistent: " + cacheInstance.getPdxPersistent()));
}
if (this.pdxIgnoreUnreadFieldsUserSet
&& this.pdxIgnoreUnreadFields != cacheInstance.getPdxIgnoreUnreadFields()) {
throw new IllegalStateException(
String.format("Existing cache has different cache configuration, it has:%s",
"pdxIgnoreUnreadFields: " + cacheInstance.getPdxIgnoreUnreadFields()));
}
if (this.pdxSerializerUserSet
&& !samePdxSerializer(this.pdxSerializer, cacheInstance.getPdxSerializer())) {
throw new IllegalStateException(
String.format("Existing cache has different cache configuration, it has:%s",
"pdxSerializer: " + cacheInstance.getPdxSerializer()));
}
}
private boolean samePdxSerializer(PdxSerializer s1, PdxSerializer s2) {
Object o1 = s1;
Object o2 = s2;
if (s1 instanceof ReflectionBasedAutoSerializer
&& s2 instanceof ReflectionBasedAutoSerializer) {
// Fix for bug 44907.
o1 = ((ReflectionBasedAutoSerializer) s1).getManager();
o2 = ((ReflectionBasedAutoSerializer) s2).getManager();
}
return equals(o1, o2);
}
private boolean equals(Object o1, Object o2) {
if (o1 == null) {
return o2 == null;
}
if (o2 == null) {
return false;
}
return o1.equals(o2);
}
public void setDeclarativeConfig(CacheConfig cacheConfig) {
if (!this.pdxDiskStoreUserSet) {
this.pdxDiskStore = cacheConfig.getPdxDiskStore();
this.pdxDiskStoreUserSet = cacheConfig.pdxDiskStoreUserSet;
}
if (!this.pdxPersistentUserSet) {
this.pdxPersistent = cacheConfig.isPdxPersistent();
this.pdxPersistentUserSet = cacheConfig.pdxPersistentUserSet;
}
if (!this.pdxReadSerializedUserSet) {
this.pdxReadSerialized = cacheConfig.isPdxReadSerialized();
this.pdxReadSerializedUserSet = cacheConfig.pdxReadSerializedUserSet;
}
if (!this.pdxSerializerUserSet) {
this.pdxSerializer = cacheConfig.getPdxSerializer();
this.pdxSerializerUserSet = cacheConfig.pdxSerializerUserSet;
}
if (!this.pdxIgnoreUnreadFieldsUserSet) {
this.pdxIgnoreUnreadFields = cacheConfig.getPdxIgnoreUnreadFields();
this.pdxIgnoreUnreadFieldsUserSet = cacheConfig.pdxIgnoreUnreadFieldsUserSet;
}
}
}