clean up during OSGi bundle shutdown

Change-Id: Ib0b6b203e00a053219bc8076f063dd9f99aa0eba
This commit is contained in:
Axel Uhl
2017-02-08 13:38:54 +01:00
parent ef5c0cf61b
commit a360cd2db4
5 changed files with 56 additions and 10 deletions
@@ -12,3 +12,6 @@ Require-Bundle: com.sap.sailing.domain.common,
com.sap.sailing.domain,
com.sap.sse.common,
com.sap.sse
Import-Package: org.osgi.framework
Bundle-ActivationPolicy: lazy
Bundle-Activator: com.sap.sailing.grib.impl.Activator
@@ -72,5 +72,11 @@ public interface GribWindFieldFactory {
* Use this method to create formatters for the {@code createGribWindField...} methods that require one.
*/
Formatter createLogFormatter(Logger logger, Level level);
/**
* To be called when the bundle shuts down; all resources can be released now, and all persistent file
* caches can be cleaned.
*/
void shutdown();
}
@@ -0,0 +1,21 @@
package com.sap.sailing.grib.impl;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import com.sap.sailing.grib.GribWindFieldFactory;
public class Activator implements BundleActivator {
private GribWindFieldFactory factory;
@Override
public void start(BundleContext context) throws Exception {
factory = GribWindFieldFactoryImpl.INSTANCE;
}
@Override
public void stop(BundleContext context) throws Exception {
factory.shutdown();
}
}
@@ -11,6 +11,7 @@ import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -53,15 +54,7 @@ public class GribWindFieldFactoryImpl implements GribWindFieldFactory {
while (!finished) {
try {
final Reference<? extends GribWindField> ref = referenceQueue.remove();
final File dir;
synchronized (GribWindFieldFactoryImpl.this) {
dir = filesToCleanWhenGribWindFieldNoLongerUsed.remove(ref);
finished = filesToCleanWhenGribWindFieldNoLongerUsed.isEmpty();
if (finished) {
fileSystemCleaner = null;
}
}
rm_rf(dir);
finished = cleanup(ref);
} catch (InterruptedException e) {
logger.log(Level.WARNING, "Interrupted while waiting for weak reference, giving up", e);
finished = true;
@@ -73,7 +66,30 @@ public class GribWindFieldFactoryImpl implements GribWindFieldFactory {
}
}
}
private boolean cleanup(final Reference<? extends GribWindField> ref) {
boolean finished;
final File dir;
synchronized (GribWindFieldFactoryImpl.this) {
dir = filesToCleanWhenGribWindFieldNoLongerUsed.remove(ref);
finished = filesToCleanWhenGribWindFieldNoLongerUsed.isEmpty();
if (finished) {
fileSystemCleaner = null;
}
}
rm_rf(dir);
return finished;
}
@Override
public synchronized void shutdown() {
for (Iterator<WeakReference<GribWindField>> i=filesToCleanWhenGribWindFieldNoLongerUsed.keySet().iterator(); i.hasNext(); ) {
final WeakReference<GribWindField> ref = i.next();
cleanup(ref);
i.remove();
}
}
/**
* Removes directory and all its contents
*/
@@ -86,6 +102,7 @@ public class GribWindFieldFactoryImpl implements GribWindFieldFactory {
f.delete();
}
}
dir.delete();
}
@Override