001: /*
002: * Created on 13-Jul-05
003: *
004: * To change the template for this generated file go to
005: * Window>Preferences>Java>Code Generation>Code and Comments
006: */
007: package org.ontoware.semversion.impl;
008:
009: import java.util.Iterator;
010:
011: import org.ontoware.aifbcommons.collection.ClosableIterator;
012: import org.ontoware.rdf2go.model.Diff;
013: import org.ontoware.rdf2go.model.Model;
014: import org.ontoware.rdf2go.model.Statement;
015: import org.ontoware.rdf2go.model.impl.DiffImpl;
016: import org.ontoware.rdf2go.model.impl.ModelAddRemoveMemoryImpl;
017: import org.slf4j.Logger;
018: import org.slf4j.LoggerFactory;
019:
020: /**
021: * @author mvo,careng
022: *
023: */
024: public class SyntacticDiffEngine {
025:
026: private static final Logger log = LoggerFactory
027: .getLogger(SyntacticDiffEngine.class);
028:
029: public static Diff getSyntacticDiff(Model a, Model b)
030: throws Exception {
031:
032: // in b, but not in a
033: ModelAddRemoveMemoryImpl added = new ModelAddRemoveMemoryImpl();
034: // in a, but not in b
035: ModelAddRemoveMemoryImpl removed = new ModelAddRemoveMemoryImpl();
036:
037: Iterator<Statement> it;
038: it = a.iterator();
039: while (it.hasNext()) {
040: Statement s = it.next();
041: log.debug("removed: " + s);
042: if (!b.contains(s.getSubject(), s.getPredicate(), s
043: .getObject()))
044: removed.addStatement(s);
045: }
046:
047: it = b.iterator();
048: while (it.hasNext()) {
049: Statement s = it.next();
050: log.debug("added: " + s);
051: if (!a.contains(s.getSubject(), s.getPredicate(), s
052: .getObject()))
053: added.addStatement(s);
054: }
055: return new DiffImpl(added.iterator(), removed.iterator());
056: }
057:
058: /**
059: * Applies a diff
060: *
061: * @param ts
062: * a TripleStore
063: * @param sourceModel
064: * the source model
065: * @param diff
066: * contains added and removed triplesets
067: * @param resultURI
068: * under which a model with source + added - removed is created
069: * @returns a temporary model with the diff applied
070: * @throws Exception
071: * TODO: use blank node enrichment here
072: */
073: public static Model applyDiff(TripleStore ts, Model sourceModel,
074: Diff diff) {
075: try {
076: Model result = ts.getTempModel(ts.newRandomUniqueURI());
077:
078: ClosableIterator<Statement> sourceIt = sourceModel
079: .iterator();
080: result.addAll(sourceIt);
081: sourceIt.close();
082:
083: Iterator<? extends Statement> it;
084: it = diff.getRemoved().iterator();
085: while (it.hasNext()) {
086: Statement s = it.next();
087: log.debug("remove " + s);
088: result.removeStatement(s);
089: }
090:
091: it = diff.getAdded().iterator();
092: while (it.hasNext()) {
093: Statement s = it.next();
094: log.debug("add " + s);
095: result.addStatement(s);
096: }
097: sourceModel.close();
098: return result;
099: } catch (Exception e) {
100: throw new RuntimeException(e);
101: }
102: }
103: }
|