Get rid of threadgroups

This commit is contained in:
Parnassian
2014-02-22 18:51:58 +01:00
parent 09c679d05f
commit 18f10207cc
14 changed files with 86 additions and 96 deletions
+9 -35
View File
@@ -26,13 +26,13 @@ import java.util.TimerTask;
public class Context { public class Context {
public static final HashMap<ThreadGroup, Context> threadGroups = new HashMap<ThreadGroup, Context>(); public static final HashMap<ThreadGroup, Context> threadGroups = new HashMap<ThreadGroup, Context>();
private static ArrayList<Paintable> paintables = new ArrayList<Paintable>(); private static ArrayList<Paintable> paintables = new ArrayList<Paintable>();
private static int id = 1;
private static Context instance;
public boolean added; public boolean added;
private ASMClassLoader classLoader; private ASMClassLoader classLoader;
private ClassPath classPath; private ClassPath classPath;
private ServerProvider serverProvider; private ServerProvider serverProvider;
private int tab;
private Applet gameApplet; private Applet gameApplet;
private HookParser hookParser; private HookParser hookParser;
private Script runningScript; private Script runningScript;
@@ -42,7 +42,7 @@ public class Context {
private Mouse mouse; private Mouse mouse;
private Keyboard keyboard; private Keyboard keyboard;
public Context(final ServerProvider serverProvider) { private Context(final ServerProvider serverProvider) {
threadGroups.put(Thread.currentThread().getThreadGroup(), this); threadGroups.put(Thread.currentThread().getThreadGroup(), this);
this.serverProvider = serverProvider; this.serverProvider = serverProvider;
@@ -50,23 +50,15 @@ public class Context {
this.classPath = new ClassPath(); this.classPath = new ClassPath();
this.classLoader = new ASMClassLoader(classPath); this.classLoader = new ASMClassLoader(classPath);
this.randomHandler = new RandomHandler(); this.randomHandler = new RandomHandler();
this.tab = id;
id++;
} }
/** public static Context getInstance(ServerProvider serverProvider) {
* Resolves the context from threadgroup return instance == null ? instance = new Context(serverProvider) : instance;
*
* @return context
*/
public static Context resolve() {
return threadGroups.get(Thread.currentThread().getThreadGroup());
} }
public static Context currentTab() { public static Context getInstance() {
// TODO return getInstance(null);
return threadGroups.values().iterator().next();
} }
public void setEnvironment() { public void setEnvironment() {
@@ -209,24 +201,6 @@ public class Context {
return classLoader; return classLoader;
} }
/**
* Gets the id of this context
*
* @return id context
*/
public static int getID() {
return id;
}
/**
* Tab id of this context
*
* @return tab id of this context
*/
public int getTab() {
return tab;
}
/** /**
* Adds a paintable instance to the paintables * Adds a paintable instance to the paintables
* *
@@ -25,7 +25,7 @@ public class ASMUtils implements Opcodes {
} }
public static ClassNode getClass(String className) { public static ClassNode getClass(String className) {
Context context = Context.resolve(); Context context = Context.getInstance();
for (ClassNode node : context.getClassPath().classes.values()) { for (ClassNode node : context.getClassPath().classes.values()) {
if (node.name.equals(className)) { if (node.name.equals(className)) {
return node; return node;
@@ -43,7 +43,7 @@ public class PaintDebugger {
} }
public static final PaintDebugger getInstance() { public static final PaintDebugger getInstance() {
return Context.resolve().getPaintDebugger(); return Context.getInstance().getPaintDebugger();
} }
public final void addLine(final String debugLine) { public final void addLine(final String debugLine) {
@@ -21,7 +21,7 @@ public class BotDialog extends JDialog {
setLayout(new BorderLayout()); setLayout(new BorderLayout());
setUndecorated(true); setUndecorated(true);
setBackground(new Color(0, 0, 0, 0)); setBackground(new Color(0, 0, 0, 0));
setContentPane(new PaintComponent(botUI.getSize())); setContentPane(PaintComponent.getInstance(botUI.getSize()));
setPreferredSize(botUI.getSize()); setPreferredSize(botUI.getSize());
setSize(botUI.getSize()); setSize(botUI.getSize());
setVisible(true); setVisible(true);
@@ -7,9 +7,6 @@ import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionAdapter;
import java.util.HashMap;
import java.util.Map;
import javax.swing.Box; import javax.swing.Box;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JButton; import javax.swing.JButton;
@@ -31,7 +28,6 @@ import org.parabot.environment.scripts.Script;
public class BotToolbar extends JToolBar { public class BotToolbar extends JToolBar {
private static final long serialVersionUID = 5373484845104212180L; private static final long serialVersionUID = 5373484845104212180L;
private static BotToolbar instance; private static BotToolbar instance;
private static Map<TabButton, Context> environments = new HashMap<TabButton, Context>();
private JButton tab; private JButton tab;
private final JButton run; private final JButton run;
@@ -110,7 +106,7 @@ public class BotToolbar extends JToolBar {
} }
private void setScriptState(int state) { private void setScriptState(int state) {
Context.currentTab().getRunningScript().setState(state); Context.getInstance().getRunningScript().setState(state);
} }
@@ -140,26 +136,7 @@ public class BotToolbar extends JToolBar {
public void addTab(final Context context, final String name) { public void addTab(final Context context, final String name) {
TabButton b = new TabButton(name); TabButton b = new TabButton(name);
b.setActive(true); b.setActive(true);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final TabButton tabButton = (TabButton) e.getSource();
final Context context = environments.get(tabButton);
for(final TabButton button : environments.keySet()) {
button.setActive(false);
}
tabButton.setActive(true);
if(!context.appletSet()) {
return;
}
GamePanel.getInstance().setContext(context);
}
});
//add(b, getComponentIndex(tab));
add(b, 0); add(b, 0);
environments.put(b, context);
} }
@@ -1,10 +1,14 @@
package org.parabot.core.ui.components; package org.parabot.core.ui.components;
import java.awt.Color; import java.awt.AlphaComposite;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel; import javax.swing.JComponent;
import org.parabot.core.paint.PaintDebugger;
import org.parabot.environment.api.utils.Time;
/** /**
* *
@@ -13,20 +17,58 @@ import javax.swing.JPanel;
* @author Everel * @author Everel
* *
*/ */
public class PaintComponent extends JPanel { public class PaintComponent extends JComponent implements Runnable {
private static final long serialVersionUID = 4653612412080038193L; private static final long serialVersionUID = 4653612412080038193L;
private static PaintComponent instance;
public PaintComponent(Dimension size) { private BufferedImage buffer;
setPreferredSize(size); private Graphics2D g2;
setSize(size); private Dimension dimensions;
private PaintDebugger paintDebugger;
private PaintComponent(Dimension dimensions) {
this.dimensions = dimensions;
this.buffer = new BufferedImage(dimensions.width, dimensions.height, BufferedImage.TYPE_INT_ARGB);
this.g2 = buffer.createGraphics();
setPreferredSize(dimensions);
setSize(dimensions);
setOpaque(false); setOpaque(false);
setDoubleBuffered(true);
}
public static PaintComponent getInstance(Dimension dimensions) {
return instance == null ? instance = new PaintComponent(dimensions) : instance;
}
public static PaintComponent getInstance() {
return getInstance(null);
}
public void startPainting(PaintDebugger paintDebugger) {
this.paintDebugger = paintDebugger;
new Thread(this).start();
} }
@Override @Override
public void paintComponent(Graphics g) { public void paintComponent(Graphics g) {
System.out.println("paint"); super.paintComponent(g);
g.setColor(Color.red); g2.setComposite(AlphaComposite.Clear);
g.drawString("hi", 10, 10); g2.fillRect(0, 0, dimensions.width, dimensions.height);
g2.setComposite(AlphaComposite.SrcOver);
if(paintDebugger != null) {
paintDebugger.debug(g2);
}
g.drawImage(buffer, 0, 0, null);
}
@Override
public void run() {
while(true) {
Time.sleep(15);
repaint();
}
} }
} }
@@ -1,6 +1,5 @@
package org.parabot.environment; package org.parabot.environment;
import org.parabot.core.Context;
import org.parabot.core.Core; import org.parabot.core.Core;
import org.parabot.core.desc.ServerDescription; import org.parabot.core.desc.ServerDescription;
import org.parabot.core.jython.Jython; import org.parabot.core.jython.Jython;
@@ -35,10 +34,7 @@ public class Environment {
Core.verbose("Loading server: " + desc.toString()); Core.verbose("Loading server: " + desc.toString());
final String id = "tab" + Context.getID(); ServerParser.SERVER_CACHE.get(desc).run();
final ThreadGroup bot = new ThreadGroup(id);
ServerParser.SERVER_CACHE.get(desc).run(bot);
} }
} }
@@ -25,7 +25,7 @@ public class Keyboard implements KeyListener {
} }
public static Keyboard getInstance() { public static Keyboard getInstance() {
return Context.resolve().getKeyboard(); return Context.getInstance().getKeyboard();
} }
static { static {
@@ -26,7 +26,7 @@ public class Mouse implements MouseListener, MouseMotionListener {
} }
public static Mouse getInstance() { public static Mouse getInstance() {
return Context.resolve().getMouse(); return Context.getInstance().getMouse();
} }
/** /**
@@ -62,7 +62,7 @@ public class Script implements Runnable {
@Override @Override
public final void run() { public final void run() {
Context context = Context.resolve(); Context context = Context.getInstance();
Core.verbose("Initializing script..."); Core.verbose("Initializing script...");
context.getServerProvider().initScript(this); context.getServerProvider().initScript(this);
@@ -70,7 +70,7 @@ public class Script implements Runnable {
if(!onExecute()) { if(!onExecute()) {
Core.verbose("Script#onExecute returned false, unloading and stopping script..."); Core.verbose("Script#onExecute returned false, unloading and stopping script...");
Context.resolve().getServerProvider().unloadScript(this); context.getServerProvider().unloadScript(this);
this.state = STATE_STOPPED; this.state = STATE_STOPPED;
Core.verbose("Done."); Core.verbose("Done.");
return; return;
@@ -113,9 +113,9 @@ public class Script implements Runnable {
Core.verbose("Script stopped/finished, unloading and stopping..."); Core.verbose("Script stopped/finished, unloading and stopping...");
onFinish(); onFinish();
LogArea.log("Script stopped."); LogArea.log("Script stopped.");
Context.resolve().getServerProvider().unloadScript(this); context.getServerProvider().unloadScript(this);
this.state = STATE_STOPPED; this.state = STATE_STOPPED;
Context.resolve().setRunningScript(null); context.setRunningScript(null);
BotToolbar.getInstance().toggleRun(); BotToolbar.getInstance().toggleRun();
Core.verbose("Done."); Core.verbose("Done.");
} }
@@ -27,7 +27,7 @@ public class LocalServerExecuter extends ServerExecuter {
} }
@Override @Override
public void run(ThreadGroup tg) { public void run() {
// add jar or directory to buildpath. // add jar or directory to buildpath.
if (this.classPath.isJar()) { if (this.classPath.isJar()) {
Core.verbose("Adding server provider jar to buildpath: " Core.verbose("Adding server provider jar to buildpath: "
@@ -43,7 +43,7 @@ public class LocalServerExecuter extends ServerExecuter {
} }
} }
// finalize // finalize
super.finalize(tg, this.serverProvider, this.serverName); super.finalize(this.serverProvider, this.serverName);
} }
} }
@@ -32,7 +32,7 @@ public class PublicServerExecuter extends ServerExecuter {
} }
@Override @Override
public void run(ThreadGroup tg) { public void run() {
try { try {
final File destination = new File(Directories.getCachePath(), final File destination = new File(Directories.getCachePath(),
this.serverID); this.serverID);
@@ -86,7 +86,7 @@ public class PublicServerExecuter extends ServerExecuter {
final Constructor<?> con = providerClass.getConstructor(); final Constructor<?> con = providerClass.getConstructor();
final ServerProvider serverProvider = (ServerProvider) con final ServerProvider serverProvider = (ServerProvider) con
.newInstance(); .newInstance();
super.finalize(tg, serverProvider, this.serverName); super.finalize(serverProvider, this.serverName);
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
UILog.log( UILog.log(
"Error", "Error",
@@ -2,6 +2,7 @@ package org.parabot.environment.servers;
import org.parabot.core.Context; import org.parabot.core.Context;
import org.parabot.core.ui.components.BotToolbar; import org.parabot.core.ui.components.BotToolbar;
import org.parabot.core.ui.components.PaintComponent;
/** /**
* *
@@ -12,17 +13,17 @@ import org.parabot.core.ui.components.BotToolbar;
*/ */
public abstract class ServerExecuter { public abstract class ServerExecuter {
public abstract void run(final ThreadGroup tg); public abstract void run();
public void finalize(final ThreadGroup tg, final ServerProvider provider, final String serverName) { public void finalize(final ServerProvider provider, final String serverName) {
// loads the server and its it to the gui new Thread(new Runnable() {
new Thread(tg, new Runnable() {
@Override @Override
public void run() { public void run() {
try { try {
final Context context = new Context(provider); Context context = Context.getInstance(provider);
BotToolbar.getInstance().addTab(context, serverName); BotToolbar.getInstance().addTab(context, serverName);
context.load(); context.load();
PaintComponent.getInstance().startPainting(context.getPaintDebugger());
} catch (Throwable t) { } catch (Throwable t) {
t.printStackTrace(); t.printStackTrace();
} }
@@ -75,7 +75,7 @@ public abstract class ServerProvider implements Opcodes {
for (Injectable inj : injectables) { for (Injectable inj : injectables) {
inj.inject(); inj.inject();
} }
Context.resolve().setHookParser(parser); Context.getInstance().setHookParser(parser);
} }
private HookFile fetchHookFile() { private HookFile fetchHookFile() {
@@ -106,11 +106,11 @@ public abstract class ServerProvider implements Opcodes {
} }
public void setClientInstance(Object client) { public void setClientInstance(Object client) {
Context.resolve().setClientInstance(client); Context.getInstance().setClientInstance(client);
} }
public void parseJar() { public void parseJar() {
Context.resolve().getClassPath().addJar(getJar()); Context.getInstance().getClassPath().addJar(getJar());
} }
public void initScript(Script script) { public void initScript(Script script) {
@@ -122,7 +122,7 @@ public abstract class ServerProvider implements Opcodes {
} }
public void initMouse() { public void initMouse() {
final Context context = Context.resolve(); final Context context = Context.getInstance();
final Applet applet = context.getApplet(); final Applet applet = context.getApplet();
final Mouse mouse = new Mouse(applet); final Mouse mouse = new Mouse(applet);
applet.addMouseListener(mouse); applet.addMouseListener(mouse);
@@ -131,7 +131,7 @@ public abstract class ServerProvider implements Opcodes {
} }
public void initKeyboard() { public void initKeyboard() {
final Context context = Context.resolve(); final Context context = Context.getInstance();
final Applet applet = context.getApplet(); final Applet applet = context.getApplet();
final Keyboard keyboard = new Keyboard(applet); final Keyboard keyboard = new Keyboard(applet);
applet.addKeyListener(keyboard); applet.addKeyListener(keyboard);