Java tutorial
/** * 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.crunch.test; import java.io.File; import java.io.IOException; import java.util.Set; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.junit.rules.ExternalResource; import org.junit.rules.TemporaryFolder; import org.junit.runner.Description; import org.junit.runners.model.Statement; import com.google.common.collect.ImmutableSet; import com.google.common.io.Files; import com.google.common.io.Resources; /** * Creates a temporary directory for a test case and destroys it afterwards. * * This provides a temporary directory like JUnit's {@link TemporaryFolder} but * geared towards Hadoop applications. Unlike {@link TemporaryFolder}, it * doesn't create any files or directories except for the root directory itself. * * Also, {@link #getDefaultConfiguration()} provides you with a configuration that * overrides path properties with temporary directories. You have to specify these * properties via the constructor. */ public final class TemporaryPath extends ExternalResource { private final TemporaryFolder tmp = new TemporaryFolder(); private final Set<String> confKeys; /** * Construct {@code TemporaryPath}. * @param confKeys {@link Configuration} keys containing directories to override */ public TemporaryPath(String... confKeys) { if (confKeys != null) { this.confKeys = ImmutableSet.copyOf(confKeys); } else { this.confKeys = ImmutableSet.of(); } } public void create() throws Throwable { tmp.create(); } public void delete() { tmp.delete(); } @Override public Statement apply(Statement base, Description description) { return tmp.apply(base, description); } /** * Get the root directory which will be deleted automatically. */ public File getRootFile() { return tmp.getRoot(); } /** * Get the root directory as a {@link Path}. */ public Path getRootPath() { return toPath(tmp.getRoot()); } /** * Get the root directory as an absolute file name. */ public String getRootFileName() { return tmp.getRoot().getAbsolutePath(); } /** * Get a {@link File} below the temporary directory. */ public File getFile(String fileName) { return new File(getRootFile(), fileName); } /** * Get a {@link Path} below the temporary directory. */ public Path getPath(String fileName) { return toPath(getFile(fileName)); } /** * Get an absolute file name below the temporary directory. */ public String getFileName(String fileName) { return getFile(fileName).getAbsolutePath(); } /** * Copy a classpath resource to {@link File}. */ public File copyResourceFile(String resourceName) throws IOException { String baseName = new File(resourceName).getName(); File dest = new File(tmp.getRoot(), baseName); copy(resourceName, dest); return dest; } /** * Copy a classpath resource to a {@link Path}. */ public Path copyResourcePath(String resourceName) throws IOException { return toPath(copyResourceFile(resourceName)); } /** * Copy a classpath resource returning its absolute file name. */ public String copyResourceFileName(String resourceName) throws IOException { return copyResourceFile(resourceName).getAbsolutePath(); } private static void copy(String resourceName, File dest) throws IOException { Resources.asByteSource(Resources.getResource(resourceName)).copyTo(Files.asByteSink(dest)); } private static Path toPath(File file) { return new Path(file.getAbsolutePath()); } public Configuration getDefaultConfiguration() { return overridePathProperties(new Configuration()); } /** * Set all keys specified in the constructor to temporary directories. */ public Configuration overridePathProperties(Configuration config) { for (String name : confKeys) { config.set(name, getFileName("tmp-" + name)); } return config; } }