use of won.protocol.util.RdfUtils.Pair in project webofneeds by researchstudio-sat.
the class TestDataMigrator method migrateFile.
/**
* Deletes all 'remote messages', changes msg:isRemoteResponseTo to
* msg:respondingTo references.
*
* @param filename
* @throws Exception
*/
public void migrateFile(File inFile, File outFile) throws Exception {
Objects.requireNonNull(inFile);
Objects.requireNonNull(outFile);
if (!inFile.isFile()) {
throw new IllegalArgumentException("input file must be a file, but this isnt one: " + inFile);
}
if (!inFile.canRead()) {
throw new IllegalArgumentException("cannot read input file " + inFile);
}
if (inFile.getAbsolutePath().equals(outFile.getAbsolutePath())) {
throw new IllegalArgumentException("Input file and output file are the same, aborting.");
}
logger.debug("migrating {} from {} to {}", new Object[] { inFile.getName(), removeBase(inFile.getParentFile().getAbsolutePath()), removeBase(outFile.getParentFile().getAbsolutePath()) });
Dataset ds = DatasetFactory.createGeneral();
RDFDataMgr.read(ds, inFile.getAbsolutePath());
final Dataset finalDs = ds;
List<Pair<String>> remoteMessages = this.findRemoteMsg.apply(ds);
Map<String, String> remoteToOrig = remoteMessages.stream().distinct().collect(Collectors.toMap(Pair::getSecond, Pair::getFirst));
Map<String, List<Statement>> statementsToMoveFromRemoteMsgToOrig = new HashMap<>();
Set<String> remoteResponses = findRemoteResponse.apply(ds).stream().collect(Collectors.toSet());
// remove the msg:isResponseTo triple from the remote responses (in the next
// step, we'll rename the msg:isRemoteResponseTo triples
ds = RdfUtils.toQuadStream(ds).filter(q -> {
if (!q.getSubject().isURI()) {
return true;
}
if (!remoteResponses.contains(q.getSubject().getURI())) {
return true;
}
if ((WONMSG.getURI() + "isResponseTo").equals(q.getPredicate().getURI())) {
return false;
}
return true;
}).collect(RdfUtils.collectToDataset());
ds = RdfUtils.toQuadStream(ds).map(quad -> {
Node pred = quad.getPredicate();
if (pred.isURI() && pred.getURI().equals(WONMSG.getURI() + "isRemoteResponseTo")) {
pred = WONMSG.respondingTo.asNode();
}
if (pred.isURI() && pred.getURI().equals(WONMSG.getURI() + "isResponseTo")) {
pred = WONMSG.respondingTo.asNode();
}
if (pred.isURI() && pred.getURI().equals(WONMSG.getURI() + "isResponseToMessageType")) {
pred = WONMSG.respondingToMessageType.asNode();
}
return new Quad(quad.getGraph(), quad.getSubject(), pred, quad.getObject());
}).collect(RdfUtils.collectToDataset());
// remove the correspondingRemoteMessage triples
ds = RdfUtils.toQuadStream(ds).filter(q -> !(WONMSG.getURI() + "correspondingRemoteMessage").equals(q.getPredicate().getURI())).collect(RdfUtils.collectToDataset());
// replace remote message uris in prev references with the org msgs and move
// those triples to the orig msg envelopes
RdfUtils.toQuadStream(ds).forEach(q -> {
Node pred = q.getPredicate();
if (pred.isURI() && pred.getURI().equals(WONMSG.previousMessage.getURI())) {
pred = WONMSG.respondingTo.asNode();
Node obj = q.getObject();
if (obj.isURI()) {
String orig = remoteToOrig.get(obj.getURI());
if (orig != null) {
Statement stmt = new StatementImpl(new ResourceImpl(q.getSubject().getURI()), new PropertyImpl(q.getPredicate().getURI()), new ResourceImpl(orig));
List<Statement> stmts = statementsToMoveFromRemoteMsgToOrig.get(orig);
if (stmts == null) {
stmts = new ArrayList<>();
}
stmts.add(stmt);
statementsToMoveFromRemoteMsgToOrig.put(orig, stmts);
}
}
}
});
// remove remote messages (their graphs)
Set<String> toRemove = remoteMessages.stream().map(p -> p.getSecond()).collect(Collectors.toSet());
ds = removeMessages(ds, toRemove);
// now add the triples we saved from the remote messages to the original
// messages:
// for each original message: find the quad that holds the [msg] msg:messageType
// [msgType] triple. insert the set of statements in that graph
// this creates a stream of quads, which in the end we add to the ds
final Dataset finalDsNow = ds;
List<Quad> moveddata = statementsToMoveFromRemoteMsgToOrig.entrySet().stream().flatMap(entry -> {
Optional<Quad> quad = RdfUtils.toQuadStream(finalDsNow).filter(q -> q.getSubject().isURI() && entry.getKey().equals(q.getSubject().getURI()) && WONMSG.messageType.getURI().equals(q.getPredicate().getURI())).findFirst();
if (!quad.isPresent())
return null;
return entry.getValue().stream().map(stmt -> new Quad(quad.get().getGraph(), new ResourceImpl(entry.getKey()).asNode(), stmt.getPredicate().asNode(), stmt.getObject().asNode()));
}).filter(x -> x != null).collect(Collectors.toList());
ds = Stream.concat(RdfUtils.toQuadStream(ds), moveddata.stream()).collect(RdfUtils.collectToDataset());
ds = removeMessages(ds, listFromExternalMsgs.apply(ds).stream().collect(Collectors.toSet()));
logger.debug("writing rsult to {}", outFile);
RDFDataMgr.write(new FileOutputStream(outFile), Prefixer.setPrefixes(ds), Lang_WON.TRIG_WON_CONVERSATION);
// RDFDataMgr.write(System.out, ds, Lang.TRIG);
}
Aggregations