/* * #! * Ontopia Engine * #- * Copyright (C) 2001 - 2013 The Ontopia 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 net.ontopia.utils; import java.io.File; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Set; import net.ontopia.utils.ResourcesDirectoryReader.ResourcesFilterIF; public class TestFileUtils { public static void verifyDirectory(String dir) { File thedir = new File(dir); if (!thedir.exists()) thedir.mkdirs(); } public static void verifyDirectory(String base, String dir) { File thedir = new File(base + File.separator + dir); if (!thedir.exists()) thedir.mkdirs(); } public static void verifyDirectory(String base, String sub1, String sub2) { File thedir = new File(base + File.separator + sub1 + File.separator + sub2); if (!thedir.exists()) thedir.mkdirs(); } public static final String testdataInputRoot = "net/ontopia/testdata/"; private static String testdataOutputRoot = null; public static List<String[]> getTestInputFiles(String baseDirectory, String subDirectory, String filter) { return getTestInputFiles(baseDirectory + "/" + subDirectory, filter); } public static List<String[]> getTestInputFiles(String baseDirectory, String subDirectory, ResourcesFilterIF filter) { return getTestInputFiles(baseDirectory + "/" + subDirectory, filter); } public static List<String[]> getTestInputFiles(String directory, String filter) { String resourcesDirectory = testdataInputRoot + directory; ResourcesDirectoryReader directoryReader = new ResourcesDirectoryReader(resourcesDirectory, filter); return getTestInputFiles(directoryReader, resourcesDirectory); } public static List<String[]> getTestInputFiles(String directory, ResourcesFilterIF filter) { String resourcesDirectory = testdataInputRoot + directory; ResourcesDirectoryReader directoryReader = new ResourcesDirectoryReader(resourcesDirectory, filter); return getTestInputFiles(directoryReader, resourcesDirectory); } public static List<String[]> getTestInputFiles(ResourcesDirectoryReader directoryReader, String resourcesDirectory) { Set<String> resources = directoryReader.getResources(); if (resources.size() == 0) throw new RuntimeException("No resources found in directory " + resourcesDirectory); List<String[]> tests = new ArrayList<String[]>(); for (String resource : resources) { int slashPos = resource.lastIndexOf("/") + 1; String root = resource.substring(0, slashPos); String filename = resource.substring(slashPos); tests.add(new String[] {root, filename}); } return tests; } public static String getTestInputFile(String directory, String filename) { return "classpath:" + testdataInputRoot + directory + "/" + filename; } public static String getTestInputFile(String directory, String subDirectory, String filename) { return getTestInputFile(directory + "/" + subDirectory, filename); } public static String getTestInputFile(String directory, String subDirectory, String subSubDirectory, String filename) { return getTestInputFile(directory + "/" + subDirectory + "/" + subSubDirectory, filename); } private static File getTransferredTestInputFile(String filein, File fileout) throws IOException, FileNotFoundException { if (fileout.exists()) { // file has already been transferred, return as is return fileout; } // transfer test data from resource to file InputStream streamin = StreamUtils.getInputStream(filein); FileOutputStream streamout = new FileOutputStream(fileout); StreamUtils.transfer(streamin, streamout); streamout.close(); streamin.close(); return fileout; } public static File getTransferredTestInputFile(String directory, String filename) throws IOException, FileNotFoundException { return getTransferredTestInputFile( getTestInputFile(directory, filename), getTestOutputFile(directory, filename)); } public static File getTransferredTestInputFile(String directory, String subDirectory, String filename) throws IOException, FileNotFoundException { return getTransferredTestInputFile( getTestInputFile(directory, subDirectory, filename), getTestOutputFile(directory, subDirectory, filename)); } public static File getTransferredTestInputFile(String directory, String subDirectory, String subSubDirectory, String filename) throws IOException, FileNotFoundException { return getTransferredTestInputFile( getTestInputFile(directory, subDirectory, subSubDirectory, filename), getTestOutputFile(directory, subDirectory, subSubDirectory, filename)); } public static void transferTestInputDirectory(String directory) throws IOException { transferTestInputDirectory(new ResourcesDirectoryReader(testdataInputRoot + directory)); } public static void transferTestInputDirectory(String directory, boolean searchSubdirectories) throws IOException { transferTestInputDirectory(new ResourcesDirectoryReader(testdataInputRoot + directory, searchSubdirectories)); } public static void transferTestInputDirectory(String directory, String filter) throws IOException { transferTestInputDirectory(new ResourcesDirectoryReader(testdataInputRoot + directory, filter)); } public static void transferTestInputDirectory(String directory, boolean searchSubdirectories, String filter) throws IOException { transferTestInputDirectory(new ResourcesDirectoryReader(testdataInputRoot + directory, searchSubdirectories, filter)); } public static void transferTestInputDirectory(String directory, ResourcesFilterIF filter) throws IOException { transferTestInputDirectory(new ResourcesDirectoryReader(testdataInputRoot + directory, filter)); } public static void transferTestInputDirectory(String directory, boolean searchSubdirectories, ResourcesFilterIF filter) throws IOException { transferTestInputDirectory(new ResourcesDirectoryReader(testdataInputRoot + directory, searchSubdirectories, filter)); } public static void transferTestInputDirectory(ResourcesDirectoryReader directoryReader) throws IOException { Set<String> resources = directoryReader.getResources(); for (String resource : resources) { int slashPos = resource.lastIndexOf("/") + 1; String root = resource.substring(testdataInputRoot.length(), slashPos); String filename = resource.substring(slashPos); getTransferredTestInputFile(root, filename); } } public static File getTestOutputFile(String directory, String filename) { verifyDirectory(getTestdataOutputDirectory(), directory); return new File(getTestdataOutputDirectory() + File.separator + directory + File.separator + filename); } public static File getTestOutputFile(String directory, String subDirectory, String filename) { return getTestOutputFile(directory + File.separator + subDirectory, filename); } public static File getTestOutputFile(String directory, String subDirectory, String subSubDirectory, String filename) { return getTestOutputFile(directory + File.separator + subDirectory + File.separator + subSubDirectory, filename); } /** * Returns the folder used for test output files */ public static String getTestdataOutputDirectory() { if (testdataOutputRoot == null) { testdataOutputRoot = System.getProperty("net.ontopia.test.root"); // Fall back to the user home directory if (testdataOutputRoot == null) { testdataOutputRoot = System.getProperty("user.dir") + File.separator + "target" + File.separator + "test-data" + File.separator; } // Complain if the directory couldn't be found. if (testdataOutputRoot == null) { throw new OntopiaRuntimeException("Could not find test root directory." + " Please set the 'net.ontopia.test.root'" + " system property."); } // verify the root verifyDirectory(testdataOutputRoot); } return testdataOutputRoot; } }