/*
* ome.io.nio.AbstractFileSystemService
*
* Copyright 2006 University of Dundee. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.io.nio;
import java.io.File;
import java.util.Formatter;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author callan
*
*/
public class AbstractFileSystemService {
/** The logger for this particular class */
private static Logger log = LoggerFactory.getLogger(AbstractFileSystemService.class);
public final static String ROOT_DEFAULT = File.separator + "OMERO"
+ File.separator;
public final static String PIXELS_PATH = "Pixels" + File.separator;
public final static String FILES_PATH = "Files" + File.separator;
public final static String THUMBNAILS_PATH = "Thumbnails" + File.separator;
private final String root;
public AbstractFileSystemService(String path) {
File rootDirectory = new File(path);
if (!rootDirectory.isDirectory() || !rootDirectory.canRead()
|| !rootDirectory.canWrite()) {
throw new IllegalArgumentException(
"Invalid directory specified for file system service."
+ rootDirectory);
}
this.root = rootDirectory.getAbsolutePath();
if (log.isDebugEnabled()) {
log.debug("Using root path: '" + this.root + "'");
}
}
/**
* Makes sure that for a given path, it's subpath exists. For example, given
* the path "/foo/bar/foobar.txt" the method will make sure the directory
* structure "/foo/bar" exists.
*
* @param path
* the path to check for subpath existance.
*/
protected void createSubpath(String path) {
File file = new File(path);
if (!file.exists()) {
File directory = new File(file.getParent());
if (!directory.exists()) {
directory.mkdirs();
}
}
}
/**
* Returns a numbered path relative to the root of this service, but is
* ignorant of FS and similar constructs. For example, given an id of
* 12345 this will return "ROOT/Pixels/Dir-123/Dir-456/123456"
*
* @param id the Pixels identifier
* @return the path relative to the root
*/
public String getPixelsPath(Long id) {
return getPath(PIXELS_PATH, id);
}
/**
* Returns a numbered path relative to the root of this service, but is
* ignorant of FS and similar constructs. For example, given an id of
* 123456 this will return "ROOT/Files/Dir-123/Dir-456/123456"
*
* @param id the Files identifier
* @return the path relative to the root
*/
public String getFilesPath(Long id) {
return getPath(FILES_PATH, id);
}
/**
* Returns a numbered path relative to the root of this service, but is
* ignorant of FS and similar constructs. For example, given an id of
* 123456 this will return "ROOT/Thumbnails/Dir-123/Dir-456/123456"
*
* @param id the thumbnail identifier
* @return the path relative to the root
*/
public String getThumbnailPath(Long id) {
return getPath(THUMBNAILS_PATH, id);
}
private String getPath(String prefix, Long id) {
String suffix = "";
Long remaining = id;
Long dirno = 0L;
if (id == null) {
throw new NullPointerException("Expecting a not-null id.");
}
while (remaining > 999) {
remaining /= 1000;
if (remaining > 0) {
Formatter formatter = new Formatter();
dirno = remaining % 1000;
suffix = formatter.format("Dir-%03d", dirno).out().toString()
+ File.separator + suffix;
}
}
String path = FilenameUtils.concat(root, prefix + suffix + id);
return path;
}
}