/*
 * 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.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import org.apache.geode.cache.RegionAttributes;
import org.apache.geode.internal.Assert;

/**
 * UserSpecifiedRegionAttributes provides an way to detect departures from default attribute values.
 * It may be used when collecting attributes from an XML parser or from attribute changes made using
 * the {@link org.apache.geode.cache.AttributesFactory}. Its initial usage was to validate when a
 * user set a value which should not be set (for PartitionedRegions).
 *
 * @since GemFire 5.1
 *
 */
public abstract class UserSpecifiedRegionAttributes<K, V> implements RegionAttributes<K, V> {

  /** The attributes' cache listener */
  private boolean hasCacheListeners = false;
  private boolean hasGatewaySenderId = false;
  private boolean hasAsyncEventListeners = false;
  private boolean hasCacheLoader = false;
  private boolean hasCacheWriter = false;
  private boolean hasEntryIdleTimeout = false;
  private boolean hasCustomEntryIdleTimeout = false;
  private boolean hasEntryTimeToLive = false;
  private boolean hasCustomEntryTimeToLive = false;
  private boolean hasInitialCapacity = false;
  private boolean hasKeyConstraint = false;
  private boolean hasValueConstraint = false;
  private boolean hasLoadFactor = false;
  private boolean hasRegionIdleTimeout = false;
  private boolean hasRegionTimeToLive = false;
  private boolean hasScope = false;
  private boolean hasStatisticsEnabled = false;
  private boolean hasIgnoreJTA = false;
  private boolean hasIsLockGrantor = false;
  private boolean hasConcurrencyLevel = false;
  private boolean hasConcurrencyChecksEnabled = false;
  private boolean hasEarlyAck = false;
  private boolean hasMulticastEnabled = false;
  private boolean hasDiskWriteAttributes = false;
  private boolean hasDiskDirs = false;
  private boolean hasDataPolicy = false;
  private boolean hasPartitionAttributes = false;
  private boolean hasMembershipAttributes = false;
  private boolean hasSubscriptionAttributes = false;
  private boolean hasEvictionAttributes = false;
  private boolean hasCustomEviction = false;

  /**
   * Whether this region has specified a disk store name
   *
   * @since GemFire prPersistSprint2
   */
  private boolean hasDiskStoreName = false;
  private boolean hasDiskSynchronous = false;

  /**
   * Whether this region has publisher explicitly set
   *
   * @since GemFire 4.2.3
   */

  private boolean hasPublisher = false;
  /**
   * Whether this region has enable bridge conflation explicitly set
   *
   * @since GemFire 4.2
   */
  private boolean hasEnableSubscriptionConflation = false;
  /**
   * Whether this region has enable async conflation explicitly set
   *
   * @since GemFire 4.2.3
   */
  private boolean hasEnableAsyncConflation = false;


  private boolean hasIndexMaintenanceSynchronous = false;


  /**
   * Whether this region has a client to server connection pool
   *
   * @since GemFire 5.7
   */
  private boolean hasPoolName = false;
  /**
   * Whether this region has a cloning enabled
   *
   * @since GemFire 6.1
   */
  private boolean hasCloningEnabled = false;

  /**
   * Whether this region has entry value compression.
   *
   * @since GemFire 8.0
   */
  private boolean hasCompressor = false;

  /**
   * Whether this region has enable off-heap memory set.
   *
   * @since Geode 1.0
   */
  private boolean hasOffHeap = false;

  public boolean hasCacheLoader() {
    return this.hasCacheLoader;
  }

  public boolean hasCacheWriter() {
    return this.hasCacheWriter;
  }

  public boolean hasKeyConstraint() {
    return this.hasKeyConstraint;
  }

  public boolean hasValueConstraint() {
    return this.hasValueConstraint;
  }

  public boolean hasRegionTimeToLive() {
    return this.hasRegionTimeToLive;
  }

