RmsMidlet.java
**
* Copyright (c) 2013 Nokia Corporation. All rights reserved.
* Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
* Oracle and Java are trademarks or registered trademarks of Oracle and/or its
* affiliates. Other product and company names mentioned herein may be trademarks
* or trade names of their respective owners.
* See LICENSE.TXT for license information.
*/
package com.nokia.example;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.RecordStore;
/**
* MIDlet for benchmarking different record store access strategies.
*/
public class RmsMidlet
extends MIDlet
implements CommandListener {
private Command exit;
private Command run;
private Command delete;
private Form form;
private long startTime;
private long stopTime;
private RmsConnection basicRms = new BasicRms();
private RmsConnection badRms = new BadRms();
private RmsConnection cacheRms = new CacheRms();
private RmsConnection fileRms = new FileRms();
private final String recordData = "some dummy data for record";
public RmsMidlet() {
form = new Form("RMS");
exit = new Command("Exit", Command.EXIT, 1);
run = new Command("Run", Command.SCREEN, 1);
delete = new Command("Delete", Command.SCREEN, 1);
form.addCommand(exit);
form.addCommand(run);
form.addCommand(delete);
form.setCommandListener(this);
}
public void startApp() {
Display.getDisplay(this).setCurrent(form);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command command, Displayable displayable) {
if (command == exit) {
destroyApp(true);
notifyDestroyed();
}
else if (command == run) {
new Thread(new Runnable() {
public void run() {
execute();
}
}).start();
}
else if (command == delete) {
new Thread(new Runnable() {
public void run() {
reset();
}
}).start();
}
}
private void log(String msg) {
form.append(msg + "\n");
}
private void clear() {
form.deleteAll();
}
private void execute() {
init();
log("Starting test...");
String simpleResult = test(basicRms);
log("Basic RecordStore:\n" + simpleResult);
String badResult = test(badRms);
log("Bad RecordStore:\n" + badResult);
String cacheResult = test(cacheRms);
log("Cache RecordStore:\n" + cacheResult);
String fileResult = test(fileRms);
log("File RecordStore:\n" + fileResult);
log("Test done");
}
private void init() {
clear();
String[] stores = RecordStore.listRecordStores();
if (stores == null) {
log("Populating recordstores...");
populateStore(basicRms);
populateStore(badRms);
populateStore(cacheRms);
populateStore(fileRms);
log("Populating recordstores done");
}
}
private void populateStore(RmsConnection rms) {
try {
rms.open();
rms.set(recordData.getBytes());
}
catch (Exception e) {
log("Can not populate recordstores with the "
+ rms.getClass() + "!");
}
finally {
rms.close();
}
}
private void reset() {
clear();
log("Deleting recordstores...");
// Remove normal record stores
String[] stores = RecordStore.listRecordStores();
for (int i = 0; stores != null && i < stores.length; i++) {
try {
RecordStore.deleteRecordStore(stores[i]);
}
catch (Exception e) {
log("Deleting of the recordstore " + stores[i] + " failed!");
}
}
// Remove file record store
try {
((FileRms) fileRms).delete();
}
catch (Exception e) {
log("Deleting of the recordstore FileRms failed!");
}
log("Deleting recordstores done");
}
private String test(RmsConnection rms) {
String rtn = "";
try {
startTiming();
rms.open();
for (int i = 0; i < 100; i++) {
byte[] data = rms.get();
String out = new String(data);
// sanity check - what goes in must come out
checkEquals(recordData, out);
}
rms.close();
stopTiming();
rtn = getTime();
}
catch (SecurityException e) {
rtn = "Not allowed to test";
}
catch (DataMatchException e) {
rtn = "Tested data does not match";
}
catch (Exception e) {
rtn = "Error in running the test";
}
finally {
rms.close();
return rtn;
}
}
private class DataMatchException extends RuntimeException {
}
private void checkEquals(String expected, String actual) {
if (expected.compareTo(actual) != 0) {
throw new DataMatchException();
}
}
private void startTiming() {
startTime = System.currentTimeMillis();
}
private void stopTiming() {
stopTime = System.currentTimeMillis();
}
private String getTime() {
return (new Long(stopTime - startTime)).toString() + " ms";
}
}