/* * Copyright (C) 2011 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.errai.ioc.client.container; import org.jboss.errai.common.client.util.CreationalCallback; import org.jboss.errai.ioc.client.container.async.AsyncBeanManager; import org.jboss.errai.ioc.client.container.async.AsyncBeanManagerImpl; import org.jboss.errai.ioc.client.lifecycle.api.LifecycleEvent; import org.jboss.errai.ioc.client.lifecycle.api.LifecycleListener; import org.jboss.errai.ioc.client.lifecycle.api.LifecycleListenerGenerator; import org.jboss.errai.ioc.client.lifecycle.api.LifecycleListenerRegistrar; import com.google.gwt.core.client.GWT; /** * A simple utility class which provides a static reference in the client to the * bean manager. * * @author Mike Brock */ public final class IOC { private static final IOC inst = new IOC(); private final ClientBeanManager beanManager; private IOC() { IOCEnvironment iocEnvironment; try { iocEnvironment = GWT.create(IOCEnvironment.class); } catch (UnsupportedOperationException e) { iocEnvironment = new IOCEnvironment() { @Override public boolean isAsync() { return false; } @Override public ClientBeanManager getNewBeanManager() { if (!GWT.isClient()) { return new SyncBeanManagerImpl(); } else { return null; } } }; } beanManager = iocEnvironment.getNewBeanManager(); } /** * Returns a reference to the bean manager in the client. * * @return the singleton instance of the client bean manager. * * @see SyncBeanManagerImpl */ public static SyncBeanManager getBeanManager() { if (inst.beanManager instanceof AsyncBeanManager) { return ((AsyncBeanManagerImpl) inst.beanManager).getInnerBeanManager(); } return (SyncBeanManagerImpl) inst.beanManager; } public static AsyncBeanManager getAsyncBeanManager() { if (inst.beanManager instanceof SyncBeanManager) { return new SyncToAsyncBeanManagerAdapter((SyncBeanManager) inst.beanManager); } return (AsyncBeanManager) inst.beanManager; } /** * Register a {@link LifecycleListenerGenerator} for * {@linkplain LifecycleEvent IOC Lifecycle Events}. * * @param beanType * The type of bean for which {@link LifecycleListener * LifecycleListeners} created by this generator observe. * @param listenerGenerator * A generator creating {@link LifecycleListener LifecycleListeners} * which observe events from the specified bean type. */ public static <T> void registerLifecycleListener(final Class<T> beanType, final LifecycleListenerGenerator<T> listenerGenerator) { getAsyncBeanManager().lookupBean(LifecycleListenerRegistrar.class).getInstance( new CreationalCallback<LifecycleListenerRegistrar>() { @Override public void callback(final LifecycleListenerRegistrar registrar) { registrar.registerGenerator(beanType, listenerGenerator); } }); } /** * Register a single {@link LifecycleListener} for {@link LifecycleEvent * LifecycleEvents} from a single instance. * * @param instance The instance to be observed. * @param listener The listener to be registered. */ public static <T> void registerLifecycleListener(final T instance, final LifecycleListener<T> listener) { getAsyncBeanManager().lookupBean(LifecycleListenerRegistrar.class).getInstance( new CreationalCallback<LifecycleListenerRegistrar>() { @Override public void callback(final LifecycleListenerRegistrar registrar) { registrar.registerListener(instance, listener); } }); } /** * Unregister a {@link LifecycleListenerGenerator} and all the * {@link LifecycleListener LifecycleListeners} created by this generator. * * @param beanType * The bean type for which this generator created listeners. * @param generator * The generator to be unregistered (must be the same instance as was * registered). */ public static <T> void unregisterLifecycleListener(final Class<T> beanType, final LifecycleListenerGenerator<T> generator) { getAsyncBeanManager().lookupBean(LifecycleListenerRegistrar.class).getInstance( new CreationalCallback<LifecycleListenerRegistrar>() { @Override public void callback(final LifecycleListenerRegistrar registrar) { registrar.unregisterGenerator(beanType, generator); } }); } /** * Unregister a single {@link LifecycleListener} for {@link LifecycleEvent * LifecycleEvents} from a single instance. * * @param instance The instance that was observed. * @param listener The listener that was registered. */ public static <T> void unregisterLifecycleListener(final T instance, final LifecycleListener<T> listener) { getAsyncBeanManager().lookupBean(LifecycleListenerRegistrar.class).getInstance( new CreationalCallback<LifecycleListenerRegistrar>() { @Override public void callback(final LifecycleListenerRegistrar registrar) { registrar.unregisterListener(instance, listener); } }); } /** * For testing only. Resets the bean manager. */ public static void reset() { if (inst.beanManager instanceof SyncBeanManagerImpl) { ((SyncBeanManagerImpl) inst.beanManager).reset(); } else if (inst.beanManager instanceof AsyncBeanManagerImpl) { ((AsyncBeanManagerImpl) inst.beanManager).reset(); } else { throw new RuntimeException("Cannot reset bean manager of type " + inst.beanManager.getClass().getName()); } } }