/*
* Copyright 2016 Rackspace
*
* 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.rackspacecloud.blueflood.cache;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.rackspacecloud.blueflood.rollup.Granularity;
import com.rackspacecloud.blueflood.types.RollupType;
import com.rackspacecloud.blueflood.utils.TimeValue;
/**
* TTL Provider which obtains the TTL from the primary or secondary provider.
*/
public class CombinedTtlProvider implements TenantTtlProvider {
private final ConfigTtlProvider primary;
private final SafetyTtlProvider safety;
private static final CombinedTtlProvider INSTANCE = new CombinedTtlProvider(
ConfigTtlProvider.getInstance(),
SafetyTtlProvider.getInstance()
);
public static CombinedTtlProvider getInstance() {
return INSTANCE;
}
@VisibleForTesting
CombinedTtlProvider(ConfigTtlProvider primary, SafetyTtlProvider safety) {
this.primary = primary;
this.safety = safety;
}
@Override
public Optional<TimeValue> getTTL(String tenantId, Granularity gran, RollupType rollupType) {
Optional<TimeValue> primaryValue = primary.getTTL(tenantId, gran, rollupType);
Optional<TimeValue> safetyValue = safety.getTTL(tenantId, gran, rollupType);
return getTimeValue(primaryValue, safetyValue);
}
public long getFinalTTL(String tenantid, Granularity gran) {
long ttl;
if (gran == Granularity.FULL && primary.areTTLsForced()) {
ttl = primary.getConfigTTLForIngestion().toMillis();
} else {
ttl = safety.getTTL(tenantid, gran, RollupType.BF_BASIC).get().toMillis();
}
return ttl;
}
private Optional<TimeValue> getTimeValue(Optional<TimeValue> primaryValue, Optional<TimeValue> safetyValue) {
if (!primaryValue.isPresent()) {
return safetyValue;
}
return primaryValue;
}
}