RMSGameScores.java Source code

Java tutorial

Introduction

Here is the source code for RMSGameScores.java

Source

/*
 * RMSGameScores.java 
 * Copyright (c) 2000 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Author: Srikanth Raju
 *
 * This software is the confidential and proprietary information of Sun
 * Microsystems, Inc. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Sun.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
 * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
 * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
 * THIS SOFTWARE OR ITS DERIVATIVES.
 */

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.rms.RecordComparator;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordFilter;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;

/**
 * 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;

        try {
            int score = inputStream.readInt();
            name = inputStream.readUTF();
        } catch (EOFException eofe) {
            System.out.println(eofe);
            eofe.printStackTrace();
        } catch (IOException eofe) {
            System.out.println(eofe);
            eofe.printStackTrace();
        }
        return (this.playerNameFilter.equals(name));
    }

    /*
     * 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) {

        try {
            while (re.hasNextElement()) {
                int id = re.nextRecordId();
                ByteArrayInputStream bais = new ByteArrayInputStream(recordStore.getRecord(id));
                DataInputStream inputStream = new DataInputStream(bais);
                try {
                    int score = inputStream.readInt();
                    String playerName = inputStream.readUTF();
                    System.out.println(playerName + " = " + score);
                } catch (EOFException eofe) {
                    System.out.println(eofe);
                    eofe.printStackTrace();
                }
            }
        } catch (RecordStoreException rse) {
            System.out.println(rse);
            rse.printStackTrace();
        } catch (IOException ioe) {
            System.out.println(ioe);
            ioe.printStackTrace();
        }
    }

    /**
     * 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
        }
    }

}