// Copyright 2000-2003, FreeHEP. package hep.graphics.heprep.rmi; import java.rmi.*; import java.util.*; import hep.graphics.heprep.*; import hep.graphics.heprep.ref.*; import hep.graphics.heprep.util.*; /** * * @author M.Donszelmann * * @version $Id: HepRepAdapter.java 8584 2006-08-10 23:06:37Z duns $ */ public class HepRepAdapter implements HepRep { private HepRepFactory factory; private RMIHepRep heprep; private MapList/*<TreeID, HepRepInstanceTrees>*/ instanceTrees = new HashMapList(); private MapList/*<TreeID, HepRepTypeTrees>*/ typeTrees = new HashMapList(); /** * Create a wrapper for the top-level RMI HepRep object * @param heprep rmi heprep */ public HepRepAdapter(RMIHepRep heprep) { this.heprep = heprep; factory = new DefaultHepRepFactory(); } public HepRep copy() throws CloneNotSupportedException { return copy(null); } public HepRep copy(HepRepSelectFilter filter) throws CloneNotSupportedException { HepRep copy = factory.createHepRep(); // copy layers for (Iterator i=getLayerOrder().iterator(); i.hasNext(); ) { copy.addLayer((String)i.next()); } // copy type trees for (Iterator i=getTypeTreeList().iterator(); i.hasNext(); ) { HepRepTypeTree typeTree = (HepRepTypeTree)i.next(); copy.addTypeTree(typeTree.copy()); } // copy instance trees for (Iterator i=getInstanceTreeList().iterator(); i.hasNext(); ) { HepRepInstanceTree instanceTree = (HepRepInstanceTree)i.next(); HepRepTreeID typeTreeID = instanceTree.getTypeTree(); HepRepTypeTree typeTree = copy.getTypeTree(typeTreeID.getName(), typeTreeID.getVersion()); copy.addInstanceTree(instanceTree.copy(typeTree, filter)); } return copy; } public void addLayer(String layer) { throw new RuntimeException("HepRepAdapter.addLayer is not implemented."); } public List getLayerOrder() { try { return heprep.getLayerOrder(); } catch (RemoteException re) { return null; } } public void addTypeTree(HepRepTypeTree typeTree) { if (typeTree == null) return; typeTrees.put(factory.createHepRepTreeID(typeTree.getName(), typeTree.getVersion()), typeTree); } public void removeTypeTree(HepRepTypeTree typeTree) { if (typeTree == null) return; typeTrees.remove(factory.createHepRepTreeID(typeTree.getName(), typeTree.getVersion())); } public HepRepTypeTree getTypeTree(String name, String version) { try { HepRepTypeTree typeTree = (HepRepTypeTree)typeTrees.get(factory.createHepRepTreeID(name, version)); if (typeTree == null) { typeTree = heprep.getTypeTree(name, version); addTypeTree(typeTree); } return typeTree; } catch (RemoteException re) { return null; } } public Set/*<HepRepTypeTree>*/ getTypeTrees() { return typeTrees.valueSet(); } public List/*<HepRepTypeTree>*/ getTypeTreeList() { return typeTrees.valueList(); } public void addInstanceTree(HepRepInstanceTree instanceTree) { if (instanceTree == null) return; instanceTrees.put(factory.createHepRepTreeID(instanceTree.getName(), instanceTree.getVersion()), instanceTree); } public void overlayInstanceTree(HepRepInstanceTree instanceTree) { throw new RuntimeException("HepRepAdapter.overlayInstanceTree is not implemented."); } public void removeInstanceTree(HepRepInstanceTree instanceTree) { if (instanceTree == null) return; instanceTrees.remove(factory.createHepRepTreeID(instanceTree.getName(), instanceTree.getVersion())); } public HepRepInstanceTree getInstanceTreeTop(String name, String version) { try { HepRepInstanceTree instanceTree = (HepRepInstanceTree)instanceTrees.get(factory.createHepRepTreeID(name, version)); if (instanceTree == null) { instanceTree = heprep.getInstanceTreeTop(name, version); addInstanceTree(instanceTree); } return instanceTree; } catch (RemoteException re) { return null; } } public HepRepInstanceTree getInstances(String name, String version, String[] typeNames) { try { HepRepInstanceTree instanceTree = (HepRepInstanceTree)instanceTrees.get(factory.createHepRepTreeID(name, version)); if (instanceTree == null) { instanceTree = heprep.getInstances(name, version, typeNames); addInstanceTree(instanceTree); } return instanceTree; } catch (RemoteException re) { return null; } } public HepRepInstanceTree getInstancesAfterAction( String name, String version, String[] typeNames, HepRepAction[] actions, boolean getPoints, boolean getDrawAtts, boolean getNonDrawAtts, String[] invertAtts) { try { HepRepInstanceTree instanceTree = heprep.getInstancesAfterAction( name, version, typeNames, actions, getPoints, getDrawAtts, getNonDrawAtts, invertAtts); addInstanceTree(instanceTree); return instanceTree; } catch (RemoteException re) { return null; } } public String checkForException() { return "Not Implemented"; } public Set/*<HepRepInstanceTree>*/ getInstanceTrees() { return instanceTrees.valueSet(); } public List/*<HepRepInstanceTree>*/ getInstanceTreeList() { return instanceTrees.valueList(); } public boolean equals(Object o) { if (o instanceof HepRep) { HepRep ref = (HepRep)o; if (!ref.getLayerOrder().equals(getLayerOrder())) return false; if (!ref.getTypeTreeList().equals(getTypeTreeList())) return false; if (!ref.getInstanceTreeList().equals(getInstanceTreeList())) return false; return true; } return false; } public int hashCode() { long code = getLayerOrder().hashCode(); code += getTypeTreeList().hashCode(); code += getInstanceTreeList().hashCode(); return (int)code; } }