Skip to content

Commit 88ddb3d

Browse files
committed
650 - filestore message length fix
1 parent 8bae003 commit 88ddb3d

File tree

5 files changed

+57
-41
lines changed

5 files changed

+57
-41
lines changed

quickfixj-core/src/main/java/quickfix/CachedFileStore.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.io.BufferedOutputStream;
2929
import java.io.DataInputStream;
3030
import java.io.DataOutputStream;
31+
import java.io.EOFException;
3132
import java.io.File;
3233
import java.io.FileInputStream;
3334
import java.io.FileOutputStream;
@@ -86,8 +87,6 @@ public class CachedFileStore implements MessageStore {
8687

8788
private FileOutputStream headerFileOutputStream;
8889

89-
private final String charsetEncoding = CharsetSupport.getCharset();
90-
9190
CachedFileStore(String path, SessionID sessionID, boolean syncWrites) throws IOException {
9291
this.syncWrites = syncWrites;
9392

@@ -308,16 +307,15 @@ public boolean get(int sequence, String message) {
308307
throw new UnsupportedOperationException("not supported");
309308
}
310309

311-
private String read(long offset, long size) throws IOException {
312-
final byte[] data = new byte[(int) size];
313-
314-
messageFileReader.seek(offset);
315-
if (messageFileReader.read(data) != size) {
316-
throw new IOException("Truncated input while reading message: "
317-
+ new String(data, charsetEncoding));
310+
private String read(long offset, int size) throws IOException {
311+
try {
312+
final byte[] data = new byte[size];
313+
messageFileReader.seek(offset);
314+
messageFileReader.readFully(data);
315+
return new String(data, CharsetSupport.getCharset());
316+
} catch (EOFException eofe) { // can't read fully
317+
throw new IOException("Truncated input while reading message: offset=" + offset + ", expected size=" + size, eofe);
318318
}
319-
320-
return new String(data, charsetEncoding);
321319
}
322320

323321
private Collection<String> getMessage(long startSequence, long endSequence) throws IOException {
@@ -326,7 +324,7 @@ private Collection<String> getMessage(long startSequence, long endSequence) thro
326324
final List<long[]> offsetAndSizes = messageIndex.get(startSequence, endSequence);
327325
for (final long[] offsetAndSize : offsetAndSizes) {
328326
if (offsetAndSize != null) {
329-
final String message = read(offsetAndSize[0], offsetAndSize[1]);
327+
final String message = read(offsetAndSize[0], (int) offsetAndSize[1]);
330328
messages.add(message);
331329
}
332330
}
@@ -341,7 +339,8 @@ private Collection<String> getMessage(long startSequence, long endSequence) thro
341339
*/
342340
public boolean set(int sequence, String message) throws IOException {
343341
final long offset = messageFileWriter.getFilePointer();
344-
final int size = message.length();
342+
final byte[] messageBytes = message.getBytes(CharsetSupport.getCharset());
343+
final int size = messageBytes.length;
345344
messageIndex.put((long) sequence, new long[] { offset, size });
346345
headerDataOutputStream.writeInt(sequence);
347346
headerDataOutputStream.writeLong(offset);
@@ -350,7 +349,7 @@ public boolean set(int sequence, String message) throws IOException {
350349
if (syncWrites) {
351350
headerFileOutputStream.getFD().sync();
352351
}
353-
messageFileWriter.write(message.getBytes(CharsetSupport.getCharset()));
352+
messageFileWriter.write(messageBytes);
354353
return true;
355354
}
356355

quickfixj-core/src/main/java/quickfix/FileStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ private String getMessage(long offset, int size, int i) throws IOException {
362362
@Override
363363
public boolean set(int sequence, String message) throws IOException {
364364
final long offset = messageFileWriter.getFilePointer();
365-
byte[] messageBytes = message.getBytes(CharsetSupport.getCharset());
365+
final byte[] messageBytes = message.getBytes(CharsetSupport.getCharset());
366366
final int size = messageBytes.length;
367367
if (messageIndex != null) {
368368
updateMessageIndex(sequence, offset, size);

quickfixj-core/src/test/java/quickfix/AbstractMessageStoreTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@
2020
package quickfix;
2121

2222
import junit.framework.TestCase;
23+
import org.quickfixj.CharsetSupport;
2324

2425
import java.io.IOException;
2526
import java.util.ArrayList;
27+
import java.util.List;
2628

2729
public abstract class AbstractMessageStoreTest extends TestCase {
30+
2831
private SessionID sessionID;
2932
private MessageStore store;
3033

@@ -167,6 +170,44 @@ public void testRefreshMessageStore() throws Exception {
167170
}
168171
}
169172

173+
public void testSetAndGetMessageWithAsciiCharacters() throws IOException {
174+
MessageStore underTest = getStore();
175+
176+
if (underTest instanceof SleepycatStore) {
177+
return;
178+
}
179+
180+
underTest.set(1, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789");
181+
182+
List<String> messages = new ArrayList<>();
183+
underTest.get(1, 1, messages);
184+
185+
assertEquals(1, messages.size());
186+
assertEquals("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789", messages.get(0));
187+
}
188+
189+
public void testSetAndGetMessageWithUnicodeCharacters() throws IOException {
190+
MessageStore underTest = getStore();
191+
192+
if (underTest instanceof SleepycatStore) {
193+
return;
194+
}
195+
196+
CharsetSupport.setCharset("UTF-8");
197+
198+
try {
199+
underTest.set(1, "a \u00A9 \u2603 \uD834\uDF06");
200+
201+
List<String> messages = new ArrayList<>();
202+
underTest.get(1, 1, messages);
203+
204+
assertEquals(1, messages.size());
205+
assertEquals("a \u00A9 \u2603 \uD834\uDF06", messages.get(0));
206+
} finally {
207+
CharsetSupport.setDefaultCharset();
208+
}
209+
}
210+
170211
protected void closeMessageStore(MessageStore store) throws IOException {
171212
// does nothing, by default
172213
}

quickfixj-core/src/test/java/quickfix/FileStoreTest.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -123,28 +123,4 @@ public void testResetShouldNeverFail() throws Exception {
123123
thread.interrupt();
124124
thread.join();
125125
}
126-
127-
public void testSetAndGetMessageWithAsciiCharacters() throws IOException {
128-
MessageStore underTest = getStore();
129-
underTest.set(1, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789");
130-
131-
List<String> messages = new ArrayList<>();
132-
underTest.get(1, 1, messages);
133-
134-
assertEquals(1, messages.size());
135-
assertEquals("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789", messages.get(0));
136-
}
137-
138-
public void testSetAndGetMessageWithUnicodeCharacters() throws IOException {
139-
CharsetSupport.setCharset("UTF-8");
140-
141-
MessageStore underTest = getStore();
142-
underTest.set(1, "a \u00A9 \u2603 \uD834\uDF06");
143-
144-
List<String> messages = new ArrayList<>();
145-
underTest.get(1, 1, messages);
146-
147-
assertEquals(1, messages.size());
148-
assertEquals("a \u00A9 \u2603 \uD834\uDF06", messages.get(0));
149-
}
150126
}

quickfixj-core/src/test/java/quickfix/SleepycatStoreTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
import java.io.IOException;
2424

2525
public class SleepycatStoreTest extends AbstractMessageStoreTest {
26-
protected MessageStoreFactory getMessageStoreFactory() throws ConfigError, FieldConvertError {
26+
27+
protected MessageStoreFactory getMessageStoreFactory() throws ConfigError {
2728
SessionSettings settings = new SessionSettings(getConfigurationFileName());
2829
File tmpfile;
2930
try {
@@ -62,5 +63,4 @@ public void testCloseAndOpen() throws Exception {
6263
assertEquals(123, store.getNextSenderMsgSeqNum());
6364
assertEquals(321, store.getNextTargetMsgSeqNum());
6465
}
65-
6666
}

0 commit comments

Comments
 (0)