  public boolean hasRegionIdleTimeout() {
    return this.hasRegionIdleTimeout;
  }

  public boolean hasEntryTimeToLive() {
    return this.hasEntryTimeToLive;
  }

  public boolean hasCustomEntryTimeToLive() {
    return this.hasCustomEntryTimeToLive;
  }

  public boolean hasEntryIdleTimeout() {
    return this.hasEntryIdleTimeout;
  }

  public boolean hasCustomEntryIdleTimeout() {
    return this.hasCustomEntryIdleTimeout;
  }

  public boolean hasMirrorType() {
    return hasDataPolicy();
  }

  public boolean hasDataPolicy() {
    return this.hasDataPolicy;
  }

  public boolean hasScope() {
    return this.hasScope;
  }

  public boolean hasCacheListeners() {
    return this.hasCacheListeners;
  }

  public boolean hasGatewaySenderId() {
    return this.hasGatewaySenderId;
  }

  public boolean hasAsyncEventListeners() {
    return this.hasAsyncEventListeners;
  }

  public boolean hasInitialCapacity() {
    return this.hasInitialCapacity;
  }

  public boolean hasLoadFactor() {
    return this.hasLoadFactor;
  }

  public boolean hasConcurrencyLevel() {
    return this.hasConcurrencyLevel;
  }

  public boolean hasConcurrencyChecksEnabled() {
    return this.hasConcurrencyChecksEnabled;
  }

  public boolean hasStatisticsEnabled() {
    return this.hasStatisticsEnabled;
  }

  public boolean hasIgnoreJTA() {
    return this.hasIgnoreJTA;
  }

  public boolean hasIsLockGrantor() {
    return this.hasIsLockGrantor;
  }

  public boolean hasPersistBackup() {
    return hasDataPolicy();
  }

  public boolean hasEarlyAck() {
    return this.hasEarlyAck;
  }

  public boolean hasMulticastEnabled() {
    return this.hasMulticastEnabled;
  }

  public boolean hasPublisher() {
    return this.hasPublisher;
  }

  public boolean hasPartitionAttributes() {
    return this.hasPartitionAttributes;
  }

  public boolean hasSubscriptionAttributes() {
    return this.hasSubscriptionAttributes;
  }

  public boolean hasEnableSubscriptionConflation() {
    return this.hasEnableSubscriptionConflation;
  }

  public boolean hasEnableAsyncConflation() {
    return this.hasEnableAsyncConflation;
  }

  public boolean hasIndexMaintenanceSynchronous() {
    return this.hasIndexMaintenanceSynchronous;
  }

  public boolean hasDiskWriteAttributes() {
    return this.hasDiskWriteAttributes;
  }

  public boolean hasDiskDirs() {
    return this.hasDiskDirs;
  }

  public boolean hasMembershipAttributes() {
    return this.hasMembershipAttributes;
  }

  public boolean hasEvictionAttributes() {
    return this.hasEvictionAttributes;
  }

  public boolean hasCustomEviction() {
    return this.hasCustomEviction;
  }

  public boolean hasPoolName() {
    return this.hasPoolName;
  }

  public boolean hasCompressor() {
    return this.hasCompressor;
  }

  public boolean hasOffHeap() {
    return this.hasOffHeap;
  }

  public boolean hasCloningEnabled() {
    return this.hasCloningEnabled;
  }

  public boolean hasDiskStoreName() {
    return this.hasDiskStoreName;
  }

  public boolean hasDiskSynchronous() {
    return this.hasDiskSynchronous;
  }

  public void setHasCacheListeners(boolean hasCacheListeners) {
    this.hasCacheListeners = hasCacheListeners;
  }

  public void setHasGatewaySenderIds(boolean hasgatewaySenders) {
    this.hasGatewaySenderId = hasgatewaySenders;
  }

  public void setHasAsyncEventListeners(boolean hasAsyncEventListeners) {
    this.hasAsyncEventListeners = hasAsyncEventListeners;
  }

