/**
*
*/
package com.flickr4java.flickr.util;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.auth.Auth;
import com.flickr4java.flickr.people.User;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
/**
*
* Implements a filesystem based storage system for Auth instances. One ".auth" file is maintained per Auth instance stored.
*
* @author Matthew MacKenzie
*
*/
public class FileAuthStore implements AuthStore {
private Map<String, Auth> auths;
private Map<String, Auth> authsByUser; // Separate HashMap due to retrieveAll.
private File authStoreDir;
public FileAuthStore(File authStoreDir) throws FlickrException {
this.auths = new HashMap<String, Auth>();
this.authsByUser = new HashMap<String, Auth>();
this.authStoreDir = authStoreDir;
if (!authStoreDir.exists())
authStoreDir.mkdir();
if (!authStoreDir.canRead()) {
try {
throw new FlickrException("Cannot read " + authStoreDir.getCanonicalPath());
} catch (IOException e) {
throw new FlickrException(e.getMessage(), e);
}
}
this.load();
}
private void load() throws FlickrException {
try {
File[] authFiles = authStoreDir.listFiles(new AuthFilenameFilter());
for (int i = 0; i < authFiles.length; i++) {
if (authFiles[i].isFile() && authFiles[i].canRead()) {
ObjectInputStream authStream = new ObjectInputStream(new FileInputStream(authFiles[i]));
Auth authInst = null;
try {
authInst = (Auth) authStream.readObject();
} catch (ClassCastException cce) {
// ignore. Its not an auth, so we won't store it. simple as that :-);
} catch (ClassNotFoundException e) {
// yep, ignoring. LALALALALLALAL. I can't hear you :-)
}
if (authInst != null) {
this.auths.put(authInst.getUser().getId(), authInst);
// Also store by user-name since it is generally easier to remember.
this.authsByUser.put(authInst.getUser().getUsername(), authInst);
}
authStream.close();
}
}
} catch (IOException e) {
throw new FlickrException(e.getMessage(), e);
}
}
/*
* (non-Javadoc)
*
* @see com.flickr4java.flickr.util.AuthStore#store(com.flickr4java.flickr.auth.Auth)
*/
public void store(Auth token) throws IOException {
this.auths.put(token.getUser().getId(), token);
this.authsByUser.put(token.getUser().getUsername(), token);
String filename = token.getUser().getId() + ".auth";
File outFile = new File(this.authStoreDir, filename);
outFile.createNewFile();
ObjectOutputStream authStream = new ObjectOutputStream(new FileOutputStream(outFile));
authStream.writeObject(token);
authStream.flush();
authStream.close();
}
/*
* (non-Javadoc)
* Retrieve via flickr user id or username.
*
* @see com.flickr4java.flickr.util.AuthStore#retrieve(java.lang.String)
*/
public Auth retrieve(String nsid) {
Auth auth = this.auths.get(nsid);
if(auth != null)
return auth;
else
return this.authsByUser.get(nsid);
}
/*
* (non-Javadoc)
*
* @see com.flickr4java.flickr.util.AuthStore#retrieveAll()
*/
public Auth[] retrieveAll() {
return this.auths.values().toArray(new Auth[this.auths.size()]);
}
/*
* (non-Javadoc)
*
* @see com.flickr4java.flickr.util.AuthStore#clearAll()
*/
public void clearAll() {
this.auths.clear();
this.authsByUser.clear();
File[] auths = this.authStoreDir.listFiles(new AuthFilenameFilter());
for (int i = 0; i < auths.length; i++) {
auths[i].delete();
}
}
/*
* (non-Javadoc)
*
* @see com.flickr4java.flickr.util.AuthStore#clear(java.lang.String)
*/
public void clear(String nsid) {
Auth a = this.auths.get(nsid);
if(a != null) {
this.authsByUser.remove(a.getUser().getUsername());
}
this.auths.remove(nsid);
this.authsByUser.remove(nsid); // in case username is passed.
File auth = new File(this.authStoreDir, nsid + ".auth");
if (auth.exists())
auth.delete();
}
static class AuthFilenameFilter implements FilenameFilter {
private static final String suffix = ".auth";
public boolean accept(File dir, String name) {
if (name.endsWith(suffix))
return true;
return false;
}
}
public static void main(String[] args) throws Exception {
FileAuthStore fas = new FileAuthStore(new File(System.getProperty("user.home") + File.separatorChar + "flickrauth"));
Auth a = new Auth();
User u = new User();
u.setId("THISISMYNSID");
a.setUser(u);
fas.store(a);
fas = null;
fas = new FileAuthStore(new File(System.getProperty("user.home") + File.separatorChar + "flickrauth"));
Auth a2 = fas.retrieve("THISISMYNSID");
System.out.println(a2.getUser().getId());
}
}