Function bodies 269 total
hasVariantSplits method · java · L127-L129 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Rollout.java
public boolean hasVariantSplits() {
return variantSplits != null && !variantSplits.isEmpty();
}toString method · java · L132-L140 (9 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Rollout.java
public String toString() {
return "Rollout{" +
"rolloutPercentage=" + rolloutPercentage +
", legacyRuntimeEvaluationDefinition=" + legacyRuntimeEvaluationDefinition +
", runtimeEvaluationRule=" + runtimeEvaluationRule +
", variantOverride='" + variantOverride + '\'' +
", variantSplits=" + variantSplits +
'}';
}getRuntimeEvaluationRule method · java · L145-L147 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Rollout.java
public JSONObject getRuntimeEvaluationRule() {
return runtimeEvaluationRule;
}RuleSet class · java · L17-L83 (67 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/RuleSet.java
public final class RuleSet {
private final List<Variant> variants;
private final List<Rollout> rollouts;
private final Map<String, String> testUserOverrides;
/**
* Creates a new RuleSet with all components.
*
* @param variants the list of available variants for this flag
* @param rollouts the list of rollout rules (evaluated in order)
* @param testUserOverrides optional map of distinct_id to variant key for test users
*/
public RuleSet(List<Variant> variants, List<Rollout> rollouts, Map<String, String> testUserOverrides) {
this.variants = variants != null ? Collections.unmodifiableList(variants) : Collections.emptyList();
this.rollouts = rollouts != null ? Collections.unmodifiableList(rollouts) : Collections.emptyList();
this.testUserOverrides = testUserOverrides != null
? Collections.unmodifiableMap(testUserOverrides)
: null;
}
/**
* Creates a new RuleSet without test user RuleSet method · java · L29-L35 (7 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/RuleSet.java
public RuleSet(List<Variant> variants, List<Rollout> rollouts, Map<String, String> testUserOverrides) {
this.variants = variants != null ? Collections.unmodifiableList(variants) : Collections.emptyList();
this.rollouts = rollouts != null ? Collections.unmodifiableList(rollouts) : Collections.emptyList();
this.testUserOverrides = testUserOverrides != null
? Collections.unmodifiableMap(testUserOverrides)
: null;
}RuleSet method · java · L43-L45 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/RuleSet.java
public RuleSet(List<Variant> variants, List<Rollout> rollouts) {
this(variants, rollouts, null);
}getVariants method · java · L50-L52 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/RuleSet.java
public List<Variant> getVariants() {
return variants;
}Methodology: Repobility · https://repobility.com/research/state-of-ai-code-2026/
getRollouts method · java · L57-L59 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/RuleSet.java
public List<Rollout> getRollouts() {
return rollouts;
}getTestUserOverrides method · java · L64-L66 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/RuleSet.java
public Map<String, String> getTestUserOverrides() {
return testUserOverrides;
}hasTestUserOverrides method · java · L71-L73 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/RuleSet.java
public boolean hasTestUserOverrides() {
return testUserOverrides != null && !testUserOverrides.isEmpty();
}toString method · java · L76-L82 (7 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/RuleSet.java
public String toString() {
return "RuleSet{" +
"variants=" + variants +
", rollouts=" + rollouts +
", testUserOverrides=" + testUserOverrides +
'}';
}SelectedVariant class · java · L17-L124 (108 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public final class SelectedVariant<T> {
private final String variantKey;
private final T variantValue;
private final UUID experimentId;
private final Boolean isExperimentActive;
private final Boolean isQaTester;
/**
* Creates a SelectedVariant with only a value (key is null).
* This is typically used for fallback responses.
*
* @param variantValue the fallback value
*/
public SelectedVariant(T variantValue) {
this(null, variantValue, null, null, null);
}
/**
* Creates a new SelectedVariant with experimentation metadata.
*
* @param variantKey the key of the selected variant (may be null for fallback)
* @param variantValue the value of the selected variant (may be null for fallback)
* @param experimentId the experiment ID (may be null)
* @param isExperimentActive whether the experiment is active (may be null)
* @param isQaTester whether the user is a QA tester (may be null)
*/
SelectedVariant method · java · L30-L32 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public SelectedVariant(T variantValue) {
this(null, variantValue, null, null, null);
}SelectedVariant method · java · L43-L49 (7 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public SelectedVariant(String variantKey, T variantValue, UUID experimentId, Boolean isExperimentActive, Boolean isQaTester) {
this.variantKey = variantKey;
this.variantValue = variantValue;
this.experimentId = experimentId;
this.isExperimentActive = isExperimentActive;
this.isQaTester = isQaTester;
}getVariantKey method · java · L54-L56 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public String getVariantKey() {
return variantKey;
}Repobility's GitHub App fixes findings like these · https://github.com/apps/repobility-bot
getVariantValue method · java · L61-L63 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public T getVariantValue() {
return variantValue;
}getExperimentId method · java · L68-L70 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public UUID getExperimentId() {
return experimentId;
}getIsExperimentActive method · java · L75-L77 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public Boolean getIsExperimentActive() {
return isExperimentActive;
}getIsQaTester method · java · L82-L84 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public Boolean getIsQaTester() {
return isQaTester;
}isSuccess method · java · L89-L91 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public boolean isSuccess() {
return variantKey != null;
}isFallback method · java · L96-L98 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public boolean isFallback() {
return variantKey == null;
}toString method · java · L101-L109 (9 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public String toString() {
return "SelectedVariant{" +
"variantKey='" + variantKey + '\'' +
", variantValue=" + variantValue +
", experimentId=" + experimentId +
", isExperimentActive=" + isExperimentActive +
", isQaTester=" + isQaTester +
'}';
}equals method · java · L112-L123 (12 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/SelectedVariant.java
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SelectedVariant<?> that = (SelectedVariant<?>) o;
if (variantKey != null ? !variantKey.equals(that.variantKey) : that.variantKey != null) return false;
if (variantValue != null ? !variantValue.equals(that.variantValue) : that.variantValue != null) return false;
if (experimentId != null ? !experimentId.equals(that.experimentId) : that.experimentId != null) return false;
if (isExperimentActive != null ? !isExperimentActive.equals(that.isExperimentActive) : that.isExperimentActive != null) return false;
return isQaTester != null ? isQaTester.equals(that.isQaTester) : that.isQaTester == null;
}Repobility (the analyzer behind this table) · https://repobility.com
Variant class · java · L13-L71 (59 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Variant.java
public final class Variant {
private final String key;
private final Object value;
private final boolean isControl;
private final float split;
/**
* Creates a new Variant.
*
* @param key the unique identifier for this variant
* @param value the value associated with this variant (can be boolean, string, number, or JSON object)
* @param isControl whether this variant is the control variant
* @param split the percentage split allocation for this variant (0.0-1.0)
*/
public Variant(String key, Object value, boolean isControl, float split) {
this.key = key;
this.value = value;
this.isControl = isControl;
this.split = split;
}
/**
* @return the unique identifier for this variant
*/
public String getKey() {
return key;
}
/**
* @return the value associated with this variant
*/
public Object getValue() {
return value;
}
/**
* @rVariant method · java · L27-L32 (6 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Variant.java
public Variant(String key, Object value, boolean isControl, float split) {
this.key = key;
this.value = value;
this.isControl = isControl;
this.split = split;
}getKey method · java · L37-L39 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Variant.java
public String getKey() {
return key;
}getValue method · java · L44-L46 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Variant.java
public Object getValue() {
return value;
}isControl method · java · L51-L53 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Variant.java
public boolean isControl() {
return isControl;
}getSplit method · java · L58-L60 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Variant.java
public float getSplit() {
return split;
}toString method · java · L63-L70 (8 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/Variant.java
public String toString() {
return "Variant{" +
"key='" + key + '\'' +
", value=" + value +
", isControl=" + isControl +
", split=" + split +
'}';
}VariantOverride class · java · L12-L37 (26 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/VariantOverride.java
public final class VariantOverride {
private final String key;
/**
* Creates a new VariantOverride.
*
* @param key the variant key to force selection of
*/
public VariantOverride(String key) {
this.key = key;
}
/**
* @return the variant key
*/
public String getKey() {
return key;
}
@Override
public String toString() {
return "VariantOverride{" +
"key='" + key + '\'' +
'}';
}
}Repobility · open methodology · https://repobility.com/research/
VariantOverride method · java · L20-L22 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/VariantOverride.java
public VariantOverride(String key) {
this.key = key;
}getKey method · java · L27-L29 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/VariantOverride.java
public String getKey() {
return key;
}toString method · java · L32-L36 (5 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/model/VariantOverride.java
public String toString() {
return "VariantOverride{" +
"key='" + key + '\'' +
'}';
}BaseFlagsProvider class · java · L31-L239 (209 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/BaseFlagsProvider.java
public abstract class BaseFlagsProvider<C extends BaseFlagsConfig> {
protected static final int BUFFER_SIZE = 4096;
protected final String projectToken;
protected final C config;
protected final String sdkVersion;
protected final EventSender eventSender;
/**
* Creates a new BaseFlagsProvider.
*
* @param projectToken the Mixpanel project token
* @param config the flags configuration
* @param sdkVersion the SDK version string
* @param eventSender the EventSender implementation for tracking exposure events
*/
protected BaseFlagsProvider(String projectToken, C config, String sdkVersion, EventSender eventSender) {
this.projectToken = projectToken;
this.config = config;
this.sdkVersion = sdkVersion;
this.eventSender = eventSender;
}
// #region HTTP Methods
/**
* Performs an HTTP GET request with Basic Auth.
* <p>
* This method is protected to allow test subclasses to BaseFlagsProvider method · java · L47-L52 (6 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/BaseFlagsProvider.java
protected BaseFlagsProvider(String projectToken, C config, String sdkVersion, EventSender eventSender) {
this.projectToken = projectToken;
this.config = config;
this.sdkVersion = sdkVersion;
this.eventSender = eventSender;
}httpGet method · java · L62-L92 (31 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/BaseFlagsProvider.java
protected String httpGet(String urlString) throws IOException {
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(config.getRequestTimeoutSeconds() * 1000);
conn.setReadTimeout(config.getRequestTimeoutSeconds() * 1000);
// Set Basic Auth header (token as username, empty password)
String auth = projectToken + ":";
String encodedAuth = java.util.Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
conn.setRequestProperty("Authorization", "Basic " + encodedAuth);
// Set custom headers
conn.setRequestProperty("X-Scheme", "https");
conn.setRequestProperty("X-Forwarded-Proto", "https");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("traceparent", TraceparentUtil.generateTraceparent());
InputStream responseStream = null;
try {
responseStream = conn.gereadStream method · java · L97-L108 (12 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/BaseFlagsProvider.java
protected String readStream(InputStream in) throws IOException {
StringBuilder out = new StringBuilder();
InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
char[] buffer = new char[BUFFER_SIZE];
int count;
while ((count = reader.read(buffer)) != -1) {
out.append(buffer, 0, count);
}
return out.toString();
}getVariant method · java · L141-L143 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/BaseFlagsProvider.java
public <T> SelectedVariant<T> getVariant(String flagKey, SelectedVariant<T> fallback, Map<String, Object> context) {
return getVariant(flagKey, fallback, context, true);
}Methodology: Repobility · https://repobility.com/research/state-of-ai-code-2026/
getVariantValue method · java · L166-L170 (5 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/BaseFlagsProvider.java
public <T> T getVariantValue(String flagKey, T fallbackValue, Map<String, Object> context) {
SelectedVariant<T> fallback = new SelectedVariant<>(fallbackValue);
SelectedVariant<T> result = getVariant(flagKey, fallback, context, true);
return result.getVariantValue();
}isEnabled method · java · L183-L188 (6 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/BaseFlagsProvider.java
public boolean isEnabled(String flagKey, Map<String, Object> context) {
SelectedVariant<Object> result = getVariant(flagKey, new SelectedVariant<>(false), context, true);
Object value = result.getVariantValue();
return value instanceof Boolean && (Boolean) value;
}trackExposure method · java · L197-L228 (32 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/BaseFlagsProvider.java
protected void trackExposure(String distinctId, String flagKey, String variantKey,
String evaluationMode, Consumer<JSONObject> addTimingProperties,
UUID experimentId, Boolean isExperimentActive, Boolean isQaTester) {
try {
JSONObject properties = new JSONObject();
properties.put("Experiment name", flagKey);
properties.put("Variant name", variantKey);
properties.put("$experiment_type", "feature_flag");
properties.put("Flag evaluation mode", evaluationMode);
// Add experiment metadata
if (experimentId != null) {
properties.put("$experiment_id", experimentId.toString());
}
if (isExperimentActive != null) {
properties.put("$is_experiment_active", isExperimentActive);
}
if (isQaTester != null) {
properties.put("$is_qa_tester", isQaTesteshutdown method · java · L236-L238 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/BaseFlagsProvider.java
public void shutdown() {
// No-op by default
}LocalFlagsProvider function · java · L51-L57 (7 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/LocalFlagsProvider.java
public LocalFlagsProvider(LocalFlagsConfig config, String sdkVersion, EventSender eventSender) {
super(config.getProjectToken(), config, sdkVersion, eventSender);
this.flagDefinitions = new AtomicReference<>(new HashMap<>());
this.ready = new AtomicBoolean(false);
this.closed = new AtomicBoolean(false);
}startPollingForDefinitions function · java · L67-L93 (27 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/LocalFlagsProvider.java
public void startPollingForDefinitions() {
if (closed.get()) {
logger.log(Level.WARNING, "Cannot start polling: provider is closed");
return;
}
// Initial fetch
fetchDefinitions();
// Start background polling if enabled
if (config.isEnablePolling()) {
pollingExecutor = Executors.newSingleThreadScheduledExecutor(r -> {
Thread t = new Thread(r, "mixpanel-flags-poller");
t.setDaemon(true);
return t;
});
pollingExecutor.scheduleAtFixedRate(
this::fetchDefinitions,
config.getPollingIntervalSeconds(),
config.getPollingIntervalSeconds(),
TimeUnit.SECONDS
);
logger.log(Level.INFO, "Started polling for flag definitions every " + config.getPollingIntervalSeconds() + " seconds");
}
}stopPollingForDefinitions function · java · L98-L111 (14 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/LocalFlagsProvider.java
public void stopPollingForDefinitions() {
if (pollingExecutor != null) {
pollingExecutor.shutdown();
try {
if (!pollingExecutor.awaitTermination(5, TimeUnit.SECONDS)) {
pollingExecutor.shutdownNow();
}
} catch (InterruptedException e) {
pollingExecutor.shutdownNow();
Thread.currentThread().interrupt();
}
pollingExecutor = null;
}
}areFlagsReady function · java · L120-L122 (3 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/LocalFlagsProvider.java
public boolean areFlagsReady() {
return ready.get();
}Repobility's GitHub App fixes findings like these · https://github.com/apps/repobility-bot
fetchDefinitions function · java · L127-L140 (14 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/LocalFlagsProvider.java
private void fetchDefinitions() {
try {
String endpoint = buildDefinitionsUrl();
String response = httpGet(endpoint);
Map<String, ExperimentationFlag> newDefinitions = parseDefinitions(response);
flagDefinitions.set(newDefinitions);
ready.set(true);
logger.log(Level.FINE, "Successfully fetched " + newDefinitions.size() + " flag definitions");
} catch (Exception e) {
logger.log(Level.WARNING, "Failed to fetch flag definitions", e);
}
}parseDefinitions function · java · L161-L182 (22 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/LocalFlagsProvider.java
private Map<String, ExperimentationFlag> parseDefinitions(String jsonResponse) {
Map<String, ExperimentationFlag> definitions = new HashMap<>();
try {
JSONObject root = new JSONObject(jsonResponse);
JSONArray flags = root.optJSONArray("flags");
if (flags == null) {
return definitions;
}
for (int i = 0; i < flags.length(); i++) {
JSONObject flagJson = flags.getJSONObject(i);
ExperimentationFlag flag = parseFlag(flagJson);
definitions.put(flag.getKey(), flag);
}
} catch (Exception e) {
logger.log(Level.SEVERE, "Failed to parse flag definitions", e);
}
return definitions;
}parseFlag function · java · L187-L217 (31 LOC)src/main/java/com/mixpanel/mixpanelapi/featureflags/provider/LocalFlagsProvider.java
private ExperimentationFlag parseFlag(JSONObject json) {
String id = json.optString("id", "");
String name = json.optString("name", "");
String key = json.optString("key", "");
String status = json.optString("status", "");
int projectId = json.optInt("project_id", 0);
String context = json.optString("context", "distinct_id");
// Parse experiment metadata
UUID experimentId = null;
String experimentIdString = json.optString("experiment_id", null);
if (experimentIdString != null && !experimentIdString.isEmpty()) {
try {
experimentId = UUID.fromString(experimentIdString);
} catch (IllegalArgumentException e) {
logger.log(Level.WARNING, "Invalid UUID for experiment_id: " + experimentIdString);
}
}
Boolean isExperimentActive = null;
if (json.has("is_experiment_active")) {
isExperimentActive = json.optBool