  public void setHasCacheLoader(boolean hasCacheLoader) {
    this.hasCacheLoader = hasCacheLoader;
  }

  public void setHasCacheWriter(boolean hasCacheWriter) {
    this.hasCacheWriter = hasCacheWriter;
  }

  public void setHasConcurrencyLevel(boolean hasConcurrencyLevel) {
    this.hasConcurrencyLevel = hasConcurrencyLevel;
  }

  public void setHasConcurrencyChecksEnabled(boolean has) {
    this.hasConcurrencyChecksEnabled = has;
  }

  public void setHasDataPolicy(boolean hasDataPolicy) {
    this.hasDataPolicy = hasDataPolicy;
  }

  public void setHasDiskDirs(boolean hasDiskDirs) {
    this.hasDiskDirs = hasDiskDirs;
  }

  public void setHasDiskWriteAttributes(boolean hasDiskWriteAttributes) {
    this.hasDiskWriteAttributes = hasDiskWriteAttributes;
  }

  public void setHasEarlyAck(boolean hasEarlyAck) {
    this.hasEarlyAck = hasEarlyAck;
  }

  public void setHasEnableAsyncConflation(boolean hasEnableAsyncConflation) {
    this.hasEnableAsyncConflation = hasEnableAsyncConflation;
  }

  public void setHasEnableSubscriptionConflation(boolean hasEnableSubscriptionConflation) {
    this.hasEnableSubscriptionConflation = hasEnableSubscriptionConflation;
  }

  public void setHasEntryIdleTimeout(boolean hasEntryIdleTimeout) {
    this.hasEntryIdleTimeout = hasEntryIdleTimeout;
  }

  public void setHasCustomEntryIdleTimeout(boolean has) {
    this.hasCustomEntryIdleTimeout = has;
  }

  public void setHasEntryTimeToLive(boolean hasEntryTimeToLive) {
    this.hasEntryTimeToLive = hasEntryTimeToLive;
  }

  public void setHasCustomEntryTimeToLive(boolean has) {
    this.hasCustomEntryTimeToLive = has;
  }

  public void setHasEvictionAttributes(boolean hasEvictionAttributes) {
    this.hasEvictionAttributes = hasEvictionAttributes;
  }

  public void setHasCustomEviction(boolean hasCustomEviction) {
    this.hasCustomEviction = hasCustomEviction;
  }

  public void setHasIgnoreJTA(boolean hasIgnoreJTA) {
    this.hasIgnoreJTA = hasIgnoreJTA;
  }

  public void setHasIndexMaintenanceSynchronous(boolean hasIndexMaintenanceSynchronous) {
    this.hasIndexMaintenanceSynchronous = hasIndexMaintenanceSynchronous;
  }

  public void setHasInitialCapacity(boolean hasInitialCapacity) {
    this.hasInitialCapacity = hasInitialCapacity;
  }

  public void setHasIsLockGrantor(boolean hasIsLockGrantor) {
    this.hasIsLockGrantor = hasIsLockGrantor;
  }

  public void setHasKeyConstraint(boolean hasKeyConstraint) {
    this.hasKeyConstraint = hasKeyConstraint;
  }

  public void setHasLoadFactor(boolean hasLoadFactor) {
    this.hasLoadFactor = hasLoadFactor;
  }

  public void setHasMembershipAttributes(boolean hasMembershipAttributes) {
    this.hasMembershipAttributes = hasMembershipAttributes;
  }

  public void setHasMulticastEnabled(boolean hasMulticastEnabled) {
    this.hasMulticastEnabled = hasMulticastEnabled;
  }

  public void setHasPartitionAttributes(boolean hasPartitionAttributes) {
    this.hasPartitionAttributes = hasPartitionAttributes;
  }

  public void setHasPublisher(boolean hasPublisher) {
    this.hasPublisher = hasPublisher;
  }

