/**
 * 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.hadoop.yarn.api.records;

import org.apache.hadoop.yarn.util.Records;

/**
 * Use {@link UpdatedContainer} instead
 */
@Deprecated
public abstract class ContainerResourceDecrease {
  public static ContainerResourceDecrease newInstance(
      ContainerId existingContainerId, Resource targetCapability) {
    ContainerResourceDecrease context = Records
        .newRecord(ContainerResourceDecrease.class);
    context.setContainerId(existingContainerId);
    context.setCapability(targetCapability);
    return context;
  }

  public abstract ContainerId getContainerId();

  public abstract void setContainerId(ContainerId containerId);

  public abstract Resource getCapability();

  public abstract void setCapability(Resource capability);

  @Override
  public int hashCode() {
    return getCapability().hashCode() + getContainerId().hashCode();
  }

  @Override
  public boolean equals(Object other) {
    if (other instanceof ContainerResourceDecrease) {
      ContainerResourceDecrease ctx = (ContainerResourceDecrease)other;

      if (getContainerId() == null && ctx.getContainerId() != null) {
        return false;
      } else if (!getContainerId().equals(ctx.getContainerId())) {
        return false;
      }

      if (getCapability() == null && ctx.getCapability() != null) {
        return false;
      } else if (!getCapability().equals(ctx.getCapability())) {
        return false;
      }

      return true;
    } else {
      return false;
    }
  }
}
