/*
*
* This module intended to be used for session replication of Jetty via HBase
* and later will be cached via Ehcache
*
* Copyright (C) 2010 Imran M Yousuf (imyousuf@smartitengineering.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.smartitengineering.jetty.session.replication.impl.hbase;
import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
import com.google.inject.Singleton;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
import com.smartitengineering.dao.common.CommonReadDao;
import com.smartitengineering.dao.common.CommonWriteDao;
import com.smartitengineering.dao.impl.hbase.CommonDao;
import com.smartitengineering.dao.impl.hbase.spi.AsyncExecutorService;
import com.smartitengineering.dao.impl.hbase.spi.DomainIdInstanceProvider;
import com.smartitengineering.dao.impl.hbase.spi.FilterConfigs;
import com.smartitengineering.dao.impl.hbase.spi.LockAttainer;
import com.smartitengineering.dao.impl.hbase.spi.LockType;
import com.smartitengineering.dao.impl.hbase.spi.MergeService;
import com.smartitengineering.dao.impl.hbase.spi.ObjectRowConverter;
import com.smartitengineering.dao.impl.hbase.spi.SchemaInfoProvider;
import com.smartitengineering.dao.impl.hbase.spi.impl.DiffBasedMergeService;
import com.smartitengineering.dao.impl.hbase.spi.impl.LockAttainerImpl;
import com.smartitengineering.dao.impl.hbase.spi.impl.MixedExecutorServiceImpl;
import com.smartitengineering.dao.impl.hbase.spi.impl.SchemaInfoProviderBaseConfig;
import com.smartitengineering.dao.impl.hbase.spi.impl.SchemaInfoProviderImpl;
import com.smartitengineering.dao.impl.hbase.spi.impl.guice.GenericBaseConfigProvider;
import com.smartitengineering.dao.impl.hbase.spi.impl.guice.GenericFilterConfigsProvider;
import com.smartitengineering.jetty.session.replication.SessionData;
import com.smartitengineering.jetty.session.replication.SessionDataId;
import com.smartitengineering.jetty.session.replication.SessionId;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author imyousuf
*/
public class HBaseImplModule extends AbstractModule {
private final String cacheConfigRsrc, sessionCacheName, sessionIdCacheName;
protected final transient Logger logger = LoggerFactory.getLogger(getClass());
public HBaseImplModule(Properties properties) {
if (logger.isInfoEnabled()) {
logger.info("DI properties " + properties);
}
cacheConfigRsrc = properties.getProperty("com.smartitengineering.jetty.session.replication",
"com/smartitengineering/jetty/session/replication/impl/hbase/ehcache.xml");
sessionCacheName = properties.getProperty("com.smartitengineering.jetty.session.replication.sessionCache.name",
"sessionCache");
sessionIdCacheName = properties.getProperty("com.smartitengineering.jetty.session.replication.sessionIdCache.name",
"sessionIdCache");
}
@Override
protected void configure() {
bind(AsyncExecutorService.class).to(MixedExecutorServiceImpl.class).in(Singleton.class);
bind(ExecutorService.class).toInstance(Executors.newCachedThreadPool());
bind(Integer.class).annotatedWith(Names.named("maxRows")).toInstance(new Integer(100));
bind(Long.class).annotatedWith(Names.named("waitTime")).toInstance(5l);
bind(TimeUnit.class).annotatedWith(Names.named("unit")).toInstance(TimeUnit.SECONDS);
bind(Boolean.class).annotatedWith(Names.named("mergeEnabled")).toInstance(Boolean.TRUE);
bind(DomainIdInstanceProvider.class).to(SessionDataIdInstanceProvider.class).in(Singleton.class);
bind(LockType.class).toInstance(LockType.PESSIMISTIC);
bind(new TypeLiteral<Class<SessionDataId>>() {
}).toInstance(SessionDataId.class);
bind(new TypeLiteral<Class<String>>() {
}).toInstance(String.class);
bind(new TypeLiteral<ObjectRowConverter<SessionData>>() {
}).to(SessionDataObjectConverter.class).in(Singleton.class);
bind(CommonReadDao.class).annotatedWith(Names.named("dataReader")).to(new TypeLiteral<CommonReadDao<SessionData, SessionDataId>>() {
});
bind(CommonReadDao.class).annotatedWith(Names.named("idReader")).to(new TypeLiteral<CommonReadDao<SessionId, String>>() {
});
bind(CommonWriteDao.class).annotatedWith(Names.named("dataWriter")).to(new TypeLiteral<CommonWriteDao<SessionData>>() {
});
bind(CommonWriteDao.class).annotatedWith(Names.named("idWriter")).to(new TypeLiteral<CommonWriteDao<SessionId>>() {
});
bind(new TypeLiteral<CommonReadDao<SessionData, SessionDataId>>() {
}).to(new TypeLiteral<com.smartitengineering.dao.common.CommonDao<SessionData, SessionDataId>>() {
}).in(Singleton.class);
bind(new TypeLiteral<CommonWriteDao<SessionData>>() {
}).to(new TypeLiteral<com.smartitengineering.dao.common.CommonDao<SessionData, SessionDataId>>() {
}).in(Singleton.class);
bind(new TypeLiteral<com.smartitengineering.dao.common.CommonDao<SessionData, SessionDataId>>() {
}).to(new TypeLiteral<CommonDao<SessionData, SessionDataId>>() {
}).in(Singleton.class);
final TypeLiteral<SchemaInfoProviderImpl<SessionData, SessionDataId>> typeLiteral = new TypeLiteral<SchemaInfoProviderImpl<SessionData, SessionDataId>>() {
};
bind(new TypeLiteral<MergeService<SessionData, SessionDataId>>() {
}).to(new TypeLiteral<DiffBasedMergeService<SessionData, SessionDataId>>() {
});
bind(new TypeLiteral<LockAttainer<SessionData, SessionDataId>>() {
}).to(new TypeLiteral<LockAttainerImpl<SessionData, SessionDataId>>() {
}).in(Scopes.SINGLETON);
bind(new TypeLiteral<SchemaInfoProvider<SessionData, SessionDataId>>() {
}).to(typeLiteral).in(Singleton.class);
bind(new TypeLiteral<FilterConfigs<SessionData>>() {
}).toProvider(new GenericFilterConfigsProvider<SessionData>(
"com/smartitengineering/jetty/session/replication/impl/hbase/SessionDataFilterConfigs.json")).in(
Scopes.SINGLETON);
bind(new TypeLiteral<SchemaInfoProviderBaseConfig<SessionData>>() {
}).toProvider(new GenericBaseConfigProvider<SessionData>(
"com/smartitengineering/jetty/session/replication/impl/hbase/SessionDataSchemaBaseConfig.json")).in(
Scopes.SINGLETON);
bind(new TypeLiteral<ObjectRowConverter<SessionId>>() {
}).to(SessionIdObjectConverter.class).in(Singleton.class);
bind(new TypeLiteral<CommonReadDao<SessionId, String>>() {
}).to(new TypeLiteral<com.smartitengineering.dao.common.CommonDao<SessionId, String>>() {
}).in(Singleton.class);
bind(new TypeLiteral<CommonWriteDao<SessionId>>() {
}).to(new TypeLiteral<com.smartitengineering.dao.common.CommonDao<SessionId, String>>() {
}).in(Singleton.class);
bind(new TypeLiteral<com.smartitengineering.dao.common.CommonDao<SessionId, String>>() {
}).to(new TypeLiteral<CommonDao<SessionId, String>>() {
}).in(Singleton.class);
final TypeLiteral<SchemaInfoProviderImpl<SessionId, String>> aTypeLiteral = new TypeLiteral<SchemaInfoProviderImpl<SessionId, String>>() {
};
bind(new TypeLiteral<MergeService<SessionId, String>>() {
}).to(new TypeLiteral<DiffBasedMergeService<SessionId, String>>() {
});
bind(new TypeLiteral<LockAttainer<SessionId, String>>() {
}).to(new TypeLiteral<LockAttainerImpl<SessionId, String>>() {
}).in(Scopes.SINGLETON);
bind(new TypeLiteral<SchemaInfoProvider<SessionId, String>>() {
}).to(aTypeLiteral).in(Singleton.class);
bind(new TypeLiteral<FilterConfigs<SessionId>>() {
}).toProvider(new GenericFilterConfigsProvider<SessionId>(
"com/smartitengineering/jetty/session/replication/impl/hbase/SessionIdFilterConfigs.json")).in(
Scopes.SINGLETON);
bind(new TypeLiteral<SchemaInfoProviderBaseConfig<SessionId>>() {
}).toProvider(new GenericBaseConfigProvider<SessionId>(
"com/smartitengineering/jetty/session/replication/impl/hbase/SessionIdSchemaBaseConfig.json")).in(
Scopes.SINGLETON);
/*
* Configure Cache
*/
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(cacheConfigRsrc);
if (inputStream == null) {
throw new IllegalArgumentException("Cache configuration not available!");
}
CacheManager cacheManager = new CacheManager(inputStream);
Cache sessionCache = cacheManager.getCache(sessionCacheName);
if (sessionCache == null) {
throw new IllegalStateException("Could not retrieve cache!");
}
bind(Cache.class).annotatedWith(Names.named("sessionCache")).toInstance(sessionCache);
Cache sessionIdCache = cacheManager.getCache(sessionIdCacheName);
if (sessionIdCache == null) {
throw new IllegalStateException("Could not retrieve cache!");
}
bind(Cache.class).annotatedWith(Names.named("sessionIdCache")).toInstance(sessionIdCache);
}
}