/** * A class used for storing and showing game scores. */ public class RMSGameScores extends MIDlet implements RecordFilter, RecordComparator { /* * The RecordStore used for storing the game scores. */ PRivate RecordStore recordStore = null;
/* * The player name to use when filtering. */ public static String playerNameFilter = null;
/** * The constUCtor opens the underlying record store, creating it if * necessary. */ public RMSGameScores() { // Create a new record store for this example try { recordStore = RecordStore.openRecordStore("scores", true); } catch (RecordStoreException rse) { System.out.println("Record Store Exception in the ctor." + rse); rse.printStackTrace(); } }
/** * startApp() */ public void startApp() throws MIDletStateChangeException { RMSGameScores rmsgs = new RMSGameScores(); rmsgs.addScore(100, "Alice"); rmsgs.addScore(120, "Bill"); rmsgs.addScore(80, "Candice"); rmsgs.addScore(40, "Dean"); rmsgs.addScore(200, "Ethel"); rmsgs.addScore(110, "Farnsworth"); rmsgs.addScore(220, "Alice"); RMSGameScores.playerNameFilter = "Alice"; System.out .println("Print all scores followed by Scores for Farnsworth"); rmsgs.printScores(); }
/* * Part of the RecordFilter interface. */ public boolean matches(byte[] candidate) throws IllegalArgumentException { // If no filter set, nothing can match it. if (this.playerNameFilter == null) { return false; }
ByteArrayInputStream bais = new ByteArrayInputStream(candidate); DataInputStream inputStream = new DataInputStream(bais); String name = null;
/* * Part of the RecordComparator interface. */ public int compare(byte[] rec1, byte[] rec2) {
// Construct DataInputStreams for extracting the scores from // the records. ByteArrayInputStream bais1 = new ByteArrayInputStream(rec1); DataInputStream inputStream1 = new DataInputStream(bais1); ByteArrayInputStream bais2 = new ByteArrayInputStream(rec2); DataInputStream inputStream2 = new DataInputStream(bais2); int score1 = 0; int score2 = 0; try { // Extract the scores. score1 = inputStream1.readInt(); score2 = inputStream2.readInt(); } catch (EOFException eofe) { System.out.println(eofe); eofe.printStackTrace(); } catch (IOException eofe) { System.out.println(eofe); eofe.printStackTrace(); }
// Sort by score if (score1 > score2) { return RecordComparator.FOLLOWS; } else if (score1 < score2) { return RecordComparator.PRECEDES; } else { return RecordComparator.EQUIVALENT; } }
/** * Add a new score to the storage. * * @param score * the score to store. * @param playerName * the name of the play achieving this score. */ public void addScore(int score, String playerName) { // Each score is stored in a separate record, formatted with // the score, followed by the player name. ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream outputStream = new DataOutputStream(baos); try { // Push the score into a byte array. outputStream.writeInt(score); // Then push the player name. outputStream.writeUTF(playerName); } catch (IOException ioe) { System.out.println(ioe); ioe.printStackTrace(); }
// Extract the byte array byte[] b = baos.toByteArray(); try { // Add it to the record store recordStore.addRecord(b, 0, b.length); } catch (RecordStoreException rse) { System.out.println(rse); rse.printStackTrace(); } }
/** * A helper method for the printScores methods. */ private void printScoresHelper(RecordEnumeration re) {
/** * This method prints all of the scores sorted by game score. */ public void printScores() { try { // Enumerate the records using the comparator implemented // above to sort by game score.
// No RecordFilter here. All records in the RecordStore RecordEnumeration re = recordStore.enumerateRecords(null, this, true);
// Print all scores System.out.println("Print all scores..."); printScoresHelper(re);
// Enumerate records respecting a RecordFilter re = recordStore.enumerateRecords(this, this, true);
//Print scores for Farnsworth System.out.println("Print scores for : " + this.playerNameFilter); printScoresHelper(re); } catch (RecordStoreException rse) { System.out.println(rse); rse.printStackTrace(); }}
/** * pauseApp() */ public void pauseApp() { System.out.println("pauseApp()"); }
/** * destroyApp() * * This closes our open RecordStore when we are destroyed. * * @param cond * true if this is an unconditional destroy false if it is not * (ignored here and treated as unconditional) */ public void destroyApp(boolean cond) { System.out.println("destroyApp( )"); try { if (recordStore != null) recordStore.closeRecordStore(); } catch (Exception ignore) { // ignore this } }