package net.ayld.facade.bundle.impl;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.jar.JarFile;
import net.ayld.facade.event.model.JarExtractionStartEvent;
import net.ayld.facade.model.ExplodedJar;
import org.springframework.beans.factory.annotation.Required;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
public class CuncurrentManualJarExploder extends ManualJarExploder {
private ExecutorService threadPool;
@Override
public Set<ExplodedJar> explode(Set<JarFile> jars) throws IOException {
eventBus.post(new JarExtractionStartEvent("Starting concurrent extraction", this.getClass()));
final Set<ExplodedJar> result = Sets.newHashSet();
final Set<Callable<ExplodedJar>> extractionTasks = Sets.newHashSetWithExpectedSize(jars.size());
for (final JarFile jar : jars) {
final Callable<ExplodedJar> extractionTask = new Callable<ExplodedJar>() {
@Override
public ExplodedJar call() throws Exception {
return explode(jar);
}
};
extractionTasks.add(extractionTask);
}
try {
final List<Future<ExplodedJar>> futures = threadPool.invokeAll(extractionTasks);
for (Future<ExplodedJar> f : futures) {
result.add(f.get());
}
threadPool.shutdown();
threadPool.awaitTermination(1, TimeUnit.DAYS); // FOREVER !!!
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
return ImmutableSet.copyOf(result);
}
@Required
public void setThreadPool(ExecutorService threadPool) {
this.threadPool = threadPool;
}
}