/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * 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 util.build;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.HashSet;
import java.util.Set;

abstract class BuildStep implements Comparable<BuildStep> {

    BuildFile inputFile;
    BuildFile outputFile;

    static class BuildFile {
        final File folder;
        final File fileName;

        BuildFile(String folder, String fileName) {
            this.folder = new File(folder);
            this.fileName = new File(this.folder, fileName);
        }
        BuildFile(File file) {
          this.folder = file.getParentFile();
          this.fileName = file;
      }

        String getPath() {
            return fileName.getAbsolutePath();
        }

        @Override
        public int hashCode() {
            return fileName.hashCode();
        }

        @Override
        public boolean equals(Object obj) {
            if (obj == null) return false;
            if (this == obj) return true;
            if (getClass() == obj.getClass()) {
                BuildFile other = (BuildFile) obj;
                return fileName.equals(other.fileName);
            }
            return false;
        }
    }

    BuildStep(BuildFile inputFile, BuildFile outputFile) {
        if (inputFile == null) {
            throw new NullPointerException("inputFile is null");
        }
        if (outputFile == null) {
            throw new NullPointerException("outputFile is null");
        }
        this.inputFile = inputFile;
        this.outputFile = outputFile;
    }

    BuildStep(File output) {
        this.outputFile = new BuildFile(output);
    }

    private Set<BuildStep> children;

    boolean build() {
        if (children != null) {
            for (BuildStep child : children) {
                if (!child.build()) {
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (obj == this) return true;
        return this.getClass() == obj.getClass();
    }

    @Override
    public abstract int hashCode();

    public void addChild(BuildStep child) {
        if (children == null) {
            children = new HashSet<BuildStep>();
        }
        children.add(child);
    }

    public static void copyFile(File in, File out) throws IOException {
        FileChannel inChannel = new FileInputStream(in).getChannel();
        FileChannel outChannel = new FileOutputStream(out).getChannel();
        try {
            inChannel.transferTo(0, inChannel.size(), outChannel);
        } catch (IOException e) {
            throw e;
        } finally {
            if (inChannel != null) inChannel.close();
            if (outChannel != null) outChannel.close();
        }
    }

    public int compareTo(BuildStep o) {
        return (outputFile == o.outputFile ? 0 : outputFile.getPath().compareTo(
                        o.outputFile.getPath()));
    }
}
