/* * Copyright 2009 O'Reilly Media, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.oreilly.rdf.tenuki; import java.io.InputStream; import java.util.ArrayList; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.NodeIterator; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.vocabulary.RDF; public class InputStreamChangeset implements Changeset { private Model model; public InputStreamChangeset(InputStream inputStream) { model = ModelFactory.createDefaultModel(); model.read(inputStream, ""); } public Statement[] toAdd() { Property addition = model.createProperty(CHANGESET_NS,"addition"); return reifiedStatements(addition); } public Statement[] toRemove() { Property removal = model.createProperty(CHANGESET_NS,"removal"); return reifiedStatements(removal); } private Statement[] reifiedStatements(Property property) { ArrayList<Statement> statementsToAdd = new ArrayList<Statement>(); ResIterator iter = model.listSubjectsWithProperty(property); while (iter.hasNext()) { Resource changeset = iter.nextResource(); StmtIterator additionIter = changeset.listProperties(property); while (additionIter.hasNext()) { Statement statement = (Statement) additionIter.next(); Resource r = (Resource) statement.getObject(); Resource subject = r.getProperty(RDF.subject).getResource(); Resource predicate = r.getProperty(RDF.predicate).getResource(); RDFNode object = r.getProperty(RDF.object).getObject(); Statement newStatement = model.createStatement(subject, model.createProperty(predicate.getURI()), object); statementsToAdd.add(newStatement); } } return statementsToAdd.toArray(new Statement[statementsToAdd.size()]); } public Resource getSubjectOfChange() { Property prop = model.getProperty(CHANGESET_NS, "subjectOfChange"); NodeIterator iter = model.listObjectsOfProperty(prop); while (iter.hasNext()) { RDFNode node = iter.nextNode(); if (node.isURIResource()) { return (Resource) node; } } return null; } }