/*
* CorbaMutableStore.java
*
* Created on June 6, 2003, 2:06 PM
*/
package hep.aida.ref.remote.corba;
import hep.aida.IManagedObject;
import hep.aida.ref.remote.RemoteClient;
import hep.aida.ref.remote.RemoteManagedObject;
import hep.aida.ref.remote.RemoteMutableStore;
import hep.aida.ref.remote.corba.converters.CorbaConverter;
import hep.aida.ref.remote.corba.converters.CorbaDataPointSetDConverter;
import hep.aida.ref.remote.corba.converters.CorbaHist1DConverter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import org.freehep.util.FreeHEPLookup;
import org.openide.util.Lookup;
/**
* This is implementation of IDevMutableStore that works with
* AIDA CORBA Client. Supported options:
* ior=ior_value
* iorFileURL=file_URL
* ServerName=name_of_server_in_CORBA_Name_service
*
* @author serbo
*/
public final class CorbaMutableStore extends RemoteMutableStore {
private Map converters;
/** Creates a new instance of CorbaMutableStore */
public CorbaMutableStore() {
super();
converters = new Hashtable();
// Register available CORBA Converters
FreeHEPLookup.instance().add(CorbaHist1DConverter.getInstance(), "IHistogram1D");
FreeHEPLookup.instance().add(CorbaDataPointSetDConverter.getInstance(), "IDataPointSet");
}
// Service Methods
private String readIORFromFile(String fileURL) {
String ior = null;
try {
URL url = new URL(fileURL);
InputStream is = url.openStream(); // throws an IOException
BufferedReader br = new BufferedReader(new InputStreamReader(is));
ior = br.readLine();
} catch (Exception e) {
throw new RuntimeException(e);
}
return ior;
}
// From RemoteMutableStore
protected RemoteClient createClient(Map options) {
String ior = "";
String nsName = null;
//CorbaTreeClientImpl client = null;
RemoteClient client = null;
boolean duplex = true;
if (options.isEmpty())
throw new IllegalArgumentException("No information about AidaTreeServer");
Iterator it = options.keySet().iterator();
while (it.hasNext()) {
String key = ((String) it.next());
String value = ((String) options.get(key));
System.out.println("Key = "+key+" \tValue = "+value);
if (key.equalsIgnoreCase("ior")) { ior = value; }
else if (key.equalsIgnoreCase("iorFileURL"))
ior = readIORFromFile(value);
else if (key.equalsIgnoreCase("ServerName"))
nsName = value;
else if (key.equalsIgnoreCase("duplex")) {
if (value.equalsIgnoreCase("true")) duplex = true;
else duplex = false;
}
}
if (nsName == null) { // Do not use CORBA Name Service
//client = new CorbaTreeClientImpl(this, ior);
client.setDuplex(duplex);
} else { // Use CORBA Name Service
//client = new CorbaTreeClientImpl(this, ior, nsName);
client.setDuplex(duplex);
}
return client;
}
public void updateData(String path, String aidaType) throws IllegalArgumentException {
System.out.println("CorbaMutableStore.updateData: path="+path+", type="+aidaType);
// Find Convertor for this AIDA Type
CorbaConverter converter = null;
if (converters.containsKey(aidaType)) {
converter = (CorbaConverter) converters.get(aidaType);
} else {
Lookup.Template template = new Lookup.Template(CorbaConverter.class, aidaType, null);
Lookup.Item item = FreeHEPLookup.instance().lookupItem(template);
if (item == null) throw new IllegalArgumentException("No Converter for AIDA Type: "+aidaType);
converter = (CorbaConverter) item.getInstance();
converters.put(aidaType, converter);
}
// Get local AIDA Tree object and remote data
IManagedObject mo = tree.find(path);
Object data = client.find(path);
System.out.println("CorbaMutableStore.updateData: mo="+mo+", data="+data);
converter.updateAidaObject(mo, data);
//if (mo instanceof RemoteManagedObject) ((RemoteManagedObject) mo).setDataValid(true);
//if (!aidaType.equalsIgnoreCase("dir")) ((RemoteClient) client).setValid(path);
}
public IManagedObject createObject(String name, String aidaType) throws IllegalArgumentException {
System.out.println("CorbaMutableStore.createObject: name="+name+", type="+aidaType);
//super.createObject(name, aidaType);
// Lookup CorbaConverter: first in the local Map, then in the global Lookup
CorbaConverter converter = null;
if (converters.containsKey(aidaType)) {
converter = (CorbaConverter) converters.get(aidaType);
} else {
Lookup.Template template = new Lookup.Template(CorbaConverter.class, aidaType, null);
Lookup.Item item = FreeHEPLookup.instance().lookupItem(template);
if (item == null) throw new IllegalArgumentException("No Converter for AIDA Type: "+aidaType);
converter = (CorbaConverter) item.getInstance();
converters.put(aidaType, converter);
}
IManagedObject mo = (IManagedObject) converter.createAidaObject(name);
if (mo instanceof RemoteManagedObject) ((RemoteManagedObject) mo).setStore(this);
return mo;
}
// IMutableStore methods
public void close() throws IOException {
super.close();
converters.clear();
converters = null;
}
}