diff --git a/Mage.Client/plugins/mage-counter-plugin.jar b/Mage.Client/plugins/mage-counter-plugin.jar new file mode 100644 index 0000000000..7114efce24 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 fe4476349b..b76ee3e590 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 fba8993833..ef6f24d855 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 b19e253236..2f6629046d 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<String, JComponent> ui); MagePermanent getMagePermanent(PermanentView card, BigCard bigCard, CardDimensions dimension, UUID gameId); boolean isCardPluginLoaded(); + boolean isCounterPluginLoaded(); void sortPermanents(Map<String, JComponent> ui, Collection<MagePermanent> permanents); void downloadImage(Set<Card> 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 ef786e7562..872b61f562 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<Card> 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 38707263d7..2747fc3b2b 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 47b0914e20..202c5bae20 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 0000000000..ffd0ef8bd9 --- /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 0000000000..84efc1537c --- /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 2e0ea04753..f8ca19ceb0 100644 --- a/Mage.Plugins/Mage.Card.Plugin/pom.xml +++ b/Mage.Plugins/Mage.Card.Plugin/pom.xml @@ -58,28 +58,6 @@ </configuration> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-shade-plugin</artifactId> - <version>1.4</version> - <executions> - <execution> - <phase>package</phase> - <goals> - <goal>shade</goal> - </goals> - <configuration> - <shadedArtifactAttached>true</shadedArtifactAttached> - <artifactSet> - <includes> - <include>log4j:log4j:jar:</include> - </includes> - </artifactSet> - </configuration> - </execution> - </executions> - </plugin> - </plugins> <finalName>mage-card-plugin</finalName> diff --git a/Mage.Plugins/Mage.Counter.Plugin/pom.xml b/Mage.Plugins/Mage.Counter.Plugin/pom.xml new file mode 100644 index 0000000000..acd2b7fbf3 --- /dev/null +++ b/Mage.Plugins/Mage.Counter.Plugin/pom.xml @@ -0,0 +1,58 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.mage</groupId> + <artifactId>Mage-Plugins</artifactId> + <version>0.3</version> + </parent> + + <groupId>org.mage</groupId> + <artifactId>Mage-Counter-Plugin</artifactId> + <packaging>jar</packaging> + <version>0.3</version> + <name>Mage Counter Plugin</name> + <description>Implements game counter to display amount of games played</description> + + <dependencies> + <dependency> + <groupId>org.mage</groupId> + <artifactId>Mage-Common</artifactId> + <version>${mage-version}</version> + </dependency> + <dependency> + <groupId>com.googlecode.jspf</groupId> + <artifactId>jspf-core</artifactId> + <version>${jspf-version}</version> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>1.2.9</version> + <scope>provided</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.6</source> + <target>1.6</target> + </configuration> + </plugin> + + </plugins> + + <finalName>mage-counter-plugin</finalName> + </build> + + <properties> + <plugin-version>0.3</plugin-version> + <jspf-version>0.9.1</jspf-version> + </properties> +</project> 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 0000000000..8d931c2753 --- /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 0000000000..ff7b957e5d --- /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}.<br/> + * 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 85f01e4458..cc3e4fe558 100644 --- a/Mage.Plugins/pom.xml +++ b/Mage.Plugins/pom.xml @@ -20,6 +20,7 @@ <modules> <module>Mage.Theme.Plugin</module> <module>Mage.Card.Plugin</module> + <module>Mage.Counter.Plugin</module> </modules> </project>