blob: 100843915af26d82459cd1dc19c8f562efc4eef3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.core.rest.admin;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.xml.bind.DatatypeConverter;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.eclipse.skalli.commons.CollectionUtils;
public class BackupQuery {
public static final String PARAM_ALL = "all"; //$NON-NLS-1$
public static final String PARAM_PERIOD = "period"; //$NON-NLS-1$
public static final String PARAM_FROM = "from"; //$NON-NLS-1$
public static final String PARAM_TO = "to"; //$NON-NLS-1$
public static final String PARAM_INCLUDE = "include"; //$NON-NLS-1$
public static final String PARAM_EXCLUDE = "exclude"; //$NON-NLS-1$
public static final String PARAM_FILTERS = "filters"; //$NON-NLS-1$
private String unitSymbols = "dDhHmM"; //$NON-NLS-1$
private long period = 0;
private long from = 0;
private long to = 0;
private Set<String> included;
private Set<String> excluded;
private Set<String> filters;
public BackupQuery(Map<String, String> params) {
this(params, System.currentTimeMillis());
}
BackupQuery(Map<String, String> params, long now) {
if (!params.containsKey(PARAM_ALL)) {
period = Math.abs(getTimeInterval(params.get(PARAM_PERIOD)));
from = parseDateTime(params.get(PARAM_FROM), now);
to = parseDateTime(params.get(PARAM_TO), now);
if (from <= 0 && to <= 0) {
to = now;
from = period != 0 ? to - period : to - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
} else if (from > 0 && to <= 0) {
to = period != 0 ? from + period : now;
} else if (from <= 0 && to > 0) {
from = period != 0 ? to - period : 0;
} else {
// both from/to given: ignore period
}
from = Math.min(now, from);
to = Math.min(now, to);
if (from > to) {
from = to;
}
} else { // all
from = 0;
to = 0;
}
included = CollectionUtils.asSet(StringUtils.split(params.get(PARAM_INCLUDE), ','));
excluded = CollectionUtils.asSet(StringUtils.split(params.get(PARAM_EXCLUDE), ','));
filters = CollectionUtils.asSet(StringUtils.split(params.get(PARAM_FILTERS), ','));
if (filters.contains("summary")) { //$NON-NLS-1$
setFilter("summary"); //$NON-NLS-1$
}
}
private long getTimeInterval(String param) {
long timeInterval = 0;
if (StringUtils.isNotBlank(param)) {
int defaultValue = 0;
TimeUnit unit = TimeUnit.DAYS;
char unitSymbol = param.charAt(param.length() - 1);
if (unitSymbols.indexOf(unitSymbol) >=0 ) {
if (unitSymbol == 'h' || unitSymbol == 'H') {
unit = TimeUnit.HOURS;
} else if (unitSymbol == 'm' || unitSymbol == 'M') {
unit = TimeUnit.MINUTES;
}
param = StringUtils.chop(param);
defaultValue = 1;
}
int value = NumberUtils.toInt(param, defaultValue);
if (value != 0) {
timeInterval = TimeUnit.MILLISECONDS.convert(value, unit);
}
}
return timeInterval;
}
private long parseDateTime(String s, long now) {
long dateTime = 0;
if (StringUtils.isNotBlank(s)) {
try {
dateTime = DatatypeConverter.parseDateTime(s).getTimeInMillis();
} catch (IllegalArgumentException e) {
if ("now".equalsIgnoreCase(s)) { //$NON-NLS-1$
dateTime = now;
} else if (s.startsWith("-")) { //$NON-NLS-1$
//check if s is something like "-7d" indicating a time interval
long duration = getTimeInterval(s);
dateTime = duration < 0 ? now + duration : 0;
}
}
}
return dateTime;
}
public long getFrom() {
return from;
}
public long getTo() {
return to;
}
public void setFilter(String filter) {
filters = CollectionUtils.asSet(filter);
}
public void setSection(String section) {
included = CollectionUtils.asSet(section);
excluded = Collections.emptySet();
}
public Set<String> getIncluded() {
return included;
}
public Set<String> getExcluded() {
return excluded;
}
public boolean showSection(String sectionName) {
if (excluded.contains(sectionName)) {
return false;
}
if (included.isEmpty()) {
return true;
}
return included.contains(sectionName);
}
public boolean showByFilter(String filterName) {
return filters.isEmpty() || filters.contains(filterName);
}
public boolean inRange(long timestamp) {
return (from <= 0 || from <= timestamp) && (to <= 0 || timestamp <= to);
}
}