diff --git a/Mage.Client/pom.xml b/Mage.Client/pom.xml
index 0b6ea543942..04b485bf4e7 100644
--- a/Mage.Client/pom.xml
+++ b/Mage.Client/pom.xml
@@ -25,17 +25,6 @@
mage-common
${project.version}
-
- org.mage
- mage-sets
- ${project.version}
-
-
-
- ${project.groupId}
- mage-server
- ${mage-version}
-
com.googlecode.jspf
jspf-core
@@ -76,23 +65,13 @@
forms_rt
7.0.3
-
-
${project.groupId}
mage-counter-plugin
diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java
index ba37acad848..4b4d0084734 100644
--- a/Mage.Client/src/main/java/mage/client/MageFrame.java
+++ b/Mage.Client/src/main/java/mage/client/MageFrame.java
@@ -25,22 +25,15 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
-/*
- * MageFrame.java
- *
- * Created on 15-Dec-2009, 9:11:37 PM
- */
-
package mage.client;
import de.schlichtherle.truezip.file.TArchiveDetector;
import de.schlichtherle.truezip.file.TConfig;
import de.schlichtherle.truezip.fs.FsOutputOption;
import mage.cards.decks.Deck;
+import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
-import mage.cards.repository.CardScanner;
import mage.client.cards.BigCard;
import mage.client.chat.ChatPanel;
import mage.client.components.MageComponents;
@@ -67,7 +60,6 @@ import mage.client.util.SettingsManager;
import mage.client.util.gui.ArrowBuilder;
import mage.client.util.MusicPlayer;
import mage.components.ImagePanel;
-import mage.interfaces.Action;
import mage.interfaces.MageClient;
import mage.interfaces.callback.CallbackClient;
import mage.interfaces.callback.ClientCallback;
@@ -75,7 +67,6 @@ import mage.remote.Connection;
import mage.remote.Connection.ProxyType;
import mage.remote.Session;
import mage.remote.SessionImpl;
-import mage.server.Main;
import mage.utils.MageVersion;
import org.apache.log4j.Logger;
import org.mage.card.arcane.ManaSymbols;
@@ -94,8 +85,10 @@ import java.awt.image.BufferedImage;
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.InputStream;
-import java.util.*;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -205,12 +198,6 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
session = new SessionImpl(this);
- session.setEmbeddedMageServerAction(new Action() {
- @Override
- public void execute() {
- Main.main(new String[]{});
- }
- });
callbackClient = new CallbackClientImpl(this);
connectDialog = new ConnectDialog();
desktopPane.add(connectDialog, JLayeredPane.POPUP_LAYER);
@@ -480,28 +467,22 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
private void checkForNewImages() {
long beforeCall = System.currentTimeMillis();
- List cards = CardRepository.instance.getAllCards();
+ List cards = CardRepository.instance.findCards(new CardCriteria());
logger.info("Card pool load time: " + ((System.currentTimeMillis() - beforeCall) / 1000 + " seconds"));
- String useDefault = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_USE_DEFAULT, "true");
- String path = useDefault.equals("true") ? null : PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PATH, null);
-
beforeCall = System.currentTimeMillis();
- if (DownloadPictures.checkForNewCards(cards, path)) {
+ if (DownloadPictures.checkForNewCards(cards)) {
logger.info("Card images checking time: " + ((System.currentTimeMillis() - beforeCall) / 1000 + " seconds"));
if (JOptionPane.showConfirmDialog(null, "New cards are available. Do you want to download the images?", "New images available", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
- DownloadPictures.startDownload(null, cards, path);
+ DownloadPictures.startDownload(null, cards);
}
}
}
public void btnImagesActionPerformed(java.awt.event.ActionEvent evt) {
- List cards = CardRepository.instance.getAllCards();
+ List cards = CardRepository.instance.findCards(new CardCriteria());
- String useDefault = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_USE_DEFAULT, "true");
- String path = useDefault.equals("true") ? null : PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PATH, null);
-
- DownloadPictures.startDownload(null, cards, path);
+ DownloadPictures.startDownload(null, cards);
}
public void btnSymbolsActionPerformed(java.awt.event.ActionEvent evt) {
@@ -1005,7 +986,6 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
- CardScanner.scan();
for (String arg : args) {
if (arg.startsWith(liteModeArg)) {
liteMode = true;
diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java
index 0884395912a..156feeedaa1 100644
--- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java
+++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java
@@ -4,10 +4,12 @@ import mage.constants.CardType;
import mage.constants.ColoredManaSymbol;
import mage.Mana;
import mage.cards.Card;
+import mage.cards.ExpansionSet;
import mage.cards.decks.Deck;
import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
+import mage.cards.repository.ExpansionRepository;
import mage.client.MageFrame;
import mage.client.util.gui.ColorsChooser;
import mage.client.util.sets.ConstructedFormats;
@@ -28,8 +30,6 @@ import java.util.List;
import java.util.Random;
import java.util.UUID;
-import mage.cards.ExpansionSet;
-
/**
* Generates random card pool and builds a deck.
*
@@ -140,7 +140,7 @@ public class DeckGenerator {
List setsToUse = ConstructedFormats.getSetsByFormat(format);
if (setsToUse.isEmpty()) {
// use all
- setsToUse = CardRepository.instance.getSetCodes();
+ setsToUse = ExpansionRepository.instance.getSetCodes();
}
if (selectedColors.contains("X")) {
@@ -226,7 +226,7 @@ public class DeckGenerator {
int tries = 0;
int count = 0;
while (count < cardsCount) {
- Card card = cardPool.get(random.nextInt(cardPoolCount)).getCard();
+ Card card = cardPool.get(random.nextInt(cardPoolCount)).getMockCard();
if (cardFitsChosenColors(card, allowedColors)) {
spellCardPool.add(card);
count++;
@@ -291,7 +291,7 @@ public class DeckGenerator {
int tries = 0;
int count = 0;
while (count < landsCount) {
- Card card = landCards.get(random.nextInt(allCount)).getCard();
+ Card card = landCards.get(random.nextInt(allCount)).getMockCard();
if (cardCardProduceChosenColors(card, allowedColors)) {
nonBasicLandCardPool.add(card);
count++;
@@ -378,7 +378,7 @@ public class DeckGenerator {
}
int randomInt = new Random().nextInt(cards.size());
- return cards.get(randomInt).getCard();
+ return cards.get(randomInt).getMockCard();
}
diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java
index 247b3f957f9..4ec9878f8c1 100644
--- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java
+++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java
@@ -310,7 +310,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
else {
List foundCards = CardRepository.instance.findCards(buildCriteria());
for (CardInfo cardInfo : foundCards) {
- Card card = cardInfo.getCard();
+ Card card = cardInfo.getMockCard();
if (filter.match(card, null)) {
filteredCards.add(card);
}
diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java
index 910af53f58a..c4090addec9 100644
--- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java
+++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java
@@ -182,7 +182,7 @@ public class DeckEditorPanel extends javax.swing.JPanel {
}
}
} else {
- card = cardInfo != null ? cardInfo.getCard() : null;
+ card = cardInfo != null ? cardInfo.getMockCard() : null;
}
if (card != null) {
deck.getCards().add(card);
@@ -201,7 +201,7 @@ public class DeckEditorPanel extends javax.swing.JPanel {
} else if (event.getEventName().equals("shift-double-click") && mode == DeckEditorMode.Constructed) {
SimpleCardView cardView = (SimpleCardView) event.getSource();
CardInfo cardInfo = CardRepository.instance.findCard(cardView.getExpansionSetCode(), cardView.getCardNumber());
- Card card = cardInfo != null ? cardInfo.getCard() : null;
+ Card card = cardInfo != null ? cardInfo.getMockCard() : null;
if (card != null) {
deck.getSideboard().add(CardImpl.createCard(card.getClass()));
}
diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java
index d6842910364..aaf1ebf961f 100644
--- a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java
+++ b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java
@@ -31,11 +31,11 @@ package mage.client.deckeditor.collection.viewer;
import mage.cards.Card;
import mage.cards.CardDimensions;
import mage.cards.MageCard;
-import mage.client.MageFrame;
-import mage.cards.CardImpl;
import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
+import mage.cards.repository.ExpansionRepository;
+import mage.client.MageFrame;
import mage.client.cards.BigCard;
import mage.client.components.HoverButton;
import mage.client.plugins.impl.Plugins;
@@ -226,7 +226,7 @@ public class MageBook extends JComponent {
Rectangle rectangle = new Rectangle();
rectangle.translate(OFFSET_X, OFFSET_Y);
for (int i = 0; i < Math.min(conf.CARDS_PER_PAGE / 2, size); i++) {
- Card card = CardImpl.createCard(cards.get(i).getClassName());
+ Card card = cards.get(i).getMockCard();
addCard(new CardView(card), bigCard, null, rectangle);
rectangle = CardPosition.translatePosition(i, rectangle, conf);
}
@@ -237,7 +237,7 @@ public class MageBook extends JComponent {
rectangle.setLocation(second_page_x, OFFSET_Y);
for (int i = conf.CARDS_PER_PAGE / 2; i < Math.min(conf.CARDS_PER_PAGE, size); i++) {
- Card card = CardImpl.createCard(cards.get(i).getClassName());
+ Card card = cards.get(i).getMockCard();
addCard(new CardView(card), bigCard, null, rectangle);
rectangle = CardPosition.translatePosition(i - conf.CARDS_PER_PAGE / 2, rectangle, conf);
}
@@ -301,7 +301,7 @@ public class MageBook extends JComponent {
this.setsToDisplay = ConstructedFormats.getSetsByFormat(format);
if (this.setsToDisplay.isEmpty()) {
// display all
- this.setsToDisplay = CardRepository.instance.getSetCodes();
+ this.setsToDisplay = ExpansionRepository.instance.getSetCodes();
}
addSetTabs();
tabs.get(0).execute();
diff --git a/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java b/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java
index 31da43b2a44..d14d04c24fe 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java
@@ -79,7 +79,7 @@ public class AddLandDialog extends MageDialog {
}
for (int i = 0; i < number; i++) {
- Card land = cards.get(random.nextInt(cards.size())).getCard();
+ Card land = cards.get(random.nextInt(cards.size())).getMockCard();
deck.getCards().add(land);
}
}
diff --git a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java
index 8209c856006..90f21edbcb0 100644
--- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java
+++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java
@@ -301,7 +301,7 @@ public class PlayerPanelExt extends javax.swing.JPanel {
// Avatar
Image image = ImageHelper.getImageFromResources(DEFAULT_AVATAR_PATH);
- topCardPanel = Plugins.getInstance().getMageCard(new CardView(CardRepository.instance.findCard("Forest").getCard()), bigCard, topCardDimension, gameId, true);
+ topCardPanel = Plugins.getInstance().getMageCard(new CardView(CardRepository.instance.findCard("Forest").getMockCard()), bigCard, topCardDimension, gameId, true);
topCardPanel.setVisible(false);
panelBackground.add(topCardPanel);
diff --git a/Mage.Client/src/main/java/mage/client/util/CardsViewUtil.java b/Mage.Client/src/main/java/mage/client/util/CardsViewUtil.java
index 9f48d42f3ea..c77c240dd14 100644
--- a/Mage.Client/src/main/java/mage/client/util/CardsViewUtil.java
+++ b/Mage.Client/src/main/java/mage/client/util/CardsViewUtil.java
@@ -46,7 +46,7 @@ public class CardsViewUtil {
for (SimpleCardView simple: view.values()) {
CardInfo cardInfo = CardRepository.instance.findCard(simple.getExpansionSetCode(), simple.getCardNumber());
- Card card = cardInfo != null ? cardInfo.getCard() : null;
+ Card card = cardInfo != null ? cardInfo.getMockCard() : null;
if (card != null) {
cards.put(simple.getId(), new CardView(card, simple.getId()));
}
diff --git a/Mage.Client/src/main/java/mage/client/util/DeckUtil.java b/Mage.Client/src/main/java/mage/client/util/DeckUtil.java
index 8be31a46fc0..1b240c389ce 100644
--- a/Mage.Client/src/main/java/mage/client/util/DeckUtil.java
+++ b/Mage.Client/src/main/java/mage/client/util/DeckUtil.java
@@ -52,7 +52,7 @@ public class DeckUtil {
Deck deck = new Deck();
for (SimpleCardView cardView : view.getCards().values()) {
CardInfo cardInfo = CardRepository.instance.findCard(cardView.getExpansionSetCode(), cardView.getCardNumber());
- Card card = cardInfo != null ? cardInfo.getCard() : null;
+ Card card = cardInfo != null ? cardInfo.getMockCard() : null;
if (card != null) {
deck.getCards().add(card);
} else {
@@ -61,7 +61,7 @@ public class DeckUtil {
}
for (SimpleCardView cardView : view.getSideboard().values()) {
CardInfo cardInfo = CardRepository.instance.findCard(cardView.getExpansionSetCode(), cardView.getCardNumber());
- Card card = cardInfo != null ? cardInfo.getCard() : null;
+ Card card = cardInfo != null ? cardInfo.getMockCard() : null;
if (card != null) {
deck.getSideboard().add(card);
} else {
diff --git a/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java b/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java
index 27267c4e4d0..c4a90b407c5 100644
--- a/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java
+++ b/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java
@@ -5,9 +5,8 @@ import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
-import mage.cards.ExpansionSet;
-import mage.cards.Sets;
-import mage.cards.repository.CardRepository;
+import mage.cards.repository.ExpansionInfo;
+import mage.cards.repository.ExpansionRepository;
/**
* Utility class for constructed formats (expansions and other editions).
@@ -16,35 +15,36 @@ import mage.cards.repository.CardRepository;
*/
public class ConstructedFormats {
- private static final String[] constructedFormats = {"- All Sets", "- Standard", "- Extended", "- Modern",
- "Modern Masters",
- "* Return to Ravnica Block", "Dragon's Maze", "Gatecrash","Return to Ravnica",
- "Magic 2013", "Planechase 2012",
- "* Innistrad Block", "Avacyn Restored", "Dark Ascension", "Innistrad",
- "Magic 2012", "Commander",
- "* Scars of Mirrodin Block", "New Phyrexia", "Mirrodin Besieged", "Scars of Mirrodin", "Magic 2011",
- "* Zendikar Block", "Rise of the Eldrazi", "Worldwake", "Zendikar",
- "Magic 2010", "Planechase",
- "* Shards of Alara Block", "Alara Reborn", "Conflux", "Shards of Alara",
- "* Shadowmoor Block", "Shadowmoor", "Eventide",
- "* Lorwyn Block", "Lorwyn", "Morningtide",
- "* Time Spiral Block", "Future Sight", "Planar Chaos", "Time Spiral", "Tenth Edition",
- "* Ravnica Block", "Dissension", "Guildpact", "Ravnica: City of Guilds",
- "* Kamigawa Block", "Saviors of Kamigawa", "Betrayers of Kamigawa", "Champions of Kamigawa","Ninth Edition",
- "* Mirrodin Block", "Fifth Dawn", "Darksteel", "Mirrodin",
- "* Onslaught Block", "Scourge", "Legions", "Onslaught","Eighth Edition",
- "* Odyssey Block", "Judgment", "Torment", "Odyssey",
- "* Invasion Block", "Apocalypse", "Planeshift", "Invasion","Seventh Edition",
- "* Masquerade Block", "Prophecy", "Nemesis", "Mercadian Masques",
- "* Urza Block", "Urza's Destiny", "Urza's Legacy", "Urza's Saga", "Sixth Edition",
- "* Tempest Block", "Exodus", "Stronghold", "Tempest",
- "* Mirage Block", "Weatherlight", "Visions", "Mirage", "Fifth Edition",
- "* Ice Age Block", "Coldsnap", "Alliances", "Ice Age", "Fourth Edition",
- "Homelands","Fallen Empires","The Dark","Legends","Antiquities", "Arabian Nights",
- "Revised Edition", "Unlimited Edition", "Limited Edition Beta", "Limited Edition Alpha",
- "Guru",
- "Duel Decks: Elspeth vs. Tezzeret"
- };
+ private static final String[] constructedFormats = {
+ "- All Sets", "- Standard", "- Extended", "- Modern",
+ "Modern Masters",
+ "* Return to Ravnica Block", "Dragon's Maze", "Gatecrash", "Return to Ravnica",
+ "Magic 2013", "Planechase 2012",
+ "* Innistrad Block", "Avacyn Restored", "Dark Ascension", "Innistrad",
+ "Magic 2012", "Commander",
+ "* Scars of Mirrodin Block", "New Phyrexia", "Mirrodin Besieged", "Scars of Mirrodin", "Magic 2011",
+ "* Zendikar Block", "Rise of the Eldrazi", "Worldwake", "Zendikar",
+ "Magic 2010", "Planechase",
+ "* Shards of Alara Block", "Alara Reborn", "Conflux", "Shards of Alara",
+ "* Shadowmoor Block", "Shadowmoor", "Eventide",
+ "* Lorwyn Block", "Lorwyn", "Morningtide",
+ "* Time Spiral Block", "Future Sight", "Planar Chaos", "Time Spiral", "Tenth Edition",
+ "* Ravnica Block", "Dissension", "Guildpact", "Ravnica: City of Guilds",
+ "* Kamigawa Block", "Saviors of Kamigawa", "Betrayers of Kamigawa", "Champions of Kamigawa", "Ninth Edition",
+ "* Mirrodin Block", "Fifth Dawn", "Darksteel", "Mirrodin",
+ "* Onslaught Block", "Scourge", "Legions", "Onslaught", "Eighth Edition",
+ "* Odyssey Block", "Judgment", "Torment", "Odyssey",
+ "* Invasion Block", "Apocalypse", "Planeshift", "Invasion", "Seventh Edition",
+ "* Masquerade Block", "Prophecy", "Nemesis", "Mercadian Masques",
+ "* Urza Block", "Urza's Destiny", "Urza's Legacy", "Urza's Saga", "Sixth Edition",
+ "* Tempest Block", "Exodus", "Stronghold", "Tempest",
+ "* Mirage Block", "Weatherlight", "Visions", "Mirage", "Fifth Edition",
+ "* Ice Age Block", "Coldsnap", "Alliances", "Ice Age", "Fourth Edition",
+ "Homelands", "Fallen Empires", "The Dark", "Legends", "Antiquities", "Arabian Nights",
+ "Revised Edition", "Unlimited Edition", "Limited Edition Beta", "Limited Edition Alpha",
+ "Guru",
+ "Duel Decks: Elspeth vs. Tezzeret"
+ };
private ConstructedFormats() {
}
@@ -379,9 +379,7 @@ public class ConstructedFormats {
}
private static void buildLists() {
- for (String setCode : CardRepository.instance.getSetCodes()) {
- ExpansionSet set = Sets.findSet(setCode);
-
+ for (ExpansionInfo set : ExpansionRepository.instance.getAll()) {
if (set.getReleaseDate().after(standardDate)) {
standard.add(set.getCode());
}
diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/ManaSymbols.java b/Mage.Client/src/main/java/org/mage/card/arcane/ManaSymbols.java
index 91a685f6b3b..57aeb2938ae 100644
--- a/Mage.Client/src/main/java/org/mage/card/arcane/ManaSymbols.java
+++ b/Mage.Client/src/main/java/org/mage/card/arcane/ManaSymbols.java
@@ -1,6 +1,7 @@
package org.mage.card.arcane;
import mage.cards.repository.CardRepository;
+import mage.cards.repository.ExpansionRepository;
import mage.client.dialog.PreferencesDialog;
import mage.client.util.ImageHelper;
import mage.client.util.gui.BufferedImageBuilder;
@@ -49,7 +50,7 @@ public class ManaSymbols {
} catch (Exception e) {
}
}
- List setCodes = CardRepository.instance.getSetCodes();
+ List setCodes = ExpansionRepository.instance.getSetCodes();
for (String set : setCodes) {
File file = new File(getSymbolsPath() + Constants.RESOURCE_PATH_SET + set + "-C.jpg");
try {
@@ -106,7 +107,7 @@ public class ManaSymbols {
}
File file;
- for (String set : CardRepository.instance.getSetCodes()) {
+ for (String set : ExpansionRepository.instance.getSetCodes()) {
file = new File(getSymbolsPath() + Constants.RESOURCE_PATH_SET_SMALL);
if (!file.exists()) {
break;
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java
index aa597c8deeb..c52b57ebc71 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java
@@ -29,6 +29,7 @@ public class WizardCardsImageSource implements CardImageSource {
public WizardCardsImageSource() {
sets = new HashMap>();
setsAliases = new HashMap();
+ setsAliases.put("M14", "magic2014coreset/cig");
setsAliases.put("MMA", "modernmasters/cig");
setsAliases.put("DGM", "dragonsmaze/cig");
setsAliases.put("GTC", "gatecrash/cig");
@@ -50,7 +51,6 @@ public class WizardCardsImageSource implements CardImageSource {
setsAliases.put("ARB", "alarareborn/spoiler");
setsAliases.put("CON", "conflux/spoiler");
setsAliases.put("ALA", "shardsofalara/spoiler");
- setsAliases.put("HOP", "planechase/cig");
setsAliases.put("PC2", "planechase2012edition/cig");
}
@@ -60,16 +60,16 @@ public class WizardCardsImageSource implements CardImageSource {
Document doc = Jsoup.connect("http://www.wizards.com/magic/tcg/article.aspx?x=mtg/tcg/" + setsAliases.get(cardSet)).get();
Elements cardsImages = doc.select("img[height$=370]");
for (int i = 0; i < cardsImages.size(); i++) {
- String cardName = cardsImages.get(i).attr("title").replace("\u00C6", "AE").replace("\u2019", "'");
+ String cardName = normalizeName(cardsImages.get(i).attr("title"));
if (cardName != null && !cardName.isEmpty()) {
if (cardName.equals("Forest") || cardName.equals("Swamp") || cardName.equals("Mountain") || cardName.equals("Island") || cardName.equals("Plains")) {
int landNumber = 1;
- while (setLinks.get(cardName + landNumber) != null) {
+ while (setLinks.get((cardName + landNumber).toLowerCase()) != null) {
landNumber++;
}
cardName += landNumber;
}
- setLinks.put(cardName, cardsImages.get(i).attr("src"));
+ setLinks.put(cardName.toLowerCase(), cardsImages.get(i).attr("src"));
} else {
setLinks.put(Integer.toString(i), cardsImages.get(i).attr("src"));
}
@@ -77,12 +77,12 @@ public class WizardCardsImageSource implements CardImageSource {
cardsImages = doc.select("img[height$=470]");
for (int i = 0; i < cardsImages.size(); i++) {
- String cardName = cardsImages.get(i).attr("title").replace("\u00C6", "AE").replace("\u2019", "'");
+ String cardName = normalizeName(cardsImages.get(i).attr("title"));
if (cardName != null && !cardName.isEmpty()) {
String[] cardNames = cardName.replace(")", "").split(" \\(");
for (String name : cardNames) {
- setLinks.put(name, cardsImages.get(i).attr("src"));
+ setLinks.put(name.toLowerCase(), cardsImages.get(i).attr("src"));
}
} else {
setLinks.put(Integer.toString(i), cardsImages.get(i).attr("src"));
@@ -94,6 +94,18 @@ public class WizardCardsImageSource implements CardImageSource {
return setLinks;
}
+ private String normalizeName(String name) {
+ return name.replace("\u2014", "-").replace("\u2019", "'")
+ .replace("\u00C6", "AE").replace("\u00E6", "ae")
+ .replace("\u00C1", "A").replace("\u00E1", "a")
+ .replace("\u00C2", "A").replace("\u00E2", "a")
+ .replace("\u00D6", "O").replace("\u00F6", "o")
+ .replace("\u00DB", "U").replace("\u00FB", "u")
+ .replace("\u00DC", "U").replace("\u00FC", "u")
+ .replace("\u00E9", "e").replace("&", "//")
+ .replace("Hintreland Scourge", "Hinterland Scourge");
+ }
+
@Override
public String generateURL(CardDownloadData card) throws Exception {
Integer collectorId = card.getCollectorId();
@@ -110,7 +122,7 @@ public class WizardCardsImageSource implements CardImageSource {
setLinks = getSetLinks(cardSet);
sets.put(cardSet, setLinks);
}
- String link = setLinks.get(card.getDownloadName());
+ String link = setLinks.get(card.getDownloadName().toLowerCase());
if (link == null) {
if (setLinks.size() >= collectorId) {
link = setLinks.get(Integer.toString(collectorId - 1));
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java
index bcf918db432..156cfe17ad0 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java
@@ -52,7 +52,6 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
private static boolean offlineMode = false;
private JCheckBox checkBox;
private final Object sync = new Object();
- private String imagesPath;
private static CardImageSource cardImageSource;
@@ -61,11 +60,11 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
private ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
- startDownload(null, null, null);
+ startDownload(null, null);
}
- public static void startDownload(JFrame frame, List allCards, String imagesPath) {
- ArrayList cards = getNeededCards(allCards, imagesPath);
+ public static void startDownload(JFrame frame, List allCards) {
+ ArrayList cards = getNeededCards(allCards);
/*
* if (cards == null || cards.size() == 0) {
@@ -73,7 +72,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
* "All card pictures have been downloaded."); return; }
*/
- DownloadPictures download = new DownloadPictures(cards, imagesPath);
+ DownloadPictures download = new DownloadPictures(cards);
JDialog dlg = download.getDlg(frame);
dlg.setVisible(true);
dlg.dispose();
@@ -97,9 +96,8 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
this.cancel = cancel;
}
- public DownloadPictures(ArrayList cards, String imagesPath) {
+ public DownloadPictures(ArrayList cards) {
this.cards = cards;
- this.imagesPath = imagesPath;
bar = new JProgressBar(this);
@@ -186,12 +184,12 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
dlg = new JOptionPane(p0, JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[1]);
}
- public static boolean checkForNewCards(List allCards, String imagesPath) {
+ public static boolean checkForNewCards(List allCards) {
TFile file;
for (CardInfo card : allCards) {
if (card.getCardNumber() > 0 && !card.getSetCode().isEmpty()) {
- CardDownloadData url = new CardDownloadData(card.getName(), card.getSetCode(), card.getCardNumber(), usesVariousArt(card), 0, false, card.isDoubleFaced(), card.isNightCard());
- file = new TFile(CardImageUtils.getImagePath(url, imagesPath));
+ CardDownloadData url = new CardDownloadData(card.getName(), card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, false, card.isDoubleFaced(), card.isNightCard());
+ file = new TFile(CardImageUtils.generateImagePath(url));
if (!file.exists()) {
return true;
}
@@ -200,17 +198,12 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
return false;
}
- private static boolean usesVariousArt(CardInfo card) {
- String className = card.getClassName();
- return Character.isDigit(className.charAt(className.length() - 1));
- }
-
private static String createDownloadName(CardInfo card) {
String className = card.getClassName();
return className.substring(className.lastIndexOf('.') + 1);
}
- private static ArrayList getNeededCards(List allCards, String imagesPath) {
+ private static ArrayList getNeededCards(List allCards) {
ArrayList cardsToDownload = new ArrayList();
@@ -227,7 +220,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
if (card.getCardNumber() > 0 && !card.getSetCode().isEmpty()
&& !ignoreUrls.contains(card.getSetCode())) {
String cardName = card.getName();
- CardDownloadData url = new CardDownloadData(cardName, card.getSetCode(), card.getCardNumber(), usesVariousArt(card), 0, false, card.isDoubleFaced(), card.isNightCard());
+ CardDownloadData url = new CardDownloadData(cardName, card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, false, card.isDoubleFaced(), card.isNightCard());
if (url.getUsesVariousArt()) {
url.setDownloadName(createDownloadName(card));
}
@@ -237,17 +230,17 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
allCardsUrls.add(url);
if (card.isDoubleFaced()) {
- // add second side for downloading
- // it has the same expansion set code and card number as original one
- // second side = true;
- url = new CardDownloadData(card.getSecondSideName(), card.getSetCode(), card.getCardNumber(), usesVariousArt(card), 0, false, card.isDoubleFaced(), true);
+ if (card.getSecondSideName() == null || card.getSecondSideName().trim().isEmpty()) {
+ throw new IllegalStateException("Second side card can't have empty name.");
+ }
+ url = new CardDownloadData(card.getSecondSideName(), card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, false, card.isDoubleFaced(), true);
allCardsUrls.add(url);
}
if (card.isFlipCard()) {
if (card.getFlipCardName() == null || card.getFlipCardName().trim().isEmpty()) {
throw new IllegalStateException("Flipped card can't have empty name.");
}
- url = new CardDownloadData(card.getFlipCardName(), card.getSetCode(), card.getCardNumber(), usesVariousArt(card), 0, false, card.isDoubleFaced(), card.isNightCard());
+ url = new CardDownloadData(card.getFlipCardName(), card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, false, card.isDoubleFaced(), card.isNightCard());
url.setFlipCard(true);
url.setFlippedSide(true);
allCardsUrls.add(url);
@@ -274,7 +267,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
* check to see which cards we already have
*/
for (CardDownloadData card : allCardsUrls) {
- file = new TFile(CardImageUtils.getImagePath(card, imagesPath));
+ file = new TFile(CardImageUtils.generateImagePath(card));
if (!file.exists()) {
cardsToDownload.add(card);
}
@@ -363,7 +356,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
@Override
public void run() {
- File base = new File(this.imagesPath != null ? imagesPath : Constants.IO.imageBaseDir);
+ File base = new File(Constants.IO.imageBaseDir);
if (!base.exists()) {
base.mkdir();
}
@@ -458,7 +451,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
filePath.append(Constants.IO.imageBaseDir).append(File.separator);
filePath.append(card.hashCode()).append(".").append(card.getName().replace(":", "").replace("//", "-")).append(".jpg");
File temporaryFile = new File(filePath.toString());
- String imagePath = CardImageUtils.getImagePath(card, imagesPath);
+ String imagePath = CardImageUtils.generateImagePath(card);
TFile outputFile = new TFile(imagePath);
if (!outputFile.exists()) {
outputFile.getParentFile().mkdirs();
@@ -562,7 +555,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
Iterator cardsIterator = DownloadPictures.this.cards.iterator();
while (cardsIterator.hasNext()) {
CardDownloadData cardDownloadData = cardsIterator.next();
- TFile file = new TFile(CardImageUtils.getImagePath(cardDownloadData, imagesPath));
+ TFile file = new TFile(CardImageUtils.generateImagePath(cardDownloadData));
if (file.exists()) {
cardsIterator.remove();
}
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java
index cb6d9e0dbeb..3c3ece92f8c 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java
@@ -73,14 +73,21 @@ public class ImageCache {
CardDownloadData info = new CardDownloadData(name, set, collectorId, usesVariousArt, type);
+ String path;
if (collectorId == 0) {
info.setToken(true);
+ path = CardImageUtils.generateTokenImagePath(info);
+ } else {
+ path = CardImageUtils.generateImagePath(info);
}
- String path = CardImageUtils.getImagePath(info);
+
if (path == null) {
return null;
}
TFile file = new TFile(path);
+ if (!file.exists()) {
+ return null;
+ }
if (thumbnail && path.endsWith(".jpg")) {
String thumbnailPath = buildThumbnailPath(path);
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java
index 75172f7c9d0..f893c9cff9b 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java
@@ -12,22 +12,16 @@ public class CardImageUtils {
private static HashMap pathCache = new HashMap();
/**
- * Get path to image for specific card.
- *
- * @param card
- * card to get path for
+ *
* @return String if image exists, else null
*/
- public static String getImagePath(CardDownloadData card) {
- String filePath;
-
- TFile file;
+ public static String generateTokenImagePath(CardDownloadData card) {
if (card.isToken()) {
if (pathCache.containsKey(card)) {
return pathCache.get(card);
}
- filePath = getTokenImagePath(card);
- file = new TFile(filePath);
+ String filePath = getTokenImagePath(card);
+ TFile file = new TFile(filePath);
if (!file.exists()) {
filePath = searchForCardImage(card);
@@ -36,36 +30,26 @@ public class CardImageUtils {
if (file.exists()) {
pathCache.put(card, filePath);
+ return filePath;
}
- } else {
- String useDefault = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_USE_DEFAULT, "true");
- String path = useDefault.equals("true") ? null : PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PATH, null);
- filePath = getImagePath(card, path);
- file = new TFile(filePath);
}
- if (file.exists()) {
- return filePath;
- } else {
- return null;
- }
+ return null;
}
private static String getTokenImagePath(CardDownloadData card) {
- String useDefault = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_USE_DEFAULT, "true");
- String path = useDefault.equals("true") ? null : PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PATH, null);
- String filename = getImagePath(card, path);
+ String filename = generateImagePath(card);
TFile file = new TFile(filename);
if (!file.exists()) {
CardDownloadData updated = new CardDownloadData(card);
updated.setName(card.getName() + " 1");
- filename = getImagePath(updated, path);
+ filename = generateImagePath(updated);
file = new TFile(filename);
if (!file.exists()) {
updated = new CardDownloadData(card);
updated.setName(card.getName() + " 2");
- filename = getImagePath(updated, path);
+ filename = generateImagePath(updated);
}
}
@@ -129,7 +113,10 @@ public class CardImageUtils {
}
}
- public static String getImagePath(CardDownloadData card, String imagesPath) {
+ public static String generateImagePath(CardDownloadData card) {
+ String useDefault = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_USE_DEFAULT, "true");
+ String imagesPath = useDefault.equals("true") ? null : PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PATH, null);
+
String imageDir = getImageDir(card, imagesPath);
String imageName;
diff --git a/Mage.Common/src/mage/interfaces/MageServer.java b/Mage.Common/src/mage/interfaces/MageServer.java
index 3c855cf7ff5..bf9549aae76 100644
--- a/Mage.Common/src/mage/interfaces/MageServer.java
+++ b/Mage.Common/src/mage/interfaces/MageServer.java
@@ -30,6 +30,8 @@ package mage.interfaces;
import mage.MageException;
import mage.cards.decks.DeckCardLists;
+import mage.cards.repository.CardInfo;
+import mage.cards.repository.ExpansionInfo;
import mage.game.GameException;
import mage.game.match.MatchOptions;
import mage.game.tournament.TournamentOptions;
@@ -50,6 +52,10 @@ public interface MageServer {
boolean registerAdmin(String password, String sessionId, MageVersion version) throws MageException;
void deregisterClient(String sessionId) throws MageException;
+ // update methods
+ List getMissingExpansionData(List codes);
+ List getMissingCardsData(List classNames);
+
// user methods
boolean setUserData(String userName, String sessionId, UserDataView userDataView) throws MageException;
void sendFeedbackMessage(String sessionId, String username, String title, String type, String message, String email) throws MageException;
diff --git a/Mage.Common/src/mage/remote/Session.java b/Mage.Common/src/mage/remote/Session.java
index 8dd8b80f29b..5c56879d38c 100644
--- a/Mage.Common/src/mage/remote/Session.java
+++ b/Mage.Common/src/mage/remote/Session.java
@@ -28,7 +28,6 @@
package mage.remote;
-import mage.interfaces.Action;
import mage.remote.interfaces.*;
/**
@@ -38,5 +37,4 @@ import mage.remote.interfaces.*;
*/
public interface Session extends ClientData, Connect, GamePlay, GameTypes, ServerState, ChatSession, Feedback, PlayerActions, Replays, Testable {
- void setEmbeddedMageServerAction(Action embeddedMageServerAction);
}
diff --git a/Mage.Common/src/mage/remote/SessionImpl.java b/Mage.Common/src/mage/remote/SessionImpl.java
index c20d3a7ad2f..8c6bb760e9a 100644
--- a/Mage.Common/src/mage/remote/SessionImpl.java
+++ b/Mage.Common/src/mage/remote/SessionImpl.java
@@ -31,11 +31,14 @@ package mage.remote;
import mage.MageException;
import mage.cards.decks.DeckCardLists;
import mage.cards.decks.InvalidDeckException;
+import mage.cards.repository.CardInfo;
+import mage.cards.repository.CardRepository;
+import mage.cards.repository.ExpansionInfo;
+import mage.cards.repository.ExpansionRepository;
import mage.constants.Constants.SessionState;
import mage.game.GameException;
import mage.game.match.MatchOptions;
import mage.game.tournament.TournamentOptions;
-import mage.interfaces.Action;
import mage.interfaces.MageClient;
import mage.interfaces.MageServer;
import mage.interfaces.ServerState;
@@ -71,18 +74,12 @@ public class SessionImpl implements Session {
private SessionState sessionState = SessionState.DISCONNECTED;
private Connection connection;
- private Action embeddedMageServerAction;
-
private static boolean debugMode = false;
- private static boolean standalone = true;
private boolean canceled = false;
static {
debugMode = System.getProperty("debug.mage") != null;
- if (System.getProperty("skip.standalone") != null) {
- standalone = false;
- }
}
public SessionImpl(MageClient client) {
@@ -107,11 +104,6 @@ public class SessionImpl implements Session {
@Override
public boolean connect() {
-
- /*if (standalone && connection.getHost().equals("localhost")) {
- runEmbeddedMageServer();
- }*/
-
sessionState = SessionState.CONNECTING;
try {
System.setProperty("http.nonProxyHosts", "code.google.com");
@@ -177,6 +169,7 @@ public class SessionImpl implements Session {
if (registerResult) {
sessionState = SessionState.CONNECTED;
serverState = server.getServerState();
+ updateDatabase();
logger.info(new StringBuilder("Connected as ").append(this.getUserName()).append(" to MAGE server at ").append(connection.getHost()).append(":").append(connection.getPort()).toString());
client.connected(new StringBuilder("Connected as ").append(this.getUserName()).append(" to ").append(connection.getHost()).append(":").append(connection.getPort()).append(" ").toString());
return true;
@@ -205,13 +198,15 @@ public class SessionImpl implements Session {
return false;
}
- private void runEmbeddedMageServer() {
- if (embeddedMageServerAction != null) {
- try {
- embeddedMageServerAction.execute();
- } catch (MageException e) {
- logger.error(e);
- }
+ private void updateDatabase() {
+ List classNames = CardRepository.instance.getClassNames();
+ List cards = server.getMissingCardsData(classNames);
+ CardRepository.instance.addCards(cards);
+
+ List setCodes = ExpansionRepository.instance.getSetCodes();
+ List expansions = server.getMissingExpansionData(setCodes);
+ for (ExpansionInfo expansion : expansions) {
+ ExpansionRepository.instance.add(expansion);
}
}
@@ -1195,11 +1190,6 @@ public class SessionImpl implements Session {
return false;
}
- @Override
- public void setEmbeddedMageServerAction(Action embeddedMageServerAction) {
- this.embeddedMageServerAction = embeddedMageServerAction;
- }
-
@Override
public boolean ping() {
try {
@@ -1217,7 +1207,6 @@ public class SessionImpl implements Session {
return false;
}
}
-
class MageAuthenticator extends Authenticator {
private String username;
diff --git a/Mage.Server/src/main/java/mage/server/MageServerImpl.java b/Mage.Server/src/main/java/mage/server/MageServerImpl.java
index 7980645d6fb..6e88ec0d1bb 100644
--- a/Mage.Server/src/main/java/mage/server/MageServerImpl.java
+++ b/Mage.Server/src/main/java/mage/server/MageServerImpl.java
@@ -30,6 +30,10 @@ package mage.server;
import mage.MageException;
import mage.cards.decks.DeckCardLists;
+import mage.cards.repository.CardInfo;
+import mage.cards.repository.CardRepository;
+import mage.cards.repository.ExpansionInfo;
+import mage.cards.repository.ExpansionRepository;
import mage.game.GameException;
import mage.game.match.MatchOptions;
import mage.game.tournament.TournamentOptions;
@@ -59,9 +63,6 @@ import java.util.Locale;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
-
-//import mage.interfaces.Server;
-
/**
*
* @author BetaSteward_at_googlemail.com, noxx
@@ -926,4 +927,20 @@ public class MageServerImpl implements MageServer {
}
return action.negativeResult();
}
+
+ @Override
+ public List getMissingExpansionData(List codes) {
+ List result = new ArrayList();
+ for (ExpansionInfo expansionInfo : ExpansionRepository.instance.getAll()) {
+ if (!codes.contains(expansionInfo.getCode())) {
+ result .add(expansionInfo);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public List getMissingCardsData(List classNames) {
+ return CardRepository.instance.getMissingCards(classNames);
+ }
}
diff --git a/Mage/src/mage/cards/ExpansionSet.java b/Mage/src/mage/cards/ExpansionSet.java
index 1b1e05309df..1400944a8cb 100644
--- a/Mage/src/mage/cards/ExpansionSet.java
+++ b/Mage/src/mage/cards/ExpansionSet.java
@@ -98,6 +98,10 @@ public abstract class ExpansionSet implements Serializable {
return packageName;
}
+ public String getBlockName() {
+ return blockName;
+ }
+
@Override
public String toString() {
return name;
diff --git a/Mage/src/mage/cards/SplitCard.java b/Mage/src/mage/cards/SplitCard.java
index 26d6f94f5ed..9aea6839f30 100644
--- a/Mage/src/mage/cards/SplitCard.java
+++ b/Mage/src/mage/cards/SplitCard.java
@@ -50,8 +50,8 @@ import mage.watchers.Watcher;
public abstract class SplitCard> extends CardImpl {
- private Card leftHalfCard;
- private Card rightHalfCard;
+ protected Card leftHalfCard;
+ protected Card rightHalfCard;
public SplitCard(UUID ownerId, int cardNumber, String nameLeft, String nameRight, Rarity rarity, CardType[] cardTypes, String costsLeft, String costsRight, boolean fused) {
super(ownerId, cardNumber, new StringBuilder(nameLeft).append(" // ").append(nameRight).toString(), rarity, cardTypes, costsLeft + costsRight, (fused ?SpellAbilityType.SPLIT_FUSED:SpellAbilityType.SPLIT));
diff --git a/Mage/src/mage/cards/mock/MockAbility.java b/Mage/src/mage/cards/mock/MockAbility.java
new file mode 100644
index 00000000000..05d2a1456c7
--- /dev/null
+++ b/Mage/src/mage/cards/mock/MockAbility.java
@@ -0,0 +1,25 @@
+package mage.cards.mock;
+
+import mage.abilities.AbilityImpl;
+import mage.constants.AbilityType;
+import mage.constants.Zone;
+
+class MockAbility extends AbilityImpl {
+
+ private final String text;
+
+ public MockAbility(String text) {
+ super(AbilityType.STATIC, Zone.ALL);
+ this.text = text;
+ }
+
+ @Override
+ public MockAbility copy() {
+ return this;
+ }
+
+ @Override
+ public String getRule(boolean all) {
+ return text;
+ }
+}
diff --git a/Mage/src/mage/cards/mock/MockCard.java b/Mage/src/mage/cards/mock/MockCard.java
new file mode 100644
index 00000000000..a066418ccf3
--- /dev/null
+++ b/Mage/src/mage/cards/mock/MockCard.java
@@ -0,0 +1,76 @@
+package mage.cards.mock;
+
+import java.util.List;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.cards.CardImpl;
+import mage.cards.repository.CardInfo;
+import mage.cards.repository.CardRepository;
+
+/**
+ * @author North
+ */
+public class MockCard extends CardImpl {
+ public MockCard(CardInfo card) {
+ super(null, card.getName());
+ this.cardNumber = card.getCardNumber();
+ this.expansionSetCode = card.getSetCode();
+ this.power = mageIntFromString(card.getPower());
+ this.toughness = mageIntFromString(card.getToughness());
+ this.rarity = card.getRarity();
+ this.cardType = card.getTypes();
+ this.subtype = card.getSubTypes();
+ this.supertype = card.getSupertypes();
+
+ this.usesVariousArt = card.usesVariousArt();
+
+ this.manaCost = new ManaCostsImpl(join(card.getManaCosts()));
+
+ this.color = card.getColor();
+ this.splitCard = card.isSplitCard();
+ this.flipCard = card.isFlipCard();
+
+ this.canTransform = card.isDoubleFaced();
+ this.nightCard = card.isNightCard();
+ if (card.getSecondSideName() != null && !card.getSecondSideName().isEmpty()) {
+ this.secondSideCard = new MockCard(CardRepository.instance.findCard(card.getSecondSideName()));
+ }
+
+ this.flipCardName = card.getFlipCardName();
+
+ for(String ruleText: card.getRules()) {
+ this.addAbility(textAbilityFromString(ruleText));
+ }
+ }
+
+ public MockCard(final MockCard card) {
+ super(card);
+ }
+
+ @Override
+ public MockCard copy() {
+ return new MockCard(this);
+ }
+
+ private MageInt mageIntFromString(String value) {
+ try {
+ int intValue = Integer.parseInt(value);
+ return new MageInt(intValue);
+ } catch (NumberFormatException e) {
+ return new MageInt(0, value);
+ }
+ }
+
+ private String join(List strings) {
+ StringBuilder sb = new StringBuilder();
+ for (String string : strings) {
+ sb.append(string);
+ }
+ return sb.toString();
+ }
+
+ private Ability textAbilityFromString(final String text) {
+ return new MockAbility(text);
+ }
+}
diff --git a/Mage/src/mage/cards/mock/MockSplitCard.java b/Mage/src/mage/cards/mock/MockSplitCard.java
new file mode 100644
index 00000000000..fb7c5c32347
--- /dev/null
+++ b/Mage/src/mage/cards/mock/MockSplitCard.java
@@ -0,0 +1,100 @@
+package mage.cards.mock;
+
+import java.util.List;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.cards.SplitCard;
+import mage.cards.repository.CardInfo;
+import mage.cards.repository.CardRepository;
+import mage.constants.CardType;
+
+/**
+ *
+ * @author North
+ */
+public class MockSplitCard extends SplitCard {
+
+ public MockSplitCard(CardInfo card) {
+ super(null,
+ card.getCardNumber(),
+ getLeftHalfName(card),
+ getRightHalfName(card),
+ card.getRarity(),
+ card.getTypes().toArray(new CardType[0]),
+ join(card.getManaCosts()),
+ "",
+ join(card.getRules()).contains("Fuse"));
+ this.expansionSetCode = card.getSetCode();
+ this.power = mageIntFromString(card.getPower());
+ this.toughness = mageIntFromString(card.getToughness());
+ this.cardType = card.getTypes();
+ this.subtype = card.getSubTypes();
+ this.supertype = card.getSupertypes();
+
+ this.usesVariousArt = card.usesVariousArt();
+
+ this.color = card.getColor();
+ this.splitCard = card.isSplitCard();
+ this.flipCard = card.isFlipCard();
+
+ this.canTransform = card.isDoubleFaced();
+ this.nightCard = card.isNightCard();
+ if (card.getSecondSideName() != null && !card.getSecondSideName().isEmpty()) {
+ this.secondSideCard = new MockCard(CardRepository.instance.findCard(card.getSecondSideName()));
+ }
+
+ this.flipCardName = card.getFlipCardName();
+
+ for (String ruleText : card.getRules()) {
+ this.addAbility(textAbilityFromString(ruleText));
+ }
+
+ CardInfo leftHalf = CardRepository.instance.findCard(getLeftHalfName(card));
+ if(leftHalf != null) {
+ this.leftHalfCard = new MockCard(leftHalf);
+ }
+
+ CardInfo rightHalf = CardRepository.instance.findCard(getRightHalfName(card));
+ if(rightHalf != null) {
+ this.rightHalfCard = new MockCard(rightHalf);
+ }
+ }
+
+ public MockSplitCard(final MockSplitCard card) {
+ super(card);
+ }
+
+ @Override
+ public MockSplitCard copy() {
+ return new MockSplitCard(this);
+ }
+
+ private MageInt mageIntFromString(String value) {
+ try {
+ int intValue = Integer.parseInt(value);
+ return new MageInt(intValue);
+ } catch (NumberFormatException e) {
+ return new MageInt(0, value);
+ }
+ }
+
+ private static String join(List strings) {
+ StringBuilder sb = new StringBuilder();
+ for (String string : strings) {
+ sb.append(string);
+ }
+ return sb.toString();
+ }
+
+ private Ability textAbilityFromString(final String text) {
+ return new MockAbility(text);
+ }
+
+ private static String getLeftHalfName(CardInfo card) {
+ return card.getName().split(" // ")[0];
+ }
+
+ private static String getRightHalfName(CardInfo card) {
+ return card.getName().split(" // ")[1];
+ }
+}
diff --git a/Mage/src/mage/cards/repository/CardCriteria.java b/Mage/src/mage/cards/repository/CardCriteria.java
index 4db23e12205..63717c67066 100644
--- a/Mage/src/mage/cards/repository/CardCriteria.java
+++ b/Mage/src/mage/cards/repository/CardCriteria.java
@@ -171,7 +171,9 @@ public class CardCriteria {
public void buildQuery(QueryBuilder qb) throws SQLException {
Where where = qb.where();
- int clausesCount = 0;
+ where.eq("nightCard", false);
+ where.eq("splitCardHalf", false);
+ int clausesCount = 2;
if (name != null) {
where.like("name", new SelectArg('%' + name + '%'));
clausesCount++;
diff --git a/Mage/src/mage/cards/repository/CardInfo.java b/Mage/src/mage/cards/repository/CardInfo.java
index d3a5ded4453..afcac411a8e 100644
--- a/Mage/src/mage/cards/repository/CardInfo.java
+++ b/Mage/src/mage/cards/repository/CardInfo.java
@@ -38,8 +38,12 @@ import java.util.List;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.ObjectColor;
+import mage.abilities.SpellAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.cards.mock.MockCard;
+import mage.cards.mock.MockSplitCard;
+import mage.constants.SpellAbilityType;
/**
*
@@ -55,7 +59,7 @@ public class CardInfo {
protected int cardNumber;
@DatabaseField
protected String setCode;
- @DatabaseField
+ @DatabaseField(unique = true)
protected String className;
@DatabaseField
protected String power;
@@ -88,6 +92,8 @@ public class CardInfo {
@DatabaseField
protected boolean splitCard;
@DatabaseField
+ protected boolean splitCardHalf;
+ @DatabaseField
protected boolean flipCard;
@DatabaseField
protected boolean doubleFaced;
@@ -115,7 +121,7 @@ public class CardInfo {
this.flipCard = card.isFlipCard();
this.flipCardName = card.getFlipCardName();
- this.doubleFaced = card.canTransform();
+ this.doubleFaced = card.canTransform() && card.getSecondCardFace() != null;
this.nightCard = card.isNightCard();
Card secondSide = card.getSecondCardFace();
if (secondSide != null) {
@@ -133,12 +139,33 @@ public class CardInfo {
this.setSuperTypes(card.getSupertype());
this.setManaCosts(card.getManaCost().getSymbols());
this.setRules(card.getRules());
+
+ SpellAbility spellAbility = card.getSpellAbility();
+ if (spellAbility != null) {
+ SpellAbilityType spellAbilityType = spellAbility.getSpellAbilityType();
+ if (spellAbilityType == SpellAbilityType.SPLIT_LEFT || spellAbilityType == SpellAbilityType.SPLIT_RIGHT) {
+ this.className = this.setCode + "." + this.name;
+ this.splitCardHalf = true;
+ }
+ }
}
public Card getCard() {
return CardImpl.createCard(className);
}
+ public Card getMockCard() {
+ if (this.splitCard) {
+ return new MockSplitCard(this);
+ } else {
+ return new MockCard(this);
+ }
+ }
+
+ public boolean usesVariousArt() {
+ return Character.isDigit(className.charAt(className.length() - 1));
+ }
+
public ObjectColor getColor() {
ObjectColor color = new ObjectColor();
color.setBlack(black);
@@ -248,6 +275,10 @@ public class CardInfo {
return splitCard;
}
+ public boolean isSplitCardHalf() {
+ return splitCardHalf;
+ }
+
public boolean isFlipCard() {
return flipCard;
}
diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java
index 3300cc04bd2..f2965601371 100644
--- a/Mage/src/mage/cards/repository/CardRepository.java
+++ b/Mage/src/mage/cards/repository/CardRepository.java
@@ -32,7 +32,6 @@ import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.jdbc.JdbcConnectionSource;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.SelectArg;
-import com.j256.ormlite.stmt.Where;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import java.io.File;
@@ -54,7 +53,8 @@ public enum CardRepository {
instance;
private static final String JDBC_URL = "jdbc:sqlite:db/cards.db";
- private static final long DB_VERSION = 9;
+ private static final String VERSION_ENTITY_NAME = "card";
+ private static final long CARD_DB_VERSION = 10;
private Random random = new Random();
private Dao cardDao;
@@ -67,16 +67,10 @@ public enum CardRepository {
}
try {
ConnectionSource connectionSource = new JdbcConnectionSource(JDBC_URL);
- TableUtils.createTableIfNotExists(connectionSource, DatabaseVersion.class);
- Dao dbVersionDao = DaoManager.createDao(connectionSource, DatabaseVersion.class);
- List dbVersions = dbVersionDao.queryForAll();
- if (dbVersions.isEmpty() || dbVersions.get(0).getVersion() != DB_VERSION) {
+ boolean obsolete = RepositoryUtil.isDatabaseObsolete(connectionSource, VERSION_ENTITY_NAME, CARD_DB_VERSION);
+
+ if (obsolete) {
TableUtils.dropTable(connectionSource, CardInfo.class, true);
- if (dbVersions.isEmpty()) {
- DatabaseVersion dbVersion = new DatabaseVersion();
- dbVersion.setVersion(DB_VERSION);
- dbVersionDao.create(dbVersion);
- }
}
TableUtils.createTableIfNotExists(connectionSource, CardInfo.class);
@@ -123,20 +117,6 @@ public enum CardRepository {
return false;
}
- public List getSetCodes() {
- List setCodes = new ArrayList();
- try {
- QueryBuilder qb = cardDao.queryBuilder();
- qb.distinct().selectColumns("setCode");
- List results = cardDao.query(qb.prepare());
- for (CardInfo card : results) {
- setCodes.add(card.getSetCode());
- }
- } catch (SQLException ex) {
- }
- return setCodes;
- }
-
public Set getNames() {
Set names = new TreeSet();
try {
@@ -183,14 +163,16 @@ public enum CardRepository {
try {
QueryBuilder qb = cardDao.queryBuilder();
qb.distinct().selectColumns("name");
- Where where = qb.where();
- where.and(where.not().like("types", '%' + CardType.CREATURE.name() +'%'),where.not().like("types", '%' + CardType.LAND.name() + '%'));
+ qb.where()
+ .not().like("types", '%' + CardType.CREATURE.name() + '%')
+ .and()
+ .not().like("types", '%' + CardType.LAND.name() + '%');
List results = cardDao.query(qb.prepare());
for (CardInfo card : results) {
int result = card.getName().indexOf(" // ");
if (result > 0) {
names.add(card.getName().substring(0, result));
- names.add(card.getName().substring(result+4));
+ names.add(card.getName().substring(result + 4));
} else {
names.add(card.getName());
}
@@ -228,6 +210,30 @@ public enum CardRepository {
return null;
}
+
+ public List getClassNames() {
+ List names = new ArrayList();
+ try {
+ List results = cardDao.queryForAll();
+ for (CardInfo card : results) {
+ names.add(card.getClassName());
+ }
+ } catch (SQLException ex) {
+ }
+ return names;
+ }
+
+ public List getMissingCards(List classNames) {
+ try {
+ QueryBuilder queryBuilder = cardDao.queryBuilder();
+ queryBuilder.where().not().in("className", classNames);
+
+ return cardDao.query(queryBuilder.prepare());
+ } catch (SQLException ex) {
+ }
+ return new ArrayList();
+ }
+
/**
*
* @param name
@@ -262,14 +268,4 @@ public enum CardRepository {
}
return new ArrayList();
}
-
- public List getAllCards() {
- try {
- QueryBuilder queryBuilder = cardDao.queryBuilder();
-
- return cardDao.query(queryBuilder.prepare());
- } catch (SQLException ex) {
- }
- return new ArrayList();
- }
}
diff --git a/Mage/src/mage/cards/repository/CardScanner.java b/Mage/src/mage/cards/repository/CardScanner.java
index e8b5472d390..c551cda9bd0 100644
--- a/Mage/src/mage/cards/repository/CardScanner.java
+++ b/Mage/src/mage/cards/repository/CardScanner.java
@@ -33,6 +33,7 @@ import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.ExpansionSet;
import mage.cards.Sets;
+import mage.cards.SplitCard;
import mage.util.ClassScanner;
/**
@@ -53,13 +54,19 @@ public class CardScanner {
List packages = new ArrayList();
for (ExpansionSet set : Sets.getInstance().values()) {
packages.add(set.getPackageName());
+ ExpansionRepository.instance.add(new ExpansionInfo(set));
}
for (Class c : ClassScanner.findClasses(packages, CardImpl.class)) {
if (!CardRepository.instance.cardExists(c.getCanonicalName())) {
Card card = CardImpl.createCard(c);
- if (card != null && !card.isNightCard()) {
+ if (card != null) {
cardsToAdd.add(new CardInfo(card));
+ if (card instanceof SplitCard) {
+ SplitCard splitCard = (SplitCard) card;
+ cardsToAdd.add(new CardInfo(splitCard.getLeftHalfCard()));
+ cardsToAdd.add(new CardInfo(splitCard.getRightHalfCard()));
+ }
}
}
}
diff --git a/Mage/src/mage/cards/repository/DatabaseVersion.java b/Mage/src/mage/cards/repository/DatabaseVersion.java
index 7f1b3aaab0f..55f87e066ec 100644
--- a/Mage/src/mage/cards/repository/DatabaseVersion.java
+++ b/Mage/src/mage/cards/repository/DatabaseVersion.java
@@ -10,9 +10,20 @@ import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "version")
public class DatabaseVersion {
+ @DatabaseField
+ protected String entity;
+
@DatabaseField
protected Long version;
+ public String getEntity() {
+ return entity;
+ }
+
+ public void setEntity(String entity) {
+ this.entity = entity;
+ }
+
public Long getVersion() {
return version;
}
diff --git a/Mage/src/mage/cards/repository/ExpansionInfo.java b/Mage/src/mage/cards/repository/ExpansionInfo.java
new file mode 100644
index 00000000000..db1f0e8e67a
--- /dev/null
+++ b/Mage/src/mage/cards/repository/ExpansionInfo.java
@@ -0,0 +1,59 @@
+package mage.cards.repository;
+
+import com.j256.ormlite.field.DataType;
+import com.j256.ormlite.field.DatabaseField;
+import com.j256.ormlite.table.DatabaseTable;
+import mage.cards.ExpansionSet;
+import mage.constants.SetType;
+
+import java.util.Date;
+
+/**
+ *
+ * @author North
+ */
+@DatabaseTable(tableName = "expansion")
+public class ExpansionInfo {
+
+ @DatabaseField(unique = true)
+ protected String name;
+ @DatabaseField(unique = true)
+ protected String code;
+ @DatabaseField
+ protected String blockName;
+ @DatabaseField
+ protected Date releaseDate;
+ @DatabaseField(dataType = DataType.ENUM_STRING)
+ protected SetType type;
+
+ public ExpansionInfo() {
+ }
+
+ public ExpansionInfo(ExpansionSet expansionSet) {
+ this.name = expansionSet.getName();
+ this.code = expansionSet.getCode();
+ this.blockName = expansionSet.getBlockName();
+ this.releaseDate = expansionSet.getReleaseDate();
+ this.type = expansionSet.getSetType();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public String getBlockName() {
+ return blockName;
+ }
+
+ public Date getReleaseDate() {
+ return releaseDate;
+ }
+
+ public SetType getType() {
+ return type;
+ }
+}
diff --git a/Mage/src/mage/cards/repository/ExpansionRepository.java b/Mage/src/mage/cards/repository/ExpansionRepository.java
new file mode 100644
index 00000000000..bb66b60ecb6
--- /dev/null
+++ b/Mage/src/mage/cards/repository/ExpansionRepository.java
@@ -0,0 +1,73 @@
+package mage.cards.repository;
+
+import com.j256.ormlite.dao.Dao;
+import com.j256.ormlite.dao.DaoManager;
+import com.j256.ormlite.jdbc.JdbcConnectionSource;
+import com.j256.ormlite.support.ConnectionSource;
+import com.j256.ormlite.table.TableUtils;
+
+import java.io.File;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author North
+ */
+public enum ExpansionRepository {
+
+ instance;
+
+ private static final String JDBC_URL = "jdbc:sqlite:db/cards.db";
+ private static final String VERSION_ENTITY_NAME = "expansion";
+ private static final long EXPANSION_DB_VERSION = 1;
+
+ private Dao expansionDao;
+
+ private ExpansionRepository() {
+ File file = new File("db");
+ if (!file.exists()) {
+ file.mkdirs();
+ }
+ try {
+ ConnectionSource connectionSource = new JdbcConnectionSource(JDBC_URL);
+ boolean obsolete = RepositoryUtil.isDatabaseObsolete(connectionSource, VERSION_ENTITY_NAME, EXPANSION_DB_VERSION);
+
+ if (obsolete) {
+ TableUtils.dropTable(connectionSource, ExpansionInfo.class, true);
+ }
+
+ TableUtils.createTableIfNotExists(connectionSource, ExpansionInfo.class);
+ expansionDao = DaoManager.createDao(connectionSource, ExpansionInfo.class);
+ } catch (SQLException ex) {
+ }
+ }
+
+ public void add(ExpansionInfo expansion) {
+ try {
+ expansionDao.create(expansion);
+ } catch (SQLException e) {
+ }
+ }
+
+ public List getSetCodes() {
+ List setCodes = new ArrayList();
+ try {
+ List expansions = expansionDao.queryForAll();
+ for (ExpansionInfo expansion : expansions) {
+ setCodes.add(expansion.getCode());
+ }
+ } catch (SQLException ex) {
+ }
+ return setCodes;
+ }
+
+ public List getAll() {
+ try {
+ return expansionDao.queryForAll();
+ } catch (SQLException ex) {
+ }
+ return new ArrayList();
+ }
+}
diff --git a/Mage/src/mage/cards/repository/RepositoryUtil.java b/Mage/src/mage/cards/repository/RepositoryUtil.java
new file mode 100644
index 00000000000..43f9df24e15
--- /dev/null
+++ b/Mage/src/mage/cards/repository/RepositoryUtil.java
@@ -0,0 +1,34 @@
+package mage.cards.repository;
+
+import com.j256.ormlite.dao.Dao;
+import com.j256.ormlite.dao.DaoManager;
+import com.j256.ormlite.stmt.QueryBuilder;
+import com.j256.ormlite.stmt.SelectArg;
+import com.j256.ormlite.support.ConnectionSource;
+import com.j256.ormlite.table.TableUtils;
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ *
+ * @author North
+ */
+public class RepositoryUtil {
+
+ public static boolean isDatabaseObsolete(ConnectionSource connectionSource, String entityName, long version) throws SQLException {
+ TableUtils.createTableIfNotExists(connectionSource, DatabaseVersion.class);
+ Dao dbVersionDao = DaoManager.createDao(connectionSource, DatabaseVersion.class);
+
+ QueryBuilder queryBuilder = dbVersionDao.queryBuilder();
+ queryBuilder.where().eq("entity", new SelectArg(entityName)).and().eq("version", version);
+ List dbVersions = dbVersionDao.query(queryBuilder.prepare());
+
+ if (dbVersions.isEmpty()) {
+ DatabaseVersion dbVersion = new DatabaseVersion();
+ dbVersion.setEntity(entityName);
+ dbVersion.setVersion(version);
+ dbVersionDao.create(dbVersion);
+ }
+ return dbVersions.isEmpty();
+ }
+}
diff --git a/pom.xml b/pom.xml
index 7e2f80db854..4cc9b4c15db 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,6 +76,5 @@
1.0.3
UTF-8
- mage