package com.scoredev.scores;
import java.io.*;
import java.security.*;
import java.util.Hashtable;
public class HighScore
{
private String gameName;
private File highScoreFile;
public HighScore(String gameName)
{
this.gameName = gameName;
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
String path =
System.getProperty("user.home") +
File.separator +
".highscore";
highScoreFile = new File(path);
return null;
}
});
}
public void setHighScore(final int score)
throws IOException
{
//check permission first
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new HighScorePermission(gameName));
}
// need a doPrivileged block to manipulate the file
try {
AccessController.doPrivileged(new PrivilegedExceptionAction() {
public Object run() throws IOException {
Hashtable scores = null;
// try to open the existing file. Should have a locking
// protocol (could use File.createNewFile).
try {
FileInputStream fis =
new FileInputStream(highScoreFile);
ObjectInputStream ois = new ObjectInputStream(fis);
scores = (Hashtable) ois.readObject();
} catch (Exception e) {
// ignore, try and create new file
}
// if scores is null, create a new hashtable
if (scores == null)
scores = new Hashtable(13);
// update the score and save out the new high score
scores.put(gameName, new Integer(score));
FileOutputStream fos = new FileOutputStream(highScoreFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(scores);
oos.close();
return null;
}
});
} catch (PrivilegedActionException pae) {
throw (IOException) pae.getException();
}
}
/**
* get the high score. return -1 if it hasn't been set.
*
*/
public int getHighScore()
throws IOException, ClassNotFoundException
{
//check permission first
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new HighScorePermission(gameName));
}
Integer score = null;
// need a doPrivileged block to manipulate the file
try {
score = (Integer) AccessController.doPrivileged(
new PrivilegedExceptionAction() {
public Object run()
throws IOException, ClassNotFoundException
{
Hashtable scores = null;
// try to open the existing file. Should have a locking
// protocol (could use File.createNewFile).
FileInputStream fis =
new FileInputStream(highScoreFile);
ObjectInputStream ois = new ObjectInputStream(fis);
scores = (Hashtable) ois.readObject();
// get the high score out
return scores.get(gameName);
}
});
} catch (PrivilegedActionException pae) {
Exception e = pae.getException();
if (e instanceof IOException)
throw (IOException) e;
else
throw (ClassNotFoundException) e;
}
if (score == null)
return -1;
else
return score.intValue();
}
public static void main(String args[])
throws Exception
{
HighScore hs = new HighScore(args[1]);
if (args[0].equals("set")) {
hs.setHighScore(Integer.parseInt(args[2]));
} else {
System.out.println("score = "+ hs.getHighScore());
}
}
}
|