/* * Copyright 2012 Cedric Hauber * * 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.mvp.client.proxy; import com.google.gwt.event.shared.GwtEvent; import com.google.web.bindery.event.shared.Event; import com.google.web.bindery.event.shared.EventBus; import org.jboss.errai.ioc.client.container.IOCBeanDef; import org.jboss.errai.ioc.client.container.IOCBeanManager; import org.jboss.errai.mvp.client.events.NotifyingAsyncCallback; import org.jboss.errai.mvp.client.places.Gatekeeper; import org.jboss.errai.mvp.client.places.PlaceManager; import org.jboss.errai.mvp.client.presenters.Presenter; import org.jboss.errai.mvp.client.proxy.deffered.*; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Singleton; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * Created by Cedric Hauber (cedbossneo) * Date: 10/21/12 * Time: 11:55 PM */ @Singleton public class ProxyManager { @Inject private IOCBeanManager manager; @Inject EventBus eventBus; @Inject PlaceManager placeManager; private static ProxyManager instance; static List<DefferedProxy> defferedProxies = new LinkedList<DefferedProxy>(); static List<DefferedHandler> defferedHandlers = new LinkedList<DefferedHandler>(); static List<DefferedEvent> defferedEvents = new LinkedList<DefferedEvent>(); static Map<Class<? extends Presenter<?>>, Proxy> proxies = new HashMap<Class<? extends Presenter<?>>, Proxy>(); static Map<Class<? extends Presenter<?>>, ProxyPlace> proxiesPlaces = new HashMap<Class<? extends Presenter<?>>, ProxyPlace>(); public static <P extends Presenter<?>> DefferedProxyImpl<P> registerProxy(ProxyImpl<P> proxy){ DefferedProxyImpl<P> e = new DefferedProxyImpl<P>(proxy, proxy.getPresenterClass()); defferedProxies.add(e); if (instance != null) instance.registerDefferedProxy(e); return e; } public static <P extends Presenter<?>> DefferedContentHandler<P> registerHandler(GwtEvent.Type type, Class<P> presenterClass){ DefferedContentHandler<P> handler = new DefferedContentHandler<P>(type, presenterClass); defferedHandlers.add(handler); if (instance != null) instance.registerDefferedHandler(handler); return handler; } public static <P extends Presenter<?>> DefferedEventImpl<P> registerEvent(Event.Type type, Class<P> presenterClass){ DefferedEventImpl<P> defferedEvent = new DefferedEventImpl<P>(type, presenterClass); defferedEvents.add(defferedEvent); if (instance != null) instance.registerDefferedEvent(defferedEvent); return defferedEvent; } public static <P extends Presenter<?>> DefferedProxyPlace<P> registerPlace(String token, Class<P> presenterClass){ DefferedProxyPlace<P> proxyPlace = new DefferedProxyPlace<P>(token, presenterClass); defferedProxies.add(proxyPlace); if (instance != null) instance.registerDefferedProxy(proxyPlace); return proxyPlace; } public static <P extends Presenter<?>> DefferedGateKeeperProxyPlace<P> registerPlace(String token, Class<P> presenterClass, Class<? extends Gatekeeper> gateKeeper){ DefferedGateKeeperProxyPlace<P> proxyPlace = new DefferedGateKeeperProxyPlace<P>(token, presenterClass, gateKeeper); defferedProxies.add(proxyPlace); if (instance != null) instance.registerDefferedProxy(proxyPlace); return proxyPlace; } @PostConstruct public void init(){ instance = this; for (DefferedProxy defferedProxy : defferedProxies){ registerDefferedProxy(defferedProxy); } for (DefferedHandler defferedHandler : defferedHandlers){ registerDefferedHandler(defferedHandler); } for (DefferedEvent defferedEvent : defferedEvents){ registerDefferedEvent(defferedEvent); } } protected void registerDefferedEvent(DefferedEvent defferedEvent) { defferedEvent.registerEvent(eventBus, placeManager); } protected void registerDefferedHandler(DefferedHandler defferedHandler) { defferedHandler.registerHandler(eventBus, placeManager); } protected void registerDefferedProxy(DefferedProxy defferedProxy) { Proxy value = defferedProxy.makeProxy(eventBus, placeManager); if (value instanceof ProxyPlace) proxiesPlaces.put(defferedProxy.getPresenterClass(), (ProxyPlace) value); else proxies.put(defferedProxy.getPresenterClass(), value); } public static <P extends Presenter<?>> Proxy<P> getPresenterProxy(Class<P> presenterClass){ return proxies.get(presenterClass); } public static <P extends Presenter<?>> ProxyPlace<P> getPresenterProxyPlace(Class<P> presenterClass){ return proxiesPlaces.get(presenterClass); } public static <T extends Presenter<?>> void getPresenter(Class<T> persenterClass, NotifyingAsyncCallback<T> notifyingAsyncCallback){ notifyingAsyncCallback.prepare(); IOCBeanDef<T> tiocBeanDef = instance.manager.lookupBean(persenterClass); if (tiocBeanDef == null) notifyingAsyncCallback.onFailure(new Throwable("Bean definition not found")); notifyingAsyncCallback.checkLoading(); T bean = tiocBeanDef.getInstance(); if (bean == null) notifyingAsyncCallback.onFailure(new Throwable("Error while getting bean")); else notifyingAsyncCallback.onSuccess(bean); } }