All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.optimizely.ab.OptimizelyFactory Maven / Gradle / Ivy

Go to download

The Java SDK for Optimizely Feature Experimentation, Optimizely Full Stack (legacy), and Optimizely Rollouts

There is a newer version: 4.1.1
Show newest version
/**
 *
 *    Copyright 2019-2021, 2023, Optimizely
 *
 *    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.optimizely.ab;

import com.optimizely.ab.config.HttpProjectConfigManager;
import com.optimizely.ab.config.ProjectConfig;
import com.optimizely.ab.config.ProjectConfigManager;
import com.optimizely.ab.event.AsyncEventHandler;
import com.optimizely.ab.event.BatchEventProcessor;
import com.optimizely.ab.event.EventHandler;
import com.optimizely.ab.internal.PropertyUtils;
import com.optimizely.ab.notification.NotificationCenter;
import com.optimizely.ab.odp.DefaultODPApiManager;
import com.optimizely.ab.odp.ODPApiManager;
import com.optimizely.ab.odp.ODPManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;

/**
 * OptimizelyFactory is a utility class to instantiate an {@link Optimizely} client with a minimal
 * number of configuration options. Basic default parameters can be configured via system properties
 * or through the use of an optimizely.properties file. System properties takes precedence over
 * the properties file and are managed via the {@link PropertyUtils} class.
 *
 * OptimizelyFactory also provides setter methods to override the system properties at runtime.
 * 
    *
  • {@link OptimizelyFactory#setMaxEventBatchSize}
  • *
  • {@link OptimizelyFactory#setMaxEventBatchInterval}
  • *
  • {@link OptimizelyFactory#setEventQueueParams}
  • *
  • {@link OptimizelyFactory#setBlockingTimeout}
  • *
  • {@link OptimizelyFactory#setPollingInterval}
  • *
  • {@link OptimizelyFactory#setSdkKey}
  • *
  • {@link OptimizelyFactory#setDatafileAccessToken}
  • *
* */ public final class OptimizelyFactory { private static final Logger logger = LoggerFactory.getLogger(OptimizelyFactory.class); /** * Convenience method for setting the maximum number of events contained within a batch. * {@link AsyncEventHandler} * * @param batchSize The max number of events for batching */ public static void setMaxEventBatchSize(int batchSize) { if (batchSize <= 0) { logger.warn("Batch size cannot be <= 0. Reverting to default configuration."); return; } PropertyUtils.set(BatchEventProcessor.CONFIG_BATCH_SIZE, Integer.toString(batchSize)); } /** * Convenience method for setting the maximum time interval in milliseconds between event dispatches. * {@link AsyncEventHandler} * * @param batchInterval The max time interval for event batching */ public static void setMaxEventBatchInterval(long batchInterval) { if (batchInterval <= 0) { logger.warn("Batch interval cannot be <= 0. Reverting to default configuration."); return; } PropertyUtils.set(BatchEventProcessor.CONFIG_BATCH_INTERVAL, Long.toString(batchInterval)); } /** * Convenience method for setting the required queueing parameters for event dispatching. * {@link AsyncEventHandler} * * @param queueCapacity A depth of the event queue * @param numberWorkers The number of workers */ public static void setEventQueueParams(int queueCapacity, int numberWorkers) { if (queueCapacity <= 0) { logger.warn("Queue capacity cannot be <= 0. Reverting to default configuration."); return; } if (numberWorkers <= 0) { logger.warn("Number of workers cannot be <= 0. Reverting to default configuration."); return; } PropertyUtils.set(AsyncEventHandler.CONFIG_QUEUE_CAPACITY, Integer.toString(queueCapacity)); PropertyUtils.set(AsyncEventHandler.CONFIG_NUM_WORKERS, Integer.toString(numberWorkers)); } /** * Convenience method for setting the blocking timeout. * {@link HttpProjectConfigManager.Builder#withBlockingTimeout(Long, TimeUnit)} * * @param blockingDuration The blocking time duration * @param blockingTimeout The blocking time unit */ public static void setBlockingTimeout(long blockingDuration, TimeUnit blockingTimeout) { if (blockingTimeout == null) { logger.warn("TimeUnit cannot be null. Reverting to default configuration."); return; } if (blockingDuration <= 0) { logger.warn("Timeout cannot be <= 0. Reverting to default configuration."); return; } PropertyUtils.set(HttpProjectConfigManager.CONFIG_BLOCKING_DURATION, Long.toString(blockingDuration)); PropertyUtils.set(HttpProjectConfigManager.CONFIG_BLOCKING_UNIT, blockingTimeout.toString()); } /** * Convenience method for setting the evict idle connections. * {@link HttpProjectConfigManager.Builder#withEvictIdleConnections(long, TimeUnit)} * * @param maxIdleTime The connection idle time duration (0 to disable eviction) * @param maxIdleTimeUnit The connection idle time unit */ public static void setEvictIdleConnections(long maxIdleTime, TimeUnit maxIdleTimeUnit) { if (maxIdleTimeUnit == null) { logger.warn("TimeUnit cannot be null. Reverting to default configuration."); return; } if (maxIdleTime < 0) { logger.warn("Timeout cannot be < 0. Reverting to default configuration."); return; } PropertyUtils.set(HttpProjectConfigManager.CONFIG_EVICT_DURATION, Long.toString(maxIdleTime)); PropertyUtils.set(HttpProjectConfigManager.CONFIG_EVICT_UNIT, maxIdleTimeUnit.toString()); } /** * Convenience method for setting the polling interval on System properties. * {@link HttpProjectConfigManager.Builder#withPollingInterval(Long, TimeUnit)} * * @param pollingDuration The polling interval * @param pollingTimeout The polling time unit */ public static void setPollingInterval(long pollingDuration, TimeUnit pollingTimeout) { if (pollingTimeout == null) { logger.warn("TimeUnit cannot be null. Reverting to default configuration."); return; } if (pollingDuration <= 0) { logger.warn("Interval cannot be <= 0. Reverting to default configuration."); return; } PropertyUtils.set(HttpProjectConfigManager.CONFIG_POLLING_DURATION, Long.toString(pollingDuration)); PropertyUtils.set(HttpProjectConfigManager.CONFIG_POLLING_UNIT, pollingTimeout.toString()); } /** * Convenience method for setting the sdk key on System properties. * {@link HttpProjectConfigManager.Builder#withSdkKey(String)} * * @param sdkKey The sdk key */ public static void setSdkKey(String sdkKey) { if (sdkKey == null) { logger.warn("SDK key cannot be null. Reverting to default configuration."); return; } PropertyUtils.set(HttpProjectConfigManager.CONFIG_SDK_KEY, sdkKey); } /** * Convenience method for setting the Datafile Access Token on System properties. * {@link HttpProjectConfigManager.Builder#withDatafileAccessToken(String)} * * @param datafileAccessToken The datafile access token */ public static void setDatafileAccessToken(String datafileAccessToken) { if (datafileAccessToken == null) { logger.warn("Datafile Access Token cannot be null. Reverting to default configuration."); return; } PropertyUtils.set(HttpProjectConfigManager.CONFIG_DATAFILE_AUTH_TOKEN, datafileAccessToken); } /** * Returns a new Optimizely instance based on preset configuration. * * @return A new Optimizely instance */ public static Optimizely newDefaultInstance() { String sdkKey = PropertyUtils.get(HttpProjectConfigManager.CONFIG_SDK_KEY); return newDefaultInstance(sdkKey); } /** * Returns a new Optimizely instance based on preset configuration. * EventHandler - {@link AsyncEventHandler} * ProjectConfigManager - {@link HttpProjectConfigManager} * * @param sdkKey SDK key used to build the ProjectConfigManager. * @return A new Optimizely instance */ public static Optimizely newDefaultInstance(String sdkKey) { if (sdkKey == null) { logger.error("Must provide an sdkKey, returning non-op Optimizely client"); return newDefaultInstance(new ProjectConfigManager() { @Override public ProjectConfig getConfig() { return null; } @Override public ProjectConfig getCachedConfig() { return null; } @Override public String getSDKKey() { return null; } }); } return newDefaultInstance(sdkKey, null); } /** * Returns a new Optimizely instance based on preset configuration. * EventHandler - {@link AsyncEventHandler} * ProjectConfigManager - {@link HttpProjectConfigManager} * * @param sdkKey SDK key used to build the ProjectConfigManager. * @param fallback Fallback datafile string used by the ProjectConfigManager to be immediately available. * @return A new Optimizely instance */ public static Optimizely newDefaultInstance(String sdkKey, String fallback) { String datafileAccessToken = PropertyUtils.get(HttpProjectConfigManager.CONFIG_DATAFILE_AUTH_TOKEN); return newDefaultInstance(sdkKey, fallback, datafileAccessToken); } /** * Returns a new Optimizely instance with authenticated datafile support. * * @param sdkKey SDK key used to build the ProjectConfigManager. * @param fallback Fallback datafile string used by the ProjectConfigManager to be immediately available. * @param datafileAccessToken Token for authenticated datafile access. * @return A new Optimizely instance */ public static Optimizely newDefaultInstance(String sdkKey, String fallback, String datafileAccessToken) { return newDefaultInstance(sdkKey, fallback, datafileAccessToken, null); } /** * Returns a new Optimizely instance with authenticated datafile support. * * @param sdkKey SDK key used to build the ProjectConfigManager. * @param fallback Fallback datafile string used by the ProjectConfigManager to be immediately available. * @param datafileAccessToken Token for authenticated datafile access. * @param customHttpClient Customizable CloseableHttpClient to build OptimizelyHttpClient. * @return A new Optimizely instance */ public static Optimizely newDefaultInstance(String sdkKey, String fallback, String datafileAccessToken, CloseableHttpClient customHttpClient) { NotificationCenter notificationCenter = new NotificationCenter(); OptimizelyHttpClient optimizelyHttpClient = new OptimizelyHttpClient(customHttpClient); HttpProjectConfigManager.Builder builder; builder = HttpProjectConfigManager.builder() .withDatafile(fallback) .withNotificationCenter(notificationCenter) .withOptimizelyHttpClient(customHttpClient == null ? null : optimizelyHttpClient) .withSdkKey(sdkKey); if (datafileAccessToken != null) { builder.withDatafileAccessToken(datafileAccessToken); } return newDefaultInstance(builder.build(), notificationCenter); } /** * Returns a new Optimizely instance based on preset configuration. * EventHandler - {@link AsyncEventHandler} * * @param configManager The {@link ProjectConfigManager} supplied to Optimizely instance. * @return A new Optimizely instance */ public static Optimizely newDefaultInstance(ProjectConfigManager configManager) { return newDefaultInstance(configManager, null); } /** * Returns a new Optimizely instance based on preset configuration. * EventHandler - {@link AsyncEventHandler} * * @param configManager The {@link ProjectConfigManager} supplied to Optimizely instance. * @param notificationCenter The {@link NotificationCenter} supplied to Optimizely instance. * @return A new Optimizely instance */ public static Optimizely newDefaultInstance(ProjectConfigManager configManager, NotificationCenter notificationCenter) { EventHandler eventHandler = AsyncEventHandler.builder().build(); return newDefaultInstance(configManager, notificationCenter, eventHandler); } /** * Returns a new Optimizely instance based on preset configuration. * * @param configManager The {@link ProjectConfigManager} supplied to Optimizely instance. * @param notificationCenter The {@link ProjectConfigManager} supplied to Optimizely instance. * @param eventHandler The {@link EventHandler} supplied to Optimizely instance. * @return A new Optimizely instance * */ public static Optimizely newDefaultInstance(ProjectConfigManager configManager, NotificationCenter notificationCenter, EventHandler eventHandler) { if (notificationCenter == null) { notificationCenter = new NotificationCenter(); } BatchEventProcessor eventProcessor = BatchEventProcessor.builder() .withEventHandler(eventHandler) .withNotificationCenter(notificationCenter) .build(); ODPApiManager defaultODPApiManager = new DefaultODPApiManager(); ODPManager odpManager = ODPManager.builder() .withApiManager(defaultODPApiManager) .build(); return Optimizely.builder() .withEventProcessor(eventProcessor) .withConfigManager(configManager) .withNotificationCenter(notificationCenter) .withODPManager(odpManager) .build(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy