@ConditionalModule(config = "event.ab-testing.enabled", value = "true") public class ABTestingModule extends RakamModule { @Override protected void setup(Binder binder) { Multibinder<HttpService> httpServices = Multibinder.newSetBinder(binder, HttpService.class); httpServices.addBinding().to(ABTestingHttpService.class); Multibinder<Tag> tags = Multibinder.newSetBinder(binder, Tag.class); tags.addBinding().toInstance(new Tag().name("ab-testing").description("A/B Testing Module").externalDocs(MetadataConfig.centralDocs)); } @Override public String name() { return "A/B Testing Module"; } @Override public String description() { return "A/B Testing with your event data"; } }
@Override public final synchronized void configure(Binder binder) { checkState(this.binder == null, "re-entry not allowed"); this.binder = checkNotNull(binder, "binder is null"); try { ConditionalModule annotation = this.getClass().getAnnotation(ConditionalModule.class); if (annotation != null) { configurationFactory.consumeProperty(annotation.config()); String value = Optional.ofNullable(configurationFactory.getProperties().get(annotation.config())) .map(v -> v.trim()).orElse(null); if (!Objects.equals(annotation.value(), value)) { if(!(annotation.value().equals("") && value != null)) { return; } } } setup(binder); } finally { this.binder = null; } }
@ConditionalModule(config = "automation.enabled", value = "true") public class AutomationModule extends RakamModule { @Override
@AutoService(RakamModule.class) @ConditionalModule(config = "api-key-service.adapter", value = "dynamodb") public class DynamodbApiKeyModule extends RakamModule { @Override protected void setup(Binder binder) { configBinder(binder).bindConfig(DynamodbApiKeyConfig.class); configBinder(binder).bindConfig(AWSConfig.class); } @Override public String name() { return "Dynamodb Api Key Service"; } @Override public String description() { return null; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "config-manager.adapter", value = "dynamodb") public class DynamodbConfigManagerModule extends RakamModule { @Override protected void setup(Binder binder) { configBinder(binder).bindConfig(DynamodbConfigManagerConfig.class); configBinder(binder).bindConfig(AWSConfig.class); binder.bind(ConfigManager.class).to(DynamodbConfigManager.class); } @Override public String name() { return "Dynamodb Config Manager"; } @Override public String description() { return null; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "js-event-mapper.enabled", value = "true") public class JSEventMapperModule extends RakamModule { @Override protected void setup(Binder binder) { Multibinder<HttpService> httpServices = Multibinder.newSetBinder(binder, HttpService.class); httpServices.addBinding().to(CustomEventMapperHttpService.class).in(Scopes.SINGLETON); } @Override public String name() { return "Custom event mapper module"; } @Override public String description() { return "Write Javascript code to enrich and sanitize your event data in real-time"; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "webhook.enable", value = "true") public class WebhookModule extends RakamModule { @Override protected void setup(Binder binder) { configBinder(binder).bindConfig(TaskConfig.class); Multibinder<HttpService> httpServices = Multibinder.newSetBinder(binder, HttpService.class); httpServices.addBinding().to(WebHookHttpService.class); } @Override public String name() { return null; } @Override public String description() { return null; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "metastore.adapter", value = "dynamodb") public class DynamodbMetastoreModule extends RakamModule { @Override protected void setup(Binder binder) { configBinder(binder).bindConfig(DynamodbMetastoreConfig.class); configBinder(binder).bindConfig(AWSConfig.class); binder.bind(Metastore.class).to(DynamodbMetastore.class); } @Override public String name() { return null; } @Override public String description() { return null; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "ui.authentication", value = "ldap") public class LdapModule extends RakamModule { @Override protected void setup(Binder binder) { OptionalBinder.newOptionalBinder(binder, AuthService.class).setBinding().to(LdapAuthService.class); configBinder(binder).bindConfig(LdapConfig.class); } @Override public String name() { return "Ldap Auth module"; } @Override public String description() { return "Implements Ldap Auth Service"; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "event.store", value = "dummy") public static class DummyEventStoreModule extends RakamModule { @Override protected void setup(Binder binder) { binder.bind(EventStore.class).to(DummyEventStore.class); } @Override public String name() { return "Dummy Event Store"; } @Override public String description() { return "Used if no event store implementation exists"; } } }
@AutoService(RakamModule.class) @ConditionalModule(config = "query-metadata-store.adapter", value = "dynamodb") public class DynamodbQueryMetastoreModule extends RakamModule { @Override protected void setup(Binder binder) { configBinder(binder).bindConfig(DynamodbQueryMetastoreConfig.class); configBinder(binder).bindConfig(AWSConfig.class); binder.bind(QueryMetadataStore.class).to(DynamodbQueryMetastore.class); } @Override public String name() { return null; } @Override public String description() { return null; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "plugin.user.storage", value = "dynamodb") public class DynamodbUserStorageModule extends RakamModule { @Override protected void setup(Binder binder) { configBinder(binder).bindConfig(DynamodbUserConfig.class); binder.bind(UserStorage.class).to(DynamodbUserStorage.class) .in(Scopes.SINGLETON); } @Override public String name() { return "Dynamodb backend for user storage"; } @Override public String description() { return "Dynamodb user storage backend for basic CRUD and search operations."; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "event.store", value = "kafka") public class KafkaCollectorModule extends RakamModule { @Override protected void setup(Binder binder) { bindConfig(binder) .annotatedWith(Names.named("event.store.kafka")) .prefixedWith("event.store.kafka") .to(KafkaConfig.class); binder.bind(EventStore.class).to(KafkaEventStore.class); binder.bind(EventStream.class).to(KafkaStream.class); } @Override public String name() { return "Kafka Event Collector"; } @Override public String description() { return "Sends events to Apache Kafka"; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "event.stream.enabled", value = "true") public class EventStreamModule extends RakamModule { @Override protected void setup(Binder binder) { Multibinder<HttpService> httpServices = Multibinder.newSetBinder(binder, HttpService.class); httpServices.addBinding().to(EventStreamHttpService.class); Multibinder<Tag> tags = Multibinder.newSetBinder(binder, Tag.class); tags.addBinding().toInstance(new Tag().name("event-stream").description("Event Stream Module").externalDocs(MetadataConfig.centralDocs)); } @Override public String name() { return "Event stream module"; } @Override public String description() { return "Subscribes event stream and notifies new events in real-time"; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "user.funnel-analysis.enabled", value = "true") public class FunnelAnalyzerModule extends RakamModule { @Override protected void setup(Binder binder) { Multibinder<HttpService> httpServices = Multibinder.newSetBinder(binder, HttpService.class); httpServices.addBinding().to(FunnelAnalyzerHttpService.class); Multibinder<Tag> tags = Multibinder.newSetBinder(binder, Tag.class); tags.addBinding().toInstance(new Tag().name("funnel").description("Funnel Analyzer").externalDocs(MetadataConfig.centralDocs)); } @Override public String name() { return "Funnel Analyzer Module"; } @Override public String description() { return "Analyzes event data and creates funnels of user activities."; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "ui.authentication", value = "saml") public class SamlModule extends RakamModule { @Override protected void setup(Binder binder) { OptionalBinder.newOptionalBinder(binder, AuthService.class).setBinding().to(SamlAuthService.class); configBinder(binder).bindConfig(SamlConfig.class); Multibinder<HttpService> httpServices = Multibinder.newSetBinder(binder, HttpService.class); httpServices.addBinding().to(SamlHttpService.class); } @Override public String name() { return "Ldap Auth module"; } @Override public String description() { return "Implements Ldap Auth Service"; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "report.metadata.store", value = "jdbc") public class JDBCReportMetastoreModule extends RakamModule { @Override protected void setup(Binder binder) { JDBCConfig config = buildConfigObject(JDBCConfig.class, "report.metadata.store.jdbc"); binder.bind(JDBCPoolDataSource.class) .annotatedWith(Names.named("report.metadata.store.jdbc")) .toInstance(JDBCPoolDataSource.getOrCreateDataSource(config)); binder.bind(QueryMetadataStore.class).to(JDBCQueryMetadata.class); } @Override public String name() { return "JDBC report metadata store"; } @Override public String description() { return "Stores report metadata (materialized, continuous queries) in RDBMS databases"; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "user.retention-analysis.enabled", value = "true") public class RetentionAnalyzerModule extends RakamModule { @Override protected void setup(Binder binder) { Multibinder<HttpService> httpServices = Multibinder.newSetBinder(binder, HttpService.class); httpServices.addBinding().to(RetentionAnalyzerHttpService.class); Multibinder<Tag> tags = Multibinder.newSetBinder(binder, Tag.class); tags.addBinding().toInstance(new Tag().name("retention") .description("Retention Analyzer module").externalDocs(MetadataConfig.centralDocs)); // binder.bind(RetentionAnalyzerListener.class).asEagerSingleton(); } @Override public String name() { return "Retention Analyzer Module"; } @Override public String description() { return "Analyzes events of each user and allows you to improve your user acquisition and retention activities."; } }
@AutoService(RakamModule.class) @ConditionalModule(config = "event-explorer.enabled", value = "true") public class EventExplorerModule extends RakamModule { @Override protected void setup(Binder binder) { Multibinder<HttpService> httpServices = Multibinder.newSetBinder(binder, HttpService.class); httpServices.addBinding().to(EventExplorerHttpService.class); Multibinder<EventMapper> timeMapper = Multibinder.newSetBinder(binder, EventMapper.class); timeMapper.permitDuplicates().addBinding().to(TimestampEventMapper.class).in(Scopes.SINGLETON); Multibinder<Tag> tags = Multibinder.newSetBinder(binder, Tag.class); tags.addBinding().toInstance(new Tag().name("event-explorer").description("Event Explorer").externalDocs(MetadataConfig.centralDocs)); binder.bind(EventExplorerListener.class).asEagerSingleton(); } @Override public String name() { return "Event Explorer Module"; } @Override public String description() { return "It allows analyzing and visualizing events via a simple interface."; } }