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.Inject;
import com.google.inject.Injector;
import com.google.inject.Provider;
import java.applet.Applet;
import java.io.File;
import java.util.Locale;
import javax.annotation.Nullable;
import javax.inject.Provider;
import javax.inject.Singleton;
import joptsimple.ArgumentAcceptingOptionSpec;
import joptsimple.OptionParser;
@@ -130,9 +131,6 @@ public class RuneLite
@Inject
private InfoBoxManager infoBoxManager;
@Inject
private ClientLoader clientLoader;
@Inject
private OverlayManager overlayManager;
@@ -145,7 +143,13 @@ public class RuneLite
@Inject
private WorldMapOverlay worldMapOverlay;
Client client;
@Inject
@Nullable
private Applet applet;
@Inject
@Nullable
private Client client;
public static void main(String[] args) throws Exception
{
@@ -209,27 +213,23 @@ public class RuneLite
});
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
clientLoader.setUpdateCheckMode(updateMode);
final Applet client = clientLoader.load();
final boolean isOutdated = !(client instanceof Client);
final boolean isOutdated = client == null;
if (!isOutdated)
{
this.client = (Client) client;
// Inject members into client
injector.injectMembers(client);
}
// Initialize UI
clientUI.init(client);
clientUI.init(applet);
// Initialize Discord service
discordService.init();
@@ -246,7 +246,7 @@ public class RuneLite
eventBus.register(clanManager);
eventBus.register(infoBoxManager);
if (this.client != null)
if (!isOutdated)
{
eventBus.register(itemManager.get());
}
@@ -304,10 +304,4 @@ public class RuneLite
{
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.Provides;
import com.google.inject.name.Names;
import java.applet.Applet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import javax.annotation.Nullable;
import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
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.menus.MenuManager;
import net.runelite.client.plugins.PluginManager;
import net.runelite.client.rs.ClientLoader;
import net.runelite.client.task.Scheduler;
import net.runelite.client.util.DeferredEventBus;
import net.runelite.client.util.QueryRunner;
@@ -81,9 +84,17 @@ public class RuneLiteModule extends AbstractModule
}
@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

View File

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