  public void setHasRegionIdleTimeout(boolean hasRegionIdleTimeout) {
    this.hasRegionIdleTimeout = hasRegionIdleTimeout;
  }

  public void setHasRegionTimeToLive(boolean hasRegionTimeToLive) {
    this.hasRegionTimeToLive = hasRegionTimeToLive;
  }

  public void setHasScope(boolean hasScope) {
    this.hasScope = hasScope;
  }

  public void setHasStatisticsEnabled(boolean hasStatisticsEnabled) {
    this.hasStatisticsEnabled = hasStatisticsEnabled;
  }

  public void setHasSubscriptionAttributes(boolean hasSubscriptionAttributes) {
    this.hasSubscriptionAttributes = hasSubscriptionAttributes;
  }

  public void setHasValueConstraint(boolean hasValueConstraint) {
    this.hasValueConstraint = hasValueConstraint;
  }

  /**
   * If set to true then an exception will be thrown at creation time if hasPoolName is not true.
   *
   * @since GemFire 6.5
   */
  public boolean requiresPoolName = false;
  /**
   * Holds index information. Hoisted up to this class in 7.0
   *
   * @since GemFire 6.5
   */
  private List indexes;

  public void setHasPoolName(boolean hasPool) {
    this.hasPoolName = hasPool;
  }

  public void setHasCompressor(boolean hasCompressor) {
    this.hasCompressor = hasCompressor;
  }

  public void setHasOffHeap(boolean hasOffHeap) {
    this.hasOffHeap = hasOffHeap;
  }

  public void setAllHasFields(boolean b) {
    int hasCounter = 0;
    Field thisFields[] = UserSpecifiedRegionAttributes.class.getDeclaredFields();
    for (int i = 0; i < thisFields.length; i++) {
      if (thisFields[i].getName().startsWith("has")) {
        hasCounter++;
        try {
          thisFields[i].setBoolean(this, b);
        } catch (IllegalAccessException ouch) {
          Assert.assertTrue(false,
              "Could not access field" + thisFields[i].getName() + " on " + getClass());
        }
      }
    }
    Assert.assertTrue(hasCounter == HAS_COUNT, "Found " + hasCounter + " methods");
    // this.hasCacheListeners = b;
    // this.hasCacheLoader = b;
    // this.hasCacheWriter = b;
    // this.hasConcurrencyLevel = b;
    // this.hasDataPolicy = b;
    // this.hasDiskDirs = b;
    // this.hasDiskWriteAttributes = b;
    // this.hasEarlyAck = b;
    // this.hasEnableAsyncConflation = b;
    // this.hasEnableSubscriptionConflation = b;
    // this.hasEnableGateway = b;
    // this.hasEntryIdleTimeout = b;
    // this.hasEntryTimeToLive = b;
    // this.hasEvictionAttributes = b;
    // this.hasIgnoreJTA = b;
    // this.hasIndexMaintenanceSynchronous = b;
    // this.hasInitialCapacity = b;
    // this.hasIsLockGrantor = b;
    // this.hasKeyConstraint = b;
    // this.hasLoadFactor = b;
    // this.hasMembershipAttributes = b;
    // this.hasMulticastEnabled = b;
    // this.hasPartitionAttributes = b;
    // this.hasPublisher = b;
    // this.hasRegionIdleTimeout = b;
    // this.hasRegionTimeToLive = b;
    // this.hasScope = b;
    // this.hasStatisticsEnabled = b;
    // this.hasSubscriptionAttributes = b;
    // this.hasValueConstraint = b;
  }

  public void setHasCloningEnabled(boolean val) {
    this.hasCloningEnabled = val;
  }

  public void setHasDiskStoreName(boolean val) {
    this.hasDiskStoreName = val;
  }

  public void setHasDiskSynchronous(boolean val) {
    this.hasDiskSynchronous = val;
  }

  private static final int HAS_COUNT = 41;

