package io.fathom.cloud.keyczar; import io.fathom.cloud.zookeeper.ZookeeperClient; import java.io.IOException; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.data.Stat; import org.keyczar.KeyczarStore; import org.keyczar.exceptions.KeyczarException; import org.keyczar.i18n.Messages; import com.google.common.base.Charsets; public class ZookeeperKeyczarStore extends KeyczarStore { static final String META_FILE = "meta"; final ZookeeperClient zk; final String location; public ZookeeperKeyczarStore(ZookeeperClient zk, String location) { this.zk = zk; if (!location.endsWith("/")) { location += "/"; } this.location = location; } @Override public String getMetadata() throws KeyczarException { return readFile(location + META_FILE); } @Override public String getKey(int version) throws KeyczarException { return readFile(location + version); } private String readFile(String path) throws KeyczarException { try { Stat stat = new Stat(); byte[] data = zk.getData(path, null, stat); return new String(data, Charsets.UTF_8); } catch (IOException e) { throw new KeyczarException("Error reading key", e); } catch (KeeperException e) { throw new KeyczarException("Error reading key", e); } } private boolean exists(String path) throws KeyczarException { try { Stat stat = zk.exists(path, false); return stat != null; } catch (IOException e) { throw new KeyczarException("Error reading key", e); } catch (KeeperException e) { throw new KeyczarException("Error reading key", e); } } void writeFile(String path, byte[] data) throws KeyczarException { try { try { zk.createOrUpdate(path, data, true); } catch (KeeperException e) { throw new IOException("Error writing key", e); } } catch (IOException e) { throw new KeyczarException(Messages.getString("KeyczarTool.UnableToWrite", location), e); } } public boolean hasMetadata() throws KeyczarException { return exists(location + META_FILE); } @Override public void setMetadata(String metadata) throws KeyczarException { writeFile(location + META_FILE, metadata.getBytes(Charsets.UTF_8)); } @Override public void setKey(int versionNumber, String key) throws KeyczarException { writeFile(location + Integer.toString(versionNumber), key.getBytes(Charsets.UTF_8)); } }