]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/ReadGraphImpl.java
Truncate size of the binary file
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / graph / ReadGraphImpl.java
index 77af46d557e740e8d73e4bc9c9252b2adb7e7a98..79fe974642d2a71e66054fe6de5d00a60424b7bf 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;
@@ -46,6 +45,7 @@ import org.simantics.databoard.type.Datatype;
 import org.simantics.databoard.util.binary.BinaryFile;
 import org.simantics.databoard.util.binary.RandomAccessBinary;
 import org.simantics.db.AsyncReadGraph;
+import org.simantics.db.ComputationalValue;
 import org.simantics.db.DevelopmentKeys;
 import org.simantics.db.ExternalValueSupport;
 import org.simantics.db.ReadGraph;
@@ -135,7 +135,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 +1106,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 +1119,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 +3533,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 +3555,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 +4267,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
@@ -5917,6 +5914,8 @@ public class ReadGraphImpl implements AsyncReadGraph {
             }
             Serializer serializer = binding.serializer();
             byte[] bytes = serializer.serialize(initialValue);
+            // In case the file has been previously accessed and was larger we set the correct size now
+            rd.binaryFile.setLength(bytes.length);
             rd.binaryFile.write(bytes);
             ravs.put(resource, rd);
             return rd;
@@ -6106,12 +6105,18 @@ public class ReadGraphImpl implements AsyncReadGraph {
                        return getValue(r, binding);
                }
        } else if(types.contains(L0.ExternalValue)) {
-               try {
-                       return (T)ReflectionUtils.getValue(getURI(r)).getValue();
-               } catch(ValueNotFoundException e) {
-                       throw new DatabaseException(e);
-               } catch(ClassCastException e) {
-                       throw new DatabaseException(e);
+               ComputationalValue cv = syncRequest(new PossibleAdapter<ComputationalValue>(r, ComputationalValue.class), TransientCacheAsyncListener.instance());
+               if(cv != null) {
+                       return cv.getValue(this, r);
+               } else {
+                       // This should not even be possible since L0 defines an adapter for all values
+                       try {
+                               return (T)ReflectionUtils.getValue(getURI(r)).getValue();
+                       } catch(ValueNotFoundException e) {
+                               throw new DatabaseException(e);
+                       } catch(ClassCastException e) {
+                               throw new DatabaseException(e);
+                       }
                }
        }
        else {