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

import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;

@InterfaceAudience.Private
@InterfaceStability.Evolving

/**
 * Abstract class for deriving exceptions related to filesystem constraints
 */
public abstract class FSLimitException extends QuotaExceededException {
  protected static final long serialVersionUID = 1L;

  protected FSLimitException() {}

  protected FSLimitException(String msg) {
    super(msg);
  }
  
  protected FSLimitException(long quota, long count) {
    super(quota, count);
  }

  /**
   * Path component length is too long
   */
  public static final
  class PathComponentTooLongException extends FSLimitException {
    protected static final long serialVersionUID = 1L;

    private String childName;

    protected PathComponentTooLongException() {}

    protected PathComponentTooLongException(String msg) {
      super(msg);
    }
    
    public PathComponentTooLongException(long quota, long count,
        String parentPath, String childName) {
      super(quota, count);
      setPathName(parentPath);
      this.childName = childName;
    }

    String getParentPath() {
      return pathName;
    }

    @Override
    public String getMessage() {
      return "The maximum path component name limit of " + childName +
      " in directory " + getParentPath() +
      " is exceeded: limit=" + quota + " length=" + count; 
    }
  }

  /**
   * Directory has too many items
   */
  public static final
  class MaxDirectoryItemsExceededException extends FSLimitException {
    protected static final long serialVersionUID = 1L;

    protected MaxDirectoryItemsExceededException() {}

    protected MaxDirectoryItemsExceededException(String msg) {
      super(msg);
    }
    
    public MaxDirectoryItemsExceededException(long quota, long count) {
      super(quota, count);
    }

    @Override
    public String getMessage() {
      return "The directory item limit of " + pathName +
      " is exceeded: limit=" + quota + " items=" + count; 
    }
  }

  /** The given name is illegal. */
  public static final class IllegalNameException extends FSLimitException {
    public static final long serialVersionUID = 1L;
    
    public IllegalNameException() {}

    public IllegalNameException(String msg) {
      super(msg);
    }
  }
}
