Merge "Support optional values in ProcFileReader."

This commit is contained in:
Jeff Sharkey
2013-02-01 02:28:16 +00:00
committed by Android (Google) Code Review
2 changed files with 57 additions and 9 deletions

View File

@@ -19,6 +19,7 @@ package com.android.internal.util;
import java.io.Closeable; import java.io.Closeable;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.ProtocolException;
import java.nio.charset.Charsets; import java.nio.charset.Charsets;
/** /**
@@ -82,12 +83,15 @@ public class ProcFileReader implements Closeable {
} }
/** /**
* Find buffer index of next token delimiter, usually space or newline. Will * Find buffer index of next token delimiter, usually space or newline.
* fill buffer as needed. * Fills buffer as needed.
*
* @return Index of next delimeter, otherwise -1 if no tokens remain on
* current line.
*/ */
private int nextTokenIndex() throws IOException { private int nextTokenIndex() throws IOException {
if (mLineFinished) { if (mLineFinished) {
throw new IOException("no tokens remaining on current line"); return -1;
} }
int i = 0; int i = 0;
@@ -105,7 +109,7 @@ public class ProcFileReader implements Closeable {
} }
} while (fillBuf() > 0); } while (fillBuf() > 0);
throw new IOException("end of stream while looking for token boundary"); throw new ProtocolException("End of stream while looking for token boundary");
} }
/** /**
@@ -136,7 +140,7 @@ public class ProcFileReader implements Closeable {
} }
} while (fillBuf() > 0); } while (fillBuf() > 0);
throw new IOException("end of stream while looking for line boundary"); throw new ProtocolException("End of stream while looking for line boundary");
} }
/** /**
@@ -144,9 +148,11 @@ public class ProcFileReader implements Closeable {
*/ */
public String nextString() throws IOException { public String nextString() throws IOException {
final int tokenIndex = nextTokenIndex(); final int tokenIndex = nextTokenIndex();
final String s = new String(mBuffer, 0, tokenIndex, Charsets.US_ASCII); if (tokenIndex == -1) {
consumeBuf(tokenIndex + 1); throw new ProtocolException("Missing required string");
return s; } else {
return parseAndConsumeString(tokenIndex);
}
} }
/** /**
@@ -154,6 +160,33 @@ public class ProcFileReader implements Closeable {
*/ */
public long nextLong() throws IOException { public long nextLong() throws IOException {
final int tokenIndex = nextTokenIndex(); final int tokenIndex = nextTokenIndex();
if (tokenIndex == -1) {
throw new ProtocolException("Missing required long");
} else {
return parseAndConsumeLong(tokenIndex);
}
}
/**
* Parse and return next token as base-10 encoded {@code long}, or return
* the given default value if no remaining tokens on current line.
*/
public long nextOptionalLong(long def) throws IOException {
final int tokenIndex = nextTokenIndex();
if (tokenIndex == -1) {
return def;
} else {
return parseAndConsumeLong(tokenIndex);
}
}
private String parseAndConsumeString(int tokenIndex) throws IOException {
final String s = new String(mBuffer, 0, tokenIndex, Charsets.US_ASCII);
consumeBuf(tokenIndex + 1);
return s;
}
private long parseAndConsumeLong(int tokenIndex) throws IOException {
final boolean negative = mBuffer[0] == '-'; final boolean negative = mBuffer[0] == '-';
// TODO: refactor into something like IntegralToString // TODO: refactor into something like IntegralToString
@@ -193,6 +226,7 @@ public class ProcFileReader implements Closeable {
return (int) value; return (int) value;
} }
@Override
public void close() throws IOException { public void close() throws IOException {
mStream.close(); mStream.close();
} }

View File

@@ -134,7 +134,7 @@ public class ProcFileReaderTest extends AndroidTestCase {
fail("somehow read a string value?"); fail("somehow read a string value?");
} catch (IOException e) { } catch (IOException e) {
// expected // expected
assertTrue(e.getMessage().contains("end of stream")); assertTrue(e.getMessage().contains("End of stream"));
} }
} }
@@ -152,6 +152,20 @@ public class ProcFileReaderTest extends AndroidTestCase {
} }
} }
public void testOptionalLongs() throws Exception {
final ProcFileReader reader = buildReader("123 456\n789\n");
assertEquals(123L, reader.nextLong());
assertEquals(456L, reader.nextOptionalLong(-1L));
assertEquals(-1L, reader.nextOptionalLong(-1L));
assertEquals(-1L, reader.nextOptionalLong(-1L));
assertEquals(-1L, reader.nextOptionalLong(-1L));
reader.finishLine();
assertEquals(789L, reader.nextOptionalLong(-1L));
assertEquals(-1L, reader.nextOptionalLong(-1L));
}
private static ProcFileReader buildReader(String string) throws IOException { private static ProcFileReader buildReader(String string) throws IOException {
return buildReader(string, 2048); return buildReader(string, 2048);
} }