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

/**
 * This is a factory for getting {@link Version} instances. It's aware of the whole
 * {link @Version} hierarchy, so when asked for a {@link Version} that represents
 * a known version ({@link KnownVersion}) it returns a reference to one of those.
 *
 * This ensures that {@link #toString()} on any {@Version}, if that object represents a
 * known version, will render itself as a such.
 */
public class Versioning {
  private Versioning() {}

  /**
   * Find the {@link Version} for the short ordinal value.
   *
   * If the short ordinal represents a known version ({@link KnownVersion}) then return
   * that instead of constructing a new {@link UnknownVersion}.
   *
   * @return a known version ({@link KnownVersion}) if possible, otherwise an
   *         {@link UnknownVersion}.
   */
  public static Version getVersion(final short ordinal) {
    final KnownVersion knownVersion = KnownVersion.getKnownVersionOrDefault(ordinal, null);
    if (knownVersion == null) {
      return new UnknownVersion(ordinal);
    } else {
      return knownVersion;
    }
  }

  /**
   * Return the known version ({@link KnownVersion}) for {@code anyVersion}, if possible.
   * Otherwise return {@code defaultKnownVersion}. This method essentially
   * downcasts a {@link Version} to a known version {@link KnownVersion}.
   *
   * @param anyVersion came from a call to {@link #getVersion(short)}
   * @param defaultKnownVersion will be returned if {@code anyVersion} does not represent
   *        a known version
   * @return a known version
   */
  public static KnownVersion getKnownVersionOrDefault(final Version anyVersion,
      KnownVersion defaultKnownVersion) {
    if (anyVersion instanceof KnownVersion) {
      return (KnownVersion) anyVersion;
    } else {
      return defaultKnownVersion;
    }
  }

}
