gradually increase buffer size when binary querying connections

This commit is contained in:
Andreas Schildbach 2013-06-07 13:47:45 +02:00
parent ad603f8bd8
commit 1cf7d3e9e9

View file

@ -21,6 +21,7 @@ import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.Reader; import java.io.Reader;
import java.nio.charset.Charset; import java.nio.charset.Charset;
@ -115,12 +116,14 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
public final String ident; public final String ident;
public final int seqNr; public final int seqNr;
public final String ld; public final String ld;
public final int usedBufferSize;
public QueryConnectionsBinaryContext(final String ident, final int seqNr, final String ld) public QueryConnectionsBinaryContext(final String ident, final int seqNr, final String ld, final int usedBufferSize)
{ {
this.ident = ident; this.ident = ident;
this.seqNr = seqNr; this.seqNr = seqNr;
this.ld = ld; this.ld = ld;
this.usedBufferSize = usedBufferSize;
} }
public boolean canQueryLater() public boolean canQueryLater()
@ -1496,6 +1499,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
{ {
} }
private final static int QUERY_CONNECTIONS_BINARY_BUFFER_SIZE = 128 * 1024;
protected final QueryConnectionsResult queryConnectionsBinary(Location from, Location via, Location to, final Date date, final boolean dep, protected final QueryConnectionsResult queryConnectionsBinary(Location from, Location via, Location to, final Date date, final boolean dep,
final int maxNumConnections, final Collection<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final int maxNumConnections, final Collection<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility,
final Set<Option> options) throws IOException final Set<Option> options) throws IOException
@ -1536,7 +1541,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
appendConnectionsQueryUri(uri, from, via, to, date, dep, products, accessibility, options); appendConnectionsQueryUri(uri, from, via, to, date, dep, products, accessibility, options);
appendCustomConnectionsQueryBinaryUri(uri); appendCustomConnectionsQueryBinaryUri(uri);
return queryConnectionsBinary(uri.toString(), from, via, to); return queryConnectionsBinary(uri.toString(), from, via, to, QUERY_CONNECTIONS_BINARY_BUFFER_SIZE);
} }
protected QueryConnectionsResult queryMoreConnectionsBinary(final QueryConnectionsContext contextObj, final boolean later, protected QueryConnectionsResult queryMoreConnectionsBinary(final QueryConnectionsContext contextObj, final boolean later,
@ -1552,11 +1557,24 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
uri.append("&REQ0HafasScrollDir=").append(later ? 1 : 2); uri.append("&REQ0HafasScrollDir=").append(later ? 1 : 2);
appendCustomConnectionsQueryBinaryUri(uri); appendCustomConnectionsQueryBinaryUri(uri);
return queryConnectionsBinary(uri.toString(), null, null, null); return queryConnectionsBinary(uri.toString(), null, null, null, QUERY_CONNECTIONS_BINARY_BUFFER_SIZE + context.usedBufferSize);
} }
private QueryConnectionsResult queryConnectionsBinary(final String uri, final Location from, final Location via, final Location to) private class CustomBufferedInputStream extends BufferedInputStream
throws IOException {
public CustomBufferedInputStream(final InputStream in)
{
super(in);
}
public int getCount()
{
return count;
}
}
private QueryConnectionsResult queryConnectionsBinary(final String uri, final Location from, final Location via, final Location to,
final int expectedBufferSize) throws IOException
{ {
/* /*
* Many thanks to Malte Starostik and Robert, who helped a lot with analyzing this API! * Many thanks to Malte Starostik and Robert, who helped a lot with analyzing this API!
@ -1568,8 +1586,9 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
try try
{ {
is = new LittleEndianDataInputStream(new BufferedInputStream(ParserUtils.scrapeInputStream(uri))); final CustomBufferedInputStream bis = new CustomBufferedInputStream(ParserUtils.scrapeInputStream(uri));
is.mark(256 * 1024); is = new LittleEndianDataInputStream(bis);
is.mark(expectedBufferSize);
// quick check of status // quick check of status
final int version = is.readShortReverse(); final int version = is.readShortReverse();
@ -1934,7 +1953,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
} }
final QueryConnectionsResult result = new QueryConnectionsResult(header, uri, from, via, to, new QueryConnectionsBinaryContext( final QueryConnectionsResult result = new QueryConnectionsResult(header, uri, from, via, to, new QueryConnectionsBinaryContext(
requestId, seqNr, ld), connections); requestId, seqNr, ld, bis.getCount()), connections);
return result; return result;
} }