/*
* BasicMutableStore.java
*
* Created on May 28, 2003, 4.39 PM
*/
package hep.aida.ref.remote.basic;
import hep.aida.IManagedObject;
import hep.aida.dev.IDevMutableStore;
import hep.aida.dev.IDevTree;
import hep.aida.ref.remote.basic.interfaces.UpdateEvent;
import java.io.IOException;
import java.util.Map;
/**
* This is Basic implementation of Read-Only IMutableStore.
* It has extra methods that allow to change state of the tree
* and to create IManagedObject in that tree and update its data.
*
* @author serbo
*/
public abstract class BasicMutableStore implements AidaUpdatable, IDevMutableStore {
protected IDevTree tree;
protected UpdatableQueue queue;
protected boolean hurry; // If true, do not wait for data update,
// just schedule data update and return.
/**
* Creates a new instance of BasicMutableStore.
*/
public BasicMutableStore() {
this(null, false);
}
public BasicMutableStore(boolean hurry) {
this(null, hurry);
}
public BasicMutableStore(IDevTree tree, boolean hurry) {
this.tree = tree;
this.hurry = hurry;
queue = new UpdatableQueue();
}
// Service methods
// IDevMutableStore methods
public IManagedObject createObject(String name, String type) {
//System.out.println("BasicMutableStore.createObject: name="+name+", type="+type);
return BasicAdapter.create(name, type);
}
public abstract void updateData(String path, String type);
// IMutableStore methods
public void close() throws IOException {
queue.close();
tree = null;
}
public void commit(IDevTree tree, Map options) throws IOException {
throw new UnsupportedOperationException("Can not commit changes to the Read-Only Store");
}
public boolean isReadOnly() {
return true;
}
public abstract void read(IDevTree tree, String path) throws IllegalArgumentException, IOException;
public abstract void read(IDevTree tree, Map options, boolean readOnly, boolean createNew) throws IOException;
// AidaUpdatable methods
/**
* This method actually does the job of modifying the client tree.
* If directory or node already does exist, it will not be overwritten.
*/
public void stateChanged(UpdateEvent event) {
int id = event.id();
String path = event.path();
String type = event.nodeType();
if (id == hep.aida.ref.remote.basic.interfaces.UpdateEvent.NODE_ADDED) {
//System.out.println("Adding Node, path="+event.path()+", type="+type);
if (type.equalsIgnoreCase("dir")) {
try { // If directory already exists, IllegalArgumentException is thrown
tree.mkdirs(path);
} catch (IllegalArgumentException ex) {}
} else {
int index = path.lastIndexOf("/");
String name = path.substring(index+1);
String objDir = path.substring(0, index+1);
IManagedObject h = null;
try { // If object already exists, do not overwrite it.
h = tree.find(path);
} catch (IllegalArgumentException exFind) {}
if (h != null) return;
try { // Make sure all directories in the path exist.
tree.mkdirs(objDir);
} catch (IllegalArgumentException exObj) {}
//System.out.println("\tCreating ManagedObject with name: "+name+", path: "+objDir+", type="+type);
h = createObject(name, type);
tree.add(objDir, h);
updateData(path, type);
//servant.setValid(new String[] {path} );
}
} else if (id == hep.aida.ref.remote.basic.interfaces.UpdateEvent.NODE_DELETED) {
//System.out.println("Deleting Node, path="+event.path()+", type="+type);
if (type.equalsIgnoreCase("dir")) {
try {
String[] list = tree.listObjectNames(path);
tree.rmdir(path);
} catch (IllegalArgumentException ex) { }
} else {
try {
IManagedObject obj = tree.find(path);
tree.rm(path);
} catch (IllegalArgumentException ex) { }
}
} else if (id == hep.aida.ref.remote.basic.interfaces.UpdateEvent.NODE_UPDATED) {
//System.out.println("Updating Node, path="+event.path()+", type="+type);
updateData(path, type);
} else {
//System.out.println("Wrong ID="+event.id()+", path="+event.path()+", type="+type);
}
}
// Do some simple tests here
public static void main(String[] args) {
}
}