81 lines
2.4 KiB
Java

package p.studio;
import com.fasterxml.jackson.databind.ObjectMapper;
import p.packer.Packer;
import p.studio.events.StudioEventBus;
import p.studio.events.StudioPackerEventAdapter;
import p.studio.utilities.ThemeService;
import p.studio.utilities.i18n.I18nService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
public final class AppContainer implements Container {
private final I18nService i18nService;
private final ThemeService themeService;
private final StudioEventBus studioEventBus;
private final ObjectMapper mapper;
private final EmbeddedPacker embeddedPacker;
private final StudioBackgroundTasks backgroundTasks;
public AppContainer() {
this.i18nService = new I18nService();
this.themeService = new ThemeService();
this.studioEventBus = new StudioEventBus();
this.mapper = new ObjectMapper();
final ExecutorService backgroundExecutor = Executors.newFixedThreadPool(2, new StudioWorkerThreadFactory());
this.backgroundTasks = new StudioBackgroundTasks(backgroundExecutor);
final Packer packer = Packer.bootstrap(this.mapper, new StudioPackerEventAdapter(studioEventBus));
this.embeddedPacker = new EmbeddedPacker(packer.workspaceService(), packer::close);
}
@Override
public I18nService getI18n() {
return i18nService;
}
@Override
public ThemeService getTheme() {
return themeService;
}
@Override
public StudioEventBus getEventBus() {
return studioEventBus;
}
@Override
public ObjectMapper getMapper() {
return mapper;
}
@Override
public EmbeddedPacker getPacker() {
return embeddedPacker;
}
@Override
public StudioBackgroundTasks getBackgroundTasks() {
return backgroundTasks;
}
@Override
public void shutdownContainer() {
embeddedPacker.shutdown();
backgroundTasks.shutdown();
}
private static final class StudioWorkerThreadFactory implements ThreadFactory {
private final AtomicInteger nextId = new AtomicInteger(1);
@Override
public Thread newThread(Runnable runnable) {
final Thread thread = new Thread(runnable, "studio-worker-" + nextId.getAndIncrement());
thread.setDaemon(true);
return thread;
}
}
}