]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graph.db/src/org/simantics/graph/db/StreamingTransferableGraphImportProcess.java
Added null check to StreamingTransferableGraphImportProcess
[simantics/platform.git] / bundles / org.simantics.graph.db / src / org / simantics / graph / db / StreamingTransferableGraphImportProcess.java
index 3599eefc0ecc81c9cb6d012bf31415f48bcfc34f..78c369f96679f9ba467b76df8bdc9f074d28e503 100644 (file)
@@ -72,6 +72,7 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
        TransferableGraphSource tg;
        VirtualGraph vg;
        IImportAdvisor2 advisor;
+       TGStatusMonitor monitor;
        ClusterBuilder2 builder;
        final TGResourceUtil resourceUtil = new TGResourceUtil();
 
@@ -99,9 +100,25 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
        Resource NameOf;        
 
        public StreamingTransferableGraphImportProcess(Session session, VirtualGraph vg, TransferableGraphSource tg, IImportAdvisor2 advisor) {
+               this(session, vg, tg, advisor, null);
+       }
+
+       public StreamingTransferableGraphImportProcess(Session session, VirtualGraph vg, TransferableGraphSource tg, IImportAdvisor2 advisor, TGStatusMonitor monitor) {
                this.tg = tg;
                this.vg = vg;
                this.advisor = advisor;
+               this.monitor = monitor;
+       }
+
+       private int updatePercentage(int percentage, int done, int total) {
+               if (monitor != null && (done & 63) == 0) {
+                       int current = 100*done / total;
+                       if (current > percentage) {
+                               percentage = current;
+                               monitor.status(percentage);
+                       }
+               }
+               return percentage;
        }
 
        public void readIdentities(ReadGraph g) throws Exception {
@@ -204,7 +221,7 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                                }
                        }
                        else if(definition instanceof Internal) {
-                               String uri = TransferableGraphUtils.getURI(resourceCount, identityMap, identity.resource);
+                               String uri = TransferableGraphUtils.getTrueURI(resourceCount, identityMap, identity.resource);
                                Resource existing = graph.getPossibleResource(uri);
                                if(existing != null) {
                                        existingInternalMap.put(identity.resource, existing);
@@ -271,6 +288,14 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
        void findClusterSet(WriteOnlyGraph graph, Resource rootLibrary, int[] clustering, int[] clusterSets, long[] clusters, int id) throws DatabaseException {
                ClusteringSupport support = graph.getService(ClusteringSupport.class);
                if(id == Extensions.ROOT_LIBRARY_CLUSTER_SET || id == Extensions.INDEX_ROOT_CLUSTER_SET) return;
+               Resource indexRootClusterSetResource = rootLibrary;
+               if(indexRoot != null && support.isClusterSet(indexRoot)) {
+                       indexRootClusterSetResource = indexRoot;
+               } else {
+                       graph.setClusterSet4NewResource(rootLibrary);
+                       graph.flushCluster();                   
+               }
+               int indexRootCsHandle = builder.handle(indexRootClusterSetResource);
                for(int pos=0,index=0;index<clustering.length;index++) {
                        pos += clustering[index];
                        if(id < pos) {
@@ -280,7 +305,7 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                                        if(cs == Extensions.ROOT_LIBRARY_CLUSTER_SET) csHandle = builder.handle(rootLibrary);
                                        else if(cs == Extensions.INDEX_ROOT_CLUSTER_SET) {
                                                if(indexRoot == null) throw new DatabaseException("No index root was available in TG import.");
-                                               csHandle = builder.handle(indexRoot);
+                                               csHandle = indexRootCsHandle;
                                        }
                                        else {
                                                findClusterSet(graph, rootLibrary, clustering, clusterSets, clusters, cs);
@@ -317,7 +342,9 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
 
                                Resource parent = resolvedParents.get(parts[0]);
                                // TODO: proper exception message
-                               if(parent == null) throw new IllegalStateException("!!");
+                               if(parent == null) {
+                                       throw new IllegalStateException("!!");
+                               }
 
                                Resource childResource = graph.newResource();
                                graph.claim(childResource, InstanceOf, null, ExternalEntity);
@@ -459,8 +486,11 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                                }
                        }
                }               
-               
-               tg.getStatementCount();
+
+               int[] done = { 0 };
+               int[] percentage = { 0 };
+
+               int statementCount = tg.getStatementCount();
                tg.forStatements(null, new TransferableGraphSourceProcedure<int[]>() {
 
                        @Override
@@ -480,13 +510,17 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                                    int inverse = handles[inv];
                                    builder.addStatement(graph, object, inverse, subject);    
                                }
-                               
+
+                               // Count from 0% -> 50% => total = statementCount*2
+                               percentage[0] = updatePercentage(percentage[0], done[0]++, statementCount*2);
+               
                        }
                        
                }); 
                
-               tg.getValueCount();
-               
+               int valueCount = tg.getValueCount();
+               done[0] = 0;
+
                class ValueProcedure extends InputStream implements TransferableGraphSourceValueProcedure {
 
             private TGResourceUtil util = new TGResourceUtil();
@@ -526,7 +560,8 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                     s.skip(this);
                 }
                 builder.endValue();
-                
+                work();
+
             }
 
             @Override
@@ -546,8 +581,13 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                 for (int i = 0; i < length; ++i)
                     builder.appendValue(input.readUnsignedByte());
                 builder.endValue();
+                work();
             }
 
+            private void work() {
+                // Count from 50% -> 100% => [valueCount, valueCount*2)
+                percentage[0] = updatePercentage(percentage[0], valueCount + done[0]++, valueCount*2);
+            }
                };
                
                tg.forValues2(null, new ValueProcedure());