001/*
002 * (C) Copyright 2017 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     bdelbosc
018 */
019package org.nuxeo.lib.stream.log.chronicle;
020
021import net.openhft.chronicle.queue.RollCycle;
022import net.openhft.chronicle.queue.RollCycles;
023
024/**
025 * @since 9.3
026 */
027public class ChronicleRetentionDuration {
028
029    protected static final String SECOND_ROLLING_PERIOD = "s";
030
031    protected static final String MINUTE_ROLLING_PERIOD = "m";
032
033    protected static final String HOUR_ROLLING_PERIOD = "h";
034
035    protected static final String DAY_ROLLING_PERIOD = "d";
036
037    protected final RollCycle rollCycle;
038
039    protected final int retentionCycles;
040
041    protected final String retention;
042
043    public static final ChronicleRetentionDuration DISABLE = new ChronicleRetentionDuration("0d");
044
045    public ChronicleRetentionDuration(String retention) {
046        this.retention = retention;
047        this.rollCycle = decodeRollCycle(retention);
048        this.retentionCycles = decodeRetentionCycles(retention);
049    }
050
051    @Override
052    public String toString() {
053        return disable() ? "disabled" : retention;
054    }
055
056    public boolean disable() {
057        return retentionCycles <= 0;
058    }
059
060    public RollCycle getRollCycle() {
061        return rollCycle;
062    }
063
064    @SuppressWarnings("unused")
065    public String getRetention() {
066        return retention;
067    }
068
069    public int getRetentionCycles() {
070        return retentionCycles;
071    }
072
073    protected RollCycle decodeRollCycle(String retentionDuration) {
074        if (retentionDuration == null || retentionDuration.isEmpty()) {
075            return RollCycles.DAILY;
076        }
077        String rollingPeriod = retentionDuration.substring(retentionDuration.length() - 1);
078        switch (rollingPeriod) {
079        case SECOND_ROLLING_PERIOD:
080            return RollCycles.TEST_SECONDLY;
081        case MINUTE_ROLLING_PERIOD:
082            return RollCycles.MINUTELY;
083        case HOUR_ROLLING_PERIOD:
084            return RollCycles.HOURLY;
085        case DAY_ROLLING_PERIOD:
086            return RollCycles.DAILY;
087        default:
088            String msg = "Unknown rolling period: " + rollingPeriod;
089            throw new IllegalArgumentException(msg);
090        }
091    }
092
093    protected int decodeRetentionCycles(String retentionDuration) {
094        if (retentionDuration != null) {
095            return Integer.parseInt(retentionDuration.substring(0, retentionDuration.length() - 1));
096        }
097        return 0;
098    }
099
100}