package org.freehep.util; import org.openide.util.Lookup; import org.openide.util.MetaInfServicesLookup; import org.openide.util.lookup.AbstractLookup; import org.openide.util.lookup.InstanceContent; import org.openide.util.lookup.ProxyLookup; import org.openide.util.lookup.AbstractLookup.Pair; /** A simple lookup which allows adding and removing items. * This is just a simple front-end to the netbeans lookup api. * It provides the ability to lookup classes registered via the * Sun service provider mechanism or registered directly with this class. * @see <a href="http://openide.netbeans.org/lookup/">The Netbeans Lookup API</a> * @see <a href="http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Service%20Provider">The service provider mechanism</a> * @author tonyj * @version $Id: FreeHEPLookup.java 8584 2006-08-10 23:06:37Z duns $ */ public class FreeHEPLookup extends Lookup { private static InstanceContent ic = new InstanceContent(); private static AbstractLookup contentLookup = new AbstractLookup(ic); private static FreeHEPLookup theLookup = new FreeHEPLookup(); private MyProxyLookup proxy; private FreeHEPLookup() { proxy = new MyProxyLookup(contentLookup, Lookup.getDefault()); } /** Access a singleton instance of FreeHEPLookup.ProxyLookup * @return The singleton instance of FreeHEPLookup */ public static FreeHEPLookup instance() { return theLookup; } /** Add an instance of an Object to the lookup. * @param instance The object to add. */ public void add(Object instance) { ic.add(instance); } /** Add an instance with an ID. * @param instance The instance to add. * @param id The ID associated with the instance */ public void add(Object instance, String id) { ic.addPair(new DontAsk(instance,id)); } /** Add an instance with multiple IDs. * @param instance The instance to add. * @param ids The IDs associated with the instance. */ public void add(Object instance, String[] ids) { for ( int i = 0; i < ids.length; i++ ) ic.addPair(new DontAsk(instance,ids[i])); } /** Remove an instance from the lookup * @param instance The instance to remove */ public void remove(Object instance) { ic.remove(instance); } /** Remove an instance with a specific ID. * @param instance The instance to remove * @param id The ID of the instance */ public void remove(Object instance, String id) { ic.removePair(new DontAsk(instance,id)); } /** Remove an instance with multiple IDs * @param instance The instance to remove * @param ids The IDs of the instance */ public void remove(Object instance, String[] ids) { for ( int i = 0; i < ids.length; i++ ) ic.removePair(new DontAsk(instance,ids[i])); } /** Sets the ClassLoader used for subsequent service API lookups * @param loader The ClassLoader to use. */ public void setClassLoader(ClassLoader loader) { Lookup serviceLookup = new MetaInfServicesLookup(loader); proxy.setLookups(contentLookup, serviceLookup); } public Lookup.Result lookup(Lookup.Template template) { return proxy.lookup(template); } public Object lookup(Class clazz) { return proxy.lookup(clazz); } private class DontAsk extends Pair { private static final long serialVersionUID = -6621505967094205187L; private Object instance; private String id; DontAsk(Object instance, String id) { this.id = id; this.instance = instance; } protected boolean creatorOf(Object obj) { return obj == instance; } public String getDisplayName() { return instance.toString(); } public String getId() { return id; } public Object getInstance() { return instance; } public Class getType() { return instance.getClass(); } protected boolean instanceOf(Class clazz) { return clazz.isInstance(instance); } public boolean equals(Object xx) { if (xx instanceof DontAsk) { DontAsk other = (DontAsk) xx; return other.instance == this.instance && other.id.equals(this.id); } else return false; } public int hashCode() { return instance.hashCode() + id.hashCode(); } } private class MyProxyLookup extends ProxyLookup { MyProxyLookup(Lookup a, Lookup b) { super(new Lookup[]{a, b}); } private void setLookups(Lookup a, Lookup b) { super.setLookups(new Lookup[]{a, b}); } } }