/*
 * Copyright 2009 Google Inc.
 *
 * 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.gwt.dev.util;

import com.google.gwt.dev.util.NullOutputFileSet.NullOutputStream;
import com.google.gwt.dev.util.collect.HashSet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Set;

/**
 * An {@link OutputFileSet} on a directory.
 */
public class OutputFileSetOnDirectory extends OutputFileSet {
  private final Set<String> createdDirs = new HashSet<String>();
  private final File dir;
  private final String prefix;

  public OutputFileSetOnDirectory(File dir, String prefix) {
    super(dir.getAbsolutePath());
    this.dir = dir;
    this.prefix = prefix;
  }

  @Override
  public void close() {
  }

  @Override
  protected OutputStream createNewOutputStream(String path,
      final long timeStampMillis) throws IOException {
    final File file = pathToFile(path);
    if (file.exists() && timeStampMillis != TIMESTAMP_UNAVAILABLE &&
        file.lastModified() >= timeStampMillis) {
      return new NullOutputStream();
    }

    mkdirs(file.getParentFile());
    return new FileOutputStream(file) {
      @Override
      public void close() throws IOException {
        super.close();
        if (timeStampMillis != TIMESTAMP_UNAVAILABLE) {
          file.setLastModified(timeStampMillis);
        }
      }
    };
  }

  /**
   * A faster bulk version of {@link File#mkdirs()} that avoids recreating the
   * same directory multiple times.
   */
  private void mkdirs(File dir) throws IOException {
    if (dir == null) {
      return;
    }
    String path = dir.getPath();
    if (createdDirs.contains(path)) {
      return;
    }
    createdDirs.add(path);
    if (!dir.exists()) {
      mkdirs(dir.getParentFile());
      if (!dir.mkdir()) {
        throw new IOException("unable to create directory: " + dir.getAbsolutePath());
      }
    }
  }

  private File pathToFile(String path) throws IOException {
    return new File(dir, prefix + path).getCanonicalFile();
  }
}
