]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - src/com/hughes/android/dictionary/engine/Dictionary.java
Make more robust by catching some exceptions.
[Dictionary.git] / src / com / hughes / android / dictionary / engine / Dictionary.java
index b9a46a01545c19d7eed612d84266e69a0e52ee17..03984315afa7ef2921390fbbfcd14c3a91b22b30 100644 (file)
@@ -20,6 +20,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.io.RandomAccessFile;
+import java.nio.BufferUnderflowException;
 import java.nio.MappedByteBuffer;
 import java.nio.channels.FileChannel;
 import java.util.ArrayList;
@@ -31,9 +32,8 @@ import com.hughes.util.CachingList;
 import com.hughes.util.DataInputBuffer;
 import com.hughes.util.raf.RAFList;
 import com.hughes.util.raf.RAFListSerializer;
-import com.hughes.util.raf.RAFSerializable;
 
-public class Dictionary implements RAFSerializable<Dictionary> {
+public class Dictionary {
 
     private static final int CACHE_SIZE = 5000;
 
@@ -119,7 +119,6 @@ public class Dictionary implements RAFSerializable<Dictionary> {
         }
     }
 
-    @Override
     public void write(DataOutput out) throws IOException {
         RandomAccessFile raf = (RandomAccessFile)out;
         if (dictFileVersion < 7) throw new RuntimeException("write function cannot write formats older than v7!");
@@ -190,6 +189,14 @@ public class Dictionary implements RAFSerializable<Dictionary> {
         return result;
     }
 
+    // get DictionaryInfo for case when Dictionary cannot be opened
+    private static DictionaryInfo getErrorDictionaryInfo(final File file) {
+        final DictionaryInfo dictionaryInfo = new DictionaryInfo();
+        dictionaryInfo.uncompressedFilename = file.getName();
+        dictionaryInfo.uncompressedBytes = file.length();
+        return dictionaryInfo;
+    }
+
     public static DictionaryInfo getDictionaryInfo(final File file) {
         RandomAccessFile raf = null;
         try {
@@ -201,10 +208,15 @@ public class Dictionary implements RAFSerializable<Dictionary> {
             raf.close();
             return dictionaryInfo;
         } catch (IOException e) {
-            final DictionaryInfo dictionaryInfo = new DictionaryInfo();
-            dictionaryInfo.uncompressedFilename = file.getName();
-            dictionaryInfo.uncompressedBytes = file.length();
-            return dictionaryInfo;
+            return getErrorDictionaryInfo(file);
+        } catch (IllegalArgumentException e) {
+            // Most likely due to a Buffer.limit beyond size of file,
+            // do not crash just because of a truncated dictionary file
+            return getErrorDictionaryInfo(file);
+        } catch (BufferUnderflowException e) {
+            // Most likely due to a read beyond the buffer limit set,
+            // do not crash just because of a truncated or corrupt dictionary file
+            return getErrorDictionaryInfo(file);
         } finally {
             if (raf != null) {
                 try {