/* Copyright 2012 Google, Inc.
*
* 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.arbeitspferde.groningen.open;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.multibindings.MapBinder;
import com.google.inject.name.Named;
import org.arbeitspferde.groningen.Datastore;
import org.arbeitspferde.groningen.HistoryDatastore;
import org.arbeitspferde.groningen.common.Settings;
import org.arbeitspferde.groningen.common.SupplementalSettingsProcessor;
import org.arbeitspferde.groningen.common.open.NullSupplementalSettingsProcessor;
import org.arbeitspferde.groningen.config.LegacyProgramConfigurationMediator;
import org.arbeitspferde.groningen.config.open.NullLegacyProgramConfigurationMediator;
import org.arbeitspferde.groningen.datastore.InMemoryDatastore;
import org.arbeitspferde.groningen.extractor.CollectionLogAddressor;
import org.arbeitspferde.groningen.extractor.open.NullCollectionLogAddressor;
import org.arbeitspferde.groningen.historydatastore.MemoryHistoryDatastore;
import org.arbeitspferde.groningen.security.VendorSecurityManager;
import org.arbeitspferde.groningen.security.open.NullSecurityManager;
import org.arbeitspferde.groningen.subject.HealthQuerier;
import org.arbeitspferde.groningen.subject.ServingAddressGenerator;
import org.arbeitspferde.groningen.subject.SubjectInterrogator;
import org.arbeitspferde.groningen.subject.SubjectManipulator;
import org.arbeitspferde.groningen.subject.open.NullSubjectInterrogator;
import org.arbeitspferde.groningen.subject.open.ProcessHealthQuerier;
import org.arbeitspferde.groningen.subject.open.ProcessManipulator;
import org.arbeitspferde.groningen.subject.open.ProcessServingAddressGenerator;
import org.arbeitspferde.groningen.utility.FileEventNotifierFactory;
import org.arbeitspferde.groningen.utility.FileFactory;
import org.arbeitspferde.groningen.utility.MetricExporter;
import org.arbeitspferde.groningen.utility.logstream.FileOutputLogStreamFactory;
import org.arbeitspferde.groningen.utility.logstream.InputLogStreamFactory;
import org.arbeitspferde.groningen.utility.logstream.NullInputLogStreamFactory;
import org.arbeitspferde.groningen.utility.logstream.OutputLogStreamFactory;
import org.arbeitspferde.groningen.utility.open.LocalFileFactory;
import org.arbeitspferde.groningen.utility.open.NullFileEventNotifierFactory;
import org.arbeitspferde.groningen.utility.open.NullMetricExporter;
import org.eclipse.jetty.server.Server;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* The Groningen Guice module for components that have open source versions.
*/
public class OpenModule extends AbstractModule {
private static final Logger log = Logger.getLogger(OpenModule.class.getCanonicalName());
@Override
protected void configure() {
log.info("Binding open injectables.");
MapBinder<String, Datastore> datastoreBinder = MapBinder.newMapBinder(binder(), String.class,
Datastore.class);
datastoreBinder.addBinding(InMemoryDatastore.class.getCanonicalName())
.to(InMemoryDatastore.class);
MapBinder<String, HistoryDatastore> historyDatastoreBinder =
MapBinder.newMapBinder(binder(), String.class, HistoryDatastore.class);
historyDatastoreBinder.addBinding(
MemoryHistoryDatastore.class.getCanonicalName()).to(MemoryHistoryDatastore.class);
bind(MetricExporter.class).to(NullMetricExporter.class);
bind(SupplementalSettingsProcessor.class).to(NullSupplementalSettingsProcessor.class);
bind(SubjectInterrogator.class).to(NullSubjectInterrogator.class);
bind(FileFactory.class).to(LocalFileFactory.class);
bind(FileEventNotifierFactory.class).to(NullFileEventNotifierFactory.class);
bind(InputLogStreamFactory.class).to(NullInputLogStreamFactory.class);
bind(OutputLogStreamFactory.class).to(FileOutputLogStreamFactory.class);
bind(HealthQuerier.class).to(ProcessHealthQuerier.class);
bind(SubjectManipulator.class).to(ProcessManipulator.class);
bind(VendorSecurityManager.class).to(NullSecurityManager.class);
bind(ServingAddressGenerator.class).to(ProcessServingAddressGenerator.class);
bind(LegacyProgramConfigurationMediator.class)
.to(NullLegacyProgramConfigurationMediator.class);
bind(CollectionLogAddressor.class).to(NullCollectionLogAddressor.class);
}
/*
* This is merely a short-term hack, as it will require inclusion of the <em>appropriate</em>
* serving port.
*/
@Provides
@Singleton
@Named("servingAddress")
public String produceServingAddress() {
try {
final Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
final NetworkInterface currentInterface = interfaces.nextElement();
if (currentInterface.isLoopback()) {
continue;
}
final Enumeration<InetAddress> addresses = currentInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
final InetAddress address = addresses.nextElement();
final String canonicalName = address.getCanonicalHostName();
if (!canonicalName.equalsIgnoreCase(address.getHostAddress())) {
return canonicalName;
}
}
}
} catch (final SocketException e) {
log.log(Level.SEVERE, "Error acquiring hostname due to networking stack problems.", e);
}
log.severe("Could not acquire hostname due to unknown reasons.");
return "localhost";
}
@Provides
@Singleton
public HashFunction getHashFunction() {
return Hashing.md5();
}
@Provides
@Singleton
public Server getJettyServer(Settings settings) {
return new Server(settings.getPort());
}
}