added PerApplicationInjector

master
Stefan Dollase 2017-02-23 23:56:34 +01:00
parent 270908dc7d
commit 875f542ec2
6 changed files with 142 additions and 65 deletions

View File

@ -11,6 +11,7 @@ import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.ParserProperties;
import amidst.dependency.injection.PerApplicationInjector;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledByAny;
import amidst.documentation.CalledOnlyBy;
@ -168,7 +169,7 @@ public class Amidst {
AmidstMetaData metadata,
AmidstSettings settings) {
try {
new Application(parameters, metadata, settings).run();
new PerApplicationInjector(parameters, metadata, settings).getApplication().run();
} catch (DotMinecraftDirectoryNotFoundException e) {
AmidstLogger.warn(e);
AmidstMessageBox.displayError(

View File

@ -1,72 +1,42 @@
package amidst;
import amidst.dependency.injection.Factory0;
import amidst.dependency.injection.Factory1;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledOnlyBy;
import amidst.documentation.NotThreadSafe;
import amidst.fragment.layer.LayerBuilder;
import amidst.gui.license.LicenseWindow;
import amidst.gui.main.MainWindow;
import amidst.gui.main.UpdatePrompt;
import amidst.gui.main.viewer.ViewerFacadeBuilder;
import amidst.gui.profileselect.ProfileSelectWindow;
import amidst.mojangapi.MojangApi;
import amidst.mojangapi.MojangApiBuilder;
import amidst.mojangapi.file.DotMinecraftDirectoryNotFoundException;
import amidst.mojangapi.minecraftinterface.local.LocalMinecraftInterfaceCreationException;
import amidst.mojangapi.world.SeedHistoryLogger;
import amidst.mojangapi.world.WorldBuilder;
import amidst.mojangapi.world.player.PlayerInformationCacheImpl;
import amidst.settings.biomeprofile.BiomeProfileDirectory;
import amidst.threading.ThreadMaster;
@NotThreadSafe
public class Application {
private final CommandLineParameters parameters;
private final AmidstMetaData metadata;
private final AmidstSettings settings;
private final MojangApi mojangApi;
private final BiomeProfileDirectory biomeProfileDirectory;
private final ThreadMaster threadMaster;
private final ViewerFacadeBuilder viewerFacadeBuilder;
private final Factory1<MainWindow, UpdatePrompt> noisyUpdatePromptFactory;
private final Factory0<UpdatePrompt> silentUpdatePromptFactory;
private final Factory0<MainWindow> mainWindowFactory;
private final Factory0<ProfileSelectWindow> profileSelectWindowFactory;
private final Factory0<LicenseWindow> licenseWindowFactory;
private volatile ProfileSelectWindow profileSelectWindow;
private volatile MainWindow mainWindow;
@CalledOnlyBy(AmidstThread.EDT)
public Application(CommandLineParameters parameters, AmidstMetaData metadata, AmidstSettings settings)
throws DotMinecraftDirectoryNotFoundException,
LocalMinecraftInterfaceCreationException {
this.parameters = parameters;
this.metadata = metadata;
this.settings = settings;
this.mojangApi = createMojangApi();
this.biomeProfileDirectory = createBiomeProfileDirectory();
this.threadMaster = createThreadMaster();
this.viewerFacadeBuilder = createViewerFacadeBuilder();
}
@CalledOnlyBy(AmidstThread.EDT)
private MojangApi createMojangApi()
throws DotMinecraftDirectoryNotFoundException,
LocalMinecraftInterfaceCreationException {
return new MojangApiBuilder(
new WorldBuilder(new PlayerInformationCacheImpl(), SeedHistoryLogger.from(parameters.seedHistoryFile)),
parameters).construct();
}
@CalledOnlyBy(AmidstThread.EDT)
private BiomeProfileDirectory createBiomeProfileDirectory() {
return BiomeProfileDirectory.create(parameters.biomeProfilesDirectory);
}
@CalledOnlyBy(AmidstThread.EDT)
private ThreadMaster createThreadMaster() {
return new ThreadMaster();
}
@CalledOnlyBy(AmidstThread.EDT)
private ViewerFacadeBuilder createViewerFacadeBuilder() {
return new ViewerFacadeBuilder(settings, threadMaster.getWorkerExecutor(), new LayerBuilder());
public Application(
MojangApi mojangApi,
Factory1<MainWindow, UpdatePrompt> noisyUpdatePromptFactory,
Factory0<UpdatePrompt> silentUpdatePromptFactory,
Factory0<MainWindow> mainWindowFactory,
Factory0<ProfileSelectWindow> profileSelectWindowFactory,
Factory0<LicenseWindow> licenseWindowFactory) {
this.mojangApi = mojangApi;
this.noisyUpdatePromptFactory = noisyUpdatePromptFactory;
this.silentUpdatePromptFactory = silentUpdatePromptFactory;
this.mainWindowFactory = mainWindowFactory;
this.profileSelectWindowFactory = profileSelectWindowFactory;
this.licenseWindowFactory = licenseWindowFactory;
}
@CalledOnlyBy(AmidstThread.EDT)
@ -81,32 +51,23 @@ public class Application {
@CalledOnlyBy(AmidstThread.EDT)
public void checkForUpdates(MainWindow mainWindow) {
UpdatePrompt.from(metadata.getVersion(), threadMaster.getWorkerExecutor(), mainWindow, false).check();
noisyUpdatePromptFactory.create(mainWindow).check();
}
@CalledOnlyBy(AmidstThread.EDT)
public void checkForUpdatesSilently() {
UpdatePrompt.from(metadata.getVersion(), threadMaster.getWorkerExecutor(), null, true).check();
silentUpdatePromptFactory.create().check();
}
@CalledOnlyBy(AmidstThread.EDT)
public void displayMainWindow() {
setMainWindow(
new MainWindow(
this,
metadata,
settings,
mojangApi,
biomeProfileDirectory,
viewerFacadeBuilder,
threadMaster));
setMainWindow(mainWindowFactory.create());
setProfileSelectWindow(null);
}
@CalledOnlyBy(AmidstThread.EDT)
public void displayProfileSelectWindow() {
setProfileSelectWindow(
new ProfileSelectWindow(this, metadata, threadMaster.getWorkerExecutor(), mojangApi, settings));
setProfileSelectWindow(profileSelectWindowFactory.create());
setMainWindow(null);
}
@ -140,7 +101,7 @@ public class Application {
@CalledOnlyBy(AmidstThread.EDT)
public void displayLicenseWindow() {
new LicenseWindow(metadata);
licenseWindowFactory.create();
}
@CalledOnlyBy(AmidstThread.EDT)

View File

@ -0,0 +1,5 @@
package amidst.dependency.injection;
public interface Factory0<R> {
R create();
}

View File

@ -0,0 +1,5 @@
package amidst.dependency.injection;
public interface Factory1<P1, R> {
R create(P1 p1);
}

View File

@ -0,0 +1,5 @@
package amidst.dependency.injection;
public interface Factory2<P1, P2, R> {
R create(P1 p1, P2 p2);
}

View File

@ -0,0 +1,100 @@
package amidst.dependency.injection;
import amidst.AmidstMetaData;
import amidst.AmidstSettings;
import amidst.Application;
import amidst.CommandLineParameters;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledOnlyBy;
import amidst.documentation.NotThreadSafe;
import amidst.fragment.layer.LayerBuilder;
import amidst.gui.license.LicenseWindow;
import amidst.gui.main.MainWindow;
import amidst.gui.main.UpdatePrompt;
import amidst.gui.main.viewer.ViewerFacadeBuilder;
import amidst.gui.profileselect.ProfileSelectWindow;
import amidst.mojangapi.MojangApi;
import amidst.mojangapi.MojangApiBuilder;
import amidst.mojangapi.file.DotMinecraftDirectoryNotFoundException;
import amidst.mojangapi.minecraftinterface.local.LocalMinecraftInterfaceCreationException;
import amidst.mojangapi.world.SeedHistoryLogger;
import amidst.mojangapi.world.WorldBuilder;
import amidst.mojangapi.world.player.PlayerInformationCache;
import amidst.mojangapi.world.player.PlayerInformationCacheImpl;
import amidst.settings.biomeprofile.BiomeProfileDirectory;
import amidst.threading.ThreadMaster;
@NotThreadSafe
public class PerApplicationInjector {
private final AmidstMetaData metadata;
private final AmidstSettings settings;
private final PlayerInformationCache playerInformationCache;
private final SeedHistoryLogger seedHistoryLogger;
private final WorldBuilder worldBuilder;
private final MojangApi mojangApi;
private final BiomeProfileDirectory biomeProfileDirectory;
private final ThreadMaster threadMaster;
private final LayerBuilder layerBuilder;
private final ViewerFacadeBuilder viewerFacadeBuilder;
private final Application application;
@CalledOnlyBy(AmidstThread.EDT)
public PerApplicationInjector(CommandLineParameters parameters, AmidstMetaData metadata, AmidstSettings settings)
throws DotMinecraftDirectoryNotFoundException,
LocalMinecraftInterfaceCreationException {
this.metadata = metadata;
this.settings = settings;
this.playerInformationCache = new PlayerInformationCacheImpl();
this.seedHistoryLogger = SeedHistoryLogger.from(parameters.seedHistoryFile);
this.worldBuilder = new WorldBuilder(playerInformationCache, seedHistoryLogger);
this.mojangApi = new MojangApiBuilder(worldBuilder, parameters).construct();
this.biomeProfileDirectory = BiomeProfileDirectory.create(parameters.biomeProfilesDirectory);
this.threadMaster = new ThreadMaster();
this.layerBuilder = new LayerBuilder();
this.viewerFacadeBuilder = new ViewerFacadeBuilder(settings, threadMaster.getWorkerExecutor(), layerBuilder);
this.application = new Application(
mojangApi,
this::createNoisyUpdatePrompt,
this::createSilentUpdatePrompt,
this::createMainWindow,
this::createProfileSelectWindow,
this::createLicenseWindow);
}
@CalledOnlyBy(AmidstThread.EDT)
public Application getApplication() {
return application;
}
@CalledOnlyBy(AmidstThread.EDT)
private UpdatePrompt createNoisyUpdatePrompt(MainWindow mainWindow) {
return UpdatePrompt.from(metadata.getVersion(), threadMaster.getWorkerExecutor(), mainWindow, false);
}
@CalledOnlyBy(AmidstThread.EDT)
private UpdatePrompt createSilentUpdatePrompt() {
return UpdatePrompt.from(metadata.getVersion(), threadMaster.getWorkerExecutor(), null, true);
}
@CalledOnlyBy(AmidstThread.EDT)
private MainWindow createMainWindow() {
return new MainWindow(
application,
metadata,
settings,
mojangApi,
biomeProfileDirectory,
viewerFacadeBuilder,
threadMaster);
}
@CalledOnlyBy(AmidstThread.EDT)
private ProfileSelectWindow createProfileSelectWindow() {
return new ProfileSelectWindow(application, metadata, threadMaster.getWorkerExecutor(), mojangApi, settings);
}
@CalledOnlyBy(AmidstThread.EDT)
private LicenseWindow createLicenseWindow() {
return new LicenseWindow(metadata);
}
}