001/*
002 * geordi
003 *
004 * Copyright (C) 2018 Richard "Shred" Körber
005 *   https://github.com/shred/geordi
006 *
007 * This program is free software: you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as
009 * published by the Free Software Foundation, either version 3 of the
010 * License, or (at your option) any later version.
011 *
012 * This program is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
015 */
016package org.shredzone.geordi;
017
018import com.google.inject.AbstractModule;
019import com.google.inject.multibindings.MapBinder;
020import org.jdbi.v3.core.Jdbi;
021import org.jdbi.v3.postgres.PostgresPlugin;
022import org.quartz.Scheduler;
023import org.quartz.SchedulerException;
024import org.quartz.impl.StdSchedulerFactory;
025import org.shredzone.geordi.device.AquaeroDevice;
026import org.shredzone.geordi.device.AvmDevice;
027import org.shredzone.geordi.device.Ccu2Device;
028import org.shredzone.geordi.device.Device;
029import org.shredzone.geordi.device.DustyDevice;
030import org.shredzone.geordi.device.KaminariDevice;
031import org.shredzone.geordi.service.CompactingService;
032import org.shredzone.geordi.service.CompactingServiceImpl;
033import org.shredzone.geordi.service.DatabaseService;
034import org.shredzone.geordi.service.DatabaseServiceImpl;
035
036/**
037 * Guice module definitions for Geordi.
038 */
039public class GeordiModule extends AbstractModule {
040
041    private String databaseHost;
042    private String databaseUser;
043    private String databasePassword;
044
045    public void setDatabaseHost(String databaseHost) {
046        this.databaseHost = databaseHost;
047    }
048
049    public void setDatabaseUser(String databaseUser) {
050        this.databaseUser = databaseUser;
051    }
052
053    public void setDatabasePassword(String databasePassword) {
054        this.databasePassword = databasePassword;
055    }
056
057    @Override
058    protected void configure() {
059        bind(DatabaseService.class).to(DatabaseServiceImpl.class);
060        bind(CompactingService.class).to(CompactingServiceImpl.class);
061
062        MapBinder<String, Device> mapbinder = MapBinder.newMapBinder(binder(), String.class, Device.class);
063        mapbinder.addBinding("aquaero").to(AquaeroDevice.class);
064        mapbinder.addBinding("avm").to(AvmDevice.class);
065        mapbinder.addBinding("ccu2").to(Ccu2Device.class);
066        mapbinder.addBinding("dusty").to(DustyDevice.class);
067        mapbinder.addBinding("kaminari").to(KaminariDevice.class);
068        // Add more device implementations here...
069
070        try {
071            bind(Scheduler.class).toInstance(StdSchedulerFactory.getDefaultScheduler());
072        } catch (SchedulerException ex) {
073            throw new IllegalStateException(ex);
074        }
075
076        Jdbi jdbi;
077        if (databaseUser != null && databasePassword != null) {
078            jdbi = Jdbi.create(databaseHost, databaseUser, databasePassword);
079        } else {
080            jdbi = Jdbi.create(databaseHost);
081        }
082
083        jdbi.installPlugin(new PostgresPlugin());
084        bind(Jdbi.class).toInstance(jdbi);
085    }
086
087}