package io.dropwizard.servlets.assets; import javax.annotation.concurrent.Immutable; import java.util.Objects; @Immutable public final class ByteRange { private final int start; private final int end; public ByteRange(final int start, final int end) { this.start = start; this.end = end; } public int getStart() { return start; } public int getEnd() { return end; } public static ByteRange parse(final String byteRange, final int resourceLength) { // missing separator if (!byteRange.contains("-")) { final int start = Integer.parseInt(byteRange); return new ByteRange(start, resourceLength - 1); } // negative range if (byteRange.indexOf("-") == 0) { final int start = Integer.parseInt(byteRange); return new ByteRange(resourceLength + start, resourceLength - 1); } final String[] parts = byteRange.split("-"); if (parts.length == 2) { final int start = Integer.parseInt(parts[0]); int end = Integer.parseInt(parts[1]); if (end > resourceLength) { end = resourceLength - 1; } return new ByteRange(start, end); } else { final int start = Integer.parseInt(parts[0]); return new ByteRange(start, resourceLength - 1); } } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if ((obj == null) || (getClass() != obj.getClass())) { return false; } final ByteRange other = (ByteRange) obj; return Objects.equals(start, other.start) && Objects.equals(end, other.end); } @Override public int hashCode() { return Objects.hash(start, end); } @Override public String toString() { return String.format("%d-%d", start, end); } }