package tc.oc.commons.core.plugin;
import java.util.Set;
import java.util.logging.Logger;
import java.util.stream.Stream;
import javax.inject.Inject;
import com.google.common.eventbus.EventBus;
import tc.oc.commons.core.commands.CommandRegistry;
import tc.oc.commons.core.commands.Commands;
import tc.oc.commons.core.event.EventUtils;
import tc.oc.commons.core.util.ExceptionUtils;
import tc.oc.commons.core.util.Streams;
import tc.oc.minecraft.api.event.Enableable;
import tc.oc.minecraft.api.event.Listener;
import tc.oc.minecraft.api.plugin.Plugin;
public class PluginFacetLoader implements Enableable {
private final Logger logger;
private final Set<PluginFacet> facets;
private final EventBus guavaEventBus; // Platform-neutral event bus
private final CommandRegistry commandRegistry;
@Inject PluginFacetLoader(Plugin plugin, Set<PluginFacet> facets, EventBus guavaEventBus, CommandRegistry commandRegistry) {
this.logger = plugin.getLogger();
this.facets = facets;
this.guavaEventBus = guavaEventBus;
this.commandRegistry = commandRegistry;
}
/**
* The set of {@link PluginFacet}s belonging to this plugin.
*
* This method cannot be called before injection.
*/
private Stream<PluginFacet> facets() {
return facets.stream().filter(PluginFacet::isActive);
}
/**
* Filter {@link #facets()} by type.
*
* This is useful when enabling/disabling custom facet types.
*/
private <T> Stream<? extends T> facets(Class<T> type) {
return ((Stream<? extends T>) facets().filter(type::isInstance));
}
@Override
public void enable() {
ExceptionUtils.propagate(() -> {
facets().forEach(this::enableEventSubscriber);
facets(Commands.class).forEach(this::registerCommands);
});
}
@Override
public void disable() {
ExceptionUtils.propagate(() -> {
Streams.reverseForEach(facets(), this::disableEventSubscriber);
});
}
private void enableEventSubscriber(PluginFacet facet) {
if(EventUtils.hasSubscriberMethods(facet)) {
logger.fine("Enabling event subscriber " + facet.getClass().getName());
guavaEventBus.register(facet);
}
}
private void disableEventSubscriber(PluginFacet facet) {
if(EventUtils.hasSubscriberMethods(facet)) {
logger.fine("Disabling event subscriber " + facet.getClass().getName());
guavaEventBus.unregister(facet);
}
}
private void registerCommands(Commands commands) {
logger.fine("Registering commands " + commands.getClass().getName());
commandRegistry.register(commands.getClass());
}
}