/* * Copyright (c) 2010, grossmann * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the jo-widgets.org nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL jo-widgets.org BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ package org.jowidgets.api.toolkit; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ServiceLoader; import org.jowidgets.classloading.api.SharedClassLoader; import org.jowidgets.util.Assert; /** * The toolkit interceptor accessor class */ public final class ToolkitInterceptor { private static CompositeToolkitInterceptorHolder compositeHolder; private ToolkitInterceptor() {} /** * Register a toolkit interceptor explicitly. * * Only use this way of registration, if you are sure, that the toolkit that you are using was not already * created. * * The recommended way is to use the Service Loader Mechanism for the {@link IToolkitInterceptorHolder} interface: * (http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html) * * @param holder The holder to register */ public static synchronized void registerToolkitInterceptorHolder(final IToolkitInterceptorHolder holder) { Assert.paramNotNull(holder, "holder"); getCompositeHolder().add(holder); } /** * @deprecated Use registerToolkitInterceptorHolder instead, because this method has a typo */ @Deprecated public static synchronized void registerTollkitInterceptorHolder(final IToolkitInterceptorHolder holder) { registerToolkitInterceptorHolder(holder); } private static synchronized CompositeToolkitInterceptorHolder getCompositeHolder() { if (compositeHolder == null) { compositeHolder = new CompositeToolkitInterceptorHolder(); final ServiceLoader<IToolkitInterceptorHolder> serviceLoader = ServiceLoader.load( IToolkitInterceptorHolder.class, SharedClassLoader.getCompositeClassLoader()); final Iterator<IToolkitInterceptorHolder> iterator = serviceLoader.iterator(); while (iterator.hasNext()) { compositeHolder.add(iterator.next()); } } return compositeHolder; } /** * Gets the instance of the toolkit interceptor composite, that holds * all registered holders * * @return The toolkit interceptor, never null */ public static synchronized IToolkitInterceptor getInstance() { return getCompositeHolder().getToolkitInterceptor(); } /** * This method should only be invoked by implementors of {@link IToolkit} after toolkit was created. * * @param toolkit The toolkit that was created */ public static void onToolkitCreate(final IToolkit toolkit) { getInstance().onToolkitCreate(toolkit); } private static class CompositeToolkitInterceptorHolder implements IToolkitInterceptorHolder { private final List<IToolkitInterceptorHolder> holders; private final IToolkitInterceptor toolkitInterceptor; CompositeToolkitInterceptorHolder() { this.holders = new LinkedList<IToolkitInterceptorHolder>(); this.toolkitInterceptor = new IToolkitInterceptor() { @Override public void onToolkitCreate(final IToolkit toolkit) { for (final IToolkitInterceptorHolder holder : holders) { holder.getToolkitInterceptor().onToolkitCreate(toolkit); } } }; } void add(final IToolkitInterceptorHolder holder) { holders.add(holder); Collections.sort(holders, new Comparator<IToolkitInterceptorHolder>() { @Override public int compare(final IToolkitInterceptorHolder provider1, final IToolkitInterceptorHolder provider2) { if (provider1 != null && provider2 != null) { return provider1.getOrder() - provider2.getOrder(); } return 0; } }); } @Override public IToolkitInterceptor getToolkitInterceptor() { return toolkitInterceptor; } @Override public int getOrder() { return 0; } } }