/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.deploy;
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.name.Names;
import org.eclipse.che.api.agent.LSCSharpAgent;
import org.eclipse.che.api.agent.LSJsonAgent;
import org.eclipse.che.api.agent.LSPhpAgent;
import org.eclipse.che.api.agent.LSPythonAgent;
import org.eclipse.che.api.agent.LSTypeScriptAgent;
import org.eclipse.che.api.agent.SshAgent;
import org.eclipse.che.api.agent.SshAgentLauncher;
import org.eclipse.che.api.agent.UnisonAgent;
import org.eclipse.che.api.agent.WsAgent;
import org.eclipse.che.api.agent.WsAgentLauncher;
import org.eclipse.che.api.agent.server.launcher.AgentLauncher;
import org.eclipse.che.api.agent.shared.model.Agent;
import org.eclipse.che.api.core.rest.CheJsonProvider;
import org.eclipse.che.api.core.rest.MessageBodyAdapter;
import org.eclipse.che.api.core.rest.MessageBodyAdapterInterceptor;
import org.eclipse.che.api.factory.server.FactoryAcceptValidator;
import org.eclipse.che.api.factory.server.FactoryCreateValidator;
import org.eclipse.che.api.factory.server.FactoryEditValidator;
import org.eclipse.che.api.factory.server.FactoryParametersResolver;
import org.eclipse.che.api.machine.shared.Constants;
import org.eclipse.che.api.user.server.TokenValidator;
import org.eclipse.che.api.workspace.server.WorkspaceConfigMessageBodyAdapter;
import org.eclipse.che.api.workspace.server.WorkspaceMessageBodyAdapter;
import org.eclipse.che.api.workspace.server.stack.StackMessageBodyAdapter;
import org.eclipse.che.core.db.schema.SchemaInitializer;
import org.eclipse.che.inject.DynaModule;
import org.eclipse.che.plugin.github.factory.resolver.GithubFactoryParametersResolver;
import org.flywaydb.core.internal.util.PlaceholderReplacer;
import javax.sql.DataSource;
import static com.google.inject.matcher.Matchers.subclassesOf;
import static org.eclipse.che.inject.Matchers.names;
/** @author andrew00x */
@DynaModule
public class WsMasterModule extends AbstractModule {
@Override
protected void configure() {
// db related components modules
install(new com.google.inject.persist.jpa.JpaPersistModule("main"));
install(new org.eclipse.che.account.api.AccountModule());
install(new org.eclipse.che.api.user.server.jpa.UserJpaModule());
install(new org.eclipse.che.api.ssh.server.jpa.SshJpaModule());
install(new org.eclipse.che.api.machine.server.jpa.MachineJpaModule());
install(new org.eclipse.che.api.workspace.server.jpa.WorkspaceJpaModule());
install(new org.eclipse.che.api.core.jsonrpc.impl.JsonRpcModule());
install(new org.eclipse.che.api.core.websocket.impl.WebSocketModule());
// db configuration
bind(DataSource.class).toProvider(org.eclipse.che.core.db.h2.H2DataSourceProvider.class);
bind(SchemaInitializer.class).to(org.eclipse.che.core.db.schema.impl.flyway.FlywaySchemaInitializer.class);
bind(org.eclipse.che.core.db.DBInitializer.class).asEagerSingleton();
bind(PlaceholderReplacer.class).toProvider(org.eclipse.che.core.db.schema.impl.flyway.PlaceholderReplacerProvider.class);
//factory
bind(FactoryAcceptValidator.class).to(org.eclipse.che.api.factory.server.impl.FactoryAcceptValidatorImpl.class);
bind(FactoryCreateValidator.class).to(org.eclipse.che.api.factory.server.impl.FactoryCreateValidatorImpl.class);
bind(FactoryEditValidator.class).to(org.eclipse.che.api.factory.server.impl.FactoryEditValidatorImpl.class);
bind(org.eclipse.che.api.factory.server.FactoryService.class);
install(new org.eclipse.che.api.factory.server.jpa.FactoryJpaModule());
Multibinder<FactoryParametersResolver> factoryParametersResolverMultibinder =
Multibinder.newSetBinder(binder(), FactoryParametersResolver.class);
factoryParametersResolverMultibinder.addBinding()
.to(GithubFactoryParametersResolver.class);
install(new org.eclipse.che.plugin.docker.compose.ComposeModule());
bind(org.eclipse.che.api.user.server.CheUserCreator.class);
bind(TokenValidator.class).to(org.eclipse.che.api.local.DummyTokenValidator.class);
bind(org.eclipse.che.api.core.rest.ApiInfoService.class);
bind(org.eclipse.che.api.project.server.template.ProjectTemplateDescriptionLoader.class).asEagerSingleton();
bind(org.eclipse.che.api.project.server.template.ProjectTemplateRegistry.class);
bind(org.eclipse.che.api.project.server.template.ProjectTemplateService.class);
bind(org.eclipse.che.api.ssh.server.SshService.class);
bind(org.eclipse.che.api.machine.server.recipe.RecipeService.class);
bind(org.eclipse.che.api.user.server.UserService.class);
bind(org.eclipse.che.api.user.server.ProfileService.class);
bind(org.eclipse.che.api.user.server.PreferencesService.class);
bind(org.eclipse.che.api.workspace.server.stack.StackLoader.class);
bind(org.eclipse.che.api.workspace.server.stack.StackService.class);
bind(org.eclipse.che.api.workspace.server.TemporaryWorkspaceRemover.class);
bind(org.eclipse.che.api.workspace.server.WorkspaceService.class);
bind(org.eclipse.che.api.workspace.server.event.WorkspaceMessenger.class).asEagerSingleton();
bind(org.eclipse.che.api.workspace.server.event.WorkspaceJsonRpcMessenger.class).asEagerSingleton();
bind(org.eclipse.che.plugin.docker.machine.ext.DockerMachineExtServerChecker.class);
bind(org.eclipse.che.plugin.docker.machine.ext.DockerMachineTerminalChecker.class);
bind(org.eclipse.che.everrest.EverrestDownloadFileResponseFilter.class);
bind(org.eclipse.che.everrest.ETagResponseFilter.class);
bind(org.eclipse.che.api.agent.server.AgentRegistryService.class);
bind(org.eclipse.che.security.oauth.OAuthAuthenticatorProvider.class)
.to(org.eclipse.che.security.oauth.OAuthAuthenticatorProviderImpl.class);
bind(org.eclipse.che.security.oauth.shared.OAuthTokenProvider.class)
.to(org.eclipse.che.security.oauth.OAuthAuthenticatorTokenProvider.class);
bind(org.eclipse.che.security.oauth.OAuthAuthenticationService.class);
bind(org.eclipse.che.api.core.notification.WSocketEventBusServer.class);
// additional ports for development of extensions
Multibinder<org.eclipse.che.api.core.model.machine.ServerConf> machineServers
= Multibinder.newSetBinder(binder(),
org.eclipse.che.api.core.model.machine.ServerConf.class,
Names.named("machine.docker.dev_machine.machine_servers"));
machineServers.addBinding().toInstance(
new org.eclipse.che.api.machine.server.model.impl.ServerConfImpl(Constants.WSAGENT_DEBUG_REFERENCE, "4403/tcp", "http",
null));
bind(org.eclipse.che.api.agent.server.WsAgentHealthChecker.class)
.to(org.eclipse.che.api.agent.server.WsAgentHealthCheckerImpl.class);
bind(org.eclipse.che.api.machine.server.recipe.RecipeLoader.class);
Multibinder.newSetBinder(binder(), String.class, Names.named("predefined.recipe.path"))
.addBinding()
.toInstance("predefined-recipes.json");
bind(org.eclipse.che.api.workspace.server.WorkspaceValidator.class)
.to(org.eclipse.che.api.workspace.server.DefaultWorkspaceValidator.class);
bind(org.eclipse.che.api.workspace.server.event.MachineStateListener.class).asEagerSingleton();
// agents
bind(org.eclipse.che.api.agent.server.AgentRegistry.class).to(org.eclipse.che.api.agent.server.impl.AgentRegistryImpl.class);
Multibinder<Agent> agents = Multibinder.newSetBinder(binder(), Agent.class);
agents.addBinding().to(SshAgent.class);
agents.addBinding().to(UnisonAgent.class);
agents.addBinding().to(org.eclipse.che.api.agent.ExecAgent.class);
agents.addBinding().to(org.eclipse.che.api.agent.TerminalAgent.class);
agents.addBinding().to(WsAgent.class);
agents.addBinding().to(LSPhpAgent.class);
agents.addBinding().to(LSPythonAgent.class);
agents.addBinding().to(LSJsonAgent.class);
agents.addBinding().to(LSCSharpAgent.class);
agents.addBinding().to(LSTypeScriptAgent.class);
Multibinder<AgentLauncher> launchers = Multibinder.newSetBinder(binder(), AgentLauncher.class);
launchers.addBinding().to(WsAgentLauncher.class);
launchers.addBinding().to(org.eclipse.che.api.agent.ExecAgentLauncher.class);
launchers.addBinding().to(org.eclipse.che.api.agent.TerminalAgentLauncher.class);
launchers.addBinding().to(SshAgentLauncher.class);
bindConstant().annotatedWith(Names.named("machine.ws_agent.run_command"))
.to("export JPDA_ADDRESS=\"4403\" && ~/che/ws-agent/bin/catalina.sh jpda run");
bindConstant().annotatedWith(Names.named("machine.terminal_agent.run_command"))
.to("$HOME/che/terminal/che-websocket-terminal " +
"-addr :4411 " +
"-cmd ${SHELL_INTERPRETER}");
bindConstant().annotatedWith(Names.named("machine.exec_agent.run_command"))
.to("$HOME/che/exec-agent/che-exec-agent " +
"-addr :4412 " +
"-cmd ${SHELL_INTERPRETER} " +
"-logs-dir $HOME/che/exec-agent/logs");
bind(org.eclipse.che.api.deploy.WsMasterAnalyticsAddresser.class);
Multibinder<org.eclipse.che.api.machine.server.spi.InstanceProvider> machineImageProviderMultibinder =
Multibinder.newSetBinder(binder(), org.eclipse.che.api.machine.server.spi.InstanceProvider.class);
machineImageProviderMultibinder.addBinding().to(org.eclipse.che.plugin.docker.machine.DockerInstanceProvider.class);
bind(org.eclipse.che.api.environment.server.MachineInstanceProvider.class)
.to(org.eclipse.che.plugin.docker.machine.MachineProviderImpl.class);
install(new org.eclipse.che.api.core.rest.CoreRestModule());
install(new org.eclipse.che.api.core.util.FileCleaner.FileCleanerModule());
install(new org.eclipse.che.plugin.docker.machine.local.LocalDockerModule());
install(new org.eclipse.che.api.machine.server.MachineModule());
install(new org.eclipse.che.plugin.docker.machine.ext.DockerExtServerModule());
install(new org.eclipse.che.swagger.deploy.DocsModule());
install(new org.eclipse.che.plugin.machine.ssh.SshMachineModule());
install(new org.eclipse.che.plugin.docker.machine.proxy.DockerProxyModule());
install(new org.eclipse.che.commons.schedule.executor.ScheduleModule());
final Multibinder<MessageBodyAdapter> adaptersMultibinder = Multibinder.newSetBinder(binder(), MessageBodyAdapter.class);
adaptersMultibinder.addBinding().to(WorkspaceConfigMessageBodyAdapter.class);
adaptersMultibinder.addBinding().to(WorkspaceMessageBodyAdapter.class);
adaptersMultibinder.addBinding().to(StackMessageBodyAdapter.class);
final MessageBodyAdapterInterceptor interceptor = new MessageBodyAdapterInterceptor();
requestInjection(interceptor);
bindInterceptor(subclassesOf(CheJsonProvider.class), names("readFrom"), interceptor);
bind(org.eclipse.che.api.workspace.server.WorkspaceFilesCleaner.class)
.to(org.eclipse.che.plugin.docker.machine.cleaner.LocalWorkspaceFilesCleaner.class);
bind(org.eclipse.che.api.environment.server.InfrastructureProvisioner.class)
.to(org.eclipse.che.plugin.docker.machine.local.LocalCheInfrastructureProvisioner.class);
// system components
bind(org.eclipse.che.api.system.server.SystemService.class);
bind(org.eclipse.che.api.system.server.SystemEventsWebsocketBroadcaster.class).asEagerSingleton();
install(new org.eclipse.che.plugin.docker.machine.dns.DnsResolversModule());
install(new org.eclipse.che.plugin.traefik.TraefikDockerModule());
bind(org.eclipse.che.api.agent.server.filters.AddExecAgentInWorkspaceFilter.class);
bind(org.eclipse.che.api.agent.server.filters.AddExecAgentInStackFilter.class);
}
}