package nl.siegmann.epublib.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import nl.siegmann.epublib.domain.MediaType;
import nl.siegmann.epublib.domain.Resource;
import nl.siegmann.epublib.service.MediatypeService;
import org.apache.commons.io.IOUtils;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemException;
import org.apache.commons.vfs.VFS;
import org.slf4j.Logger;import org.slf4j.LoggerFactory;
/**
* Utitilies for making working with apache commons VFS easier.
*
* @author paul
*
*/
public class VFSUtil {
private static final Logger log = LoggerFactory.getLogger(VFSUtil.class);
public static Resource createResource(FileObject rootDir, FileObject file, String inputEncoding) throws IOException {
MediaType mediaType = MediatypeService.determineMediaType(file.getName().getBaseName());
if(mediaType == null) {
return null;
}
String href = calculateHref(rootDir, file);
Resource result = new Resource(null, IOUtils.toByteArray(file.getContent().getInputStream()), href, mediaType);
result.setInputEncoding(inputEncoding);
return result;
}
public static String calculateHref(FileObject rootDir, FileObject currentFile) throws IOException {
String result = currentFile.getName().toString().substring(rootDir.getName().toString().length() + 1);
result += ".html";
return result;
}
/**
* First tries to load the inputLocation via VFS; if that doesn't work it tries to load it as a local File
* @param inputLocation
* @return the FileObject referred to by the inputLocation
* @throws FileSystemException
*/
public static FileObject resolveFileObject(String inputLocation) throws FileSystemException {
FileObject result = null;
try {
result = VFS.getManager().resolveFile(inputLocation);
} catch (Exception e) {
try {
result = VFS.getManager().resolveFile(new File("."), inputLocation);
} catch (Exception e1) {
log.error(e.getMessage(), e);
log.error(e1.getMessage(), e);
}
}
return result;
}
/**
* First tries to load the inputLocation via VFS; if that doesn't work it tries to load it as a local File
*
* @param inputLocation
* @return the InputStream referred to by the inputLocation
* @throws FileSystemException
*/
public static InputStream resolveInputStream(String inputLocation) throws FileSystemException {
InputStream result = null;
try {
result = VFS.getManager().resolveFile(inputLocation).getContent().getInputStream();
} catch (Exception e) {
try {
result = new FileInputStream(inputLocation);
} catch (FileNotFoundException e1) {
log.error(e.getMessage(), e);
log.error(e1.getMessage(), e);
}
}
return result;
}
}