From e2152c59a273d6df427dffa1a2a8fe971112904e Mon Sep 17 00:00:00 2001 From: North Date: Tue, 18 Jun 2013 22:44:34 +0300 Subject: [PATCH 01/27] added ExpansionRepository --- Mage/src/mage/cards/ExpansionSet.java | 4 + .../cards/repository/DatabaseVersion.java | 11 +++ .../mage/cards/repository/ExpansionInfo.java | 59 +++++++++++++++ .../cards/repository/ExpansionRepository.java | 73 +++++++++++++++++++ .../mage/cards/repository/RepositoryUtil.java | 34 +++++++++ 5 files changed, 181 insertions(+) create mode 100644 Mage/src/mage/cards/repository/ExpansionInfo.java create mode 100644 Mage/src/mage/cards/repository/ExpansionRepository.java create mode 100644 Mage/src/mage/cards/repository/RepositoryUtil.java 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/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(); + } +} From 0166975e837be57969f6f36f0e909b803cad11e2 Mon Sep 17 00:00:00 2001 From: North Date: Tue, 18 Jun 2013 22:46:09 +0300 Subject: [PATCH 02/27] refactored getSetCodes to be used from ExpansionReposiitory --- .../client/deck/generator/DeckGenerator.java | 6 +- .../collection/viewer/MageBook.java | 3 +- .../client/util/sets/ConstructedFormats.java | 68 +++++++++---------- .../org/mage/card/arcane/ManaSymbols.java | 5 +- .../mage/cards/repository/CardRepository.java | 42 +++--------- 5 files changed, 52 insertions(+), 72 deletions(-) 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..f76451abb63 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")) { 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..2ebdfd6b5fb 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 @@ -36,6 +36,7 @@ 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.cards.BigCard; import mage.client.components.HoverButton; import mage.client.plugins.impl.Plugins; @@ -301,7 +302,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/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/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index feb74c07090..d283e6e5fd3 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 = 7; + private static final String VERSION_ENTITY_NAME = "card"; + private static final long CARD_DB_VERSION = 7; 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()); } @@ -265,9 +247,7 @@ public enum CardRepository { public List getAllCards() { try { - QueryBuilder queryBuilder = cardDao.queryBuilder(); - - return cardDao.query(queryBuilder.prepare()); + return cardDao.queryForAll(); } catch (SQLException ex) { } return new ArrayList(); From 60289b43dee5ae883891f29cf0a3e0a1a37f3a61 Mon Sep 17 00:00:00 2001 From: North Date: Tue, 18 Jun 2013 22:46:42 +0300 Subject: [PATCH 03/27] CardScanner now adds Expansions to the ExpansionRepository --- Mage/src/mage/cards/repository/CardScanner.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage/src/mage/cards/repository/CardScanner.java b/Mage/src/mage/cards/repository/CardScanner.java index e8b5472d390..b66fc64b83e 100644 --- a/Mage/src/mage/cards/repository/CardScanner.java +++ b/Mage/src/mage/cards/repository/CardScanner.java @@ -53,6 +53,7 @@ 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)) { From fb2ea95f55b5d6817ac6ad902e2b6b00518d4063 Mon Sep 17 00:00:00 2001 From: North Date: Tue, 18 Jun 2013 22:47:01 +0300 Subject: [PATCH 04/27] removed card scanning from the client --- Mage.Client/src/main/java/mage/client/MageFrame.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index ba37acad848..3fdf6b81d1b 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -1005,7 +1005,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; From 462992e838718df31bfe02c35d8f906abb9f1aa0 Mon Sep 17 00:00:00 2001 From: North Date: Wed, 19 Jun 2013 21:21:35 +0300 Subject: [PATCH 05/27] removed dependency to Mage.Sets and Mage.Server --- Mage.Client/pom.xml | 23 +------------------ .../src/main/java/mage/client/MageFrame.java | 9 -------- 2 files changed, 1 insertion(+), 31 deletions(-) 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 3fdf6b81d1b..3ea48536d82 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -40,7 +40,6 @@ import de.schlichtherle.truezip.fs.FsOutputOption; import mage.cards.decks.Deck; 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 +66,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 +73,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; @@ -205,12 +202,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); From e9b81dd006418f8e13391cc81d6a4b99620ee71a Mon Sep 17 00:00:00 2001 From: North Date: Wed, 19 Jun 2013 22:36:16 +0300 Subject: [PATCH 06/27] added MockCard (for display only) --- Mage/src/mage/cards/MockCard.java | 81 +++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 Mage/src/mage/cards/MockCard.java diff --git a/Mage/src/mage/cards/MockCard.java b/Mage/src/mage/cards/MockCard.java new file mode 100644 index 00000000000..f6d609bb735 --- /dev/null +++ b/Mage/src/mage/cards/MockCard.java @@ -0,0 +1,81 @@ +package mage.cards; + +import com.sun.deploy.util.StringUtils; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.AbilityImpl; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import mage.constants.AbilityType; +import mage.constants.Zone; +import mage.watchers.Watcher; + +/** + * @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.manaCost = new ManaCostsImpl(StringUtils.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 text: card.getRules()) { + this.addAbility(textAbilityFromString(text)); + } + } + + 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 Ability textAbilityFromString(final String text) { + return new AbilityImpl(AbilityType.STATIC, Zone.ALL) { + @Override + public AbilityImpl copy() { + return this; + } + + @Override + public String getRule(boolean all) { + return text; + } + }; + } +} From 1b3a51484e9f1a51b6c7497527e9cde753a19b37 Mon Sep 17 00:00:00 2001 From: North Date: Wed, 19 Jun 2013 22:53:53 +0300 Subject: [PATCH 07/27] replaced Card instances in client with MockCard --- .../java/mage/client/deck/generator/DeckGenerator.java | 6 +++--- .../src/main/java/mage/client/deckeditor/CardSelector.java | 2 +- .../main/java/mage/client/deckeditor/DeckEditorPanel.java | 4 ++-- .../mage/client/deckeditor/collection/viewer/MageBook.java | 7 +++---- .../src/main/java/mage/client/dialog/AddLandDialog.java | 2 +- .../src/main/java/mage/client/game/PlayerPanelExt.java | 2 +- .../src/main/java/mage/client/util/CardsViewUtil.java | 2 +- Mage.Client/src/main/java/mage/client/util/DeckUtil.java | 4 ++-- Mage/src/mage/cards/repository/CardInfo.java | 5 +++++ 9 files changed, 19 insertions(+), 15 deletions(-) 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 f76451abb63..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 @@ -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 eba79010782..95a8b39973e 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 2ebdfd6b5fb..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,12 +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; @@ -227,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); } @@ -238,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); } 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 24d97a1b964..ccd02a41b3f 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java @@ -249,7 +249,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/src/mage/cards/repository/CardInfo.java b/Mage/src/mage/cards/repository/CardInfo.java index d3a5ded4453..41bb708c328 100644 --- a/Mage/src/mage/cards/repository/CardInfo.java +++ b/Mage/src/mage/cards/repository/CardInfo.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import mage.cards.MockCard; import mage.constants.CardType; import mage.constants.Rarity; import mage.ObjectColor; @@ -139,6 +140,10 @@ public class CardInfo { return CardImpl.createCard(className); } + public Card getMockCard() { + return new MockCard(this); + } + public ObjectColor getColor() { ObjectColor color = new ObjectColor(); color.setBlack(black); From f0578942c629a50bc15ad159bfca313e014b8b26 Mon Sep 17 00:00:00 2001 From: North Date: Wed, 19 Jun 2013 23:05:39 +0300 Subject: [PATCH 08/27] NightCards metadata added to CardRepository on scan --- Mage/src/mage/cards/repository/CardScanner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/mage/cards/repository/CardScanner.java b/Mage/src/mage/cards/repository/CardScanner.java index b66fc64b83e..fbc65f1bea0 100644 --- a/Mage/src/mage/cards/repository/CardScanner.java +++ b/Mage/src/mage/cards/repository/CardScanner.java @@ -59,7 +59,7 @@ public class CardScanner { 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)); } } From f57f6e6d917744449fe9bea3dcfae348bc746ed2 Mon Sep 17 00:00:00 2001 From: North Date: Wed, 26 Jun 2013 19:59:59 +0300 Subject: [PATCH 09/27] Removed StringUtils (JDK7) dependency --- Mage/src/mage/cards/MockCard.java | 53 ++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/Mage/src/mage/cards/MockCard.java b/Mage/src/mage/cards/MockCard.java index f6d609bb735..a5393ea9995 100644 --- a/Mage/src/mage/cards/MockCard.java +++ b/Mage/src/mage/cards/MockCard.java @@ -1,22 +1,19 @@ package mage.cards; -import com.sun.deploy.util.StringUtils; +import java.util.List; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.AbilityImpl; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; import mage.constants.AbilityType; import mage.constants.Zone; -import mage.watchers.Watcher; /** * @author North */ -public class MockCard extends CardImpl { +public class MockCard extends CardImpl { public MockCard(CardInfo card) { super(null, card.getName()); this.cardNumber = card.getCardNumber(); @@ -28,7 +25,7 @@ public class MockCard extends CardImpl { this.subtype = card.getSubTypes(); this.supertype = card.getSupertypes(); - this.manaCost = new ManaCostsImpl(StringUtils.join(card.getManaCosts(), "")); + this.manaCost = new ManaCostsImpl(join(card.getManaCosts())); this.color = card.getColor(); this.splitCard = card.isSplitCard(); @@ -42,8 +39,8 @@ public class MockCard extends CardImpl { this.flipCardName = card.getFlipCardName(); - for(String text: card.getRules()) { - this.addAbility(textAbilityFromString(text)); + for(String ruleText: card.getRules()) { + this.addAbility(textAbilityFromString(ruleText)); } } @@ -65,17 +62,35 @@ public class MockCard extends CardImpl { } } - private Ability textAbilityFromString(final String text) { - return new AbilityImpl(AbilityType.STATIC, Zone.ALL) { - @Override - public AbilityImpl copy() { - return this; - } + private String join(List strings) { + StringBuilder sb = new StringBuilder(); + for (String string : strings) { + sb.append(string); + } + return sb.toString(); + } - @Override - public String getRule(boolean all) { - return text; - } - }; + private Ability textAbilityFromString(final String text) { + return new MockAbility(text); + } + + private 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; + } } } From d819053930f6cad4391a8bf27aa766529c56f046 Mon Sep 17 00:00:00 2001 From: North Date: Wed, 26 Jun 2013 20:34:34 +0300 Subject: [PATCH 10/27] Moved MockAbility to stand alone class --- Mage/src/mage/cards/MockAbility.java | 25 +++++++++++++++++++++++++ Mage/src/mage/cards/MockCard.java | 23 ----------------------- 2 files changed, 25 insertions(+), 23 deletions(-) create mode 100644 Mage/src/mage/cards/MockAbility.java diff --git a/Mage/src/mage/cards/MockAbility.java b/Mage/src/mage/cards/MockAbility.java new file mode 100644 index 00000000000..27a41348211 --- /dev/null +++ b/Mage/src/mage/cards/MockAbility.java @@ -0,0 +1,25 @@ +package mage.cards; + +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/MockCard.java b/Mage/src/mage/cards/MockCard.java index a5393ea9995..54f4aa6d6e0 100644 --- a/Mage/src/mage/cards/MockCard.java +++ b/Mage/src/mage/cards/MockCard.java @@ -3,12 +3,9 @@ package mage.cards; import java.util.List; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.AbilityImpl; import mage.abilities.costs.mana.ManaCostsImpl; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; -import mage.constants.AbilityType; -import mage.constants.Zone; /** * @author North @@ -73,24 +70,4 @@ public class MockCard extends CardImpl { private Ability textAbilityFromString(final String text) { return new MockAbility(text); } - - private 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; - } - } } From 8287cbaaf01bad0cfaa2876c26d3b5109ef09f21 Mon Sep 17 00:00:00 2001 From: North Date: Wed, 26 Jun 2013 22:28:33 +0300 Subject: [PATCH 11/27] Added MockSplitCard --- Mage/src/mage/cards/MockSplitCard.java | 97 +++++++++++++++++++ Mage/src/mage/cards/SplitCard.java | 4 +- Mage/src/mage/cards/repository/CardInfo.java | 7 +- .../mage/cards/repository/CardScanner.java | 6 ++ 4 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 Mage/src/mage/cards/MockSplitCard.java diff --git a/Mage/src/mage/cards/MockSplitCard.java b/Mage/src/mage/cards/MockSplitCard.java new file mode 100644 index 00000000000..3b92894f6b8 --- /dev/null +++ b/Mage/src/mage/cards/MockSplitCard.java @@ -0,0 +1,97 @@ +package mage.cards; + +import java.util.List; +import mage.MageInt; +import mage.abilities.Ability; +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.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/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/repository/CardInfo.java b/Mage/src/mage/cards/repository/CardInfo.java index 41bb708c328..56b22e7e320 100644 --- a/Mage/src/mage/cards/repository/CardInfo.java +++ b/Mage/src/mage/cards/repository/CardInfo.java @@ -41,6 +41,7 @@ import mage.constants.Rarity; import mage.ObjectColor; import mage.cards.Card; import mage.cards.CardImpl; +import mage.cards.MockSplitCard; /** * @@ -141,7 +142,11 @@ public class CardInfo { } public Card getMockCard() { - return new MockCard(this); + if (this.splitCard) { + return new MockSplitCard(this); + } else { + return new MockCard(this); + } } public ObjectColor getColor() { diff --git a/Mage/src/mage/cards/repository/CardScanner.java b/Mage/src/mage/cards/repository/CardScanner.java index fbc65f1bea0..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; /** @@ -61,6 +62,11 @@ public class CardScanner { Card card = CardImpl.createCard(c); 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())); + } } } } From 988efec96c2991853a9e5e34ffb08f6133101f17 Mon Sep 17 00:00:00 2001 From: North Date: Thu, 27 Jun 2013 23:39:09 +0300 Subject: [PATCH 12/27] moved MockCards to mock package --- Mage/src/mage/cards/{ => mock}/MockAbility.java | 2 +- Mage/src/mage/cards/{ => mock}/MockCard.java | 3 ++- Mage/src/mage/cards/{ => mock}/MockSplitCard.java | 3 ++- Mage/src/mage/cards/repository/CardInfo.java | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) rename Mage/src/mage/cards/{ => mock}/MockAbility.java (94%) rename Mage/src/mage/cards/{ => mock}/MockCard.java (94%) rename Mage/src/mage/cards/{ => mock}/MockSplitCard.java (95%) diff --git a/Mage/src/mage/cards/MockAbility.java b/Mage/src/mage/cards/mock/MockAbility.java similarity index 94% rename from Mage/src/mage/cards/MockAbility.java rename to Mage/src/mage/cards/mock/MockAbility.java index 27a41348211..05d2a1456c7 100644 --- a/Mage/src/mage/cards/MockAbility.java +++ b/Mage/src/mage/cards/mock/MockAbility.java @@ -1,4 +1,4 @@ -package mage.cards; +package mage.cards.mock; import mage.abilities.AbilityImpl; import mage.constants.AbilityType; diff --git a/Mage/src/mage/cards/MockCard.java b/Mage/src/mage/cards/mock/MockCard.java similarity index 94% rename from Mage/src/mage/cards/MockCard.java rename to Mage/src/mage/cards/mock/MockCard.java index 54f4aa6d6e0..bf2f2e031ff 100644 --- a/Mage/src/mage/cards/MockCard.java +++ b/Mage/src/mage/cards/mock/MockCard.java @@ -1,9 +1,10 @@ -package mage.cards; +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; diff --git a/Mage/src/mage/cards/MockSplitCard.java b/Mage/src/mage/cards/mock/MockSplitCard.java similarity index 95% rename from Mage/src/mage/cards/MockSplitCard.java rename to Mage/src/mage/cards/mock/MockSplitCard.java index 3b92894f6b8..2619d9b9585 100644 --- a/Mage/src/mage/cards/MockSplitCard.java +++ b/Mage/src/mage/cards/mock/MockSplitCard.java @@ -1,8 +1,9 @@ -package mage.cards; +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; diff --git a/Mage/src/mage/cards/repository/CardInfo.java b/Mage/src/mage/cards/repository/CardInfo.java index 56b22e7e320..0cbcbab17b4 100644 --- a/Mage/src/mage/cards/repository/CardInfo.java +++ b/Mage/src/mage/cards/repository/CardInfo.java @@ -35,13 +35,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import mage.cards.MockCard; import mage.constants.CardType; import mage.constants.Rarity; import mage.ObjectColor; import mage.cards.Card; import mage.cards.CardImpl; -import mage.cards.MockSplitCard; +import mage.cards.mock.MockCard; +import mage.cards.mock.MockSplitCard; /** * From a5eebbbf12e3826ff8195219e6f2bdd2d158f7c9 Mon Sep 17 00:00:00 2001 From: North Date: Thu, 27 Jun 2013 23:57:38 +0300 Subject: [PATCH 13/27] fixed NPE at downloading card images --- .../org/mage/plugins/card/images/DownloadPictures.java | 7 ------- 1 file changed, 7 deletions(-) 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..6e2e7d8153f 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 @@ -236,13 +236,6 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab url.setSplitCard(card.isSplitCard()); 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); - allCardsUrls.add(url); - } if (card.isFlipCard()) { if (card.getFlipCardName() == null || card.getFlipCardName().trim().isEmpty()) { throw new IllegalStateException("Flipped card can't have empty name."); From 4c83fd7d6a7b40d316583e0d07c432a8c1eccb6a Mon Sep 17 00:00:00 2001 From: North Date: Sat, 29 Jun 2013 00:08:10 +0300 Subject: [PATCH 14/27] fix for downloading cards from wizards spoilers --- .../dl/sources/WizardCardsImageSource.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) 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..bbec3caccdb 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 @@ -60,7 +60,7 @@ 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; @@ -69,7 +69,7 @@ public class WizardCardsImageSource implements CardImageSource { } 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,17 @@ 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("&", "//"); + } + @Override public String generateURL(CardDownloadData card) throws Exception { Integer collectorId = card.getCollectorId(); @@ -110,7 +121,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)); From a43bc8bed6f7cdeb69ce82e494607c51847771c8 Mon Sep 17 00:00:00 2001 From: North Date: Sat, 29 Jun 2013 12:52:43 +0300 Subject: [PATCH 15/27] fixed issue where second face was considered a card --- .../org/mage/plugins/card/images/DownloadPictures.java | 7 +++++++ Mage/src/mage/cards/repository/CardCriteria.java | 3 ++- Mage/src/mage/cards/repository/CardInfo.java | 2 +- Mage/src/mage/cards/repository/CardRepository.java | 7 +++++-- 4 files changed, 15 insertions(+), 4 deletions(-) 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 6e2e7d8153f..a8ee8288688 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 @@ -236,6 +236,13 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab url.setSplitCard(card.isSplitCard()); allCardsUrls.add(url); + if (card.isDoubleFaced()) { + 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(), usesVariousArt(card), 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."); diff --git a/Mage/src/mage/cards/repository/CardCriteria.java b/Mage/src/mage/cards/repository/CardCriteria.java index 4db23e12205..4997a612354 100644 --- a/Mage/src/mage/cards/repository/CardCriteria.java +++ b/Mage/src/mage/cards/repository/CardCriteria.java @@ -171,7 +171,8 @@ public class CardCriteria { public void buildQuery(QueryBuilder qb) throws SQLException { Where where = qb.where(); - int clausesCount = 0; + where.eq("nightCard", false); + int clausesCount = 1; 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 0cbcbab17b4..405e9166a9b 100644 --- a/Mage/src/mage/cards/repository/CardInfo.java +++ b/Mage/src/mage/cards/repository/CardInfo.java @@ -117,7 +117,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) { diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index d283e6e5fd3..f30c038ee86 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -54,7 +54,7 @@ public enum CardRepository { private static final String JDBC_URL = "jdbc:sqlite:db/cards.db"; private static final String VERSION_ENTITY_NAME = "card"; - private static final long CARD_DB_VERSION = 7; + private static final long CARD_DB_VERSION = 8; private Random random = new Random(); private Dao cardDao; @@ -247,7 +247,10 @@ public enum CardRepository { public List getAllCards() { try { - return cardDao.queryForAll(); + QueryBuilder queryBuilder = cardDao.queryBuilder(); + queryBuilder.where().eq("nightCard", false); + + return cardDao.query(queryBuilder.prepare()); } catch (SQLException ex) { } return new ArrayList(); From 4b4f73fea1129bc3ce8f3a51328b56e48a310621 Mon Sep 17 00:00:00 2001 From: North Date: Sat, 29 Jun 2013 16:58:25 +0300 Subject: [PATCH 16/27] fixed display of lands --- Mage/src/mage/cards/mock/MockCard.java | 2 ++ Mage/src/mage/cards/mock/MockSplitCard.java | 2 ++ Mage/src/mage/cards/repository/CardInfo.java | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/Mage/src/mage/cards/mock/MockCard.java b/Mage/src/mage/cards/mock/MockCard.java index bf2f2e031ff..a066418ccf3 100644 --- a/Mage/src/mage/cards/mock/MockCard.java +++ b/Mage/src/mage/cards/mock/MockCard.java @@ -23,6 +23,8 @@ public class MockCard extends CardImpl { this.subtype = card.getSubTypes(); this.supertype = card.getSupertypes(); + this.usesVariousArt = card.usesVariousArt(); + this.manaCost = new ManaCostsImpl(join(card.getManaCosts())); this.color = card.getColor(); diff --git a/Mage/src/mage/cards/mock/MockSplitCard.java b/Mage/src/mage/cards/mock/MockSplitCard.java index 2619d9b9585..fb7c5c32347 100644 --- a/Mage/src/mage/cards/mock/MockSplitCard.java +++ b/Mage/src/mage/cards/mock/MockSplitCard.java @@ -31,6 +31,8 @@ public class MockSplitCard extends SplitCard { this.subtype = card.getSubTypes(); this.supertype = card.getSupertypes(); + this.usesVariousArt = card.usesVariousArt(); + this.color = card.getColor(); this.splitCard = card.isSplitCard(); this.flipCard = card.isFlipCard(); diff --git a/Mage/src/mage/cards/repository/CardInfo.java b/Mage/src/mage/cards/repository/CardInfo.java index 405e9166a9b..78bb542c22d 100644 --- a/Mage/src/mage/cards/repository/CardInfo.java +++ b/Mage/src/mage/cards/repository/CardInfo.java @@ -149,6 +149,10 @@ public class CardInfo { } } + public boolean usesVariousArt() { + return Character.isDigit(className.charAt(className.length() - 1)); + } + public ObjectColor getColor() { ObjectColor color = new ObjectColor(); color.setBlack(black); From 6c51bcd59987c64f01ec37c4c4b522014bd23e01 Mon Sep 17 00:00:00 2001 From: North Date: Sat, 29 Jun 2013 16:58:53 +0300 Subject: [PATCH 17/27] fix for lands download (wizards source) --- .../mage/plugins/card/dl/sources/WizardCardsImageSource.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 bbec3caccdb..98b715ec6cc 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 @@ -64,7 +64,7 @@ public class WizardCardsImageSource implements CardImageSource { 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; @@ -102,7 +102,8 @@ public class WizardCardsImageSource implements CardImageSource { .replace("\u00D6", "O").replace("\u00F6", "o") .replace("\u00DB", "U").replace("\u00FB", "u") .replace("\u00DC", "U").replace("\u00FC", "u") - .replace("\u00E9", "e").replace("&", "//"); + .replace("\u00E9", "e").replace("&", "//") + .replace("Hintreland Scourge", "Hinterland Scourge"); } @Override From 619b7222e7d9d394b2eb446d893d8757db789057 Mon Sep 17 00:00:00 2001 From: North Date: Sat, 29 Jun 2013 16:59:23 +0300 Subject: [PATCH 18/27] refactoring to cards downloading and image path generation --- .../src/main/java/mage/client/MageFrame.java | 12 ++---- .../plugins/card/images/DownloadPictures.java | 39 ++++++++----------- .../mage/plugins/card/images/ImageCache.java | 9 ++++- .../plugins/card/utils/CardImageUtils.java | 39 +++++++------------ 4 files changed, 40 insertions(+), 59 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 3ea48536d82..bc12359ba90 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -474,14 +474,11 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { List cards = CardRepository.instance.getAllCards(); 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); } } } @@ -489,10 +486,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { public void btnImagesActionPerformed(java.awt.event.ActionEvent evt) { List cards = CardRepository.instance.getAllCards(); - 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) { 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 a8ee8288688..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)); } @@ -240,14 +233,14 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab 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(), usesVariousArt(card), 0, false, card.isDoubleFaced(), true); + 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; From 3558a67f77591bf4773ee339e040093fa420a175 Mon Sep 17 00:00:00 2001 From: North Date: Sat, 29 Jun 2013 17:26:09 +0300 Subject: [PATCH 19/27] added M14 to wizards download source --- .../org/mage/plugins/card/dl/sources/WizardCardsImageSource.java | 1 + 1 file changed, 1 insertion(+) 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 98b715ec6cc..00020f17e93 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"); From dc0db404287ef21221f5678713e9554c4ef1474d Mon Sep 17 00:00:00 2001 From: North Date: Sat, 29 Jun 2013 18:00:18 +0300 Subject: [PATCH 20/27] removed planechase from wizards image source (doesn't exist) --- .../org/mage/plugins/card/dl/sources/WizardCardsImageSource.java | 1 - 1 file changed, 1 deletion(-) 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 00020f17e93..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 @@ -51,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"); } From d6ac1070c55435d09f2461d57efbe7670f78bf49 Mon Sep 17 00:00:00 2001 From: North Date: Sat, 29 Jun 2013 18:00:43 +0300 Subject: [PATCH 21/27] filtered out split card halves in card searches --- Mage/src/mage/cards/repository/CardCriteria.java | 3 ++- Mage/src/mage/cards/repository/CardInfo.java | 16 ++++++++++++++++ .../mage/cards/repository/CardRepository.java | 4 ++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Mage/src/mage/cards/repository/CardCriteria.java b/Mage/src/mage/cards/repository/CardCriteria.java index 4997a612354..63717c67066 100644 --- a/Mage/src/mage/cards/repository/CardCriteria.java +++ b/Mage/src/mage/cards/repository/CardCriteria.java @@ -172,7 +172,8 @@ public class CardCriteria { public void buildQuery(QueryBuilder qb) throws SQLException { Where where = qb.where(); where.eq("nightCard", false); - int clausesCount = 1; + 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 78bb542c22d..50d140698d1 100644 --- a/Mage/src/mage/cards/repository/CardInfo.java +++ b/Mage/src/mage/cards/repository/CardInfo.java @@ -38,10 +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; /** * @@ -90,6 +92,8 @@ public class CardInfo { @DatabaseField protected boolean splitCard; @DatabaseField + protected boolean splitCardHalf; + @DatabaseField protected boolean flipCard; @DatabaseField protected boolean doubleFaced; @@ -135,6 +139,14 @@ 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.splitCardHalf = true; + } + } } public Card getCard() { @@ -262,6 +274,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 f30c038ee86..63b224f1acf 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -54,7 +54,7 @@ public enum CardRepository { private static final String JDBC_URL = "jdbc:sqlite:db/cards.db"; private static final String VERSION_ENTITY_NAME = "card"; - private static final long CARD_DB_VERSION = 8; + private static final long CARD_DB_VERSION = 9; private Random random = new Random(); private Dao cardDao; @@ -248,7 +248,7 @@ public enum CardRepository { public List getAllCards() { try { QueryBuilder queryBuilder = cardDao.queryBuilder(); - queryBuilder.where().eq("nightCard", false); + queryBuilder.where().eq("nightCard", false).and().eq("splitCardHalf", false); return cardDao.query(queryBuilder.prepare()); } catch (SQLException ex) { From 240650f889db70ce67e854ee71856612a12ce4de Mon Sep 17 00:00:00 2001 From: North Date: Mon, 1 Jul 2013 23:23:58 +0300 Subject: [PATCH 22/27] removed netbeans license from pom --- pom.xml | 1 - 1 file changed, 1 deletion(-) 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 From ae864146586f4d1f97ac11ce31c669d89767d614 Mon Sep 17 00:00:00 2001 From: North Date: Mon, 1 Jul 2013 23:46:27 +0300 Subject: [PATCH 23/27] Removed getAllCards method from CardRepository --- .../src/main/java/mage/client/MageFrame.java | 16 ++++++---------- .../mage/cards/repository/CardRepository.java | 11 ----------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index bc12359ba90..4b4d0084734 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -25,19 +25,13 @@ * 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.client.cards.BigCard; @@ -91,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; @@ -471,7 +467,7 @@ 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")); beforeCall = System.currentTimeMillis(); @@ -484,7 +480,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { } public void btnImagesActionPerformed(java.awt.event.ActionEvent evt) { - List cards = CardRepository.instance.getAllCards(); + List cards = CardRepository.instance.findCards(new CardCriteria()); DownloadPictures.startDownload(null, cards); } diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index 63b224f1acf..0db957d0b24 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -244,15 +244,4 @@ public enum CardRepository { } return new ArrayList(); } - - public List getAllCards() { - try { - QueryBuilder queryBuilder = cardDao.queryBuilder(); - queryBuilder.where().eq("nightCard", false).and().eq("splitCardHalf", false); - - return cardDao.query(queryBuilder.prepare()); - } catch (SQLException ex) { - } - return new ArrayList(); - } } From d541779d66d061d55aa8a8ba3d0cd30de277a4b1 Mon Sep 17 00:00:00 2001 From: North Date: Mon, 1 Jul 2013 23:58:29 +0300 Subject: [PATCH 24/27] Removed embedded server from Session --- Mage.Common/src/mage/remote/Session.java | 2 -- Mage.Common/src/mage/remote/SessionImpl.java | 27 -------------------- 2 files changed, 29 deletions(-) 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 224350b2bc6..78a085ac135 100644 --- a/Mage.Common/src/mage/remote/SessionImpl.java +++ b/Mage.Common/src/mage/remote/SessionImpl.java @@ -35,7 +35,6 @@ 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 +70,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 +100,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"); @@ -205,16 +193,6 @@ public class SessionImpl implements Session { return false; } - private void runEmbeddedMageServer() { - if (embeddedMageServerAction != null) { - try { - embeddedMageServerAction.execute(); - } catch (MageException e) { - logger.error(e); - } - } - } - private void handleCannotConnectException(CannotConnectException ex) { logger.warn("Cannot connect", ex); Throwable t = ex.getCause(); @@ -1180,11 +1158,6 @@ public class SessionImpl implements Session { return false; } - @Override - public void setEmbeddedMageServerAction(Action embeddedMageServerAction) { - this.embeddedMageServerAction = embeddedMageServerAction; - } - @Override public boolean ping() { try { From e4ea8adf94edc8df204ccd8c796feea186162ad3 Mon Sep 17 00:00:00 2001 From: North Date: Tue, 2 Jul 2013 00:32:25 +0300 Subject: [PATCH 25/27] added method for updating expansions database --- Mage.Common/src/mage/interfaces/MageServer.java | 4 ++++ .../main/java/mage/server/MageServerImpl.java | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Mage.Common/src/mage/interfaces/MageServer.java b/Mage.Common/src/mage/interfaces/MageServer.java index 3944a381679..58551a43688 100644 --- a/Mage.Common/src/mage/interfaces/MageServer.java +++ b/Mage.Common/src/mage/interfaces/MageServer.java @@ -30,6 +30,7 @@ package mage.interfaces; import mage.MageException; import mage.cards.decks.DeckCardLists; +import mage.cards.repository.ExpansionInfo; import mage.game.GameException; import mage.game.match.MatchOptions; import mage.game.tournament.TournamentOptions; @@ -50,6 +51,9 @@ 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); + // 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.Server/src/main/java/mage/server/MageServerImpl.java b/Mage.Server/src/main/java/mage/server/MageServerImpl.java index 6f2ef6c8088..216ae8c8895 100644 --- a/Mage.Server/src/main/java/mage/server/MageServerImpl.java +++ b/Mage.Server/src/main/java/mage/server/MageServerImpl.java @@ -30,6 +30,8 @@ package mage.server; import mage.MageException; import mage.cards.decks.DeckCardLists; +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 +61,6 @@ import java.util.Locale; import java.util.UUID; import java.util.concurrent.ExecutorService; - -//import mage.interfaces.Server; - /** * * @author BetaSteward_at_googlemail.com, noxx @@ -914,4 +913,15 @@ 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; + } } From 5e3970a0e0a2a0f6868a5351f6c19d922caf4311 Mon Sep 17 00:00:00 2001 From: North Date: Tue, 2 Jul 2013 22:29:06 +0300 Subject: [PATCH 26/27] added method for updating cards database --- .../src/mage/interfaces/MageServer.java | 2 ++ .../main/java/mage/server/MageServerImpl.java | 7 +++++ Mage/src/mage/cards/repository/CardInfo.java | 3 ++- .../mage/cards/repository/CardRepository.java | 26 ++++++++++++++++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Mage.Common/src/mage/interfaces/MageServer.java b/Mage.Common/src/mage/interfaces/MageServer.java index 58551a43688..589a7fcdbd3 100644 --- a/Mage.Common/src/mage/interfaces/MageServer.java +++ b/Mage.Common/src/mage/interfaces/MageServer.java @@ -30,6 +30,7 @@ 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; @@ -53,6 +54,7 @@ public interface MageServer { // update methods List getMissingExpansionData(List codes); + List getMissingCardsData(List classNames); // user methods boolean setUserData(String userName, String sessionId, UserDataView userDataView) throws MageException; diff --git a/Mage.Server/src/main/java/mage/server/MageServerImpl.java b/Mage.Server/src/main/java/mage/server/MageServerImpl.java index 216ae8c8895..119dd02c9e5 100644 --- a/Mage.Server/src/main/java/mage/server/MageServerImpl.java +++ b/Mage.Server/src/main/java/mage/server/MageServerImpl.java @@ -30,6 +30,8 @@ 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; @@ -924,4 +926,9 @@ public class MageServerImpl implements MageServer { } return result; } + + @Override + public List getMissingCardsData(List classNames) { + return CardRepository.instance.getMissingCards(classNames); + } } diff --git a/Mage/src/mage/cards/repository/CardInfo.java b/Mage/src/mage/cards/repository/CardInfo.java index 50d140698d1..afcac411a8e 100644 --- a/Mage/src/mage/cards/repository/CardInfo.java +++ b/Mage/src/mage/cards/repository/CardInfo.java @@ -59,7 +59,7 @@ public class CardInfo { protected int cardNumber; @DatabaseField protected String setCode; - @DatabaseField + @DatabaseField(unique = true) protected String className; @DatabaseField protected String power; @@ -144,6 +144,7 @@ public class CardInfo { 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; } } diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index 0db957d0b24..f2965601371 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -54,7 +54,7 @@ public enum CardRepository { private static final String JDBC_URL = "jdbc:sqlite:db/cards.db"; private static final String VERSION_ENTITY_NAME = "card"; - private static final long CARD_DB_VERSION = 9; + private static final long CARD_DB_VERSION = 10; private Random random = new Random(); private Dao cardDao; @@ -210,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 From 5809e7783bedb4958d95e5179a877a1c7fb955a6 Mon Sep 17 00:00:00 2001 From: North Date: Tue, 2 Jul 2013 22:29:35 +0300 Subject: [PATCH 27/27] added auto-update of database on connect --- Mage.Common/src/mage/remote/SessionImpl.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Mage.Common/src/mage/remote/SessionImpl.java b/Mage.Common/src/mage/remote/SessionImpl.java index 78a085ac135..51c1ed7b9f2 100644 --- a/Mage.Common/src/mage/remote/SessionImpl.java +++ b/Mage.Common/src/mage/remote/SessionImpl.java @@ -31,6 +31,10 @@ 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; @@ -165,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; @@ -193,6 +198,18 @@ public class SessionImpl implements Session { return false; } + 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); + } + } + private void handleCannotConnectException(CannotConnectException ex) { logger.warn("Cannot connect", ex); Throwable t = ex.getCause(); @@ -1175,7 +1192,6 @@ public class SessionImpl implements Session { return false; } } - class MageAuthenticator extends Authenticator { private String username;