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

import java.io.ObjectStreamException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.apache.geode.annotations.Immutable;


/**
 * Specifies how the region is affected by resumption of reliability when one or more missing
 * required roles return to the distributed membership. The <code>ResumptionAction</code> is
 * specified when configuring a region's {@link org.apache.geode.cache.MembershipAttributes}.
 *
 * @deprecated this API is scheduled to be removed
 */
@Immutable
public class ResumptionAction implements java.io.Serializable {
  private static final long serialVersionUID = 6632254151314915610L;

  /** No special action takes place when reliability resumes. */
  @Immutable
  public static final ResumptionAction NONE = new ResumptionAction("NONE", 0);

  /**
   * Resumption of reliability causes the region to be cleared of all data and
   * {@link DataPolicy#withReplication replicated} regions will do a new getInitialImage operation
   * to repopulate the region. Any existing references to this region become unusable in that any
   * subsequent methods invoked on those references will throw a
   * {@link RegionReinitializedException}.
   */
  @Immutable
  public static final ResumptionAction REINITIALIZE = new ResumptionAction("REINITIALIZE", 1);

  /** The name of this mirror type. */
  private final transient String name;

  /** byte used as ordinal to represent this Scope */
  public final byte ordinal;

  @Immutable
  private static final ResumptionAction[] PRIVATE_VALUES = {NONE, REINITIALIZE};

  /** List of all ResumptionAction values */
  @Immutable
  public static final List VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

  private Object readResolve() throws ObjectStreamException {
    return PRIVATE_VALUES[ordinal]; // Canonicalize
  }

  /** Creates a new instance of ResumptionAction. */
  private ResumptionAction(String name, int ordinal) {
    this.name = name;
    this.ordinal = (byte) ordinal;
  }

  /** Return the ResumptionAction represented by specified ordinal */
  public static ResumptionAction fromOrdinal(byte ordinal) {
    return PRIVATE_VALUES[ordinal];
  }

  /** Return the ResumptionAction specified by name */
  public static ResumptionAction fromName(String name) {
    if (name == null || name.length() == 0) {
      throw new IllegalArgumentException(
          String.format("Invalid ResumptionAction name: %s",
              name));
    }
    for (int i = 0; i < PRIVATE_VALUES.length; i++) {
      if (name.equals(PRIVATE_VALUES[i].name)) {
        return PRIVATE_VALUES[i];
      }
    }
    throw new IllegalArgumentException(
        String.format("Invalid ResumptionAction name: %s", name));
  }

  /** Returns true if this is <code>NONE</code>. */
  public boolean isNone() {
    return this == NONE;
  }

  /** Returns true if this is <code>REINITIALIZE</code>. */
  public boolean isReinitialize() {
    return this == REINITIALIZE;
  }

  /**
   * Returns a string representation for this resumption action.
   *
   * @return the name of this resumption action
   */
  @Override
  public String toString() {
    return this.name;
  }

}
