@Override public synchronized void removeStatements( Resource subj, URI pred, Value obj, Resource... contexts) throws SailException { if (sail.isArchiving()) { CloseableIteration<? extends Statement, SailException> stmts; stmts = super.getStatements(subj, pred, obj, false, contexts); try { while (stmts.hasNext()) { Statement st = stmts.next(); Resource s = st.getSubject(); URI p = st.getPredicate(); Value o = st.getObject(); Resource ctx = st.getContext(); removeRevision(s, p); if (ctx instanceof URI && !ctx.equals(trx)) { if (modified.add(ctx)) { super.addStatement(getTrx(), MODIFIED, ctx, getTrx()); } BNode node = vf.createBNode(); super.addStatement(ctx, CONTAINED, node, getTrx()); super.addStatement(node, RDF.SUBJECT, s, getTrx()); super.addStatement(node, RDF.PREDICATE, p, getTrx()); super.addStatement(node, RDF.OBJECT, o, getTrx()); } } } finally { stmts.close(); } super.removeStatements(subj, pred, obj, contexts); } else { if (sail.getMaxArchive() > 0 && arch.size() <= sail.getMaxArchive()) { CloseableIteration<? extends Statement, SailException> stmts; stmts = super.getStatements(subj, pred, obj, false, contexts); try { int maxArchive = sail.getMaxArchive(); while (stmts.hasNext() && arch.size() <= maxArchive) { Statement st = stmts.next(); Resource ctx = st.getContext(); if (ctx instanceof URI && !ctx.equals(trx)) { arch.add(st); } } } finally { stmts.close(); } } super.removeStatements(subj, pred, obj, contexts); removeRevision(subj, pred); if (contexts != null && contexts.length > 0) { for (Resource ctx : contexts) { if (ctx != null && modified.add(ctx)) { addMetadata(currentTrx, MODIFIED, ctx, currentTrx); } } } } }
private URI getTrx() throws SailException { if (trx == null) { trx = sail.nextTransaction(); synchronized (metadata) { for (Statement st : metadata) { storeStatement(st.getSubject(), st.getPredicate(), st.getObject(), st.getContext()); } metadata.clear(); } } return trx; }
@Override public synchronized void commit() throws SailException { flushArchive(); if (trx != null) { for (Statement st : arch) { Resource ctx = st.getContext(); if (ctx instanceof URI) { modified.add(ctx); } } for (Resource ctx : modified) { if (isObsolete(ctx)) { super.addStatement(ctx, RDF.TYPE, Audit.OBSOLETE, trx); } } GregorianCalendar cal = new GregorianCalendar(); XMLGregorianCalendar xgc = factory.newXMLGregorianCalendar(cal); Literal now = vf.createLiteral(xgc); super.addStatement(trx, RDF.TYPE, TRANSACTION, trx); super.addStatement(trx, COMMITTED_ON, now, trx); for (Resource predecessor : predecessors) { super.addStatement(trx, PREDECESSOR, predecessor, trx); } sail.recent(trx, getWrappedConnection()); } super.commit(); metadata.clear(); revised.clear(); modified.clear(); arch.clear(); if (trx != null) { sail.committed(trx, predecessors); predecessors = Collections.singleton(trx); trx = null; } }
public AuditingConnection( AuditingSail sail, SailConnection wrappedCon, Set<Resource> predecessors) throws DatatypeConfigurationException { super(wrappedCon); this.sail = sail; factory = DatatypeFactory.newInstance(); vf = sail.getValueFactory(); entityResolver = new OperationEntityResolver(vf); currentTrx = vf.createURI(CURRENT_TRX.stringValue()); this.predecessors = predecessors; informedBy = vf.createURI(WAS_INFORMED_BY); qualifiedUsage = vf.createURI(QUALIFIED_USAGE); usedEntity = vf.createURI(ENTITY); changed = vf.createURI(CHANGED); subject = vf.createURI(RDF.SUBJECT.stringValue()); predicate = vf.createURI(RDF.PREDICATE.stringValue()); object = vf.createURI(RDF.OBJECT.stringValue()); }
private void flushArchive() throws SailException { if (arch.size() <= sail.getMaxArchive()) { for (Statement st : arch) { Resource s = st.getSubject(); URI p = st.getPredicate(); Value o = st.getObject(); Resource ctx = st.getContext(); removeRevision(s, p); BNode node = vf.createBNode(); super.addStatement(ctx, CONTAINED, node, getTrx()); super.addStatement(node, RDF.SUBJECT, s, getTrx()); super.addStatement(node, RDF.PREDICATE, p, getTrx()); super.addStatement(node, RDF.OBJECT, o, getTrx()); if (ctx instanceof URI && modified.add(ctx)) { super.addStatement(getTrx(), MODIFIED, ctx, getTrx()); } } arch.clear(); } }