From b143a5a44d0ef9e7474c0d853b9b238a92500d5c Mon Sep 17 00:00:00 2001 From: magenoxx Date: Sun, 14 Nov 2010 17:01:12 +0000 Subject: [PATCH] Done Issue 16: Games played counter plugin. --- Mage.Client/plugins/mage-counter-plugin.jar | Bin 0 -> 5594 bytes .../src/main/java/mage/client/MageFrame.java | 15 +- .../main/java/mage/client/game/GamePanel.java | 6 +- .../java/mage/client/plugins/MagePlugins.java | 3 + .../mage/client/plugins/impl/Plugins.java | 42 ++++- .../main/java/mage/client/remote/Client.java | 5 + .../src/mage/interfaces/MageException.java | 8 +- .../src/mage/interfaces/PluginException.java | 20 +++ .../mage/interfaces/plugin/CounterPlugin.java | 15 ++ Mage.Plugins/Mage.Card.Plugin/pom.xml | 22 --- Mage.Plugins/Mage.Counter.Plugin/pom.xml | 58 +++++++ .../org/mage/plugins/counter/CounterBean.java | 30 ++++ .../plugins/counter/CounterPluginImpl.java | 149 ++++++++++++++++++ Mage.Plugins/pom.xml | 1 + 14 files changed, 342 insertions(+), 32 deletions(-) create mode 100644 Mage.Client/plugins/mage-counter-plugin.jar create mode 100644 Mage.Common/src/mage/interfaces/PluginException.java create mode 100644 Mage.Common/src/mage/interfaces/plugin/CounterPlugin.java create mode 100644 Mage.Plugins/Mage.Counter.Plugin/pom.xml create mode 100644 Mage.Plugins/Mage.Counter.Plugin/src/main/java/org/mage/plugins/counter/CounterBean.java create mode 100644 Mage.Plugins/Mage.Counter.Plugin/src/main/java/org/mage/plugins/counter/CounterPluginImpl.java diff --git a/Mage.Client/plugins/mage-counter-plugin.jar b/Mage.Client/plugins/mage-counter-plugin.jar new file mode 100644 index 0000000000000000000000000000000000000000..7114efce248e723838f50102f2d1b128fe5c2515 GIT binary patch literal 5594 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 fIRSqf`e_Gen}&)4?)g)$i ui); MagePermanent getMagePermanent(PermanentView card, BigCard bigCard, CardDimensions dimension, UUID gameId); boolean isCardPluginLoaded(); + boolean isCounterPluginLoaded(); void sortPermanents(Map ui, Collection permanents); void downloadImage(Set allCards); + int getGamesPlayed(); + int addGamesPlayed(); } diff --git a/Mage.Client/src/main/java/mage/client/plugins/impl/Plugins.java b/Mage.Client/src/main/java/mage/client/plugins/impl/Plugins.java index ef786e7562b..872b61f5626 100644 --- a/Mage.Client/src/main/java/mage/client/plugins/impl/Plugins.java +++ b/Mage.Client/src/main/java/mage/client/plugins/impl/Plugins.java @@ -2,7 +2,6 @@ package mage.client.plugins.impl; import java.io.File; import java.util.Collection; -import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -13,7 +12,6 @@ import javax.swing.JComponent; import mage.cards.Card; import mage.cards.CardDimensions; -import mage.cards.ExpansionSet; import mage.cards.MagePermanent; import mage.cards.action.impl.EmptyCallback; import mage.client.cards.BigCard; @@ -22,9 +20,10 @@ import mage.client.plugins.MagePlugins; import mage.client.util.Config; import mage.client.util.DefaultActionCallback; import mage.constants.Constants; +import mage.interfaces.PluginException; import mage.interfaces.plugin.CardPlugin; +import mage.interfaces.plugin.CounterPlugin; import mage.interfaces.plugin.ThemePlugin; -import mage.sets.Sets; import mage.util.Logging; import mage.view.PermanentView; import net.xeoh.plugins.base.PluginManager; @@ -38,6 +37,7 @@ public class Plugins implements MagePlugins { private static PluginManager pm; private final static Logger logger = Logging.getLogger(Plugins.class.getName()); private CardPlugin cardPlugin = null; + private CounterPlugin counterPlugin = null; protected static DefaultActionCallback defaultCallback = DefaultActionCallback.getInstance(); private static final EmptyCallback emptyCallback = new EmptyCallback(); @@ -51,6 +51,7 @@ public class Plugins implements MagePlugins { pm = PluginManagerFactory.createPluginManager(); pm.addPluginsFrom(new File(Constants.PLUGINS_DIRECTORY).toURI()); this.cardPlugin = pm.getPlugin(CardPlugin.class); + this.counterPlugin = pm.getPlugin(CounterPlugin.class); logger.log(Level.INFO, "Done."); } @@ -91,4 +92,39 @@ public class Plugins implements MagePlugins { public void downloadImage(Set allCards) { if (this.cardPlugin != null) this.cardPlugin.downloadImages(allCards); } + + @Override + public int getGamesPlayed() { + if (this.counterPlugin != null) { + synchronized(Plugins.class) { + try { + return this.counterPlugin.getGamePlayed(); + } catch (PluginException e) { + logger.log(Level.SEVERE, e.getMessage()); + throw new RuntimeException(e); + } + } + } + return -1; + } + + @Override + public int addGamesPlayed() { + if (this.counterPlugin != null) { + synchronized(Plugins.class) { + try { + this.counterPlugin.addGamePlayed(); + } catch (PluginException e) { + logger.log(Level.SEVERE, e.getMessage()); + throw new RuntimeException(e); + } + } + } + return 0; + } + + @Override + public boolean isCounterPluginLoaded() { + return this.counterPlugin != null; + } } diff --git a/Mage.Client/src/main/java/mage/client/remote/Client.java b/Mage.Client/src/main/java/mage/client/remote/Client.java index 38707263d78..2747fc3b2b5 100644 --- a/Mage.Client/src/main/java/mage/client/remote/Client.java +++ b/Mage.Client/src/main/java/mage/client/remote/Client.java @@ -35,6 +35,7 @@ import java.util.logging.Logger; import javax.swing.JOptionPane; import mage.client.MageFrame; import mage.client.chat.ChatPanel; +import mage.client.plugins.impl.Plugins; import mage.interfaces.callback.CallbackClient; import mage.interfaces.callback.ClientCallback; import mage.util.Logging; @@ -169,6 +170,10 @@ public class Client implements CallbackClient { catch (Exception ex) { handleException(ex); } + + if (Plugins.getInstance().isCounterPluginLoaded()) { + Plugins.getInstance().addGamesPlayed(); + } } protected void watchGame(UUID gameId) { diff --git a/Mage.Common/src/mage/interfaces/MageException.java b/Mage.Common/src/mage/interfaces/MageException.java index 47b0914e207..202c5bae20f 100644 --- a/Mage.Common/src/mage/interfaces/MageException.java +++ b/Mage.Common/src/mage/interfaces/MageException.java @@ -29,13 +29,19 @@ package mage.interfaces; /** - * + * Root application exception. + * * @author BetaSteward_at_googlemail.com */ public class MageException extends Exception { + private static final long serialVersionUID = 8340806803178193696L; + public MageException(String message) { super(message); } + public MageException(Throwable t) { + super(t); + } } diff --git a/Mage.Common/src/mage/interfaces/PluginException.java b/Mage.Common/src/mage/interfaces/PluginException.java new file mode 100644 index 00000000000..ffd0ef8bd97 --- /dev/null +++ b/Mage.Common/src/mage/interfaces/PluginException.java @@ -0,0 +1,20 @@ +package mage.interfaces; + +/** + * Exception thrown by plugin on errors. + * + * @author nantuko + * + */ +public class PluginException extends MageException { + + private static final long serialVersionUID = 5528005696138392272L; + + public PluginException(String message) { + super(message); + } + + public PluginException(Throwable t) { + super(t); + } +} diff --git a/Mage.Common/src/mage/interfaces/plugin/CounterPlugin.java b/Mage.Common/src/mage/interfaces/plugin/CounterPlugin.java new file mode 100644 index 00000000000..84efc1537c8 --- /dev/null +++ b/Mage.Common/src/mage/interfaces/plugin/CounterPlugin.java @@ -0,0 +1,15 @@ +package mage.interfaces.plugin; + +import mage.interfaces.PluginException; +import net.xeoh.plugins.base.Plugin; + +/** + * Interface for counter plugins + * + * @version 0.1 14.112010 + * @author nantuko + */ +public interface CounterPlugin extends Plugin { + void addGamePlayed() throws PluginException; + int getGamePlayed() throws PluginException; +} diff --git a/Mage.Plugins/Mage.Card.Plugin/pom.xml b/Mage.Plugins/Mage.Card.Plugin/pom.xml index 2e0ea047534..f8ca19ceb0c 100644 --- a/Mage.Plugins/Mage.Card.Plugin/pom.xml +++ b/Mage.Plugins/Mage.Card.Plugin/pom.xml @@ -58,28 +58,6 @@ - - org.apache.maven.plugins - maven-shade-plugin - 1.4 - - - package - - shade - - - true - - - log4j:log4j:jar: - - - - - - - mage-card-plugin diff --git a/Mage.Plugins/Mage.Counter.Plugin/pom.xml b/Mage.Plugins/Mage.Counter.Plugin/pom.xml new file mode 100644 index 00000000000..acd2b7fbf3f --- /dev/null +++ b/Mage.Plugins/Mage.Counter.Plugin/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + + org.mage + Mage-Plugins + 0.3 + + + org.mage + Mage-Counter-Plugin + jar + 0.3 + Mage Counter Plugin + Implements game counter to display amount of games played + + + + org.mage + Mage-Common + ${mage-version} + + + com.googlecode.jspf + jspf-core + ${jspf-version} + + + log4j + log4j + 1.2.9 + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + + + mage-counter-plugin + + + + 0.3 + 0.9.1 + + diff --git a/Mage.Plugins/Mage.Counter.Plugin/src/main/java/org/mage/plugins/counter/CounterBean.java b/Mage.Plugins/Mage.Counter.Plugin/src/main/java/org/mage/plugins/counter/CounterBean.java new file mode 100644 index 00000000000..8d931c2753c --- /dev/null +++ b/Mage.Plugins/Mage.Counter.Plugin/src/main/java/org/mage/plugins/counter/CounterBean.java @@ -0,0 +1,30 @@ +package org.mage.plugins.counter; + +import java.io.Serializable; + +/** + * Class for storing plugin data. + * + * @version 1.0 int version & int gamesPlayed fields + * @author nantuko + */ +public class CounterBean implements Serializable { + + private static final long serialVersionUID = 6382055182568871761L; + + private int gamesPlayed; + + private int version = 1; + + public int getGamesPlayed() { + return gamesPlayed; + } + + public void setGamesPlayed(int gamesPlayed) { + this.gamesPlayed = gamesPlayed; + } + + public final int getVersion() { + return version; + } +} diff --git a/Mage.Plugins/Mage.Counter.Plugin/src/main/java/org/mage/plugins/counter/CounterPluginImpl.java b/Mage.Plugins/Mage.Counter.Plugin/src/main/java/org/mage/plugins/counter/CounterPluginImpl.java new file mode 100644 index 00000000000..ff7b957e5d6 --- /dev/null +++ b/Mage.Plugins/Mage.Counter.Plugin/src/main/java/org/mage/plugins/counter/CounterPluginImpl.java @@ -0,0 +1,149 @@ +package org.mage.plugins.counter; + +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +import mage.interfaces.PluginException; +import mage.interfaces.plugin.CounterPlugin; +import net.xeoh.plugins.base.annotations.PluginImplementation; +import net.xeoh.plugins.base.annotations.events.Init; +import net.xeoh.plugins.base.annotations.events.PluginLoaded; +import net.xeoh.plugins.base.annotations.meta.Author; + +import org.apache.log4j.Logger; + +/** + * Implementation of {@link CounterPlugin}.
+ * Stores data in data folder. + * + * @version 0.1 14.11.2010 Initial Version + * @author nantuko + */ +@PluginImplementation +@Author(name = "nantuko") +public class CounterPluginImpl implements CounterPlugin { + + private static final String PLUGIN_DATA_FOLDER_PATH = "plugins" + File.separator + "plugin.data" + File.separator + "counters"; + + private static final String DATA_STORAGE_FILE = "counters"; + + private static final Logger log = Logger.getLogger(CounterPluginImpl.class); + + private boolean isLoaded = false; + + @Init + public void init() { + File dataFolder = new File(PLUGIN_DATA_FOLDER_PATH); + if (!dataFolder.exists()) { + dataFolder.mkdirs(); + if (!dataFolder.exists()) { + throw new RuntimeException("CounterPluginImpl: Couldn't create folders: " + PLUGIN_DATA_FOLDER_PATH); + } + } + File data = new File(PLUGIN_DATA_FOLDER_PATH + File.separator + DATA_STORAGE_FILE); + if (!data.exists()) { + try { + data.createNewFile(); + } catch (IOException e) { + log.error(e.getMessage(), e); + throw new RuntimeException("Couldn't create data file for counter plugin: " + e.getMessage()); + } + } + + this.isLoaded = true; + } + + @PluginLoaded + public void newPlugin(CounterPlugin plugin) { + log.info(plugin.toString() + " has been loaded."); + } + + public String toString() { + return "[Game counter plugin, version 0.1]"; + } + + @Override + public void addGamePlayed() throws PluginException { + if (!isLoaded) return; + File data = new File(PLUGIN_DATA_FOLDER_PATH + File.separator + DATA_STORAGE_FILE); + ObjectInputStream ois = null; + ObjectOutputStream oos = null; + if (data.exists()) { + int prev = 0; + try { + ois = new ObjectInputStream(new FileInputStream(data)); + Object o = ois.readObject(); + CounterBean c = null; + if (o instanceof CounterBean) { + c = (CounterBean)o; + prev = c.getGamesPlayed(); + } + } catch (EOFException e) { + // do nothing + } catch (IOException e) { + throw new PluginException(e); + } catch (ClassNotFoundException e) { + throw new PluginException(e); + } finally { + if (ois != null) try { ois.close(); } catch (Exception e) {} + } + + try { + synchronized (this) { + oos = new ObjectOutputStream(new FileOutputStream(data)); + CounterBean c = new CounterBean(); + c.setGamesPlayed(prev+1); + oos.writeObject(c); + oos.close(); + } + } catch (IOException e) { + throw new PluginException(e); + } finally { + if (oos != null) try { oos.close(); } catch (Exception e) {} + } + } else { + log.error("Counter plugin: data file doesn't exist, please restart plugin."); + } + } + + @Override + public int getGamePlayed() throws PluginException { + if (!isLoaded) return -1; + File data = new File(PLUGIN_DATA_FOLDER_PATH + File.separator + DATA_STORAGE_FILE); + if (!data.exists()) { + return 0; + } + if (data.exists()) { + ObjectInputStream ois = null; + try { + synchronized (this) { + ois = new ObjectInputStream(new FileInputStream(data)); + Object o = ois.readObject(); + CounterBean c = null; + if (o instanceof CounterBean) { + c = (CounterBean)o; + } + ois.close(); + return c.getGamesPlayed(); + } + } catch (EOFException e) { + return 0; + } catch (IOException e) { + throw new PluginException(e); + } catch (ClassNotFoundException e) { + throw new PluginException(e); + } finally { + if (ois != null) try { ois.close(); } catch (Exception e) {} + } + } else { + log.error("Counter plugin: data file doesn't exist, please restart plugin."); + return 0; + } + } + +} diff --git a/Mage.Plugins/pom.xml b/Mage.Plugins/pom.xml index 85f01e4458a..cc3e4fe558c 100644 --- a/Mage.Plugins/pom.xml +++ b/Mage.Plugins/pom.xml @@ -20,6 +20,7 @@ Mage.Theme.Plugin Mage.Card.Plugin + Mage.Counter.Plugin