Inject and load RS client and applet through Guice

Instead of requiring to create client from RuneLite just use Guice for
it and separate applet provider.

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2018-06-07 11:08:39 +02:00
parent 0f0ac2ab64
commit 8909871554
4 changed files with 40 additions and 33 deletions

View File

@@ -31,10 +31,11 @@ import com.google.common.eventbus.EventBus;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.google.inject.Provider;
import java.applet.Applet; import java.applet.Applet;
import java.io.File; import java.io.File;
import java.util.Locale; import java.util.Locale;
import javax.annotation.Nullable;
import javax.inject.Provider;
import javax.inject.Singleton; import javax.inject.Singleton;
import joptsimple.ArgumentAcceptingOptionSpec; import joptsimple.ArgumentAcceptingOptionSpec;
import joptsimple.OptionParser; import joptsimple.OptionParser;
@@ -130,9 +131,6 @@ public class RuneLite
@Inject @Inject
private InfoBoxManager infoBoxManager; private InfoBoxManager infoBoxManager;
@Inject
private ClientLoader clientLoader;
@Inject @Inject
private OverlayManager overlayManager; private OverlayManager overlayManager;
@@ -145,7 +143,13 @@ public class RuneLite
@Inject @Inject
private WorldMapOverlay worldMapOverlay; private WorldMapOverlay worldMapOverlay;
Client client; @Inject
@Nullable
private Applet applet;
@Inject
@Nullable
private Client client;
public static void main(String[] args) throws Exception public static void main(String[] args) throws Exception
{ {
@@ -209,27 +213,23 @@ public class RuneLite
}); });
injector = Guice.createInjector(new RuneLiteModule()); injector = Guice.createInjector(new RuneLiteModule());
injector.getInstance(RuneLite.class).start(getOptions().valueOf(updateMode)); injector.getInstance(ClientLoader.class).setUpdateCheckMode(getOptions().valueOf(updateMode));
injector.getInstance(RuneLite.class).start();
} }
public void start(ClientUpdateCheckMode updateMode) throws Exception public void start() throws Exception
{ {
// Load RuneLite or Vanilla client // Load RuneLite or Vanilla client
clientLoader.setUpdateCheckMode(updateMode); final boolean isOutdated = client == null;
final Applet client = clientLoader.load();
final boolean isOutdated = !(client instanceof Client);
if (!isOutdated) if (!isOutdated)
{ {
this.client = (Client) client;
// Inject members into client // Inject members into client
injector.injectMembers(client); injector.injectMembers(client);
} }
// Initialize UI // Initialize UI
clientUI.init(client); clientUI.init(applet);
// Initialize Discord service // Initialize Discord service
discordService.init(); discordService.init();
@@ -246,7 +246,7 @@ public class RuneLite
eventBus.register(clanManager); eventBus.register(clanManager);
eventBus.register(infoBoxManager); eventBus.register(infoBoxManager);
if (this.client != null) if (!isOutdated)
{ {
eventBus.register(itemManager.get()); eventBus.register(itemManager.get());
} }
@@ -304,10 +304,4 @@ public class RuneLite
{ {
RuneLite.options = options; RuneLite.options = options;
} }
@VisibleForTesting
public void setClient(Client client)
{
this.client = client;
}
} }

View File

@@ -29,8 +29,10 @@ import com.google.common.eventbus.SubscriberExceptionContext;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
import com.google.inject.Provides; import com.google.inject.Provides;
import com.google.inject.name.Names; import com.google.inject.name.Names;
import java.applet.Applet;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import javax.annotation.Nullable;
import javax.inject.Singleton; import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
@@ -44,6 +46,7 @@ import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemManager;
import net.runelite.client.menus.MenuManager; import net.runelite.client.menus.MenuManager;
import net.runelite.client.plugins.PluginManager; import net.runelite.client.plugins.PluginManager;
import net.runelite.client.rs.ClientLoader;
import net.runelite.client.task.Scheduler; import net.runelite.client.task.Scheduler;
import net.runelite.client.util.DeferredEventBus; import net.runelite.client.util.DeferredEventBus;
import net.runelite.client.util.QueryRunner; import net.runelite.client.util.QueryRunner;
@@ -81,9 +84,17 @@ public class RuneLiteModule extends AbstractModule
} }
@Provides @Provides
Client provideClient(RuneLite runeLite) @Singleton
Applet provideApplet(ClientLoader clientLoader)
{ {
return runeLite.client; return clientLoader.load();
}
@Provides
@Singleton
Client provideClient(@Nullable Applet applet)
{
return applet instanceof Client ? (Client) applet : null;
} }
@Provides @Provides

