/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.test.util.impl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.junit.rules.ExternalResource;
/**
* Provides access to a file that is a copy of a given classpath resource.
*
* <p>Useful to test code that expects actual files on the filesystem using
* resources from a different jar (which are zipped and are not actual files).
*
* @author Yoann Rodiere
*/
public class ClasspathResourceAsFile extends ExternalResource {
private File parentDirectory;
private final URL url;
private File file;
private boolean hasCreatedTempFile;
public ClasspathResourceAsFile(Class<?> clazz, String path) {
this( clazz, path, null );
}
public ClasspathResourceAsFile(Class<?> clazz, String path, File parentDirectory) {
this.url = clazz.getResource( path );
this.parentDirectory = parentDirectory;
}
public File get() {
return file;
}
@Override
protected void before() throws Throwable {
createFileIfNecessary();
}
@Override
protected void after() {
deleteFileIfNecessary();
}
private void createFileIfNecessary() throws IOException {
this.file = FileUtils.toFile( url );
if ( file == null ) {
this.file = File.createTempFile( "classPathResourceAsFile", getOriginalExtension(), parentDirectory );
this.hasCreatedTempFile = true;
try ( InputStream input = url.openStream(); OutputStream output = new FileOutputStream( file ) ) {
IOUtils.copy( input, output );
}
}
}
private void deleteFileIfNecessary() {
try {
if ( hasCreatedTempFile ) {
FileUtils.deleteQuietly( file );
}
}
finally {
this.file = null;
this.hasCreatedTempFile = false;
}
}
private String getOriginalExtension() {
String extension = FilenameUtils.getExtension( url.getFile() );
if ( extension == null || extension.isEmpty() ) {
extension = null;
}
else {
extension = "." + extension;
}
return extension;
}
}