More debug information for BufferUnderflowException in ReadGraphImpl 87/2287/5
authorjsimomaa <jani.simomaa@gmail.com>
Tue, 9 Oct 2018 07:32:06 +0000 (10:32 +0300)
committerJani Simomaa <jani.simomaa@semantum.fi>
Tue, 9 Oct 2018 07:53:26 +0000 (07:53 +0000)
gitlab #144

Change-Id: Idca98155061c535d54465e29f682694a6f7449d8

bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/ReadGraphImpl.java

index 77af46d557e740e8d73e4bc9c9252b2adb7e7a98..3feb22e00ebda688379b6ed7c8785b09fb8035ca 100644 (file)
@@ -18,7 +18,6 @@ import java.io.IOException;
 import java.io.PrintStream;
 import java.lang.reflect.Array;
 import java.lang.reflect.InvocationTargetException;
-import java.nio.BufferUnderflowException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -135,7 +134,6 @@ import org.simantics.db.exception.NoSingleResultException;
 import org.simantics.db.exception.ResourceNotFoundException;
 import org.simantics.db.exception.ServiceException;
 import org.simantics.db.exception.ValidationException;
-import org.simantics.db.impl.BlockingAsyncProcedure;
 import org.simantics.db.impl.RelationContextImpl;
 import org.simantics.db.impl.ResourceImpl;
 import org.simantics.db.impl.internal.RandomAccessValueSupport;
@@ -1107,9 +1105,10 @@ public class ReadGraphImpl implements AsyncReadGraph {
 
                assert (subject != null);
 
+               byte[] bytes = null;
                try {
                        
-                       byte[] bytes = processor.getValue(this, subject);
+                       bytes = processor.getValue(this, subject);
                        if (bytes == null) throw new DoesNotContainValueException("No value for resource " + subject);
 
                        Serializer serializer = getSerializer(binding);
@@ -1119,20 +1118,9 @@ public class ReadGraphImpl implements AsyncReadGraph {
 
                        throw new DoesNotContainValueException(e);
 
-               } catch (IOException e) {
-
-                       throw new ServiceException(e);
-
-               } catch (DatabaseException e) {
-                   
-            throw new ServiceException(e);
-            
-        } catch (BufferUnderflowException e) {
-            // This is sometimes thrown when deserialize fails because wrong format.
-            // For callers of this method this is just an service exception.
-            throw new ServiceException(e);
-        }
-
+               } catch (Throwable t) {
+                       throw new ServiceException("Could not getValue for subject " + debugString(subject) + " and binding " + String.valueOf(binding) + " with bytes " + safeArrayToString(bytes), t);
+               }
        }
 
        @Override
@@ -3544,14 +3532,9 @@ public class ReadGraphImpl implements AsyncReadGraph {
 //                                     else
                                                procedure.execute(graph, (T) obj);
 
-                               } catch (IOException e) {
-                                       procedure.exception(graph, e);
-                               } catch (BufferUnderflowException e) {
-                                       procedure.exception(graph, e);
                                } catch (Throwable t) {
-                                       procedure.exception(graph, t);
+                                   procedure.exception(graph, new ServiceException("Could not forValue for subject " + debugString(resource) + " and binding " + String.valueOf(binding) + " with bytes " + safeArrayToString(result), t));
                                }
-
                        }
 
                        @Override
@@ -3571,6 +3554,24 @@ public class ReadGraphImpl implements AsyncReadGraph {
                });
 
        }
+       
+    private static String safeArrayToString(byte[] a) {
+        if (a == null)
+            return "null";
+        int iMax = a.length - 1;
+        if (iMax == -1)
+            return "[]";
+
+        StringBuilder b = new StringBuilder();
+        b.append('[');
+        for (int i = 0; i < 100; i++) { // limit to first 100 items 
+            b.append(a[i]);
+            if (i == iMax)
+                return b.append(']').toString();
+            b.append(", ");
+        }
+        return b.append(", ... (" + a.length + ")]").toString();
+    }
 
        @Override
        public <T> void forValue(Resource subject, Binding binding,
@@ -4265,14 +4266,9 @@ public class ReadGraphImpl implements AsyncReadGraph {
                                        else
                                                procedure.execute(graph, (T) obj);
 
-                               } catch (IOException e) {
-                                       procedure.exception(graph, e);
-                               } catch (BufferUnderflowException e) {
-                                       procedure.exception(graph, e);
                                } catch (Throwable t) {
-                                       procedure.exception(graph, t);
+                                       procedure.exception(graph, new ServiceException("Could not forValue for subject " + debugString(resource) + " and binding " + String.valueOf(binding) + " with bytes " + safeArrayToString(result), t));
                                }
-
                        }
 
                        @Override