123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962 |
- package javax.imageio.spi;
- import gnu.classpath.ServiceFactory;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.HashSet;
- import java.util.IdentityHashMap;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.Map;
- import java.util.NoSuchElementException;
- import java.util.Set;
- public class ServiceRegistry
- {
-
-
- final Class[] categories;
-
- private final LinkedList[] providers;
-
- private IdentityHashMap[] constraints;
-
- public ServiceRegistry(Iterator<Class<?>> categories)
- {
- ArrayList cats = new ArrayList( 10);
- if (categories == null)
- throw new IllegalArgumentException();
- while (categories.hasNext())
- {
- Class cat = (Class) categories.next();
- if (cat == null)
- throw new IllegalArgumentException();
- cats.add(cat);
- }
- int numCats = cats.size();
- this.categories = (Class[]) cats.toArray(new Class[numCats]);
- this.providers = new LinkedList[numCats];
- }
-
- public static <T> Iterator<T> lookupProviders(Class<T> spi,
- ClassLoader loader)
- {
- return ServiceFactory.lookupProviders(spi, loader);
- }
-
- public static <T> Iterator<T> lookupProviders(Class<T> spi)
- {
- return ServiceFactory.lookupProviders(spi);
- }
-
- public Iterator<Class<?>> getCategories()
- {
- return new Iterator()
- {
- int index = -1;
- public boolean hasNext()
- {
- return index < categories.length - 1;
- }
- public Object next()
- {
- if (!hasNext())
- throw new NoSuchElementException();
- return categories[++index];
- }
- public void remove()
- {
- throw new UnsupportedOperationException();
- }
- };
- }
-
- private synchronized boolean registerServiceProvider(Object provider,
- int cat)
- {
- LinkedList provs;
- boolean result;
- Class category;
- if (provider == null)
- throw new IllegalArgumentException();
- category = categories[cat];
- if (!category.isInstance(provider))
- throw new ClassCastException(category.getName());
- provs = providers[cat];
- if (provs == null)
- {
- result = true;
- provs = providers[cat] = new LinkedList();
- }
- else
- result = false;
- provs.add(provider);
- if (provider instanceof RegisterableService)
- ((RegisterableService) provider).onRegistration(this, category);
- return result;
- }
-
- public synchronized <T> boolean registerServiceProvider(T provider,
- Class<T> category)
- {
- for (int i = 0; i < categories.length; i++)
- if (categories[i] == category)
- return registerServiceProvider(provider, i);
- throw new IllegalArgumentException();
- }
-
- public synchronized void registerServiceProvider(Object provider)
- {
- boolean ok = false;
- if (provider == null)
- throw new IllegalArgumentException();
- for (int i = 0; i < categories.length; i++)
- if (categories[i].isInstance(provider))
- {
- ok = true;
- registerServiceProvider(provider, i);
- }
- if (!ok)
- throw new IllegalArgumentException();
- }
-
- public synchronized void registerServiceProviders(Iterator<?> providers)
- {
- if (providers == null)
- throw new IllegalArgumentException();
- while (providers.hasNext())
- registerServiceProvider(providers.next());
- }
-
- private synchronized boolean deregisterServiceProvider(Object provider,
- int cat)
- {
- LinkedList provs;
- boolean result;
- Class category;
- if (provider == null)
- throw new IllegalArgumentException();
- category = categories[cat];
- if (!category.isInstance(provider))
- throw new ClassCastException(category.getName());
- provs = providers[cat];
- if (provs == null)
- return false;
- result = provs.remove(provider);
- if (provs.isEmpty())
- providers[cat] = null;
- if (result && (provider instanceof RegisterableService))
- ((RegisterableService) provider).onDeregistration(this, category);
- return result;
- }
-
- public synchronized <T> boolean deregisterServiceProvider(T provider,
- Class<T> category)
- {
- for (int i = 0; i < categories.length; i++)
- if (categories[i] == category)
- return deregisterServiceProvider(provider, i);
- throw new IllegalArgumentException();
- }
-
- public synchronized void deregisterServiceProvider(Object provider)
- {
- boolean ok = false;
- if (provider == null)
- throw new IllegalArgumentException();
- for (int i = 0; i < categories.length; i++)
- if (categories[i].isInstance(provider))
- {
- ok = true;
- deregisterServiceProvider(provider, i);
- }
- if (!ok)
- throw new IllegalArgumentException();
- }
-
- public synchronized void deregisterAll(Class<?> category)
- {
- boolean ok = false;
- for (int i = 0; i < categories.length; i++)
- {
- if (categories[i] != category)
- continue;
- ok = true;
- while (providers[i] != null)
- deregisterServiceProvider(providers[i].get(0), i);
- }
- if (!ok)
- throw new IllegalArgumentException();
- }
-
- public synchronized void deregisterAll()
- {
- for (int i = 0; i < categories.length; i++)
- while (providers[i] != null)
- deregisterServiceProvider(providers[i].get(0), i);
- }
-
- public void finalize()
- throws Throwable
- {
- super.finalize();
- deregisterAll();
- }
-
- public synchronized boolean contains(Object provider)
- {
- if (provider == null)
- throw new IllegalArgumentException();
-
-
-
- for (int i = 0; i < providers.length; i++)
- {
-
-
-
- if (!categories[i].isInstance(provider))
- continue;
-
-
- LinkedList p = providers[i];
- if (p != null && p.contains(provider))
- return true;
- }
- return false;
- }
-
- private int getCategoryID(Class category)
- {
- for (int i = 0; i < categories.length; i++)
- if (categories[i] == category)
- return i;
- throw new IllegalArgumentException();
- }
-
- public <T> Iterator<T> getServiceProviders(Class<T> category,
- boolean useOrdering)
- {
- return getServiceProviders(category, null, useOrdering);
- }
-
- public synchronized <T> Iterator<T> getServiceProviders(Class<T> category,
- Filter filter,
- boolean useOrdering)
- {
- int catid;
- LinkedList provs;
- ArrayList result;
- catid = getCategoryID(category);
- provs = providers[catid];
- if (provs == null)
- return Collections.EMPTY_LIST.iterator();
- result = new ArrayList(provs.size());
- for (Iterator iter = provs.iterator(); iter.hasNext();)
- {
- Object provider = iter.next();
- if (filter == null || filter.filter(provider))
- result.add(provider);
- }
-
-
-
- if (useOrdering && constraints != null)
- {
- final Map cons = constraints[catid];
- if (cons != null)
- Collections.sort(result, new Comparator()
- {
- public int compare(Object o1, Object o2)
- {
- Set s;
- if (o1 == o2)
- return 0;
- s = (Set) cons.get(o1);
- if (s != null && s.contains(o2))
- return -1;
- s = (Set) cons.get(o2);
- if (s != null && s.contains(o1))
- return 1;
- return 0;
- }
- });
- }
- return result.iterator();
- }
-
- public synchronized <T> T getServiceProviderByClass(Class<T> providerClass)
- {
- if (providerClass == null)
- throw new IllegalArgumentException();
-
-
-
- for (int cat = 0; cat < categories.length; cat++)
- {
- if (!categories[cat].isAssignableFrom(providerClass))
- continue;
- LinkedList provs = providers[cat];
- if (provs == null)
- continue;
- for (Iterator iter = provs.iterator(); iter.hasNext();)
- {
- Object provider = iter.next();
- if (providerClass.isInstance(provider))
- return (T) provider;
- }
- }
- return null;
- }
-
- public synchronized <T> boolean setOrdering(Class<T> category,
- T firstProvider,
- T secondProvider)
- {
- return addConstraint(getCategoryID(category), firstProvider,
- secondProvider);
- }
-
- public synchronized <T> boolean unsetOrdering(Class<T> category,
- T firstProvider,
- T secondProvider)
- {
- return removeConstraint(getCategoryID(category),
- firstProvider, secondProvider);
- }
-
- private boolean addConstraint(int catid, Object first, Object second)
- {
- Set s;
- IdentityHashMap cons;
-
- removeConstraint(catid, second, first);
- if (constraints == null)
- constraints = new IdentityHashMap[categories.length];
- cons = constraints[catid];
- if (cons == null)
- cons = constraints[catid] = new IdentityHashMap();
- s = (Set) cons.get(first);
- if (s == null)
- cons.put(first, s = new HashSet());
- return s.add(second);
- }
-
- private boolean removeConstraint(int catid, Object first, Object second)
- {
- Collection s;
- IdentityHashMap cons;
- if (first == null || second == null || first == second)
- throw new IllegalArgumentException();
- if (constraints == null)
- return false;
- cons = constraints[catid];
- if (cons == null)
- return false;
- s = (Collection) cons.get(first);
- if (s == null)
- return false;
- if (!s.remove(second))
- return false;
-
-
- if (cons.isEmpty())
- {
- constraints[catid] = null;
- boolean anyConstraints = false;
- for (int i = 0; i < constraints.length; i++)
- {
- if (constraints[i] != null)
- {
- anyConstraints = true;
- break;
- }
- }
- if (!anyConstraints)
- constraints = null;
- }
- return true;
- }
-
- public static interface Filter
- {
-
- boolean filter(Object provider);
- }
- }
|