/************************************************************************************************** * Copyright (c) 2014 Dennis Fischer. * * All rights reserved. This program and the accompanying materials * * are made available under the terms of the GNU Public License v3.0+ * * which accompanies this distribution, and is available at * * http://www.gnu.org/licenses/gpl.html * * * * Contributors: Dennis Fischer * **************************************************************************************************/ package de.chaosfisch.uploader; import com.google.common.eventbus.EventBus; import com.google.inject.AbstractModule; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.matcher.Matchers; import com.google.inject.multibindings.Multibinder; import com.google.inject.name.Names; import com.google.inject.spi.InjectionListener; import com.google.inject.spi.TypeEncounter; import com.google.inject.spi.TypeListener; import de.chaosfisch.google.GoogleModule; import de.chaosfisch.google.enddir.EnddirServiceImpl; import de.chaosfisch.google.enddir.IEnddirService; import de.chaosfisch.google.youtube.schedule.IScheduleService; import de.chaosfisch.google.youtube.schedule.ScheduleServiceImpl; import de.chaosfisch.google.youtube.thumbnail.IThumbnailService; import de.chaosfisch.google.youtube.thumbnail.ThumbnailServiceImpl; import de.chaosfisch.google.youtube.upload.UploadPostProcessor; import de.chaosfisch.google.youtube.upload.UploadPreProcessor; import de.chaosfisch.google.youtube.upload.Uploader; import de.chaosfisch.google.youtube.upload.metadata.AbstractMetadataService; import de.chaosfisch.google.youtube.upload.metadata.IMetadataService; import de.chaosfisch.services.ExportPostProcessor; import de.chaosfisch.services.PlaceholderPreProcessor; import de.chaosfisch.uploader.persistence.PersistenceModule; import de.chaosfisch.uploader.persistence.dao.IPersistenceService; import de.chaosfisch.util.TextUtil; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ResourceBundle; public class UploaderModule extends AbstractModule { @Override protected void configure() { bind(String.class).annotatedWith(Names.named(IPersistenceService.PERSISTENCE_FOLDER)) .toInstance(String.format("%s/%s", ApplicationData.DATA_DIR, ApplicationData.VERSION)); try { final String configFile = ApplicationData.DATA_DIR + "/config.properties"; if (!Files.exists(Paths.get(configFile))) { Files.createFile(Paths.get(configFile)); } final PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration(configFile); propertiesConfiguration.setAutoSave(true); bind(Configuration.class).toInstance(propertiesConfiguration); } catch (IOException | ConfigurationException e) { throw new RuntimeException(e); } install(new PersistenceModule()); install(new GoogleModule()); final Multibinder<UploadPreProcessor> preProcessorMultibinder = Multibinder.newSetBinder(binder(), UploadPreProcessor.class); preProcessorMultibinder.addBinding().to(PlaceholderPreProcessor.class); final Multibinder<UploadPostProcessor> uploadPostProcessorMultibinder = Multibinder.newSetBinder(binder(), UploadPostProcessor.class); uploadPostProcessorMultibinder.addBinding().to(ExportPostProcessor.class); bind(ResourceBundle.class).annotatedWith(Names.named("i18n-resources")) .toInstance(ResourceBundle.getBundle("de.chaosfisch.uploader.resources.application")); mapServices(); mapUtil(); } private void mapUtil() { final EventBus eventBus = new EventBus(); bind(EventBus.class).toInstance(eventBus); bindListener(Matchers.any(), new TypeListener() { @Override public <I> void hear(@SuppressWarnings("unused") final TypeLiteral<I> type, final TypeEncounter<I> encounter) { encounter.register(new InjectionListener<I>() { @Override public void afterInjection(final I injectee) { eventBus.register(injectee); } }); } }); requestStaticInjection(TextUtil.class); } private void mapServices() { bind(IMetadataService.class).to(AbstractMetadataService.class).in(Singleton.class); bind(IEnddirService.class).to(EnddirServiceImpl.class).in(Singleton.class); bind(IThumbnailService.class).to(ThumbnailServiceImpl.class).in(Singleton.class); bind(IScheduleService.class).to(ScheduleServiceImpl.class).in(Singleton.class); bind(Uploader.class).in(Singleton.class); } }