From e682387dfd4252b08e67bf7df96fbbc06fcad7d2 Mon Sep 17 00:00:00 2001 From: Clisprail Date: Sat, 6 Apr 2013 21:02:29 +0200 Subject: [PATCH] Updated whole environment --- .gitignore | 3 + .ssh/.gitignore | 3 + parabotv2/src/org/parabot/Landing.java | 4 + .../src/org/parabot/core/Directories.java | 97 +++++++++++++++++++ .../src/org/parabot/core/WebConstants.java | 1 + .../parabot/core/desc/ServerDescription.java | 11 +++ .../core/parsers/ServerManifestParser.java | 64 ++++++++++-- .../org/parabot/core/ui/ServerSelector.java | 37 +++---- .../parabot/core/ui/widgets/ServerWidget.java | 28 +++--- .../org/parabot/environment/Environment.java | 55 +++++++---- .../environment/servers/ServerProvider.java | 3 +- 11 files changed, 244 insertions(+), 62 deletions(-) create mode 100644 .gitignore create mode 100644 .ssh/.gitignore create mode 100644 parabotv2/src/org/parabot/core/Directories.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..929f44e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/id_rsa +/id_rsa.pub +/known_hosts diff --git a/.ssh/.gitignore b/.ssh/.gitignore new file mode 100644 index 0000000..929f44e --- /dev/null +++ b/.ssh/.gitignore @@ -0,0 +1,3 @@ +/id_rsa +/id_rsa.pub +/known_hosts diff --git a/parabotv2/src/org/parabot/Landing.java b/parabotv2/src/org/parabot/Landing.java index 3f9530e..a94cd68 100644 --- a/parabotv2/src/org/parabot/Landing.java +++ b/parabotv2/src/org/parabot/Landing.java @@ -2,6 +2,8 @@ package org.parabot; import javax.swing.UIManager; +import org.parabot.core.Core; +import org.parabot.core.Directories; import org.parabot.core.ui.ServerSelector; /** @@ -19,6 +21,8 @@ public class Landing { } catch (Throwable t) { t.printStackTrace(); } + Directories.validate(); + Core.enableDevMode(); ServerSelector.getInstance().setVisible(true); } } diff --git a/parabotv2/src/org/parabot/core/Directories.java b/parabotv2/src/org/parabot/core/Directories.java new file mode 100644 index 0000000..bb3a0b7 --- /dev/null +++ b/parabotv2/src/org/parabot/core/Directories.java @@ -0,0 +1,97 @@ +package org.parabot.core; + +import java.io.File; +import java.util.LinkedList; +import java.util.Queue; + +import javax.swing.JFileChooser; +import javax.swing.filechooser.FileSystemView; + +import org.parabot.environment.OperatingSystem; + +/** + * + * @author Clisprail + * @author Matt + * + */ +public class Directories { + + /** + * Gets default user directory + * @return default user director + */ + public static File getDefaultDirectory() { + switch (OperatingSystem.getOS()) { + case WINDOWS: + JFileChooser fr = new JFileChooser(); + FileSystemView fw = fr.getFileSystemView(); + return fw.getDefaultDirectory(); + default: + return new File(System.getProperty("user.home")); + } + } + + /** + * Gets bot workspace + * @return workspace of bot + */ + public static File getWorkspace() { + return new File(getDefaultDirectory(), "/Parabot/"); + } + + /** + * Get script sources path + * @return script sources path + */ + public static File getScriptSourcesPath() { + return new File(getDefaultDirectory(), "/Parabot/scripts/sources/"); + } + + /** + * Get script compiled path + * @return script compiled path + */ + public static File getScriptCompiledPath() { + return new File(getDefaultDirectory(), "/Parabot/scripts/compiled/"); + } + + /** + * Gets settings directory + * @return settings directory + */ + public static File getSettingsPath() { + return new File(getDefaultDirectory(), "/Parabot/settings/"); + } + + /** + * Gets servers directory + * @return servers directory + */ + public static File getServerPath() { + return new File(getDefaultDirectory(), "/Parabot/servers/"); + } + + /** + * Validates all directories and makes them if necessary + */ + public static void validate() { + final File defaultPath = getDefaultDirectory(); + if(defaultPath == null || !defaultPath.exists()) { + throw new RuntimeException("Default path not found"); + } + final Queue files = new LinkedList(); + files.add(getWorkspace()); + files.add(getServerPath()); + files.add(getSettingsPath()); + files.add(getScriptSourcesPath()); + files.add(getScriptCompiledPath()); + while(files.size() > 0) { + final File file = files.poll(); + if(!file.exists()) { + file.mkdirs(); + } + } + } + +} diff --git a/parabotv2/src/org/parabot/core/WebConstants.java b/parabotv2/src/org/parabot/core/WebConstants.java index d400735..f5cf97b 100644 --- a/parabotv2/src/org/parabot/core/WebConstants.java +++ b/parabotv2/src/org/parabot/core/WebConstants.java @@ -2,5 +2,6 @@ package org.parabot.core; public class WebConstants { public static final String HOME = "http://parnassian.host56.com/"; + public static final String SERVER_MANIFEST = HOME + "servers/manifest.dat"; } diff --git a/parabotv2/src/org/parabot/core/desc/ServerDescription.java b/parabotv2/src/org/parabot/core/desc/ServerDescription.java index 99f2b2a..22cf5b9 100644 --- a/parabotv2/src/org/parabot/core/desc/ServerDescription.java +++ b/parabotv2/src/org/parabot/core/desc/ServerDescription.java @@ -1,5 +1,16 @@ package org.parabot.core.desc; public class ServerDescription { + public String serverName = null; + public String author = null; + public int revision = 0; + public int providerIndex = -1; + + public ServerDescription(final String serverName, final String author, final int revision, final int providerIndex) { + this.serverName = serverName; + this.author = author; + this.revision = revision; + this.providerIndex = providerIndex; + } } diff --git a/parabotv2/src/org/parabot/core/parsers/ServerManifestParser.java b/parabotv2/src/org/parabot/core/parsers/ServerManifestParser.java index 5bb8c56..1e09bd5 100644 --- a/parabotv2/src/org/parabot/core/parsers/ServerManifestParser.java +++ b/parabotv2/src/org/parabot/core/parsers/ServerManifestParser.java @@ -1,9 +1,18 @@ package org.parabot.core.parsers; -import java.net.URL; +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.parabot.core.Core; +import org.parabot.core.Directories; +import org.parabot.core.classpath.ClassPath; import org.parabot.core.desc.ServerDescription; +import org.parabot.environment.servers.ServerManifest; +import org.parabot.environment.servers.ServerProvider; +import org.parabot.environment.servers.loader.ServerLoader; /** * @@ -11,11 +20,7 @@ import org.parabot.core.desc.ServerDescription; * */ public class ServerManifestParser { - private URL url = null; - - public ServerManifestParser(final URL url) { - this.url = url; - } + public static Map cache = new HashMap(); /** * Gets server descriptions @@ -33,8 +38,53 @@ public class ServerManifestParser { } private ServerDescription[] localDesc() { - return null; + final ClassPath path = new ClassPath(); + path.loadClasses(Directories.getServerPath(), null); + final ServerLoader loader = new ServerLoader(path); + final List providers = new ArrayList(); + final List descs = new ArrayList(); + for(final String className : loader.getServerClassNames()) { + try { + final Class serverProviderClass = loader.loadClass(className); + final Object annotation = serverProviderClass.getAnnotation(ServerManifest.class); + if(annotation == null) { + throw new RuntimeException("Missing manifest at " + className); + } + final ServerManifest manifest = (ServerManifest) annotation; + final Constructor con = serverProviderClass.getConstructor(); + final ServerProvider server = (ServerProvider) con.newInstance(); + providers.add(server); + descs.add(new ServerDescription(manifest.name(), manifest.author(), 0, providers.size() - 1)); + } catch (Throwable t) { + t.printStackTrace(); + } + } + if(providers.isEmpty()) { + return null; + } + final ServerCache cachedServer = new ServerCache(loader, providers.toArray(new ServerProvider[providers.size()])); + for(final ServerDescription desc : descs) { + cache.put(desc, cachedServer); + } + return descs.toArray(new ServerDescription[descs.size()]); } + public class ServerCache { + private ServerLoader serverLoader = null; + private ServerProvider[] serverProviders = null; + + private ServerCache(final ServerLoader serverLoader, final ServerProvider[] serverProviders) { + this.serverLoader = serverLoader; + this.serverProviders = serverProviders; + } + + public ServerLoader getLoader() { + return serverLoader; + } + + public ServerProvider[] getProviders() { + return serverProviders; + } + } } diff --git a/parabotv2/src/org/parabot/core/ui/ServerSelector.java b/parabotv2/src/org/parabot/core/ui/ServerSelector.java index 2ad56bf..54f1bfb 100644 --- a/parabotv2/src/org/parabot/core/ui/ServerSelector.java +++ b/parabotv2/src/org/parabot/core/ui/ServerSelector.java @@ -1,42 +1,44 @@ package org.parabot.core.ui; import java.awt.Dimension; -import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Queue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; +import org.parabot.core.desc.ServerDescription; +import org.parabot.core.parsers.ServerManifestParser; import org.parabot.core.ui.utils.Center; import org.parabot.core.ui.widgets.ServerWidget; - -public class ServerSelector extends JFrame -{ +public class ServerSelector extends JFrame { private static final long serialVersionUID = 1L; private static ServerSelector instance = null; public static ServerSelector getInstance() { - if(instance != null) { + if (instance != null) { instance.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); return instance; } return instance = new ServerSelector(); } - public ServerSelector() { setLayout(null); - ServerWidget[] widgets = getServers(); + Queue widgets = getServers(); JPanel p = new JPanel(); p.setBounds(0, 0, 400, 800); p.setLayout(null); - p.setPreferredSize(new Dimension(400, widgets.length * 100)); + p.setPreferredSize(new Dimension(400, widgets.size() * 100)); JScrollPane pane = new JScrollPane(p); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - for (int i = 0; i < widgets.length; i++) { - widgets[i].setBounds(0, i * 100, 400, 100); - p.add(widgets[i]); + final int count = widgets.size() - 1; + while (widgets.size() > 0) { + final ServerWidget widget = widgets.poll(); + widget.setBounds(0, (count - widgets.size()) * 100, 400, 100); + p.add(widget); } pane.setBounds(0, 0, 400, 200); pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); @@ -47,12 +49,13 @@ public class ServerSelector extends JFrame Center.centerFramea(this, 406, 228); } - public ServerWidget[] getServers() { - ArrayList widgets = new ArrayList(); - widgets.add(new ServerWidget("RecklessPk", "Clisprail", "317")); - widgets.add(new ServerWidget("Soulsplit", "Clisprail", "317")); - return widgets.toArray(new ServerWidget[widgets.size()]); + public Queue getServers() { + final Queue widgets = new LinkedList(); + for (ServerDescription desc : new ServerManifestParser() + .getDescriptions()) { + widgets.add(new ServerWidget(desc)); + } + return widgets; } } - diff --git a/parabotv2/src/org/parabot/core/ui/widgets/ServerWidget.java b/parabotv2/src/org/parabot/core/ui/widgets/ServerWidget.java index d8af2be..87d4217 100644 --- a/parabotv2/src/org/parabot/core/ui/widgets/ServerWidget.java +++ b/parabotv2/src/org/parabot/core/ui/widgets/ServerWidget.java @@ -7,13 +7,11 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.net.MalformedURLException; -import java.net.URL; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; -import org.parabot.core.WebConstants; +import org.parabot.core.desc.ServerDescription; import org.parabot.environment.Environment; /** @@ -25,27 +23,23 @@ public class ServerWidget extends JPanel { private static final long serialVersionUID = 1L; private String name = null; + public ServerDescription desc = null; final ActionListener play = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - try { - load(new URL(WebConstants.HOME + name - + ".jar"), name); - } catch (MalformedURLException e1) { - e1.printStackTrace(); - } + load(desc, name); } }; - public ServerWidget(final String serverName, final String author, - final String revision) { + public ServerWidget(final ServerDescription desc) { + this.desc = desc; setLayout(null); - this.name = serverName.replaceAll(" ", ""); + this.name = desc.serverName.replaceAll(" ", ""); JLabel l = new JLabel(); l.setFont(new Font("Arial", Font.BOLD, 16)); l.setForeground(Color.white); - l.setText(serverName); + l.setText(desc.serverName); l.setBounds(10, 10, 100, 20); add(l); final Font f = new Font("Arial", Font.PLAIN, 12); @@ -54,13 +48,13 @@ public class ServerWidget extends JPanel { l.setFont(f); l.setForeground(Color.white); l.setBounds(10, 45, 100, 20); - l.setText("Author: " + author); + l.setText("Author: " + desc.author); add(l); l = new JLabel(); l.setFont(f); l.setForeground(Color.white); l.setBounds(10, 60, 100, 20); - l.setText("Revision: " + revision); + l.setText("Revision: " + desc.revision); add(l); final JButton b = new JButton("Start"); b.setFocusable(false); @@ -90,7 +84,7 @@ public class ServerWidget extends JPanel { g2d.fillRect(0, 0, w, h); } - public void load(final URL url, final String serverName) { - Environment.load(url, serverName); + public void load(final ServerDescription desc, final String serverName) { + Environment.load(desc, serverName); } } diff --git a/parabotv2/src/org/parabot/environment/Environment.java b/parabotv2/src/org/parabot/environment/Environment.java index 105d066..dafb980 100644 --- a/parabotv2/src/org/parabot/environment/Environment.java +++ b/parabotv2/src/org/parabot/environment/Environment.java @@ -1,10 +1,12 @@ package org.parabot.environment; import java.lang.reflect.Constructor; -import java.net.URL; - import org.parabot.core.Context; +import org.parabot.core.Core; import org.parabot.core.classpath.ClassPath; +import org.parabot.core.desc.ServerDescription; +import org.parabot.core.parsers.ServerManifestParser; +import org.parabot.core.parsers.ServerManifestParser.ServerCache; import org.parabot.core.ui.BotUI; import org.parabot.core.ui.ServerSelector; import org.parabot.core.ui.components.BotToolbar; @@ -22,38 +24,53 @@ public class Environment { * Loads a new environment * @param url */ - public static void load(final URL url, final String serverName) { + public static void load(final ServerDescription desc, final String serverName) { ServerSelector.getInstance().dispose(); if(!BotUI.getInstance().isVisible()) { BotUI.getInstance().setVisible(true); } - - final ClassPath classPath = new ClassPath(); - classPath.addJar(url.toString()); - - final ServerLoader serverLoader = new ServerLoader(classPath); - final String[] serverProviders = serverLoader.getServerClassNames(); - if (serverProviders == null) { - throw new RuntimeException("No server provided."); + + final ClassPath classPath = Core.isDevMode() ? null : new ClassPath(); + final ServerCache cache = Core.isDevMode() ? ServerManifestParser.cache.get(desc) : null; + + final ServerLoader serverLoader = Core.isDevMode() ? cache.getLoader() : new ServerLoader(classPath); + String[] serverProviders = null; + if(!Core.isDevMode()) { + serverProviders = serverLoader.getServerClassNames(); + if (serverProviders == null) { + throw new RuntimeException("No server provided."); + } } - final String id = "tab" + Context.getID(); final ThreadGroup bot = new ThreadGroup(id); new Thread(bot, new Runnable() { @Override public void run() { try { - final Class serverProviderClass = serverLoader.loadClass(serverProviders[0]); - final Constructor con = serverProviderClass.getConstructor(); - ServerProvider server = (ServerProvider) con.newInstance(); - server.context.setEnvironment(serverLoader); - BotToolbar.getInstance().addTab(server.context, serverName); - server.context.load(); + final ServerProvider server = !Core.isDevMode() ? fetchServerProvider(serverLoader) : cache.getProviders()[desc.providerIndex]; + final Context context = new Context(server); + context.setEnvironment(serverLoader); + BotToolbar.getInstance().addTab(context, serverName); + context.load(); } catch (Throwable t) { - throw new RuntimeException("Error while loading server. " + t.getMessage()); + t.printStackTrace(); } } }).start(); } + + private static ServerProvider fetchServerProvider(ServerLoader loader) { + try { + final String[] serverProviders = loader.getServerClassNames(); + if (serverProviders == null) { + throw new RuntimeException("No server provided."); + } + final Class serverProviderClass = loader.loadClass(serverProviders[0]); + final Constructor con = serverProviderClass.getConstructor(); + return (ServerProvider) con.newInstance(); + } catch (Throwable t) { + throw new RuntimeException("Error while loading server. " + t.getMessage()); + } + } } diff --git a/parabotv2/src/org/parabot/environment/servers/ServerProvider.java b/parabotv2/src/org/parabot/environment/servers/ServerProvider.java index bfd158c..f5c2f88 100644 --- a/parabotv2/src/org/parabot/environment/servers/ServerProvider.java +++ b/parabotv2/src/org/parabot/environment/servers/ServerProvider.java @@ -13,7 +13,6 @@ import org.parabot.core.Context; * */ public abstract class ServerProvider { - public Context context = new Context(this); /** * Hooks to parse @@ -47,7 +46,7 @@ public abstract class ServerProvider { } public void parseJar() { - context.getClassPath().addJar(getJar()); + Context.resolve().getClassPath().addJar(getJar()); } }