/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.jena.graph.test; import java.util.Arrays ; import java.util.Iterator ; import java.util.List ; import junit.framework.TestSuite ; import org.apache.jena.graph.* ; import org.apache.jena.mem.GraphMem ; /** * Version of graph tests that set up a listener that copies all changes * and verifies that after every notification modified graph * and original are isomorphic. */ public class TestGraphListener extends MetaTestGraph { public TestGraphListener(String name) { super(name); } public TestGraphListener( Class<? extends Graph> graphClass, String name) { super( graphClass, name); } public static TestSuite suite() { return MetaTestGraph.suite( TestGraphListener.class, GraphMem.class ); } /** * A listener to check that a graph is being tracked * correctly by its events. */ protected class CheckChanges implements GraphListener { protected Graph copy, original; final String desc; public CheckChanges(String description, Graph g) { original = g; desc = description; copy = TestGraphListener.super.getGraph(); } protected void verify() { assertIsomorphic(desc+" has not been tracked correctly. [delegating,copy-from-listener]", original,copy ); } @Override public void notifyAddIterator(Graph g, Iterator<Triple> it) { while (it.hasNext()) copy.add(it.next()); verify(); } @Override public void notifyAddTriple(Graph g, Triple t) { copy.add(t); verify(); } @Override public void notifyDeleteIterator(Graph g, Iterator<Triple> it) { while (it.hasNext()) copy.delete(it.next()); verify(); } @Override public void notifyDeleteTriple(Graph g, Triple t) { copy.delete(t); verify(); } @Override public void notifyEvent(Graph source, Object value) { if (value instanceof GraphEvents) { if (GraphEvents.removeAll.equals(value)) { notifyRemoveAll(source,Triple.ANY); } else { GraphEvents event = (GraphEvents)value; if ("remove".equals(event.getTitle())) { notifyRemoveAll(source,(Triple)event.getContent()); } } } verify(); } public void notifyRemoveAll(Graph source, Triple t) { GraphUtil.remove(copy, t.getSubject(), t.getPredicate(), t.getObject()); verify(); } @Override public void notifyAddList(Graph g, List<Triple> triples) { notifyAddIterator(g, triples.iterator()); } @Override public void notifyDeleteArray(Graph g, Triple[] triples) { notifyDeleteIterator(g,Arrays.asList(triples).iterator()); } @Override public void notifyAddArray(Graph g, Triple[] triples) { notifyAddIterator(g,Arrays.asList(triples).iterator()); } @Override public void notifyAddGraph(Graph g, Graph added) { notifyAddIterator(g,added.find(Triple.ANY)); } @Override public void notifyDeleteGraph(Graph g, Graph removed) { notifyDeleteIterator(g,removed.find(Triple.ANY)); } @Override public void notifyDeleteList(Graph g, List<Triple> list) { notifyDeleteIterator(g, list.iterator()); } } @Override public Graph getGraph() { Graph g = Factory.createGraphMem(); g.getEventManager().register(new CheckChanges("simple tracking",g)); return g; } }