blob: 99eace740e96b2ff73ab1cb0db190785112d7391 [file] [log] [blame]
package org.eclipse.osee.ote.internal;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Level;
import org.eclipse.osee.framework.jdk.core.util.io.streams.StreamPumper;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.ote.OTEServerRuntimeCache;
import org.eclipse.osee.ote.io.OTEServerFolder;
public class OTEServerRuntimeCacheImpl implements OTEServerRuntimeCache {
private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd___kk_mm_ss");
private File folder;
private OTEServerFolder oteServerFolder;
public OTEServerRuntimeCacheImpl(){
}
/**
* ds component method
*/
public void start(){
folder = oteServerFolder.getCacheFolder();
if (!folder.exists()) {
if (!folder.mkdirs()) {
OseeLog.log(getClass(), Level.SEVERE, "Could not create JAR cache at " + folder.getAbsolutePath());
}
}
if (!folder.isDirectory()) {
OseeLog.log(getClass(), Level.SEVERE, "The JAR cache is not a directory! Path=" + folder.getAbsolutePath());
}
clean();
}
/**
* ds component method
*/
public void stop(){
}
/**
* ds component method
*/
public void bindOTEServerFolder(OTEServerFolder oteServerFolder){
this.oteServerFolder = oteServerFolder;
}
/**
* ds component method
*/
public void unbindOTEServerFolder(OTEServerFolder oteServerFolder){
this.oteServerFolder = oteServerFolder;
}
@Override
public void clearJarCache() {
File[] bundleFolders = folder.listFiles();
for(File bundleFolder: bundleFolders){
if(bundleFolder.isDirectory()){
File[] jars = bundleFolder.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.getAbsolutePath().endsWith(".jar");
}
});
for(File jar:jars){
jar.delete();
}
} else {
bundleFolder.delete();
}
}
}
@Override
public File save(String symbolicName, String md5Digest, InputStream servedBundleIn) throws IOException {
File namedFolder = new File(folder, symbolicName);
if(namedFolder.exists() && !namedFolder.isDirectory()){
namedFolder.delete();
}
namedFolder.mkdirs();
File newCachedFile = new File(namedFolder, md5Digest + ".jar");
OutputStream cachedFileOut = new FileOutputStream(newCachedFile);
StreamPumper.pumpData(servedBundleIn, cachedFileOut);
cachedFileOut.close();
servedBundleIn.close();
writeDateFile(newCachedFile);
return newCachedFile;
}
@Override
public File get(String symbolicName, String md5Digest) throws FileNotFoundException {
File foundFile = new File(new File(folder, symbolicName), md5Digest + ".jar");
if(foundFile.exists()){
writeDateFile(foundFile);
return foundFile;
}
return null;
}
/**
* Write out a file that has the date a cached file was last accessed. This file will be used to determine when it is ok to remove a file.
*
* @param foundFile
*/
private void writeDateFile(File foundFile) {
File dateFile = new File(foundFile.getParentFile(), foundFile.getName()+ ".date");
FileOutputStream fos = null;
try{
fos = new FileOutputStream(dateFile);
fos.write(formatter.format(new Date()).getBytes());
fos.flush();
} catch(IOException ex) {
OseeLog.log(getClass(), Level.SEVERE, ex);
} finally {
if(fos != null){
try {
fos.close();
} catch (IOException e) {
}
}
}
}
private void clean(){
if(folder.exists()){
File[] bundleFolders = folder.listFiles();
if(bundleFolders != null){
for(File bundleFolder: bundleFolders){
if(bundleFolder.isDirectory()){
File[] jars = bundleFolder.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.getAbsolutePath().endsWith(".jar");
}
});
if(jars.length == 0){
if(bundleFolder.listFiles().length == 0){
bundleFolder.delete();
}
} else {
for(File jar:jars){
File dateFile = new File(jar.getAbsolutePath() + ".date");
if(dateFile.exists()){
if(isDateFileOld(dateFile)){//delete files that haven't been recently used
if(jar.exists()){
jar.delete();
}
dateFile.delete();
}
} else { //delete a jar without a ".date" file
jar.delete();
}
}
}
} else { //delete legacy style cache items
bundleFolder.delete();
}
}
}
}
}
private boolean isDateFileOld(File dateFile) {
String dateStr = getDateFromFile(dateFile);
Date date;
try {
date = formatter.parse(dateStr);
} catch (ParseException e) {
return true;
}
Date oldDate = getOldDate();
if(date.before(oldDate)){
return true;
} else {
return false;
}
}
private String getDateFromFile(File dateFile){
FileInputStream fis = null;
String dateStr = null;
try{
byte[] buffer = new byte[1024];
fis = new FileInputStream(dateFile);
fis.read(buffer);
dateStr = new String(buffer);
} catch(IOException ex) {
OseeLog.log(getClass(), Level.SEVERE, ex);
} finally {
if(fis != null){
try {
fis.close();
} catch (IOException e) {
}
}
}
return dateStr;
}
private Date getOldDate(){
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DAY_OF_MONTH, -7);
return cal.getTime();
}
}