package me.test.first.spring.rs.http;
import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
/**
*
* <ul>
* <li>{@code Range: items=0-9} : 前10条记录</li>
* <li>{@code Range: items=0-} : 全部记录</li>
* <li>{@code Range: items=10-} : 从第11条记录开始到末尾</li>
* </ul>
*
*
* @author zhangliangliang
*
*/
// for http request header
public class Range implements Serializable {
private static final long serialVersionUID = 1L;
private static final Pattern p = Pattern.compile("\\s*items\\s*=\\s*(\\d*)\\s*-\\s*(\\d*)?\\s*",
Pattern.CASE_INSENSITIVE);
// required (inclusive) : must not be null or minus
private Integer start;
// optional (inclusive) : null means to end
private Integer end;
public Range() {
super();
}
public Range(Integer start, Integer end) {
Assert.notNull(start);
Assert.isTrue(start >= 0, "Range start value must be equal or bigger than 0.");
if (end != null) {
Assert.isTrue(end >= start,
"Range end value must be null, or equal or bigger than start value.");
}
this.start = start;
this.end = end;
}
public Range(Integer start) {
this(start, null);
}
public static Range valueOf(String value) {
Assert.notNull(value);
Matcher matcher = p.matcher(value);
Assert.isTrue(matcher.matches(), "Invalid http Range header");
String startStr = matcher.group(1);
String endStr = matcher.group(2);
Integer start = Integer.valueOf(startStr);
Integer end = null;
if (StringUtils.isNotEmpty(endStr)) {
end = Integer.valueOf(endStr);
}
return new Range(start, end);
}
public Integer getStart() {
return start;
}
public Integer getEnd() {
return end;
}
@Override
public String toString() {
if (this.end == null) {
return String.format("items=%d-", this.start);
}
return String.format("items=%d-%d", this.start, this.end);
}
public static void main(String[] args) {
System.out.println(Range.valueOf(" items = 4 - 9 ").toString());
System.out.println(Range.valueOf(" items = 4 - ").toString());
}
}