diff --git a/Mage.Client/src/main/java/mage/client/cards/Card.java b/Mage.Client/src/main/java/mage/client/cards/Card.java index c81ed5f1b35..7028e4845d0 100644 --- a/Mage.Client/src/main/java/mage/client/cards/Card.java +++ b/Mage.Client/src/main/java/mage/client/cards/Card.java @@ -46,7 +46,7 @@ import mage.client.util.DefaultActionCallback; import mage.client.util.ImageHelper; import mage.client.util.gui.ArrowBuilder; import mage.remote.Session; -import mage.sets.Sets; +import mage.cards.Sets; import mage.view.AbilityView; import mage.view.CardView; import mage.view.PermanentView; diff --git a/Mage.Client/src/main/java/mage/client/cards/Permanent.java b/Mage.Client/src/main/java/mage/client/cards/Permanent.java index 89aa3f3176e..921d5d1ab63 100644 --- a/Mage.Client/src/main/java/mage/client/cards/Permanent.java +++ b/Mage.Client/src/main/java/mage/client/cards/Permanent.java @@ -56,7 +56,7 @@ import mage.cards.CardDimensions; import mage.cards.MagePermanent; import mage.client.util.Config; import mage.client.util.ImageHelper; -import mage.sets.Sets; +import mage.cards.Sets; import mage.view.CounterView; import mage.view.PermanentView; 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 e59d4c117a1..381faacae49 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 @@ -13,7 +13,7 @@ import mage.client.cards.CardsStorage; import mage.client.util.gui.ColorsChooser; import mage.client.util.sets.ConstructedFormats; import mage.interfaces.rate.RateCallback; -import mage.sets.Sets; +import mage.cards.Sets; import mage.utils.DeckBuilder; import javax.swing.*; 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 94423ed4a61..018f1adffd4 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -45,7 +45,7 @@ import mage.client.util.Listener; import mage.components.CardInfoPane; import mage.game.GameException; import mage.remote.Session; -import mage.sets.Sets; +import mage.cards.Sets; import mage.view.CardView; import mage.view.SimpleCardView; import org.apache.log4j.Logger; diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/table/CardTableSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/table/CardTableSelector.java index 68b81cbda96..321398a2289 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/table/CardTableSelector.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/table/CardTableSelector.java @@ -50,7 +50,7 @@ import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.mageobject.ColorlessPredicate; import mage.filter.predicate.other.CardTextPredicate; import mage.filter.predicate.other.ExpansionSetPredicate; -import mage.sets.Sets; +import mage.cards.Sets; import mage.view.CardsView; import javax.swing.*; diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java index 838f95f7e23..2c71cfbc97b 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java @@ -44,7 +44,7 @@ import mage.game.draft.DraftOptions.TimingOption; import mage.game.tournament.LimitedOptions; import mage.game.tournament.TournamentOptions; import mage.remote.Session; -import mage.sets.Sets; +import mage.cards.Sets; import mage.view.TableView; import mage.view.TournamentTypeView; import org.apache.log4j.Logger; 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 7246f8ae748..db337be4f45 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 @@ -7,7 +7,7 @@ import java.util.GregorianCalendar; import java.util.List; import mage.cards.ExpansionSet; import mage.cards.repository.CardRepository; -import mage.sets.Sets; +import mage.cards.Sets; /** * Utility class for constructed formats. diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Extended.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Extended.java index 6ec14ee49e5..45def4ee99a 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Extended.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Extended.java @@ -33,7 +33,7 @@ import java.util.GregorianCalendar; import mage.Constants.SetType; import mage.cards.ExpansionSet; import mage.cards.decks.Constructed; -import mage.sets.Sets; +import mage.cards.Sets; /** * diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java index deda018651f..e38979af4f5 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java @@ -33,7 +33,7 @@ import java.util.GregorianCalendar; import mage.Constants.SetType; import mage.cards.ExpansionSet; import mage.cards.decks.Constructed; -import mage.sets.Sets; +import mage.cards.Sets; /** * diff --git a/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java b/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java index 26b919dda2e..a0018bf1a37 100644 --- a/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java +++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java @@ -36,7 +36,7 @@ import java.util.Map; import mage.game.tournament.Tournament; import mage.game.tournament.TournamentOptions; import mage.game.tournament.TournamentType; -import mage.sets.Sets; +import mage.cards.Sets; import mage.view.TournamentTypeView; import org.apache.log4j.Logger; diff --git a/Mage.Sets/pom.xml b/Mage.Sets/pom.xml index 6816f43b797..77560bad1d3 100644 --- a/Mage.Sets/pom.xml +++ b/Mage.Sets/pom.xml @@ -34,22 +34,6 @@ junit 4.8.2 - - - org.xerial - sqlite-jdbc - 3.7.2 - - - com.j256.ormlite - ormlite-core - 4.42 - - - com.j256.ormlite - ormlite-jdbc - 4.42 - diff --git a/Mage.Tests/src/test/java/org/mage/test/load/LoadTest.java b/Mage.Tests/src/test/java/org/mage/test/load/LoadTest.java index e2131542f9b..70ddc440b35 100644 --- a/Mage.Tests/src/test/java/org/mage/test/load/LoadTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/load/LoadTest.java @@ -11,7 +11,7 @@ import mage.player.ai.ComputerPlayer; import mage.remote.Connection; import mage.remote.Session; import mage.remote.SessionImpl; -import mage.sets.Sets; +import mage.cards.Sets; import mage.view.GameTypeView; import mage.view.TableView; import org.apache.log4j.Logger; diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java index f0272dd1bb7..03e76eee302 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java @@ -10,7 +10,7 @@ import mage.game.GameOptions; import mage.game.TwoPlayerDuel; import mage.player.ai.ComputerPlayer; import mage.players.Player; -import mage.sets.Sets; +import mage.cards.Sets; import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.MageTestBase; diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/TestPlayRandomGame.java b/Mage.Tests/src/test/java/org/mage/test/serverside/TestPlayRandomGame.java index 2b3723edbe7..8842ee1353d 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/TestPlayRandomGame.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/TestPlayRandomGame.java @@ -10,7 +10,7 @@ import mage.game.GameOptions; import mage.game.TwoPlayerDuel; import mage.player.ai.ComputerPlayer; import mage.players.Player; -import mage.sets.Sets; +import mage.cards.Sets; import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.MageTestBase; diff --git a/Mage/pom.xml b/Mage/pom.xml index 7c2a94ec626..7e216a5e081 100644 --- a/Mage/pom.xml +++ b/Mage/pom.xml @@ -21,6 +21,22 @@ 1.2.14 jar + + + org.xerial + sqlite-jdbc + 3.7.2 + + + com.j256.ormlite + ormlite-core + 4.42 + + + com.j256.ormlite + ormlite-jdbc + 4.42 + diff --git a/Mage.Sets/src/mage/sets/Sets.java b/Mage/src/mage/cards/Sets.java similarity index 63% rename from Mage.Sets/src/mage/sets/Sets.java rename to Mage/src/mage/cards/Sets.java index f1e309f83d8..20254e1119f 100644 --- a/Mage.Sets/src/mage/sets/Sets.java +++ b/Mage/src/mage/cards/Sets.java @@ -26,17 +26,15 @@ * or implied, of BetaSteward_at_googlemail.com. */ -package mage.sets; +package mage.cards; import mage.Constants.CardType; import mage.Constants.ColoredManaSymbol; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.ExpansionSet; import mage.cards.decks.DeckCardLists; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; +import mage.util.ClassScanner; import org.apache.log4j.Logger; import java.io.FileNotFoundException; @@ -58,81 +56,14 @@ public class Sets extends HashMap { } private Sets() { - this.addSet(AlaraReborn.getInstance()); - this.addSet(Alliances.getInstance()); - this.addSet(Antiquities.getInstance()); - this.addSet(Apocalypse.getInstance()); - this.addSet(ArabianNights.getInstance()); - this.addSet(AvacynRestored.getInstance()); - this.addSet(BetrayersOfKamigawa.getInstance()); - this.addSet(ChampionsOfKamigawa.getInstance()); - this.addSet(Coldsnap.getInstance()); - this.addSet(Conflux.getInstance()); - this.addSet(DarkAscension.getInstance()); - this.addSet(Darksteel.getInstance()); - this.addSet(Dissension.getInstance()); - this.addSet(EighthEdition.getInstance()); - this.addSet(ElspethvsTezzeret.getInstance()); - this.addSet(Eventide.getInstance()); - this.addSet(Exodus.getInstance()); - this.addSet(FifthDawn.getInstance()); - this.addSet(FifthEdition.getInstance()); - this.addSet(FallenEmpires.getInstance()); - this.addSet(FourthEdition.getInstance()); - this.addSet(FutureSight.getInstance()); - this.addSet(Guildpact.getInstance()); - this.addSet(Guru.getInstance()); - this.addSet(Homelands.getInstance()); - this.addSet(IceAge.getInstance()); - this.addSet(Innistrad.getInstance()); - this.addSet(Invasion.getInstance()); - this.addSet(Judgment.getInstance()); - this.addSet(Legends.getInstance()); - this.addSet(Legions.getInstance()); - this.addSet(Lorwyn.getInstance()); - this.addSet(Magic2010.getInstance()); - this.addSet(Magic2011.getInstance()); - this.addSet(Magic2012.getInstance()); - this.addSet(Magic2013.getInstance()); - this.addSet(MagicPlayerRewards.getInstance()); - this.addSet(MercadianMasques.getInstance()); - this.addSet(Mirage.getInstance()); - this.addSet(Mirrodin.getInstance()); - this.addSet(MirrodinBesieged.getInstance()); - this.addSet(Morningtide.getInstance()); - this.addSet(Nemesis.getInstance()); - this.addSet(NewPhyrexia.getInstance()); - this.addSet(NinthEdition.getInstance()); - this.addSet(Odyssey.getInstance()); - this.addSet(Onslaught.getInstance()); - this.addSet(PlanarChaos.getInstance()); - this.addSet(Planechase.getInstance()); - this.addSet(Planeshift.getInstance()); - this.addSet(Prophecy.getInstance()); - this.addSet(RavnicaCityOfGuilds.getInstance()); - this.addSet(ReturnToRavnica.getInstance()); - this.addSet(RiseOfTheEldrazi.getInstance()); - this.addSet(SaviorsOfKamigawa.getInstance()); - this.addSet(ScarsOfMirrodin.getInstance()); - this.addSet(Scourge.getInstance()); - this.addSet(SeventhEdition.getInstance()); - this.addSet(ShardsOfAlara.getInstance()); - this.addSet(Shadowmoor.getInstance()); - this.addSet(SixthEdition.getInstance()); - this.addSet(Stronghold.getInstance()); - this.addSet(Tenth.getInstance()); - this.addSet(Tempest.getInstance()); - this.addSet(TheDark.getInstance()); - this.addSet(TimeSpiral.getInstance()); - this.addSet(TimeSpiralTimeshifted.getInstance()); - this.addSet(Torment.getInstance()); - this.addSet(UrzasSaga.getInstance()); - this.addSet(UrzasLegacy.getInstance()); - this.addSet(UrzasDestiny.getInstance()); - this.addSet(Visions.getInstance()); - this.addSet(Weatherlight.getInstance()); - this.addSet(Worldwake.getInstance()); - this.addSet(Zendikar.getInstance()); + ArrayList packages = new ArrayList(); + packages.add("mage.sets"); + for (Class c : ClassScanner.findClasses(packages, ExpansionSet.class)) { + try { + addSet((ExpansionSet) c.getMethod("getInstance").invoke(null)); + } catch (Exception ex) { + } + } } private void addSet(ExpansionSet set) { @@ -190,8 +121,9 @@ public class Sets extends HashMap { } public static ExpansionSet findSet(String code) { - if (fINSTANCE.containsKey(code)) + if (fINSTANCE.containsKey(code)) { return fINSTANCE.get(code); + } return null; } @@ -200,10 +132,12 @@ public class Sets extends HashMap { Map deckCards = new HashMap(); Map sideboard = new HashMap(); try { - if (deck.getName() != null && deck.getName().length() > 0) + if (deck.getName() != null && deck.getName().length() > 0) { out.println("NAME:" + deck.getName()); - if (deck.getAuthor() != null && deck.getAuthor().length() > 0) + } + if (deck.getAuthor() != null && deck.getAuthor().length() > 0) { out.println("AUTHOR:" + deck.getAuthor()); + } for (String cardClass: deck.getCards()) { if (deckCards.containsKey(cardClass)) { deckCards.put(cardClass, deckCards.get(cardClass) + 1); diff --git a/Mage.Sets/src/mage/cards/decks/importer/DckDeckImporter.java b/Mage/src/mage/cards/decks/importer/DckDeckImporter.java similarity index 100% rename from Mage.Sets/src/mage/cards/decks/importer/DckDeckImporter.java rename to Mage/src/mage/cards/decks/importer/DckDeckImporter.java diff --git a/Mage.Sets/src/mage/cards/decks/importer/DecDeckImporter.java b/Mage/src/mage/cards/decks/importer/DecDeckImporter.java similarity index 100% rename from Mage.Sets/src/mage/cards/decks/importer/DecDeckImporter.java rename to Mage/src/mage/cards/decks/importer/DecDeckImporter.java diff --git a/Mage.Sets/src/mage/cards/decks/importer/DeckImporter.java b/Mage/src/mage/cards/decks/importer/DeckImporter.java similarity index 100% rename from Mage.Sets/src/mage/cards/decks/importer/DeckImporter.java rename to Mage/src/mage/cards/decks/importer/DeckImporter.java diff --git a/Mage.Sets/src/mage/cards/decks/importer/DeckImporterUtil.java b/Mage/src/mage/cards/decks/importer/DeckImporterUtil.java similarity index 100% rename from Mage.Sets/src/mage/cards/decks/importer/DeckImporterUtil.java rename to Mage/src/mage/cards/decks/importer/DeckImporterUtil.java diff --git a/Mage.Sets/src/mage/cards/decks/importer/MWSDeckImporter.java b/Mage/src/mage/cards/decks/importer/MWSDeckImporter.java similarity index 100% rename from Mage.Sets/src/mage/cards/decks/importer/MWSDeckImporter.java rename to Mage/src/mage/cards/decks/importer/MWSDeckImporter.java diff --git a/Mage.Sets/src/mage/cards/decks/importer/TxtDeckImporter.java b/Mage/src/mage/cards/decks/importer/TxtDeckImporter.java similarity index 100% rename from Mage.Sets/src/mage/cards/decks/importer/TxtDeckImporter.java rename to Mage/src/mage/cards/decks/importer/TxtDeckImporter.java diff --git a/Mage.Sets/src/mage/cards/repository/CardCriteria.java b/Mage/src/mage/cards/repository/CardCriteria.java similarity index 100% rename from Mage.Sets/src/mage/cards/repository/CardCriteria.java rename to Mage/src/mage/cards/repository/CardCriteria.java diff --git a/Mage.Sets/src/mage/cards/repository/CardInfo.java b/Mage/src/mage/cards/repository/CardInfo.java similarity index 100% rename from Mage.Sets/src/mage/cards/repository/CardInfo.java rename to Mage/src/mage/cards/repository/CardInfo.java diff --git a/Mage.Sets/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java similarity index 100% rename from Mage.Sets/src/mage/cards/repository/CardRepository.java rename to Mage/src/mage/cards/repository/CardRepository.java diff --git a/Mage/src/mage/cards/repository/CardScanner.java b/Mage/src/mage/cards/repository/CardScanner.java new file mode 100644 index 00000000000..e8b5472d390 --- /dev/null +++ b/Mage/src/mage/cards/repository/CardScanner.java @@ -0,0 +1,70 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.repository; + +import java.util.ArrayList; +import java.util.List; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.ExpansionSet; +import mage.cards.Sets; +import mage.util.ClassScanner; + +/** + * + * @author North + */ +public class CardScanner { + + private static boolean scanned = false; + + public static void scan() { + if (scanned) { + return; + } + scanned = true; + + List cardsToAdd = new ArrayList(); + List packages = new ArrayList(); + for (ExpansionSet set : Sets.getInstance().values()) { + packages.add(set.getPackageName()); + } + + for (Class c : ClassScanner.findClasses(packages, CardImpl.class)) { + if (!CardRepository.instance.cardExists(c.getCanonicalName())) { + Card card = CardImpl.createCard(c); + if (card != null && !card.isNightCard()) { + cardsToAdd.add(new CardInfo(card)); + } + } + } + if (!cardsToAdd.isEmpty()) { + CardRepository.instance.addCards(cardsToAdd); + } + } +} diff --git a/Mage.Sets/src/mage/cards/repository/CardScanner.java b/Mage/src/mage/util/ClassScanner.java similarity index 73% rename from Mage.Sets/src/mage/cards/repository/CardScanner.java rename to Mage/src/mage/util/ClassScanner.java index a8ba126ead9..434258be2ed 100644 --- a/Mage.Sets/src/mage/cards/repository/CardScanner.java +++ b/Mage/src/mage/util/ClassScanner.java @@ -25,7 +25,7 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.cards.repository; +package mage.util; import java.io.File; import java.io.FileInputStream; @@ -39,45 +39,14 @@ import java.util.List; import java.util.TreeSet; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.ExpansionSet; -import mage.sets.Sets; /** * * @author North */ -public class CardScanner { +public class ClassScanner { - private static boolean scanned = false; - - public static void scan() { - if (scanned) { - return; - } - scanned = true; - - List cardsToAdd = new ArrayList(); - List packages = new ArrayList(); - for (ExpansionSet set : Sets.getInstance().values()) { - packages.add(set.getPackageName()); - } - - for (Class c : getCards(packages)) { - if (!CardRepository.instance.cardExists(c.getCanonicalName())) { - Card card = CardImpl.createCard(c); - if (card != null && !card.isNightCard()) { - cardsToAdd.add(new CardInfo(card)); - } - } - } - if (!cardsToAdd.isEmpty()) { - CardRepository.instance.addCards(cardsToAdd); - } - } - - private static List getCards(List packages) { + public static List findClasses(List packages, Class type) { List cards = new ArrayList(); try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); @@ -102,19 +71,19 @@ public class CardScanner { } for (String filePath : dirs.keySet()) { - cards.addAll(findCards(new File(filePath), dirs.get(filePath))); + cards.addAll(findClasses(new File(filePath), dirs.get(filePath), type)); } for (String filePath : jars) { File file = new File(URLDecoder.decode(filePath, "UTF-8")); - cards.addAll(findCardsInJar(file, packages)); + cards.addAll(findClassesInJar(file, packages, type)); } } catch (IOException ex) { } return cards; } - private static List findCards(File directory, String packageName) { + private static List findClasses(File directory, String packageName, Class type) { List cards = new ArrayList(); if (!directory.exists()) { return cards; @@ -124,7 +93,7 @@ public class CardScanner { if (file.getName().endsWith(".class")) { try { Class clazz = Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)); - if (CardImpl.class.isAssignableFrom(clazz)) { + if (type.isAssignableFrom(clazz)) { cards.add(clazz); } } catch (ClassNotFoundException ex) { @@ -134,7 +103,7 @@ public class CardScanner { return cards; } - private static List findCardsInJar(File file, List packages) { + private static List findClassesInJar(File file, List packages, Class type) { List cards = new ArrayList(); if (!file.exists()) { return cards; @@ -149,12 +118,13 @@ public class CardScanner { } if (jarEntry.getName().endsWith(".class")) { String className = jarEntry.getName().replace('/', '.').replace(".class", ""); - String packageName = className.substring(0, className.lastIndexOf('.')); + int packageNameEnd = className.lastIndexOf('.'); + String packageName = packageNameEnd != -1 ? className.substring(0, packageNameEnd) : ""; if (packages.contains(packageName)) { Class clazz; try { clazz = Class.forName(className); - if (CardImpl.class.isAssignableFrom(clazz)) { + if (type.isAssignableFrom(clazz)) { cards.add(clazz); } } catch (ClassNotFoundException ex) {