package org.aplikator.server.persistence.tempstore;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.aplikator.client.local.widgets.BinaryFieldWidget;
import org.aplikator.server.Configurator;
import com.google.common.io.ByteStreams;
/**
* @author vlahoda
*/
class FileTempstore implements Tempstore {
private static final Logger LOG = Logger.getLogger(FileTempstore.class.getName());
private File root;
public FileTempstore() {
String rootPath = Configurator.get().getConfig().getString(Configurator.TEMPSTORE_HOME);
root = new File(rootPath);
root.mkdirs();
}
@Override
public String store(String filename, InputStream data, boolean closeInput) {
int index = filename.lastIndexOf(File.separatorChar);//on some systems the filename contains full path
if (index > -1) {
filename = filename.substring(index + 1);
}
String uuid = UUID.randomUUID().toString();
File tempDir = new File(root, uuid);
if (tempDir.mkdir()) {
File targetFile = new File(tempDir, filename);
try {
if (targetFile.createNewFile()) {
FileOutputStream target = new FileOutputStream(targetFile);
try {
ByteStreams.copy(data, target);
return uuid;
} finally {
if (data != null && closeInput) {
data.close();
}
if (target != null) {
target.close();
}
}
}
} catch (IOException e) {
LOG.log(Level.SEVERE, e.toString() + " FILENAME:" + filename + " TEMPDIR:" + tempDir.getPath() + " TARGETFILE:" + targetFile.getPath(), e);
return BinaryFieldWidget.ERROR_PREFIX + e.getMessage();
}
}
return "";
}
@Override
public String storeString(String filename, String data, String charset) {
int index = filename.lastIndexOf(File.separatorChar);//on some systems the filename contains full path
if (index > -1) {
filename = filename.substring(index + 1);
}
String uuid = UUID.randomUUID().toString();
File tempDir = new File(root, uuid);
if (tempDir.mkdir()) {
File targetFile = new File(tempDir, filename);
try {
if (targetFile.createNewFile()) {
FileOutputStream target = new FileOutputStream(targetFile);
try {
byte[] bytes = data.getBytes(charset);
if ("UTF-8".equals(charset)) {
target.write(239);
target.write(187);
target.write(191);
}
target.write(bytes);
return uuid;
} finally {
if (target != null) {
target.flush();
target.close();
}
}
}
} catch (IOException e) {
LOG.log(Level.SEVERE, e.toString() + " FILENAME:" + filename + " TEMPDIR:" + tempDir.getPath() + " TARGETFILE:" + targetFile.getPath(), e);
return BinaryFieldWidget.ERROR_PREFIX + e.getMessage();
}
}
return "";
}
@Override
public String getFilename(String id) {
File tf = getFile(id);
if (tf != null) {
return tf.getName();
}
return "";
}
@Override
public long getFileLength(String id) {
File tf = getFile(id);
if (tf != null) {
return tf.length();
}
return 0;
}
private File getFile(String id) {
File tempDir = new File(root, id);
if (tempDir.exists()) {
File[] tempFiles = tempDir.listFiles();
if (tempFiles.length == 1) {
return tempFiles[0];
}
}
return null;
}
@Override
public InputStream load(String id) {
File tf = getFile(id);
if (tf != null) {
try {
return new FileInputStream(tf);
} catch (FileNotFoundException e) {
LOG.severe(e.toString());
}
}
return null;
}
@Override
public void remove(String id) {
File tf = getFile(id);
File folder = null;
if (tf != null) {
folder = tf.getParentFile();
tf.delete();
}
if (folder != null) {
folder.delete();
}
}
}