blob: 9d828e9f726de2396397e4b702c37ed853fe3d4e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.cocoon.util;
/**
* @author <a href="mailto:stuart.roebuck@adolos.co.uk">Stuart Roebuck</a>
* @version CVS $Id$
*/
final public class ByteRange {
private final long start;
private final long end;
public ByteRange(long start, long end) {
this.start = start;
this.end = end;
}
public ByteRange(String string) throws NumberFormatException {
string = string.trim();
int dashPos = string.indexOf('-');
int length = string.length();
if (string.indexOf(',') != -1) {
throw new NumberFormatException("Simple ByteRange String contains a comma.");
}
if (dashPos > 0) {
this.start = Integer.parseInt(string.substring(0, dashPos));
} else {
this.start = Long.MIN_VALUE;
}
if (dashPos < length - 1) {
this.end = Integer.parseInt(string.substring(dashPos + 1, length));
} else {
this.end = Long.MAX_VALUE;
}
if (this.start > this.end) {
throw new NumberFormatException("Start value is greater than end value.");
}
}
public long getStart() {
return this.start;
}
public long getEnd() {
return this.end;
}
public long length() {
if (this.start == Long.MIN_VALUE || this.end == Long.MAX_VALUE) {
return -1;
}
return this.end - this.start + 1;
}
public ByteRange intersection(ByteRange range) {
if (range.end < this.start || this.end < range.start) {
return null;
} else {
long start = (this.start > range.start) ? this.start : range.start;
long end = (this.end < range.end) ? this.end : range.end;
return new ByteRange(start, end);
}
}
public String toString() {
return this.start + "-" + this.end;
}
}