mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-20 04:35:32 +00:00
clean up during OSGi bundle shutdown
Change-Id: Ib0b6b203e00a053219bc8076f063dd9f99aa0eba
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
+26
-9
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user