/*
* Syncany, www.syncany.org
* Copyright (C) 2011-2015 Philipp C. Heckel <philipp.heckel@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.syncany.config;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.common.eventbus.EventBus;
/**
* The event bus wraps the Google EventBus service for the
* daemon. It provides a publish/subscribe mechanism within a
* single JVM.
*
* @author Philipp C. Heckel <philipp.heckel@gmail.com>
*/
public abstract class InternalEventBus {
protected static final Logger logger = Logger.getLogger(InternalEventBus.class.getSimpleName());
private static Map<Class<? extends InternalEventBus>, InternalEventBus> instances = new HashMap<>();
protected EventBus eventBus;
@SuppressWarnings("unchecked")
protected static <T extends InternalEventBus> T getInstance(Class<T> eventBusClass) {
T eventBusInstance = (T) instances.get(eventBusClass);
if (eventBusInstance != null) {
return eventBusInstance;
}
try {
eventBusInstance = eventBusClass.newInstance();
instances.put(eventBusClass, eventBusInstance);
}
catch (Exception e) {
throw new RuntimeException("Cannot create event bus with class " + eventBusClass);
}
return eventBusInstance;
}
protected InternalEventBus() {
this.eventBus = new EventBus(this.getClass().getName());
logger.log(Level.INFO, "Event bus: Created event bus " + this.getClass().getName());
}
public void register(Object object) {
logger.log(Level.INFO, "Event bus '" + this.getClass().getSimpleName() + "': Registering " + object.getClass().getSimpleName() + " (" + object + ") ...");
eventBus.register(object);
}
public void unregister(Object object) {
logger.log(Level.INFO, "Event bus '" + this.getClass().getSimpleName() + "': Unregistering " + object.getClass().getSimpleName() + " (" + object + ") ...");
eventBus.unregister(object);
}
public void post(Object event) {
logger.log(Level.INFO, "Event bus '" + this.getClass().getSimpleName() + "': Posting event " + event.getClass().getSimpleName() + " (" + event + ") ...");
eventBus.post(event);
}
}