package com.apigee.sdk.apm.android.model;
import com.apigee.sdk.apm.android.model.AppConfigOverrideFilter.FILTER_TYPE;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;
//import com.apigee.sdk.android.model.CONFIG_TYPE;
/**
*
* This class represented an enhanced version of the
* ApplicationConfigurationModel to support 3 additional use cases:
*
* 1. Enabling Device level configuration overrides 2. Enabling Device Type
* configuration overrides 3. Enabling A/B Testing for configuration overrides
*
* Device level configuration overrides enable the developer to override 1 or
* more devices using a specific configuration. This is helpful when the user is
* doing testing, or if there is a particular customer complaint.
*
* Device Type Configuration Overrides enables the developer to override
* multiple devices based on the type of phone it is, network it is on, etc.
* This is helpful the developer identifies a large swath of devices that could
* potentially have issues.
*
* A/B Testing over-rides enable the developers to incrementally roll out
* features to a percentage of the population. This essentially allows for
* developers to "test" to see if a configuration performs better than another.
*
* Logic for implementing overrides:
*
* Configuration logic gets implemented using a "hierarchy". It should look
* something like this:
*
* 1. If Device-Level Overrides is enabled && Phone matches device filter, then
* use Device-level AppConfig 2. Else, If Device-Type Overrides is enabled &&
* Phone matches device filter, then Device-type AppConfig 3. Else, If A/B Test
* Overrides is enabled && Random % < "B Percentage", then use A/B Testing
* AppConfig 4. Else, use default AppConfig
*
* Tradeoffs:
*
* The question might be - why only use 4 levels ? What if we want to mix and
* match ? The reason is "real world use cases". Instead of having 100s of
* combinations that will never get used or will never see the light of day, its
* important to not over-complicate. You will also notice, there is no explicit
* "versioning" either. This is more of a "tool" to get developers out of tough
* spots and not a general all purpose configuration system.
*
* @author alanho
* @author prabhat
*
*/
public class ApigeeApp implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
Long instaOpsApplicationId;
UUID applicationUUID;
UUID organizationUUID;
String orgName;
String appName;
String fullAppName;
String appOwner;
//String appVersion;
Date createdDate = new Date();
Date lastModifiedDate = new Date();
Boolean monitoringDisabled = false;
Boolean deleted = false;
String googleId;
String appleId;
String description;
String environment;
String customUploadUrl;
ApigeeMonitoringSettings defaultAppConfig;
Set<AppConfigOverrideFilter> appConfigOverrideFilters = new HashSet<AppConfigOverrideFilter>();
ApigeeMonitoringSettings deviceLevelAppConfig;
Boolean deviceLevelOverrideEnabled = false;
ApigeeMonitoringSettings deviceTypeAppConfig;
Boolean deviceTypeOverrideEnabled = false;
ApigeeMonitoringSettings ABTestingAppConfig;
Boolean ABTestingOverrideEnabled = false;
Integer ABTestingPercentage = 0;
Set<AppConfigOverrideFilter> deviceNumberFilters;
Set<AppConfigOverrideFilter> deviceIdFilters;
Set<AppConfigOverrideFilter> deviceModelRegexFilters;
Set<AppConfigOverrideFilter> devicePlatformRegexFilters;
Set<AppConfigOverrideFilter> networkTypeRegexFilters;
Set<AppConfigOverrideFilter> networkOperatorRegexFilters;
public ApigeeApp() {
this.defaultAppConfig = new ApigeeMonitoringSettings(
ApigeeMobileAPMConstants.CONFIG_TYPE_DEFAULT);
this.deviceLevelAppConfig = new ApigeeMonitoringSettings(
ApigeeMobileAPMConstants.CONFIG_TYPE_DEVICE_LEVEL);
this.deviceTypeAppConfig = new ApigeeMonitoringSettings(
ApigeeMobileAPMConstants.CONFIG_TYPE_DEVICE_TYPE);
this.ABTestingAppConfig = new ApigeeMonitoringSettings(
ApigeeMobileAPMConstants.CONFIG_TYPE_AB);
}
public Long getInstaOpsApplicationId() {
return instaOpsApplicationId;
}
public void setInstaOpsApplicationId(Long instaOpsApplicationId) {
this.instaOpsApplicationId = instaOpsApplicationId;
}
public UUID getApplicationUUID() {
return applicationUUID;
}
public void setApplicationUUID(UUID applicationUUID) {
this.applicationUUID = applicationUUID;
}
public UUID getOrganizationUUID() {
return organizationUUID;
}
public void setOrganizationUUID(UUID organizationUUID) {
this.organizationUUID = organizationUUID;
}
public String getOrgName() {
return orgName;
}
public void setOrgName(String orgName) {
this.orgName = orgName;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getFullAppName() {
return fullAppName;
}
public void setFullAppName(String fullAppName) {
this.fullAppName = fullAppName;
}
public String getAppOwner() {
return appOwner;
}
public void setAppOwner(String appOwner) {
this.appOwner = appOwner;
}
public String getGoogleId() {
return googleId;
}
public void setGoogleId(String googleId) {
this.googleId = googleId;
}
public String getAppleId() {
return appleId;
}
public void setAppleId(String appleId) {
this.appleId = appleId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getEnvironment() {
return environment;
}
public void setEnvironment(String environment) {
this.environment = environment;
}
@JsonManagedReference
public Set<AppConfigOverrideFilter> getAppConfigOverrideFilters() {
return appConfigOverrideFilters;
}
public void setAppConfigOverrideFilters(
Set<AppConfigOverrideFilter> appConfigOverrideFilters) {
this.appConfigOverrideFilters = appConfigOverrideFilters;
}
public void addAppConfigOverrideFilters(
AppConfigOverrideFilter appConfigOverrideFilter) {
this.appConfigOverrideFilters.add(appConfigOverrideFilter);
}
//public Set<AppConfigOverrideFilter> getDeletedAppConfigOverrideFilters() {
// return deletedAppConfigOverrideFilters;
//}
//public void setDeletedAppConfigOverrideFilters(
// Set<AppConfigOverrideFilter> deletedAppConfigOverrideFilters) {
// this.deletedAppConfigOverrideFilters = deletedAppConfigOverrideFilters;
//}
//public String getAppVersion() {
// return appVersion;
//}
//public void setAppVersion(String appVersion) {
// this.appVersion = appVersion;
//}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public Date getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(Date lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
public Boolean getMonitoringDisabled() {
return monitoringDisabled;
}
public void setMonitoringDisabled(Boolean monitoringDisabled) {
this.monitoringDisabled = monitoringDisabled;
}
public ApigeeMonitoringSettings getDeviceLevelAppConfig() {
return deviceLevelAppConfig;
}
public void setDeviceLevelAppConfig(
ApigeeMonitoringSettings deviceLevelAppConfig) {
this.deviceLevelAppConfig = deviceLevelAppConfig;
}
public Set<AppConfigOverrideFilter> getDeviceNumberFilters() {
return getFiltersofType(FILTER_TYPE.DEVICE_NUMBER);
}
public void setDeviceNumberFilters(
Set<AppConfigOverrideFilter> deviceNumberFilters) {
this.deviceNumberFilters = deviceNumberFilters;
}
public Set<AppConfigOverrideFilter> getDeviceIdFilters() {
return getFiltersofType(FILTER_TYPE.DEVICE_ID);
}
public void setDeviceIdFilters(Set<AppConfigOverrideFilter> deviceIdFilters) {
this.deviceIdFilters = deviceIdFilters;
}
public Boolean getDeviceLevelOverrideEnabled() {
return deviceLevelOverrideEnabled;
}
public void setDeviceLevelOverrideEnabled(Boolean deviceLevelOverrideEnabled) {
this.deviceLevelOverrideEnabled = deviceLevelOverrideEnabled;
}
public ApigeeMonitoringSettings getDeviceTypeAppConfig() {
return deviceTypeAppConfig;
}
public void setDeviceTypeAppConfig(
ApigeeMonitoringSettings deviceTypeAppConfig) {
this.deviceTypeAppConfig = deviceTypeAppConfig;
}
public Set<AppConfigOverrideFilter> getDeviceModelRegexFilters() {
return getFiltersofType(FILTER_TYPE.DEVICE_MODEL);
}
public void setDeviceModelRegexFilters(
Set<AppConfigOverrideFilter> deviceModelRegexFilters) {
this.deviceModelRegexFilters = deviceModelRegexFilters;
}
public Set<AppConfigOverrideFilter> getDevicePlatformRegexFilters() {
return getFiltersofType(FILTER_TYPE.DEVICE_PLATFORM);
}
public void setDevicePlatformRegexFilters(
Set<AppConfigOverrideFilter> devicePlatformRegexFilters) {
this.devicePlatformRegexFilters = devicePlatformRegexFilters;
}
public Set<AppConfigOverrideFilter> getNetworkTypeRegexFilters() {
return getFiltersofType(FILTER_TYPE.NETWORK_TYPE);
}
public void setNetworkTypeRegexFilters(
Set<AppConfigOverrideFilter> networkTypeRegexFilters) {
this.networkTypeRegexFilters = networkTypeRegexFilters;
}
public Set<AppConfigOverrideFilter> getNetworkOperatorRegexFilters() {
return getFiltersofType(FILTER_TYPE.NETWORK_OPERATOR);
}
public void setNetworkOperatorRegexFilters(
Set<AppConfigOverrideFilter> networkOperatorRegexFilters) {
this.networkOperatorRegexFilters = networkOperatorRegexFilters;
}
public Boolean getDeviceTypeOverrideEnabled() {
return deviceTypeOverrideEnabled;
}
public void setDeviceTypeOverrideEnabled(Boolean deviceTypeOverrideEnabled) {
this.deviceTypeOverrideEnabled = deviceTypeOverrideEnabled;
}
public ApigeeMonitoringSettings getABTestingAppConfig() {
return ABTestingAppConfig;
}
public void setABTestingAppConfig(
ApigeeMonitoringSettings ABTestingAppConfig) {
this.ABTestingAppConfig = ABTestingAppConfig;
}
public Integer getABTestingPercentage() {
return ABTestingPercentage;
}
public void setABTestingPercentage(Integer ABTestingPercentage) {
this.ABTestingPercentage = ABTestingPercentage;
}
public Boolean getABTestingOverrideEnabled() {
return ABTestingOverrideEnabled;
}
public void setABTestingOverrideEnabled(Boolean ABTestingOverrideEnabled) {
this.ABTestingOverrideEnabled = ABTestingOverrideEnabled;
}
public ApigeeMonitoringSettings getDefaultAppConfig() {
return defaultAppConfig;
}
public void setDefaultAppConfig(
ApigeeMonitoringSettings defaultAppConfig) {
this.defaultAppConfig = defaultAppConfig;
}
public String getCustomUploadUrl() {
return customUploadUrl;
}
public void setCustomUploadUrl(String customUploadUrl) {
this.customUploadUrl = customUploadUrl;
}
private Set<AppConfigOverrideFilter> getFiltersofType(FILTER_TYPE filterType) {
Set<AppConfigOverrideFilter> filters = new HashSet<AppConfigOverrideFilter>();
for (Iterator<AppConfigOverrideFilter> i = appConfigOverrideFilters
.iterator(); i.hasNext();) {
AppConfigOverrideFilter filter = i.next();
if (filter.getFilterType() == filterType) {
filters.add(filter);
}
}
return filters;
}
public Boolean getDeleted() {
return deleted;
}
public void setDeleted(Boolean deleted) {
this.deleted = deleted;
}
}