| /* |
| * 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; |
| } |
| } |
| |
| } |