/**
* Copyright 2017 Netflix, 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 com.netflix.raigad.resources;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.Scopes;
import com.google.inject.name.Names;
import com.google.inject.servlet.GuiceServletContextListener;
import com.google.inject.servlet.ServletModule;
import com.netflix.governator.guice.LifecycleInjector;
import com.netflix.governator.lifecycle.LifecycleManager;
import com.netflix.raigad.aws.IAMCredential;
import com.netflix.raigad.aws.ICredential;
import com.netflix.raigad.backup.AbstractRepository;
import com.netflix.raigad.backup.AbstractRepositorySettingsParams;
import com.netflix.raigad.backup.S3Repository;
import com.netflix.raigad.backup.S3RepositorySettingsParams;
import com.netflix.raigad.configuration.IConfiguration;
import com.netflix.raigad.identity.CassandraInstanceFactory;
import com.netflix.raigad.identity.EurekaHostsSupplier;
import com.netflix.raigad.identity.HostSupplier;
import com.netflix.raigad.identity.IRaigadInstanceFactory;
import com.netflix.raigad.scheduler.GuiceJobFactory;
import com.netflix.raigad.startup.RaigadServer;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
import com.sun.jersey.spi.container.servlet.ServletContainer;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class InjectedWebListener extends GuiceServletContextListener {
protected static final Logger logger = LoggerFactory.getLogger(InjectedWebListener.class);
@Override
protected Injector getInjector() {
List<Module> moduleList = new ArrayList<>();
moduleList.add(new JaxServletModule());
moduleList.add(new RaigadGuiceModule());
Injector injector;
try {
injector = LifecycleInjector.builder().withModules(moduleList).build().createInjector();
startJobs(injector);
LifecycleManager manager = injector.getInstance(LifecycleManager.class);
manager.start();
}
catch (Exception e) {
logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(), e);
}
return injector;
}
private void startJobs(Injector injector) throws Exception {
injector.getInstance(IConfiguration.class).initialize();
logger.info("** Now starting to initialize Raigad server from OSS");
injector.getInstance(RaigadServer.class).initialize();
}
private static class JaxServletModule extends ServletModule {
@Override
protected void configureServlets() {
Map<String, String> params = new HashMap<String, String>();
params.put(PackagesResourceConfig.PROPERTY_PACKAGES, "unbound");
params.put("com.sun.jersey.config.property.packages", "com.netflix.raigad.resources");
params.put(ServletContainer.PROPERTY_FILTER_CONTEXT_PATH, "/REST");
serve("/REST/*").with(GuiceContainer.class, params);
}
}
private static class RaigadGuiceModule extends AbstractModule {
@Override
protected void configure() {
logger.info("** Binding OSS Config classes.");
// Fix bug in Jersey-Guice integration exposed by child injectors
binder().bind(GuiceContainer.class).asEagerSingleton();
binder().bind(GuiceJobFactory.class).asEagerSingleton();
binder().bind(IRaigadInstanceFactory.class).to(CassandraInstanceFactory.class);
// TODO: Use config.getCredentialProvider() instead of IAMCredential
binder().bind(ICredential.class).to(IAMCredential.class);
binder().bind(AbstractRepository.class).annotatedWith(Names.named("s3")).to(S3Repository.class);
binder().bind(AbstractRepositorySettingsParams.class).annotatedWith(Names.named("s3")).to(S3RepositorySettingsParams.class);
bind(SchedulerFactory.class).to(StdSchedulerFactory.class).asEagerSingleton();
bind(HostSupplier.class).to(EurekaHostsSupplier.class).in(Scopes.SINGLETON);
}
}
}