  public void initHasFields(UserSpecifiedRegionAttributes<K, V> other) {
    Field thisFields[] = UserSpecifiedRegionAttributes.class.getDeclaredFields();
    Object[] emptyArgs = new Object[] {};
    int hasCounter = 0;
    String fieldName = null;
    for (int i = 0; i < thisFields.length; i++) {
      fieldName = thisFields[i].getName();
      if (fieldName.startsWith("has")) {
        hasCounter++;
        boolean bval = false;

        try {
          Method otherMeth = other.getClass().getMethod(fieldName/* , (Class[])null */);
          bval = ((Boolean) otherMeth.invoke(other, emptyArgs)).booleanValue();
        } catch (NoSuchMethodException darnit) {
          Assert.assertTrue(false, "A has* method accessor is required for field " + fieldName);
        } catch (IllegalAccessException boom) {
          Assert.assertTrue(false, "Could not access method " + fieldName + " on " + getClass());
        } catch (IllegalArgumentException e) {
          Assert.assertTrue(false,
              "Illegal argument trying to set field " + e.getLocalizedMessage());
        } catch (InvocationTargetException e) {
          Assert.assertTrue(false, "Failed trying to invoke method " + e.getLocalizedMessage());
        }

        try {
          thisFields[i].setBoolean(this, bval);
        } catch (IllegalAccessException ouch) {
          Assert.assertTrue(false, "Could not access field" + fieldName + " on " + getClass());
        }
      }
    }
    Assert.assertTrue(hasCounter == HAS_COUNT,
        "Expected " + HAS_COUNT + " methods, got " + hasCounter + " last field: " + fieldName);

    // this.hasCacheListeners = other.hasCacheListeners();
    // this.hasCacheLoader = other.hasCacheLoader();
    // this.hasCacheWriter = other.hasCacheWriter();
    // this.hasConcurrencyLevel = other.hasConcurrencyLevel();
    // this.hasDataPolicy = other.hasDataPolicy();
    // this.hasDiskDirs = other.hasDiskDirs();
    // this.hasDiskWriteAttributes = other.hasDiskWriteAttributes();
    // this.hasEarlyAck = other.hasEarlyAck();
    // this.hasEnableAsyncConflation = other.hasEnableAsyncConflation();
    // this.hasEnableSubscriptionConflation = other.hasEnableSubscriptionConflation();
    // this.hasEnableGateway = other.hasEnableGateway();
    // this.hasEntryIdleTimeout = other.hasEntryIdleTimeout();
    // this.hasEntryTimeToLive = other.hasEntryTimeToLive();
    // this.hasEvictionAttributes = other.hasEvictionAttributes();
    // this.hasIgnoreJTA = other.hasIgnoreJTA();
    // this.hasIndexMaintenanceSynchronous = other.hasIndexMaintenanceSynchronous();
    // this.hasInitialCapacity = other.hasInitialCapacity();
    // this.hasIsLockGrantor = other.hasIsLockGrantor();
    // this.hasKeyConstraint = other.hasKeyConstraint();
    // this.hasLoadFactor = other.hasLoadFactor();
    // this.hasMembershipAttributes = other.hasMembershipAttributes();
    // this.hasMulticastEnabled = other.hasMulticastEnabled();
    // this.hasPartitionAttributes = other.hasPartitionAttributes();
    // this.hasPublisher = other.hasPublisher();
    // this.hasRegionIdleTimeout = other.hasRegionIdleTimeout();
    // this.hasRegionTimeToLive = other.hasRegionTimeToLive();
    // this.hasScope = other.hasScope();
    // this.hasStatisticsEnabled = other.hasStatisticsEnabled();
    // this.hasSubscriptionAttributes = other.hasSubscriptionAttributes();
    // this.hasValueConstraint = other.hasValueConstraint();
  }

  public void setIndexes(List indexes) {
    this.indexes = indexes;
  }

  public List getIndexes() {
    return this.indexes;
  }
}
