/*
* Copyright 2014-2015. Adaptive.me.
*
* 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 me.adaptive.che.infrastructure;
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.spring.SpringIntegration;
import me.adaptive.che.infrastructure.dao.*;
import me.adaptive.core.data.SpringContextHolder;
import org.eclipse.che.api.account.server.ResourcesManager;
import org.eclipse.che.api.account.server.SubscriptionService;
import org.eclipse.che.api.account.server.dao.AccountDao;
import org.eclipse.che.api.account.server.dao.PlanDao;
import org.eclipse.che.api.auth.AuthenticationDao;
import org.eclipse.che.api.factory.FactoryStore;
import org.eclipse.che.api.user.server.TokenValidator;
import org.eclipse.che.api.user.server.dao.PreferenceDao;
import org.eclipse.che.api.user.server.dao.UserDao;
import org.eclipse.che.api.user.server.dao.UserProfileDao;
import org.eclipse.che.api.workspace.server.dao.MemberDao;
import org.eclipse.che.api.workspace.server.dao.WorkspaceDao;
import org.eclipse.che.inject.DynaModule;
import org.springframework.beans.factory.BeanFactory;
import java.util.Map;
@DynaModule
public class AdaptiveInfrastructureModule extends AbstractModule {
@Override
protected void configure() {
bind(BeanFactory.class).toInstance(SpringContextHolder.getApplicationContext());
bind(UserDao.class).toProvider(SpringIntegration.fromSpring(UserDao.class, "UserDao"));
bind(WorkspaceDao.class).toProvider(SpringIntegration.fromSpring(AdaptiveWorkspaceDao.class,"adaptiveWorkspaceDao"));
bind(UserProfileDao.class).toProvider(SpringIntegration.fromSpring(AdaptiveProfileDao.class,"adaptiveProfileDao"));
bind(PreferenceDao.class).toProvider(SpringIntegration.fromSpring(AdaptivePreferenceDao.class, "adaptivePreferenceDao"));
//TODO find a batter way
Multibinder<SubscriptionService> multiBinder = Multibinder.newSetBinder(binder(), SubscriptionService.class);
Map<String, SubscriptionService> services = SpringContextHolder.getApplicationContext().getBeansOfType(SubscriptionService.class);
services.entrySet().forEach(entry -> multiBinder.addBinding().toInstance(entry.getValue()));
bind(MemberDao.class).toProvider(SpringIntegration.fromSpring(WorkspaceMemberDao.class, "workspaceMemberDao"));
bind(ResourcesManager.class).toProvider(SpringIntegration.fromSpring(AdaptiveResourcesManager.class, "adaptiveResourcesManager"));
bind(PlanDao.class).toProvider(SpringIntegration.fromSpring(AdaptivePlanDao.class, "adaptivePlanDao"));
bind(AccountDao.class).toProvider(SpringIntegration.fromSpring(AccountDao.class, "AccountDao"));
bind(AuthenticationDao.class).toProvider(SpringIntegration.fromSpring(AdaptiveAuthenticationDao.class,"adaptiveAuthenticationDao"));
bind(FactoryStore.class).to(InMemoryFactoryStore.class);
bind(TokenValidator.class).toProvider(SpringIntegration.fromSpring(AdaptiveTokenValidator.class, "adaptiveTokenValidator"));
SpringIntegration.bindAll(binder(), SpringContextHolder.getApplicationContext());
}
}