View File

@@ -30,11 +30,13 @@ import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.http.api.updatecheck.UpdateCheckClient; import net.runelite.http.api.updatecheck.UpdateCheckClient;
@Slf4j @Slf4j
@Singleton
public class ClientLoader public class ClientLoader
{ {
private final UpdateCheckClient updateCheckClient = new UpdateCheckClient(); private final UpdateCheckClient updateCheckClient = new UpdateCheckClient();

View File

@@ -31,7 +31,9 @@ import com.google.inject.Injector;
import com.google.inject.Module; import com.google.inject.Module;
import com.google.inject.grapher.graphviz.GraphvizGrapher; import com.google.inject.grapher.graphviz.GraphvizGrapher;
import com.google.inject.grapher.graphviz.GraphvizModule; import com.google.inject.grapher.graphviz.GraphvizModule;
import com.google.inject.testing.fieldbinder.Bind;
import com.google.inject.testing.fieldbinder.BoundFieldModule; import com.google.inject.testing.fieldbinder.BoundFieldModule;
import java.applet.Applet;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -63,11 +65,15 @@ public class PluginManagerTest
@Rule @Rule
public TemporaryFolder folder = new TemporaryFolder(); public TemporaryFolder folder = new TemporaryFolder();
private RuneLite runelite; @Mock
private Set<Class> pluginClasses; @Bind
public Applet applet;
@Mock @Mock
Client client; @Bind
public Client client;
private Set<Class> pluginClasses;
@Before @Before
public void before() throws IOException public void before() throws IOException
@@ -78,8 +84,6 @@ public class PluginManagerTest
BoundFieldModule.of(this)); BoundFieldModule.of(this));
RuneLite.setInjector(injector); RuneLite.setInjector(injector);
runelite = injector.getInstance(RuneLite.class);
// Find plugins we expect to have // Find plugins we expect to have
pluginClasses = new HashSet<>(); pluginClasses = new HashSet<>();
Set<ClassInfo> classes = ClassPath.from(getClass().getClassLoader()).getTopLevelClassesRecursive(PLUGIN_PACKAGE); Set<ClassInfo> classes = ClassPath.from(getClass().getClassLoader()).getTopLevelClassesRecursive(PLUGIN_PACKAGE);
@@ -105,12 +109,10 @@ public class PluginManagerTest
long expected = pluginClasses.stream() long expected = pluginClasses.stream()
.map(cl -> (PluginDescriptor) cl.getAnnotation(PluginDescriptor.class)) .map(cl -> (PluginDescriptor) cl.getAnnotation(PluginDescriptor.class))
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(pd -> pd.loadWhenOutdated()) .filter(PluginDescriptor::loadWhenOutdated)
.count(); .count();
assertEquals(expected, plugins.size()); assertEquals(expected, plugins.size());
runelite.setClient(client);
pluginManager = new PluginManager(); pluginManager = new PluginManager();
pluginManager.loadCorePlugins(); pluginManager.loadCorePlugins();
plugins = pluginManager.getPlugins(); plugins = pluginManager.getPlugins();
@@ -130,8 +132,6 @@ public class PluginManagerTest
modules.add(new GraphvizModule()); modules.add(new GraphvizModule());
modules.add(new RuneLiteModule()); modules.add(new RuneLiteModule());
runelite.setClient(client);
PluginManager pluginManager = new PluginManager(); PluginManager pluginManager = new PluginManager();
pluginManager.loadCorePlugins(); pluginManager.loadCorePlugins();
for (Plugin p : pluginManager.getPlugins()) for (Plugin p : pluginManager.getPlugins())