/* * 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())); } }