- Reduce CheckStyle, FindBugs, and PMD output for recently changed files.

This commit is contained in:
Braids
2011-08-19 03:48:50 +00:00
parent fdb1199223
commit 664a535a47
5 changed files with 572 additions and 495 deletions

View File

@@ -37,31 +37,39 @@ import forge.view.FView;
* @author Forge
* @version $Id$
*/
public class CardReader implements Runnable, NewConstants {
public class CardReader
implements Runnable, // NOPMD by Braids on 8/18/11 10:55 PM
NewConstants
{
private static final String CARD_FILE_DOT_EXTENSION = ".txt"; // NOPMD by Braids on 8/18/11 11:04 PM
/** Default charset when loading from files. */
public static final String DEFAULT_CHARSET_NAME = "US-ASCII";
public static final String DEFAULT_CHARSET_NAME = "US-ASCII"; // NOPMD by Braids on 8/18/11 10:54 PM
/** Regex that matches a single hyphen (-) or space. */
public static final Pattern HYPHEN_OR_SPACE = Pattern.compile("[ -]");
/** Regex for punctuation that we omit from card file names. */
public static final Pattern PUNCTUATION_TO_ZAP = Pattern.compile("[,'\"]");
public static final Pattern PUNCTUATION_TO_ZAP = Pattern.compile("[,'\"]"); // NOPMD by Braids on 8/18/11 10:54 PM
/** Regex that matches two or more underscores (_). */
public static final Pattern MULTIPLE_UNDERSCORES = Pattern.compile("__+");
public static final Pattern MULTIPLE_UNDERSCORES = Pattern.compile("__+"); // NOPMD by Braids on 8/18/11 10:54 PM
/** Special value for estimatedFilesRemaining. */
protected static final int UNKNOWN_NUMBER_OF_FILES_REMAINING = -1;
protected static final int UNKNOWN_NUMBER_OF_FILES_REMAINING = -1; // NOPMD by Braids on 8/18/11 10:54 PM
private Map<String, Card> mapToFill;
private File cardsfolder;
private transient Map<String, Card> mapToFill;
private transient File cardsfolder;
private ZipFile zip;
private Charset charset;
private transient ZipFile zip;
private transient Charset charset;
private Enumeration<? extends ZipEntry> zipEnum;
private long estimatedFilesRemaining = UNKNOWN_NUMBER_OF_FILES_REMAINING;
private Iterable<File> findNonDirsIterable;
private transient Enumeration<? extends ZipEntry> zipEnum;
private transient long estimatedFilesRemaining = // NOPMD by Braids on 8/18/11 10:56 PM
UNKNOWN_NUMBER_OF_FILES_REMAINING;
private transient Iterable<File> findNonDirsIterable; // NOPMD by Braids on 8/18/11 10:56 PM
@@ -90,17 +98,19 @@ public class CardReader implements Runnable, NewConstants {
*/
public CardReader(final File theCardsFolder, final Map<String, Card> theMapToFill, final boolean useZip) {
if (theMapToFill == null) {
throw new NullPointerException("theMapToFill must not be null.");
throw new NullPointerException("theMapToFill must not be null."); // NOPMD by Braids on 8/18/11 10:53 PM
}
this.mapToFill = theMapToFill;
if (!theCardsFolder.exists()) {
throw new RuntimeException("CardReader : constructor error -- file not found -- filename is "
throw new RuntimeException(// NOPMD by Braids on 8/18/11 10:53 PM
"CardReader : constructor error -- file not found -- filename is "
+ theCardsFolder.getAbsolutePath());
}
if (!theCardsFolder.isDirectory()) {
throw new RuntimeException("CardReader : constructor error -- not a directory -- "
throw new RuntimeException(// NOPMD by Braids on 8/18/11 10:53 PM
"CardReader : constructor error -- not a directory -- "
+ theCardsFolder.getAbsolutePath());
}
@@ -114,7 +124,7 @@ public class CardReader implements Runnable, NewConstants {
try {
this.zip = new ZipFile(zipFile);
} catch (Exception exn) {
System.err.println("Error reading zip file \""
System.err.println("Error reading zip file \"" // NOPMD by Braids on 8/18/11 10:53 PM
+ zipFile.getAbsolutePath() + "\": " + exn + ". "
+ "Defaulting to txt files in \""
+ theCardsFolder.getAbsolutePath()
@@ -186,28 +196,7 @@ public class CardReader implements Runnable, NewConstants {
}
if (zip != null) {
monitor.setTotalUnitsThisPhase(estimatedFilesRemaining);
ZipEntry entry;
// zipEnum was initialized in the constructor.
while (zipEnum.hasMoreElements()) {
entry = (ZipEntry) zipEnum.nextElement();
if (entry.isDirectory() || !entry.getName().endsWith(".txt")) {
monitor.incrementUnitsCompletedThisPhase(1L);
continue;
}
result = loadCard(entry);
monitor.incrementUnitsCompletedThisPhase(1L);
if (cardName != null && cardName.equals(result.getName())) {
break;
}
}
} else {
if (zip == null) {
if (estimatedFilesRemaining == UNKNOWN_NUMBER_OF_FILES_REMAINING) {
final Generator<File> findNonDirsGen = new FindNonDirectoriesSkipDotDirectoriesGenerator(cardsfolder);
estimatedFilesRemaining = GeneratorFunctions.estimateSize(findNonDirsGen);
@@ -217,7 +206,7 @@ public class CardReader implements Runnable, NewConstants {
monitor.setTotalUnitsThisPhase(estimatedFilesRemaining);
for (File cardTxtFile : findNonDirsIterable) {
if (!cardTxtFile.getName().endsWith(".txt")) {
if (!cardTxtFile.getName().endsWith(CARD_FILE_DOT_EXTENSION)) {
monitor.incrementUnitsCompletedThisPhase(1L);
continue;
}
@@ -231,6 +220,27 @@ public class CardReader implements Runnable, NewConstants {
} //endfor
} else {
monitor.setTotalUnitsThisPhase(estimatedFilesRemaining);
ZipEntry entry;
// zipEnum was initialized in the constructor.
while (zipEnum.hasMoreElements()) {
entry = (ZipEntry) zipEnum.nextElement();
if (entry.isDirectory() || !entry.getName().endsWith(CARD_FILE_DOT_EXTENSION)) {
monitor.incrementUnitsCompletedThisPhase(1L);
continue;
}
result = loadCard(entry);
monitor.incrementUnitsCompletedThisPhase(1L);
if (cardName != null && cardName.equals(result.getName())) {
break;
}
}
} //endif
if (monitor != null) {
@@ -270,7 +280,7 @@ public class CardReader implements Runnable, NewConstants {
return line;
} catch (Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("CardReader : readLine(Card) error", ex);
throw new RuntimeException("CardReader : readLine(Card) error", ex); // NOPMD by Braids on 8/18/11 10:53 PM
}
} //readLine(BufferedReader)
@@ -290,76 +300,88 @@ public class CardReader implements Runnable, NewConstants {
inputStreamReader = new InputStreamReader(inputStream, charset);
reader = new BufferedReader(inputStreamReader);
String s = readLine(reader);
while (!"End".equals(s)) {
if (s.startsWith("#")) {
String line = readLine(reader);
while (!"End".equals(line)) {
if (line.charAt(0) == '#') { // NOPMD by Braids on 8/18/11 10:59 PM
//no need to do anything, this indicates a comment line
} else if (s.startsWith("Name:")) {
String t = s.substring(5);
} else if (line.startsWith("Name:")) {
final String value = line.substring(5);
//System.out.println(s);
if (!mapToFill.containsKey(t)) {
card.setName(t);
} else {
if (mapToFill.containsKey(value)) {
break; // this card has already been loaded.
} else {
card.setName(value);
}
} else if (s.startsWith("ManaCost:")) {
String t = s.substring(9);
} else if (line.startsWith("ManaCost:")) {
final String value = line.substring(9);
//System.out.println(s);
if (!"no cost".equals(t)) {
card.setManaCost(t);
if (!"no cost".equals(value)) {
card.setManaCost(value);
}
} else if (s.startsWith("Types:")) {
addTypes(card, s.substring(6));
} else if (s.startsWith("Text:")) {
String t = s.substring(5);
} else if (line.startsWith("Types:")) {
addTypes(card, line.substring("Types:".length()));
} else if (line.startsWith("Text:")) {
String value = line.substring("Text:".length());
// if (!t.equals("no text"));
if ("no text".equals(t)) {
t = "";
if ("no text".equals(value)) {
value = "";
}
card.setText(t);
} else if (s.startsWith("PT:")) {
String t = s.substring(3);
String[] pt = t.split("/");
int att = pt[0].contains("*") ? 0 : Integer.parseInt(pt[0]);
int def = pt[1].contains("*") ? 0 : Integer.parseInt(pt[1]);
card.setBaseAttackString(pt[0]);
card.setBaseDefenseString(pt[1]);
card.setText(value);
} else if (line.startsWith("PT:")) {
final String value = line.substring("PT:".length());
final String[] powTough = value.split("/");
int att;
if (powTough[0].contains("*")) {
att = 0;
} else {
att = Integer.parseInt(powTough[0]);
}
int def;
if (powTough[1].contains("*")) {
def = 0;
} else {
def = Integer.parseInt(powTough[1]);
}
card.setBaseAttackString(powTough[0]);
card.setBaseDefenseString(powTough[1]);
card.setBaseAttack(att);
card.setBaseDefense(def);
} else if (s.startsWith("Loyalty:")) {
String[] splitStr = s.split(":");
int loyal = Integer.parseInt(splitStr[1]);
} else if (line.startsWith("Loyalty:")) {
final String[] splitStr = line.split(":");
final int loyal = Integer.parseInt(splitStr[1]);
card.setBaseLoyalty(loyal);
} else if (s.startsWith("K:")) {
String t = s.substring(2);
card.addIntrinsicKeyword(t);
} else if (s.startsWith("SVar:")) {
String[] t = s.split(":", 3);
card.setSVar(t[1], t[2]);
} else if (s.startsWith("A:")) {
String t = s.substring(2);
card.addIntrinsicAbility(t);
} else if (s.startsWith("T:")) {
String t = s.substring(2);
card.addTrigger(TriggerHandler.parseTrigger(t, card, true));
} else if (s.startsWith("S:")) {
String t = s.substring(2);
card.addStaticAbilityString(t);
} else if (s.startsWith("SetInfo:")) {
String t = s.substring(8);
card.addSet(new SetInfo(t));
} else if (line.startsWith("K:")) {
final String value = line.substring(2);
card.addIntrinsicKeyword(value);
} else if (line.startsWith("SVar:")) {
final String[] value = line.split(":", 3);
card.setSVar(value[1], value[2]);
} else if (line.startsWith("A:")) {
final String value = line.substring(2);
card.addIntrinsicAbility(value);
} else if (line.startsWith("T:")) {
final String value = line.substring(2);
card.addTrigger(TriggerHandler.parseTrigger(value, card, true));
} else if (line.startsWith("S:")) {
final String value = line.substring(2);
card.addStaticAbilityString(value);
} else if (line.startsWith("SetInfo:")) {
final String value = line.substring("SetInfo:".length());
card.addSet(new SetInfo(value)); // NOPMD by Braids on 8/18/11 11:08 PM
}
s = readLine(reader);
line = readLine(reader);
} // while !End
} finally {
try {
reader.close();
} catch (IOException ignored) {
} catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08 PM
}
try {
inputStreamReader.close();
} catch (IOException ignored) {
} catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08 PM
}
}
@@ -392,12 +414,13 @@ public class CardReader implements Runnable, NewConstants {
return loadCard(fileInputStream);
} catch (FileNotFoundException ex) {
ErrorViewer.showError(ex, "File \"%s\" exception", pathToTxtFile.getAbsolutePath());
throw new RuntimeException("CardReader : run error -- file exception -- filename is "
throw new RuntimeException(// NOPMD by Braids on 8/18/11 10:53 PM
"CardReader : run error -- file exception -- filename is "
+ pathToTxtFile.getPath(), ex);
} finally {
try {
fileInputStream.close();
} catch (IOException ignored) {
} catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08 PM
}
}
}
@@ -416,13 +439,13 @@ public class CardReader implements Runnable, NewConstants {
return loadCard(zipInputStream);
} catch (IOException exn) {
throw new RuntimeException(exn);
throw new RuntimeException(exn); // NOPMD by Braids on 8/18/11 10:53 PM
} finally {
try {
if (zipInputStream != null) {
zipInputStream.close();
}
} catch (IOException ignored) {
} catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08 PM
}
}
}
@@ -455,14 +478,14 @@ public class CardReader implements Runnable, NewConstants {
baseFileName = PUNCTUATION_TO_ZAP.matcher(baseFileName).replaceAll("");
// Place the file within a single-letter subdirectory.
StringBuffer buf = new StringBuffer(1 + 1 + baseFileName.length() + ".txt".length());
final StringBuffer buf = new StringBuffer(1 + 1 + baseFileName.length() + CARD_FILE_DOT_EXTENSION.length());
buf.append(Character.toLowerCase(baseFileName.charAt(0)));
// Zip file is always created with unix-style path names.
buf.append('/');
buf.append(baseFileName.toLowerCase(Locale.ENGLISH));
buf.append(".txt");
buf.append(CARD_FILE_DOT_EXTENSION);
return buf.toString();
}
@@ -474,20 +497,18 @@ public class CardReader implements Runnable, NewConstants {
*
* @return a new Card instance having that name, or null if not found
*/
public final Card findCard(final String canonicalASCIIName) {
public final Card findCard(final String canonicalASCIIName) { // NOPMD by Braids on 8/18/11 11:08 PM
UtilFunctions.checkNotNull("canonicalASCIIName", canonicalASCIIName);
String cardFilePath = toMostLikelyPath(canonicalASCIIName);
final String cardFilePath = toMostLikelyPath(canonicalASCIIName);
Card result = null;
if (zip != null) {
ZipEntry entry = zip.getEntry(cardFilePath);
final ZipEntry entry = zip.getEntry(cardFilePath);
if (entry != null) {
result = loadCard(entry);
} else {
//System.err.println(":Could not find \"" + cardFilePath + "\" in zip file.");
}
}

View File

@@ -1,15 +1,13 @@
package forge.gui;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JDialog;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import forge.Gui_ProgressBarWindow;
import net.slightlymagic.braids.util.UtilFunctions;
import net.slightlymagic.braids.util.progress_monitor.BaseProgressMonitor;
import forge.Gui_ProgressBarWindow;
/**
* GUI Progress Monitor that displays the ETA (Estimated Time of Arrival or
@@ -20,88 +18,98 @@ import net.slightlymagic.braids.util.progress_monitor.BaseProgressMonitor;
*/
public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
private Gui_ProgressBarWindow dialog;
private String title;
private transient Gui_ProgressBarWindow dialog;
private transient String title;
/**
* Convenience for
* MultiPhaseProgressMonitorWithETA(title, numPhases, totalUnitsFirstPhase,
* minUIUpdateIntervalSec, null);
*
* @see #MultiPhaseProgressMonitorWithETA(String,int,long,float,float[])
*/
public MultiPhaseProgressMonitorWithETA(String title, int numPhases,
long totalUnitsFirstPhase, float minUIUpdateIntervalSec)
{
this(title, numPhases, totalUnitsFirstPhase, minUIUpdateIntervalSec, null);
}
/**
* Create a GUI progress monitor and open its first dialog.
*
* Like all swing components, this constructor must be invoked from the
* swing Event Dispatching Thread. The rest of the methods of this class
* are exempt from this requirement.
*
* @param title the title to give the dialog box(es)
*
* @param numPhases the total number of phases to expect
*
* @param totalUnitsFirstPhase the total number of units that will be
* processed in the first phase
*
* @param minUIUpdateIntervalSec the approximate interval at which to
* update the dialog box in seconds
*
* @param phaseWeights see BaseProgressMonitor
*
* @see BaseProgressMonitor#BaseProgressMonitor(int,long,float,float[])
*/
public MultiPhaseProgressMonitorWithETA(String title, int numPhases,
long totalUnitsFirstPhase, float minUIUpdateIntervalSec,
float[] phaseWeights)
{
super(numPhases, totalUnitsFirstPhase, minUIUpdateIntervalSec,
phaseWeights);
/**
* Convenience for
* MultiPhaseProgressMonitorWithETA(title, numPhases, totalUnitsFirstPhase,
* minUIUpdateIntervalSec, null).
*
* @see #MultiPhaseProgressMonitorWithETA(String,int,long,float,float[])
*
* @param neoTitle the title to give the dialog box(es)
*
* @param numPhases the total number of phases to expect
*
* @param totalUnitsFirstPhase the total number of units that will be
* processed in the first phase
*
* @param minUIUpdateIntervalSec the approximate interval at which to
* update the dialog box in seconds
*/
public MultiPhaseProgressMonitorWithETA(final String neoTitle, final int numPhases,
final long totalUnitsFirstPhase, final float minUIUpdateIntervalSec) // NOPMD by Braids on 8/18/11 11:16 PM
{
this(neoTitle, numPhases, totalUnitsFirstPhase, minUIUpdateIntervalSec, null);
}
/**
* Create a GUI progress monitor and open its first dialog.
*
* Like all swing components, this constructor must be invoked from the
* swing Event Dispatching Thread. The rest of the methods of this class
* are exempt from this requirement.
*
* @param neoTitle the title to give the dialog box(es)
*
* @param numPhases the total number of phases to expect
*
* @param totalUnitsFirstPhase the total number of units that will be
* processed in the first phase
*
* @param minUIUpdateIntervalSec the approximate interval at which to
* update the dialog box in seconds
*
* @param phaseWeights see BaseProgressMonitor
*
* @see BaseProgressMonitor#BaseProgressMonitor(int,long,float,float[])
*/
public MultiPhaseProgressMonitorWithETA(final String neoTitle, final int numPhases,
final long totalUnitsFirstPhase, final float minUIUpdateIntervalSec, // NOPMD by Braids on 8/18/11 11:16 PM
final float[] phaseWeights)
{
super(numPhases, totalUnitsFirstPhase, minUIUpdateIntervalSec,
phaseWeights);
if (!SwingUtilities.isEventDispatchThread()) {
throw new IllegalStateException("must be called from within an event dispatch thread");
}
this.title = title;
this.title = neoTitle;
if (totalUnitsFirstPhase > 0 && dialog == null) {
throw new IllegalStateException("dialog is null");
}
}
if (totalUnitsFirstPhase > 0 && dialog == null) {
throw new IllegalStateException("dialog is null");
}
}
/**
* For developer testing.
*
* @param args ignored
*/
/**
* For developer testing.
*
* @param args ignored
*/
public static void main(final String[] args) {
System.out.println("Initializing...");
System.out.println("Initializing..."); // NOPMD by Braids on 8/18/11 11:13 PM
SwingUtilities.invokeLater(new Runnable() {
SwingUtilities.invokeLater(new Runnable() { // NOPMD by Braids on 8/18/11 11:16 PM
public void run() {
final int totalUnitsFirstPhase = 5000;
final int totalUnitsFirstPhase = 5000; // NOPMD by Braids on 8/18/11 11:16 PM
final MultiPhaseProgressMonitorWithETA monitor =
new MultiPhaseProgressMonitorWithETA("Testing 2 phases", 2, totalUnitsFirstPhase, 1.0f,
new float[] {2, 1});
new MultiPhaseProgressMonitorWithETA("Testing 2 phases", 2, totalUnitsFirstPhase, 1.0f,
new float[] {2, 1});
SwingWorker<Object, Object> worker = new SwingWorker<Object, Object>() {
final SwingWorker<Object, Object> worker = new SwingWorker<Object, Object>() {
@Override
public Object doInBackground() {
System.out.println("Running...");
System.out.println("Running..."); // NOPMD by Braids on 8/18/11 11:14 PM
for (int i = 0; i <= totalUnitsFirstPhase; i++) {
monitor.incrementUnitsCompletedThisPhase(1);
System.out.print("\ri = " + i);
System.out.print("\ri = " + i); // NOPMD by Braids on 8/18/11 11:14 PM
try {
Thread.sleep(1);
@@ -109,15 +117,15 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
// blank
}
}
System.out.println();
System.out.println(); // NOPMD by Braids on 8/18/11 11:14 PM
final int totalUnitsSecondPhase = 2000;
final int totalUnitsSecondPhase = 2000; // NOPMD by Braids on 8/18/11 11:17 PM
monitor.markCurrentPhaseAsComplete(totalUnitsSecondPhase);
for (int i = 0; i <= totalUnitsSecondPhase; i++) {
monitor.incrementUnitsCompletedThisPhase(1);
System.out.print("\ri = " + i);
System.out.print("\ri = " + i); // NOPMD by Braids on 8/18/11 11:14 PM
try {
Thread.sleep(1);
@@ -128,8 +136,8 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
monitor.markCurrentPhaseAsComplete(0);
System.out.println();
System.out.println("Done!");
System.out.println(); // NOPMD by Braids on 8/18/11 11:14 PM
System.out.println("Done!"); // NOPMD by Braids on 8/18/11 11:14 PM
return null;
}
@@ -143,22 +151,22 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
@Override
/**
* @param numUnits cannot be higher than Integer.MAX_VALUE
*
* @see net.slightlymagic.braids.util.progress_monitor.ProgressMonitor#setTotalUnitsThisPhase(long)
*/
public void setTotalUnitsThisPhase(final long numUnits) {
super.setTotalUnitsThisPhase(numUnits);
@Override
/**
* @param numUnits cannot be higher than Integer.MAX_VALUE
*
* @see net.slightlymagic.braids.util.progress_monitor.ProgressMonitor#setTotalUnitsThisPhase(long)
*/
public final void setTotalUnitsThisPhase(final long numUnits) {
super.setTotalUnitsThisPhase(numUnits);
if (numUnits > Integer.MAX_VALUE) {
throw new IllegalArgumentException("numUnits must be <= " + Integer.MAX_VALUE);
}
if (numUnits > Integer.MAX_VALUE) {
throw new IllegalArgumentException("numUnits must be <= " + Integer.MAX_VALUE);
}
if (numUnits > 0) {
// dialog must exist before we exit this method.
UtilFunctions.invokeInEventDispatchThreadAndWait(new Runnable() {
UtilFunctions.invokeInEventDispatchThreadAndWait(new Runnable() { // NOPMD by Braids on 8/18/11 11:17 PM
public void run() {
// (Re)create the progress bar.
if (dialog != null) {
@@ -171,7 +179,7 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
});
}
SwingUtilities.invokeLater(new Runnable() {
SwingUtilities.invokeLater(new Runnable() { // NOPMD by Braids on 8/18/11 11:18 PM
public void run() {
dialog.setTitle(title);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
@@ -181,25 +189,25 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
dialog.setProgressRange(0, (int) numUnits);
dialog.reset();
JProgressBar bar = dialog.getProgressBar();
final JProgressBar bar = dialog.getProgressBar();
bar.setString("");
bar.setStringPainted(true);
bar.setValue(0);
}
});
}
});
}
}
@Override
/**
* @see net.slightlymagic.braids.util.progress_monitor.ProgressMonitor#incrementUnitsCompletedThisPhase(long)
*/
public void incrementUnitsCompletedThisPhase(final long numUnits) {
super.incrementUnitsCompletedThisPhase(numUnits);
/**
* @see net.slightlymagic.braids.util.progress_monitor.ProgressMonitor#incrementUnitsCompletedThisPhase(long)
*/
public final void incrementUnitsCompletedThisPhase(final long numUnits) {
super.incrementUnitsCompletedThisPhase(numUnits);
SwingUtilities.invokeLater(new Runnable() {
SwingUtilities.invokeLater(new Runnable() { // NOPMD by Braids on 8/18/11 11:18 PM
public void run() {
for (int i = 0 ; i < numUnits ; i++) {
for (int i = 0; i < numUnits; i++) {
dialog.increment();
}
}
@@ -207,28 +215,28 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
if (shouldUpdateUI()) {
if ((getNumPhases() > 1)) {
if ((getNumPhases() > 1)) {
displayUpdate(
"Phase " + getCurrentPhase() + ". " +
//getUnitsCompletedSoFarThisPhase() + " units processed. " +
//"Overall: " + getTotalPercentCompleteAsString() + "% complete, " +
"Overall ETA in " + getRelativeETAAsString() + "."
"Phase " + getCurrentPhase() + ". "
//+ getUnitsCompletedSoFarThisPhase() + " units processed. "
//+ "Overall: " + getTotalPercentCompleteAsString() + "% complete, "
+ "Overall ETA in " + getRelativeETAAsString() + "."
);
}
else {
displayUpdate(
//"Overall: " +
getUnitsCompletedSoFarThisPhase() + " units processed; " +
//"(" + getTotalPercentCompleteAsString() + "%); " +
"ETA in " + getRelativeETAAsString() + "."
getUnitsCompletedSoFarThisPhase() + " units processed; "
//+ "(" + getTotalPercentCompleteAsString() + "%); "
+ "ETA in " + getRelativeETAAsString() + "."
);
}
}
if (getCurrentPhase() == getNumPhases() &&
getUnitsCompletedSoFarThisPhase() >= getTotalUnitsThisPhase())
if (getCurrentPhase() == getNumPhases()
&& getUnitsCompletedSoFarThisPhase() >= getTotalUnitsThisPhase())
{
displayUpdate("Done!");
displayUpdate("Done!");
}
}
@@ -238,15 +246,15 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
*
* @param message the message to display
*/
public void displayUpdate(final String message) {
public final void displayUpdate(final String message) {
final Runnable proc = new Runnable() {
final Runnable proc = new Runnable() { // NOPMD by Braids on 8/18/11 11:18 PM
public void run() {
// i've been having trouble getting the dialog to display its title.
dialog.setTitle(title);
// i've been having trouble getting the dialog to display its title.
dialog.setTitle(title);
JProgressBar bar = dialog.getProgressBar();
bar.setString(message);
JProgressBar bar = dialog.getProgressBar();
bar.setString(message);
justUpdatedUI();
}
@@ -263,7 +271,7 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
@Override
public final void dispose() {
SwingUtilities.invokeLater(new Runnable() {
SwingUtilities.invokeLater(new Runnable() { // NOPMD by Braids on 8/18/11 11:18 PM
public void run() {
getDialog().dispose();
}
@@ -275,8 +283,8 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
* @return the JDialog for the current phase; use this judiciously to
* manipulate the dialog directly.
*/
public JDialog getDialog() {
return dialog;
public final JDialog getDialog() {
return dialog;
}
}

View File

@@ -1,7 +1,5 @@
package forge.view.swing;
import java.lang.reflect.InvocationTargetException;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
@@ -28,7 +26,7 @@ import forge.view.swing.OldGuiNewGame.CardStackOffsetAction;
*/
public class ApplicationView implements FView {
private SplashFrame splashFrame;
private transient SplashFrame splashFrame;
/**
* The splashFrame field is guaranteed to exist when this constructor
@@ -39,13 +37,13 @@ public class ApplicationView implements FView {
// We must use invokeAndWait here to fulfill the constructor's
// contract.
UtilFunctions.invokeInEventDispatchThreadAndWait(new Runnable() {
UtilFunctions.invokeInEventDispatchThreadAndWait(new Runnable() { // NOPMD by Braids on 8/18/11 11:37 PM
public void run() {
splashFrame = new SplashFrame();
}
});
SwingUtilities.invokeLater(new Runnable() {
SwingUtilities.invokeLater(new Runnable() { // NOPMD by Braids on 8/18/11 11:37 PM
public void run() {
splashFrame.setVisible(true);
}
@@ -83,7 +81,10 @@ public class ApplicationView implements FView {
OldGuiNewGame.smoothLandCheckBox.setSelected(preferences.stackAiLand);
OldGuiNewGame.devModeCheckBox.setSelected(preferences.developerMode);
OldGuiNewGame.cardOverlay.setSelected(preferences.cardOverlay);
// FindBugs doesn't like the next line.
ImageCache.scaleLargerThanOriginal = preferences.scaleLargerThanOriginal;
OldGuiNewGame.cardScale.setSelected(preferences.scaleLargerThanOriginal);
CardStackOffsetAction.set(preferences.stackOffset);
CardStackAction.setVal(preferences.maxStackSize);

View File

@@ -11,51 +11,55 @@ import javax.swing.SwingUtilities;
* Some general-purpose functions.
*/
public final class UtilFunctions {
/**
* Do not instantiate.
*/
private UtilFunctions() {;}
/**
* Do not instantiate.
*/
private UtilFunctions() {
// empty
}
/**
* Throws a NullPointerException if param is null.
*
* @param paramName the name of the parameter; may be null
* @param param the parameter to test
*/
public static void checkNotNull(String paramName, Object param) {
if (param != null) return;
/**
* Throws a NullPointerException if param is null.
*
* @param paramName the name of the parameter; may be null
* @param param the parameter to test
*/
public static void checkNotNull(final String paramName, final Object param) {
if (param != null) {
return;
}
NullPointerException exn = null;
NullPointerException exn = null;
if (paramName != null) {
exn = new NullPointerException(paramName + " must not be null");
}
else {
//
exn = new NullPointerException();
}
if (paramName == null) {
exn = new NullPointerException(); // NOPMD by Braids on 8/18/11 11:19 PM
}
else {
exn = new NullPointerException(paramName + " must not be null"); // NOPMD by Braids on 8/18/11 11:19 PM
}
// Doctor the exception to appear to come from the caller.
StackTraceElement[] trace = exn.getStackTrace();
int len = getSliceLength(trace, 1);
exn.setStackTrace(slice(new StackTraceElement[len], trace, 1));
throw exn;
}
// Doctor the exception to appear to come from the caller.
final StackTraceElement[] trace = exn.getStackTrace();
final int len = getSliceLength(trace, 1);
exn.setStackTrace(slice(new StackTraceElement[len], trace, 1));
throw exn;
}
/**
* Invoke the given Runnable in an Event Dispatch Thread and wait for it
* to finish; but <B>try to use SwingUtilities.invokeLater instead whenever
* feasible.</B>
*
* Exceptions generated by SwingUtilities.invokeAndWait (if used), are
* rethrown as RuntimeExceptions.
*
* @see javax.swing.SwingUtilities#invokeLater(Runnable)
*
* @param proc the Runnable to run
*/
public static void invokeInEventDispatchThreadAndWait(final Runnable proc) {
/**
* Invoke the given Runnable in an Event Dispatch Thread and wait for it
* to finish; but <B>try to use SwingUtilities.invokeLater instead whenever
* feasible.</B>
*
* Exceptions generated by SwingUtilities.invokeAndWait (if used), are
* rethrown as RuntimeExceptions.
*
* @see javax.swing.SwingUtilities#invokeLater(Runnable)
*
* @param proc the Runnable to run
*/
public static void invokeInEventDispatchThreadAndWait(final Runnable proc) { // NOPMD by Braids on 8/18/11 11:19 PM
if (SwingUtilities.isEventDispatchThread()) {
// Just run in the current thread.
proc.run();
@@ -64,234 +68,271 @@ public final class UtilFunctions {
try {
SwingUtilities.invokeAndWait(proc);
} catch (InterruptedException exn) {
throw new RuntimeException(exn);
throw new RuntimeException(exn); // NOPMD by Braids on 8/18/11 11:19 PM
} catch (InvocationTargetException exn) {
throw new RuntimeException(exn);
throw new RuntimeException(exn); // NOPMD by Braids on 8/18/11 11:19 PM
}
}
}
/**
* Create an array from the (rest of) an iterator's output;
* this function is horribly inefficient.
*
* Please, only use it on small iterators.
*
* @param iter the iterator to traverse
*
* @return an array of (the rest of) the iterator's values
*/
public static <T> T[] iteratorToArray(Iterator<T> iter) {
ArrayList<T> list = new ArrayList<T>();
* Create an array from the (rest of) an iterator's output;
* this function is horribly inefficient.
*
* Please, only use it on small iterators.
*
* @param <T> (inferred automatically)
*
* @param iter the iterator to traverse
*
* @return an array of (the rest of) the iterator's values
*/
public static <T> T[] iteratorToArray(final Iterator<T> iter) {
final ArrayList<T> list = new ArrayList<T>();
T item;
while (iter.hasNext()) {
item = iter.next();
list.add(item);
}
T item;
while (iter.hasNext()) {
item = iter.next();
list.add(item);
}
@SuppressWarnings("unchecked")
T[] result = (T[]) list.toArray();
return result;
}
@SuppressWarnings("unchecked")
final T[] result = (T[]) list.toArray();
return result;
}
/**
* Returns the rightmost portion of an array, Python-style.
*
* @param <T> (inferred automatically)
*
* @param srcArray the array to copy (shallowly)
*
* @param startIndex if positive, the index (from the left) at which to
* start copying; if negative, we treat this as the index from the right.
* For example, calling this with startIndex = -2 returns the last two
* items in the array, if it has that many.
*
* @return a shallow copy of array starting at startIndex; this may return
* an empty array if the startIndex is out of bounds.
*/
public static <T extends Object> T[] slice(T[] dstArray, T[] srcArray,
int startIndex)
{
if (startIndex < 0) {
startIndex = srcArray.length + startIndex;
if (startIndex < 0) startIndex = 0;
}
/**
* Returns the rightmost portion of an array, Python-style.
*
* @param <T> (inferred automatically)
*
* @param dstArray the array in which to place new items
*
* @param srcArray the array to copy (shallowly)
*
* @param startIndexIn if positive, the index (from the left) at which to
* start copying; if negative, we treat this as the index from the right.
* For example, calling this with startIndex = -2 returns the last two
* items in the array, if it has that many.
*
* @return a shallow copy of array starting at startIndex; this may return
* an empty array if the startIndex is out of bounds.
*/
public static <T extends Object> T[] slice(final T[] dstArray, final T[] srcArray,
final int startIndexIn)
{
int startIndex = startIndexIn;
if (startIndex < 0) {
startIndex = srcArray.length + startIndex;
if (startIndex < 0) {
startIndex = 0;
}
}
if (dstArray == null) {
throw new NullPointerException();
}
if (dstArray == null) {
throw new NullPointerException(); // NOPMD by Braids on 8/18/11 11:19 PM
}
if (srcArray == null) {
throw new NullPointerException();
}
if (srcArray == null) {
throw new NullPointerException(); // NOPMD by Braids on 8/18/11 11:19 PM
}
int resultLength = getSliceLength(srcArray, startIndex);
final int resultLength = getSliceLength(srcArray, startIndex);
if (dstArray.length != resultLength) {
throw new ArrayIndexOutOfBoundsException(
"First parameter must have length " + resultLength + ", but length is " + dstArray.length + ".");
}
if (dstArray.length != resultLength) {
throw new ArrayIndexOutOfBoundsException(
"First parameter must have length " + resultLength
+ ", but length is " + dstArray.length + ".");
}
int srcIx = startIndex;
int srcIx = startIndex;
for (int dstIx = 0;
dstIx < resultLength && srcIx < srcArray.length;
dstIx++, srcIx++)
{
dstArray[dstIx] = srcArray[srcIx];
}
for (int dstIx = 0;
dstIx < resultLength && srcIx < srcArray.length;
dstIx++, srcIx++)
{
dstArray[dstIx] = srcArray[srcIx];
}
return dstArray;
}
return dstArray;
}
/**
* Get a slice's length in preparation for taking a slice.
*
* I do not like the fact that I have to use this function, but
* Java left me with little choice.
*
* @see #slice(Object[], Object[], int)
*
* @return the length of the array that would result from calling
* slice(Object[], Object[], int) with the given srcArray and
* startIndex.
*/
public static <T> int getSliceLength(T[] srcArray, int startIndex) {
if (startIndex < 0) {
startIndex = srcArray.length + startIndex;
if (startIndex < 0) startIndex = 0;
}
/**
* Get a slice's length in preparation for taking a slice.
*
* I do not like the fact that I have to use this function, but
* Java left me with little choice.
*
* @see #slice(Object[], Object[], int)
*
* @param <T> (inferred automatically)
*
* @param srcArray the array that would be copied (shallowly)
*
* @param startIndexIn if positive, the index (from the left) at which
* copying would start; if negative, we treat this as the index from the
* right. For example, calling this with startIndex = -2 computes the
* length if slice would return the last two items in the array, if it has
* that many.
*
* @return the length of the array that would result from calling
* slice(Object[], Object[], int) with the given srcArray and
* startIndex.
*/
public static <T> int getSliceLength(final T[] srcArray, final int startIndexIn) {
int startIndex = startIndexIn;
int resultLength = srcArray.length - startIndex;
return resultLength;
}
if (startIndex < 0) {
startIndex = srcArray.length + startIndex;
if (startIndex < 0) {
startIndex = 0;
}
}
final int resultLength = srcArray.length - startIndex;
return resultLength;
}
/**
* Handles the boilerplate null and isinstance check for an equals method.
*
* Example:
* <pre>
* public boolean equals(Object obj) {
* MyClassName that = checkNullOrNotInstance(this, obj);
* if (that == null) {
* return false;
* }
* //...
* }
* </pre>
*
* @param goodInstance a non-null instance of type T; looks neater than
* passing in goodInstance.getClass()
*
* @param obj the object to test
*
* @return null if obj is null or not an instance of goodInstance's class;
* otherwise, we return obj cast to goodInstance's type
*/
public static <T> T checkNullOrNotInstance(T goodInstance, Object obj) {
if (goodInstance == null) {
throw new NullPointerException("first parameter must not be null");
}
/**
* Handles the boilerplate null and isinstance check for an equals method.
*
* Example:
* <pre>
* public boolean equals(Object obj) {
* MyClassName that = checkNullOrNotInstance(this, obj);
* if (that == null) {
* return false;
* }
* //...
* }
* </pre>
*
* @param <T> (inferred automatically)
*
* @param goodInstance a non-null instance of type T; looks neater than
* passing in goodInstance.getClass()
*
* @param obj the object to test
*
* @return null if obj is null or not an instance of goodInstance's class;
* otherwise, we return obj cast to goodInstance's type
*/
public static <T> T checkNullOrNotInstance(final T goodInstance, final Object obj) {
if (goodInstance == null) {
throw new NullPointerException("first parameter must not be null"); // NOPMD by Braids on 8/18/11 11:19 PM
}
@SuppressWarnings("unchecked")
Class<T> classT = (Class<T>) goodInstance.getClass();
@SuppressWarnings("unchecked")
final Class<T> classT = (Class<T>) goodInstance.getClass();
boolean viable = true;
boolean viable = true;
if (obj == null) viable = false;
else if (!(classT.isInstance(obj))) viable = false;
if (obj == null) {
viable = false;
} else if (!(classT.isInstance(obj))) {
viable = false;
}
if (viable) {
return classT.cast(obj);
}
return null;
}
T result;
if (viable) {
result = classT.cast(obj);
} else {
result = null;
}
return result;
}
/**
* Safely converts an object to a String.
*
* @param obj to convert; may be null
*
* @return "null" if obj is null, obj.toString() otherwise
*/
public static String safeToString(Object obj) {
if (obj == null) {
return "null";
}
else {
return obj.toString();
}
}
/**
* Safely converts an object to a String.
*
* @param obj to convert; may be null
*
* @return "null" if obj is null, obj.toString() otherwise
*/
public static String safeToString(final Object obj) {
String result;
/**
* Remove nulls and duplicate items from the list.
*
* This may change the list's ordering. It uses the items' equals methods to
* determine equality.
*
* Advantages over HashSet: This consumes no unnecessary heap-memory, nor
* does it require objects to implement hashCode. It is OK if
* (o1.equals(o2) does not imply o1.hashCode() == o2.hashCode()).
*
* Advantages over TreeSet: This does not require a comparator.
*
* Disadvantages over HashSet and TreeSet: This runs in O(n*n) time.
*
* @param list the list to modify; this is fastest with ArrayList.
*/
public static <T> void smartRemoveDuplicatesAndNulls(List<T> list)
{
// Get rid of pesky leading nulls.
smartRemoveDuplicatesAndNullsHelper(list, 0, null);
if (obj == null) {
result = "null";
}
else {
result = obj.toString();
}
for (int earlierIx = 0; earlierIx < list.size(); earlierIx++)
{
for (int laterIx = earlierIx + 1; laterIx < list.size(); laterIx++)
{
T itemAtEarlierIx = list.get(earlierIx);
return result;
}
smartRemoveDuplicatesAndNullsHelper(list, laterIx,
itemAtEarlierIx);
}
/**
* Remove nulls and duplicate items from the list.
*
* This may change the list's ordering. It uses the items' equals methods to
* determine equality.
*
* Advantages over HashSet: This consumes no unnecessary heap-memory, nor
* does it require objects to implement hashCode. It is OK if
* (o1.equals(o2) does not imply o1.hashCode() == o2.hashCode()).
*
* Advantages over TreeSet: This does not require a comparator.
*
* Disadvantages over HashSet and TreeSet: This runs in O(n*n) time.
*
* @param <T> (inferred automatically)
*
* @param list the list to modify; this is fastest with ArrayList.
*/
public static <T> void smartRemoveDuplicatesAndNulls(final List<T> list) {
// Get rid of pesky leading nulls.
smartRemoveDuplicatesAndNullsHelper(list, 0, null);
}
}
for (int earlierIx = 0; earlierIx < list.size(); earlierIx++) {
for (int laterIx = earlierIx + 1; laterIx < list.size(); laterIx++)
{
final T itemAtEarlierIx = list.get(earlierIx);
/**
* Helper method for smartRemoveDuplicatesAndNulls that is subject to
* change; if you call this directly, you do so at your own risk!
*
* @param list the list to modify; if all items from startIx to the end
* are either null or equal to objSeenPreviously, then we truncate the
* list just before startIx.
*
* @param startIx the index to examine; we only move items within the range
* of [startIx, list.size()-1].
*
* @param objSeenPreviously the object with which to compare list[startIx];
* may be null.
*/
public static <T> void smartRemoveDuplicatesAndNullsHelper(
List<T> list, int startIx, T objSeenPreviously)
{
while (startIx < list.size() &&
(list.get(startIx) == null ||
list.get(startIx) == objSeenPreviously ||
list.get(startIx).equals(objSeenPreviously)))
{
int lastItemIx = list.size()-1;
smartRemoveDuplicatesAndNullsHelper(list, laterIx,
itemAtEarlierIx);
}
// Overwrite the item at laterIx with the one at the end,
// then delete the one at the end.
list.set(startIx, list.get(lastItemIx));
list.remove(lastItemIx);
}
}
}
}
/**
* Helper method for smartRemoveDuplicatesAndNulls that is subject to
* change; if you call this directly, you do so at your own risk!
*
* @param <T> (inferred automatically)
*
* @param list the list to modify; if all items from startIx to the end
* are either null or equal to objSeenPreviously, then we truncate the
* list just before startIx.
*
* @param startIx the index to examine; we only move items within the range
* of [startIx, list.size()-1].
*
* @param objSeenPreviously the object with which to compare list[startIx];
* may be null.
*/
public static <T> void smartRemoveDuplicatesAndNullsHelper(
final List<T> list, final int startIx, final T objSeenPreviously)
{
while (startIx < list.size()
&& (list.get(startIx) == null
|| list.get(startIx) == objSeenPreviously
|| list.get(startIx).equals(objSeenPreviously)))
{
final int lastItemIx = list.size() - 1;
// Overwrite the item at laterIx with the one at the end,
// then delete the one at the end.
list.set(startIx, list.get(lastItemIx));
list.remove(lastItemIx);
}
}
}

View File

@@ -22,11 +22,17 @@ import java.util.TreeSet;
* @author Forge
* @version $Id$
*/
@Test(groups = {"UnitTest"}, timeOut = 5000)
@Test(groups = {"UnitTest" }, timeOut = CardFactoryTest.DEFAULT_TEST_TIMEOUT_MS)
public class CardFactoryTest implements NewConstants {
private CardFactoryInterface factory;
/** The default time to allow a test to run before TestNG ignores it. */
public static final int DEFAULT_TEST_TIMEOUT_MS = 5000; // NOPMD by Braids on 8/18/11 11:43 PM
private transient CardFactoryInterface factory;
/**
* Executed before each test method, as in JUnit.
*/
@BeforeMethod
public final void setUp() {
OldGuiNewGame.loadDynamicGamedata();
@@ -37,8 +43,8 @@ public class CardFactoryTest implements NewConstants {
* Just a quick test to see if Arc-Slogger is in the database, and if it
* has the correct owner.
*/
@Test(enabled = true, timeOut = 5000)
public final void test_getCard_1() {
@Test(enabled = true, timeOut = DEFAULT_TEST_TIMEOUT_MS)
public final void test_getCard_1() { // NOPMD by Braids on 8/18/11 11:39 PM
final Card card = factory.getCard("Arc-Slogger", null);
Assert.assertNotNull(card, "card is not null");
Assert.assertNull(card.getOwner(), "card has correct owner");
@@ -47,19 +53,19 @@ public class CardFactoryTest implements NewConstants {
/**
* Make sure the method throws an exception when it's supposed to.
*/
@Test(enabled = true, timeOut = 5000)
public final void test_getRandomCombinationWithoutRepetition_tooLarge() {
@Test(enabled = true, timeOut = DEFAULT_TEST_TIMEOUT_MS)
public final void test_getRandomCombinationWithoutRepetition_tooLarge() { // NOPMD by Braids on 8/18/11 11:39 PM
BraidsAssertFunctions.assertThrowsException(IllegalArgumentException.class,
new ClumsyRunnable() {
public void run() throws Exception {
public void run() throws Exception { // NOPMD by Braids on 8/18/11 11:40 PM
factory.getRandomCombinationWithoutRepetition(factory.size());
}
});
BraidsAssertFunctions.assertThrowsException(IllegalArgumentException.class,
new ClumsyRunnable() {
public void run() throws Exception {
int largeDivisorForRandomCombo = 4;
public void run() throws Exception { // NOPMD by Braids on 8/18/11 11:40 PM
final int largeDivisorForRandomCombo = 4; // NOPMD by Braids on 8/18/11 11:41 PM
factory.getRandomCombinationWithoutRepetition(factory.size() / largeDivisorForRandomCombo);
}
});
@@ -70,10 +76,10 @@ public class CardFactoryTest implements NewConstants {
*
* This doesn't work with LazyCardFactory, so it is too slow to enable by default.
*/
@Test(enabled = false, timeOut = 5000)
public final void test_getRandomCombinationWithoutRepetition_oneTenth() {
@Test(enabled = false, timeOut = DEFAULT_TEST_TIMEOUT_MS)
public final void test_getRandomCombinationWithoutRepetition_oneTenth() { // NOPMD by Braids on 8/18/11 11:39 PM
factory = new PreloadingCardFactory(ForgeProps.getFile(CARDSFOLDER));
int divisor = 10;
final int divisor = 10; // NOPMD by Braids on 8/18/11 11:41 PM
final CardList actual = factory.getRandomCombinationWithoutRepetition(factory.size() / divisor);
final Set<String> cardNames = new TreeSet<String>();