/** ********************************************************************** * * Use is subject to license terms. * * 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 org.mustangproject.ZUGFeRD; import java.io.*; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.logging.Level; import java.util.logging.Logger; /** * This test utility class is providing usability functions for test file resources */ public class ResourceUtilities { private static final Logger LOG = Logger.getLogger(ResourceUtilities.class.getName()); /** * Loading a File into a String using a certain encoding and file path */ public static String readFile(Charset encoding, String path) throws IOException { byte[] content = Files.readAllBytes(Paths.get(path)); return new String(content, encoding); } /** * Saving a String as a file to a certain file path */ public static void saveFile(Charset encoding, String path, String content) throws FileNotFoundException { // resources will be released automatically try (PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(path)), encoding), true)) { out.println(content); } } /** * The relative path of the test file will be resolved and the absolute will be returned * * @param relativeFilePath Path of the test resource relative to src/test/resource/. * @return the absolute path of the test file * @throws FileNotFoundException If the file could not be found */ public static String getAbsolutePath(String relativeFilePath) throws FileNotFoundException { URI uri = null; try { uri = ResourceUtilities.class.getClassLoader().getResource(relativeFilePath).toURI(); uri = new URI(toExternalForm(uri)); } catch (URISyntaxException ex) { LOG.log(Level.SEVERE, null, ex); } if (uri == null) { throw new FileNotFoundException("Could not find the file '" + relativeFilePath + "'!"); } return uri.getPath(); } /** * The relative path of the test file will be resolved and the absolute will be returned * * @param relativeFilePath Path of the test resource relative to src/test/resource/. * @return the URI created based on the relativeFilePath * @throws URISyntaxException if no URI could be created from the given relative path */ public static URI getURI(String relativeFilePath) throws URISyntaxException { String filePath = "file:" + ResourceUtilities.class.getClassLoader().getResource(relativeFilePath).getPath(); filePath = toExternalForm(new URI(filePath)); return new URI(filePath); } /** * The relative path of the test file will be used to determine an absolute * path to a temporary directory in the output directory. * * @param relativeFilePath Path of the test resource relative to src/test/resource/. * @return absolute path to a test output * @throws IOException if no absolute Path could be created. */ public static String getTestOutput(String relativeFilePath) throws IOException { File tempFile = File.createTempFile(relativeFilePath, null); tempFile.deleteOnExit(); return tempFile.getAbsolutePath(); } /** * The Input of the test file will be resolved and the absolute will be returned * * @param relativeFilePath Path of the test resource relative to src/test/resource/. * @return the absolute path of the test file */ public static InputStream getTestResourceAsStream(String relativeFilePath) { return ResourceUtilities.class.getClassLoader().getResourceAsStream(relativeFilePath); } /** * Relative to the test output directory a test file will be returned dependent on the relativeFilePath provided. * * @param relativeFilePath Path of the test output resource relative to target/test-classes/. * @return the empty File of the test output (to be filled) */ public static File newTestOutputFile(String relativeFilePath) { String filepath = null; try { filepath = ResourceUtilities.class.getClassLoader().getResource("").toURI().getPath() + relativeFilePath; } catch (URISyntaxException ex) { LOG.log(Level.SEVERE, null, ex); } return new File(filepath); } /** * @return the absolute path of the test output folder, which is usually target/test-classes/. */ public static String getTestOutputFolder() { String testFolder = null; try { testFolder = ResourceUtilities.class.getClassLoader().getResource("").toURI().getPath(); } catch (URISyntaxException ex) { LOG.log(Level.SEVERE, null, ex); } return testFolder; } public static File getTempTestDirectory() { File tempDir = new File(ResourceUtilities.getTestOutputFolder() + "temp"); tempDir.mkdir(); //if it already exist no problem return tempDir; } /** * To fix the 3 slashes bug for File URI: For example: * file:/C:/work/test.txt -> file:///C:/work/test.txt * * @param u - the File URI * @return the String of the URI */ public static String toExternalForm(URI u) { StringBuilder sb = new StringBuilder(); if (u.getScheme() != null) { sb.append(u.getScheme()); sb.append(':'); } if (u.isOpaque()) { sb.append(u.getSchemeSpecificPart()); } else { if (u.getHost() != null) { sb.append("//"); if (u.getUserInfo() != null) { sb.append(u.getUserInfo()); sb.append('@'); } boolean needBrackets = ((u.getHost().indexOf(':') >= 0) && !u.getHost().startsWith("[") && !u.getHost().endsWith("]")); if (needBrackets) sb.append('['); sb.append(u.getHost()); if (needBrackets) sb.append(']'); if (u.getPort() != -1) { sb.append(':'); sb.append(u.getPort()); } } else if (u.getRawAuthority() != null) { sb.append("//"); sb.append(u.getRawAuthority()); } else { sb.append("//"); } if (u.getRawPath() != null) sb.append(u.getRawPath()); if (u.getRawQuery() != null) { sb.append('?'); sb.append(u.getRawQuery()); } } if (u.getFragment() != null) { sb.append('#'); sb.append(u.getFragment()); } String ret = null; try { ret = new URI(sb.toString()).toASCIIString(); } catch (URISyntaxException ex) { LOG.log(Level.SEVERE, null, ex); } return ret; } private ResourceUtilities() { } }