package org.simantics.layer0.utils.writer;
-import gnu.trove.map.hash.TIntIntHashMap;
-import gnu.trove.map.hash.TIntLongHashMap;
-
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import org.simantics.db.WriteOnlyGraph;
import org.simantics.db.exception.DatabaseException;
+import gnu.trove.map.hash.TIntIntHashMap;
+import gnu.trove.map.hash.TIntLongHashMap;
+
public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
protected File file;
System.out.println("Temp file: " + file.getAbsolutePath());
s = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file), 1024*1024));
// s = new ObjectOutputStream(backup);
-
file.deleteOnExit();
} catch (IOException e) {
throw new RuntimeException("Opening output stream to temporary file failed", e);
assert(value != null);
assert(dataType != null);
try {
- ++internalCount;
+ ++internalCount;
timestamps.add(0);
- s.writeByte(1);
- writeRef(internalCount);
+ s.writeByte(1);
+ writeRef(internalCount);
s.writeUnshared(value);
- writeRef(getId(dataType));
+ writeRef(getId(dataType));
s.writeByte(0);
writeRef(current);
assert(value != null);
assert(dataType != null);
try {
- ++internalCount;
+ ++internalCount;
timestamps.add(0);
- s.writeByte(1);
- writeRef(internalCount);
+ s.writeByte(1);
+ writeRef(internalCount);
s.writeUnshared(value);
- writeRef(getId(dataType));
-
+ writeRef(getId(dataType));
+
current = internalCount;
} catch (IOException e) {
throw new RuntimeException("Writing statement failed.", e);
clusterHints.put(current, clusterHint);
return this;
}
-
+
@Override
public GraphWriter createInverse(int cluster, Resource r) {
assert(r != null);
}
return this;
}
-
+
@Override
public GraphWriter createInverse(Resource r) {
assert(r != null);
throw new RuntimeException("Writing statement failed.", e);
}
return this;
- }
+ }
protected Resource getResource(WriteOnlyGraph wg, Resource[] internals, long[] resourceIds, int id) {
if(id > 0) {
@Override
public void commit(IProgressMonitor monitor, WriteOnlyGraph wg) throws DatabaseException {
-
try {
- if (s != null) {
- s.close();
- s = null;
- }
+ if (s != null) {
+ s.close();
+ s = null;
+ }
externalsInv = null;
-
- monitor.beginTask("", 100);
-
- int lastPercentageDone = 0;
- long fileLength = file.length();
-
-// System.out.println("size of commit file: " + fileLength);
-
- Resource[] internals = new Resource[internalCount];
- resourceIds = new long[internalCount];
-
-
+ monitor.beginTask("Writing database", 100);
FileInputStream fis = new FileInputStream(file);
FileChannel fc = fis.getChannel();
- ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(fis, 1024*1024));
- int resourceCounter = 0;
- int statementCounter = 0;
- int valueCounter = 0;
- time = 0;
- loop: while(true) {
- switch(is.read()) {
- case -1:
- break loop;
- case 0: {
- int s = is.readInt();
- int p = is.readInt();
- int o = is.readInt();
- Resource rs = getResource(wg, internals, resourceIds, s);
- Resource rp = getResource(wg, internals, resourceIds, p);
- Resource ro = getResource(wg, internals, resourceIds, o);
- Resource rpInv = inverses.get(p);
- wg.claim(rs, rp, rpInv, ro);
- statementCounter += 2;
- } break;
- case 1: {
- int id = is.readInt();
- Object value = is.readUnshared();
- int type = is.readInt();
-
- Resource r = newResource(wg, internals, id);
- wg.claim(r, l0.InstanceOf, null, getResource(wg, internals, resourceIds, type));
- wg.claimValue(r, value);
- statementCounter ++;
- resourceCounter ++;
- valueCounter ++;
-
- } break;
- case 2: {
- wg.flushCluster();
- } break;
- case 3: {
-
- int s = is.readInt();
- int t = is.readInt();
-
- Resource type = getResource(wg, internals, resourceIds, t);
- wg.claim(newResource(wg, internals, s), l0.InstanceOf, null, type);
- statementCounter ++;
- resourceCounter ++;
-
- } break;
- case 4: {
-
- int s = is.readInt();
- newResource(wg, internals, s);
- resourceCounter ++;
-
- } break;
- case 5: { // InverseOf
-
- int r1 = is.readInt();
- int r2 = is.readInt();
-
- Resource rr1 = getResource(wg, internals, resourceIds, r1);
- Resource rr2 = getResource(wg, internals, resourceIds, r2);
- wg.claim(rr1, l0.InverseOf, l0.InverseOf, rr2);
- statementCounter += 2;
-
- inverses.put(r1, rr2);
- inverses.put(r2, rr1);
-
- } break;
- }
-
-// if((counter % 200000) == 0) {
-// System.out.println("Written " + counter + " statements.");
-// }
-
- double percentageDone = 100.0 * (double) fc.position() / (double) fileLength;
- int newPercentageDone = (int) Math.round(percentageDone);
- if(newPercentageDone > lastPercentageDone) {
- monitor.setTaskName("Writing database (" + newPercentageDone + "%)");
- monitor.worked(newPercentageDone - lastPercentageDone);
- lastPercentageDone = newPercentageDone;
- }
+ try (ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(fis, 1024*1024))) {
+ commit(monitor, wg, is, fc);
}
-
- System.out.println("clusterIds.size() = " + clusterIds.size());
-
- System.out.println("Wrote " + resourceCounter + " resources, " + statementCounter + " statements and " + valueCounter + " values.");
-
} catch (IOException e) {
- throw new RuntimeException("Commiting delayed graph writings failed.", e);
+ throw new DatabaseException("Commiting delayed graph writings failed.", e);
} catch (ClassNotFoundException e) {
- throw new RuntimeException("Commiting delayed graph writings failed.", e);
- } finally {
+ throw new DatabaseException("Commiting delayed graph writings failed.", e);
+ } finally {
file.delete();
monitor.done();
}
}
-
+
+ private void commit(IProgressMonitor monitor, WriteOnlyGraph wg, ObjectInputStream is, FileChannel fc) throws DatabaseException, IOException, ClassNotFoundException {
+ int lastPercentageDone = 0;
+ long fileLength = file.length();
+ //System.out.println("size of commit file: " + fileLength);
+
+ Resource[] internals = new Resource[internalCount];
+ resourceIds = new long[internalCount];
+
+ int resourceCounter = 0;
+ int statementCounter = 0;
+ int valueCounter = 0;
+ time = 0;
+ while(true) {
+ switch(is.read()) {
+ case -1:
+ System.out.println("clusterIds.size() = " + clusterIds.size());
+ System.out.println("Wrote " + resourceCounter + " resources, " + statementCounter + " statements and " + valueCounter + " values.");
+ return;
+
+ case 0: {
+ int s = is.readInt();
+ int p = is.readInt();
+ int o = is.readInt();
+ Resource rs = getResource(wg, internals, resourceIds, s);
+ Resource rp = getResource(wg, internals, resourceIds, p);
+ Resource ro = getResource(wg, internals, resourceIds, o);
+ Resource rpInv = inverses.get(p);
+ wg.claim(rs, rp, rpInv, ro);
+ statementCounter += 2;
+ } break;
+ case 1: {
+ int id = is.readInt();
+ Object value = is.readUnshared();
+ int type = is.readInt();
+
+ Resource r = newResource(wg, internals, id);
+ wg.claim(r, l0.InstanceOf, null, getResource(wg, internals, resourceIds, type));
+ wg.claimValue(r, value);
+ statementCounter ++;
+ resourceCounter ++;
+ valueCounter ++;
+
+ } break;
+ case 2: {
+ wg.flushCluster();
+ } break;
+ case 3: {
+
+ int s = is.readInt();
+ int t = is.readInt();
+
+ Resource type = getResource(wg, internals, resourceIds, t);
+ wg.claim(newResource(wg, internals, s), l0.InstanceOf, null, type);
+ statementCounter ++;
+ resourceCounter ++;
+
+ } break;
+ case 4: {
+
+ int s = is.readInt();
+ newResource(wg, internals, s);
+ resourceCounter ++;
+
+ } break;
+ case 5: { // InverseOf
+
+ int r1 = is.readInt();
+ int r2 = is.readInt();
+
+ Resource rr1 = getResource(wg, internals, resourceIds, r1);
+ Resource rr2 = getResource(wg, internals, resourceIds, r2);
+ wg.claim(rr1, l0.InverseOf, l0.InverseOf, rr2);
+ statementCounter += 2;
+
+ inverses.put(r1, rr2);
+ inverses.put(r2, rr1);
+
+ } break;
+ }
+
+// if((counter % 200000) == 0) {
+// System.out.println("Written " + counter + " statements.");
+// }
+
+ double percentageDone = 100.0 * (double) fc.position() / (double) fileLength;
+ int newPercentageDone = (int) Math.round(percentageDone);
+ if(newPercentageDone > lastPercentageDone) {
+ monitor.setTaskName("Writing database (" + newPercentageDone + "%)");
+ monitor.worked(newPercentageDone - lastPercentageDone);
+ lastPercentageDone = newPercentageDone;
+ }
+ }
+ }
+
private Resource newResource(WriteOnlyGraph wg, Resource[] internals, int s) throws DatabaseException {
int clusterHint = clusterHints.get(s);
resourceIds[s-1] = r.getResourceId();
return r;
}
-
-// public ValueDescriptor createDescriptor(Object obj) {
-//
-// if(obj instanceof String[])
-// return new ValueDescriptor(ValueTrait.StaticValue, (String[])obj);
-// else if(obj instanceof int[])
-// return new ValueDescriptor(ValueTrait.StaticValue, (int[])obj);
-// else if(obj instanceof double[])
-// return new ValueDescriptor(ValueTrait.StaticValue, (double[])obj);
-// else if(obj instanceof float[])
-// return new ValueDescriptor(ValueTrait.StaticValue, (float[])obj);
-// else if(obj instanceof boolean[])
-// return new ValueDescriptor(ValueTrait.StaticValue, (boolean[])obj);
-// else if(obj instanceof long[])
-// return new ValueDescriptor(ValueTrait.StaticValue, (long[])obj);
-// else if(obj instanceof byte[])
-// return new ValueDescriptor(ValueTrait.StaticValue, (byte[])obj);
-//
-// else if(obj instanceof String)
-// return new ValueDescriptor(ValueTrait.StaticValue, new String[] {(String)obj});
-// else if(obj instanceof Double)
-// return new ValueDescriptor(ValueTrait.StaticValue, new double[] {(Double)obj});
-// else if(obj instanceof Float)
-// return new ValueDescriptor(ValueTrait.StaticValue, new float[] {(Float)obj});
-// else if(obj instanceof Integer)
-// return new ValueDescriptor(ValueTrait.StaticValue, new int[] {(Integer)obj});
-// else if(obj instanceof Boolean)
-// return new ValueDescriptor(ValueTrait.StaticValue, new boolean[] {(Boolean)obj});
-// else if(obj instanceof Byte)
-// return new ValueDescriptor(ValueTrait.StaticValue, new byte[] {(Byte)obj});
-// else if(obj instanceof Long)
-// return new ValueDescriptor(ValueTrait.StaticValue, new long[] {(Long)obj});
-//
-// throw new Error("Wrong type!");
-//
-// }
@Override
public GraphWriter create() {
@Override
public GraphWriter create(int clusterHint, Resource type) {
-
- create(type);
+ create(type);
clusterHints.put(current, clusterHint);
return this;
return this;
}
- public GraphWriter flush() {
+ public GraphWriter flush() {
try {
s.writeByte(2);
} catch(IOException e) {