// Copyright 2015 The Bazel Authors. All rights reserved.
//
// Licensed 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 com.google.devtools.build.lib.skyframe;

import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import com.google.devtools.build.lib.vfs.RootedPath;

/** Exception indicating that a symlink has an unbounded expansion on resolution. */
@VisibleForSerialization
public class FileSymlinkInfiniteExpansionException extends FileSymlinkException {
  private final ImmutableList<RootedPath> pathToChain;
  private final ImmutableList<RootedPath> chain;

  public FileSymlinkInfiniteExpansionException(
      ImmutableList<RootedPath> pathToChain, ImmutableList<RootedPath> chain) {
    // The infinite expansion has already been reported by
    // FileSymlinkInfiniteExpansionUniquenessValue, but we still want to have a readable
    // #getMessage.
    super("Infinite symlink expansion");
    this.pathToChain = pathToChain;
    this.chain = chain;
  }

  /**
   * The symlink path to the symlink that is the root cause of the infinite expansion. For example,
   * suppose 'a' -> 'b' -> 'c' -> 'd' -> 'c/nope'. The path to the chain is 'a', 'b'.
   */
  @VisibleForSerialization
  public ImmutableList<RootedPath> getPathToChain() {
    return pathToChain;
  }

  /**
   * The symlink chain that is the root cause of the infinite expansion. For example, suppose 'a' ->
   * 'b' -> 'c' -> 'd' -> 'c/nope'. The chain is 'c', 'd', 'c/nope'.
   */
  @VisibleForSerialization
  public ImmutableList<RootedPath> getChain() {
    return chain;
  }

  @Override
  public String getUserFriendlyMessage() {
    return "Infinite symlink expansion: "
        + Joiner.on("- > ").join(Iterables.transform(chain, RootedPath::asPath));
  }
}

