diff --git a/Mage.Client/plugins/mage-counter-plugin.jar b/Mage.Client/plugins/mage-counter-plugin.jar new file mode 100644 index 00000000000..7114efce248 Binary files /dev/null and b/Mage.Client/plugins/mage-counter-plugin.jar differ diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index fe4476349b4..b76ee3e5903 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -34,6 +34,7 @@ package mage.client; +import java.awt.Color; import java.awt.Cursor; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @@ -47,6 +48,7 @@ import java.util.prefs.Preferences; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JDesktopPane; +import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JOptionPane; import javax.swing.JToolBar.Separator; @@ -130,9 +132,9 @@ public class MageFrame extends javax.swing.JFrame { else disableButtons(); - //TODO: + //TODO: move to plugin impl if (Plugins.getInstance().isCardPluginLoaded()) { - Separator separator = new javax.swing.JToolBar.Separator(); + Separator separator = new javax.swing.JToolBar.Separator(); mageToolbar.add(separator); JButton btnDownload = new JButton("Images"); @@ -147,6 +149,15 @@ public class MageFrame extends javax.swing.JFrame { }); mageToolbar.add(btnDownload); } + + if (Plugins.getInstance().isCounterPluginLoaded()) { + int i = Plugins.getInstance().getGamesPlayed(); + JLabel label = new JLabel(" Games played: " + String.valueOf(i)); + desktopPane.add(label); + label.setVisible(true); + label.setForeground(Color.white); + label.setBounds(0, 0, 100, 30); + } } private void btnImagesActionPerformed(java.awt.event.ActionEvent evt) { diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index fba89938337..ef6f24d855b 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -35,6 +35,7 @@ package mage.client.game; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; @@ -44,6 +45,7 @@ import java.util.UUID; import java.util.logging.Logger; import javax.swing.JComponent; +import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -84,15 +86,11 @@ public class GamePanel extends javax.swing.JPanel { //FIXME: remove from here try { - /*BufferedImage background = ImageIO.read(this.getClass().getResourceAsStream("/green.jpg")); - ImagePanel bgPanel = new ImagePanel(background, ImagePanel.TILED);*/ - // Override layout (I can't edit generated code) this.setLayout(new BorderLayout()); final JLayeredPane j = new JLayeredPane(); j.add(ArrowBuilder.getArrowsPanel(), JLayeredPane.MODAL_LAYER); j.setSize(1024,768); - //j.setBorder(BorderFactory.createLineBorder(Color.green)); this.add(j); j.add(jSplitPane1, JLayeredPane.DEFAULT_LAYER); diff --git a/Mage.Client/src/main/java/mage/client/plugins/MagePlugins.java b/Mage.Client/src/main/java/mage/client/plugins/MagePlugins.java index b19e253236a..2f6629046d7 100644 --- a/Mage.Client/src/main/java/mage/client/plugins/MagePlugins.java +++ b/Mage.Client/src/main/java/mage/client/plugins/MagePlugins.java @@ -19,6 +19,9 @@ public interface MagePlugins { void updateGamePanel(Map 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