/* * 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.rdf.model.test; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.jena.graph.test.GraphTestBase ; import org.apache.jena.rdf.listeners.ChangedListener ; import org.apache.jena.rdf.listeners.NullListener ; import org.apache.jena.rdf.listeners.ObjectListener ; import org.apache.jena.rdf.listeners.StatementListener ; import org.apache.jena.rdf.model.Model ; import org.apache.jena.rdf.model.ModelChangedListener ; import org.apache.jena.rdf.model.Statement ; import org.apache.jena.rdf.model.StmtIterator ; import org.apache.jena.rdf.model.impl.StmtIteratorImpl ; import org.apache.jena.rdf.model.test.helpers.ModelHelper ; import org.apache.jena.rdf.model.test.helpers.RecordingModelListener ; import org.apache.jena.rdf.model.test.helpers.TestingModelFactory ; import org.junit.Assert; /** * Tests for model events and listeners. */ public class TestModelEvents extends AbstractModelTestBase { static class OL extends ObjectListener { private Object recorded; private String how; @Override public void added( final Object x ) { recorded = x; how = "add"; } private Object comparable( final Object x ) { if (x instanceof Statement[]) { return Arrays.asList((Statement[]) x); } if (x instanceof Iterator<?>) { return GraphTestBase.iteratorToList((Iterator<?>) x); } return x; } public void recent( final String wantHow, final Object value ) { Assert.assertTrue(RecordingModelListener.checkEquality( comparable(value), comparable(recorded))); // Assert.assertEquals(comparable(value), comparable(recorded)); Assert.assertEquals(wantHow, how); recorded = how = null; } @Override public void removed( final Object x ) { recorded = x; how = "rem"; } } /** * Local test class to see that a StatementListener funnels all the changes * through * add/remove a single ModelHelper.statement */ public static class WatchStatementListener extends StatementListener { List<Statement> statements = new ArrayList<>(); String addOrRem = "<unset>"; @Override public void addedStatement( final Statement s ) { statements.add(s); addOrRem = "add"; } public List<Statement> contents() { try { return statements; } finally { statements = new ArrayList<>(); } } public String getAddOrRem() { return addOrRem; } @Override public void removedStatement( final Statement s ) { statements.add(s); addOrRem = "rem"; } } protected RecordingModelListener SL; public TestModelEvents( final TestingModelFactory modelFactory, final String name ) { super(modelFactory, name); } public void another( final Map<Object, Integer> m, final Object x ) { Integer n = m.get(x); if (n == null) { n = new Integer(0); } m.put(x, new Integer(n.intValue() + 1)); } public Map<Object, Integer> asBag( final List<Statement> l ) { final Map<Object, Integer> result = new HashMap<>(); for ( Statement aL : l ) { another( result, aL.asTriple() ); } return result; } protected StmtIterator asIterator( final Statement[] statements ) { return new StmtIteratorImpl(Arrays.asList(statements).iterator()); } public void assertSameBag( final List<Statement> wanted, final List<Statement> got ) { Assert.assertEquals(asBag(wanted), asBag(got)); } @Override public void setUp() { super.setUp(); SL = new RecordingModelListener(); } public void testAddInPieces() { model.register(SL); model.add(ModelHelper.resource(model, "S"), ModelHelper.property(model, "P"), ModelHelper.resource(model, "O")); SL.assertHas(new Object[] { "add", ModelHelper.statement(model, "S P O") }); } public void testAddModel() { model.register(SL); final Model m = ModelHelper.modelWithStatements(this, "NT beats S; S beats H; H beats D"); model.add(m); SL.assertHas(new Object[] { "addModel", m }); } public void testAddSingleStatements() { final Statement S1 = ModelHelper.statement(model, "S P O"); final Statement S2 = ModelHelper.statement(model, "A B C"); Assert.assertFalse(SL.has(new Object[] { "add", S1 })); model.register(SL); model.add(S1); SL.assertHas(new Object[] { "add", S1 }); model.add(S2); SL.assertHas(new Object[] { "add", S1, "add", S2 }); model.add(S1); SL.assertHas(new Object[] { "add", S1, "add", S2, "add", S1 }); } public void testAddStatementArray() { model.register(SL); final Statement[] s = ModelHelper.statements(model, "a P b; c Q d"); model.add(s); SL.assertHas(new Object[] { "add[]", Arrays.asList(s) }); } public void testAddStatementIterator() { model.register(SL); final Statement[] sa = ModelHelper.statements(model, "x R y; a P b; x R y"); final StmtIterator it = asIterator(sa); model.add(it); SL.assertHas(new Object[] { "addIterator", Arrays.asList(sa) }); } public void testAddStatementList() { model.register(SL); final List<Statement> L = Arrays.asList(ModelHelper.statements(model, "b I g; model U g")); model.add(L); SL.assertHas(new Object[] { "addList", L }); } public void testChangedListener() { final ChangedListener CL = new ChangedListener(); model.register(CL); Assert.assertFalse(CL.hasChanged()); model.add(ModelHelper.statement(model, "S P O")); Assert.assertTrue(CL.hasChanged()); Assert.assertFalse(CL.hasChanged()); model.remove(ModelHelper.statement(model, "ab CD ef")); Assert.assertTrue(CL.hasChanged()); model.add(ModelHelper.statements(model, "gh IJ kl")); Assert.assertTrue(CL.hasChanged()); model.remove(ModelHelper.statements(model, "mn OP qr")); Assert.assertTrue(CL.hasChanged()); model.add(asIterator(ModelHelper.statements(model, "st UV wx"))); Assert.assertTrue(CL.hasChanged()); Assert.assertFalse(CL.hasChanged()); model.remove(asIterator(ModelHelper.statements(model, "yz AB cd"))); Assert.assertTrue(CL.hasChanged()); model.add(ModelHelper.modelWithStatements(this, "ef GH ij")); Assert.assertTrue(CL.hasChanged()); model.remove(ModelHelper.modelWithStatements(this, "kl MN op")); Assert.assertTrue(CL.hasChanged()); model.add(Arrays.asList(ModelHelper.statements(model, "rs TU vw"))); Assert.assertTrue(CL.hasChanged()); model.remove(Arrays.asList(ModelHelper.statements(model, "xy wh q"))); Assert.assertTrue(CL.hasChanged()); } public void testDeleteModel() { model.register(SL); final Model m = ModelHelper.modelWithStatements(this, "NT beats S; S beats H; H beats D"); model.remove(m); SL.assertHas(new Object[] { "removeModel", m }); } public void testDeleteStatementArray() { model.register(SL); final Statement[] s = ModelHelper.statements(model, "a P b; c Q d"); model.remove(s); SL.assertHas(new Object[] { "remove[]", Arrays.asList(s) }); } public void testDeleteStatementIterator() { model.register(SL); final Statement[] sa = ModelHelper.statements(model, "x R y; a P b; x R y"); final StmtIterator it = asIterator(sa); model.remove(it); SL.assertHas(new Object[] { "removeIterator", Arrays.asList(sa) }); } public void testDeleteStatementList() { model.register(SL); final List<Statement> lst = Arrays.asList(ModelHelper.statements(model, "b I g; model U g")); model.remove(lst); SL.assertHas(new Object[] { "removeList", lst }); } public void testGeneralEvent() { model.register(SL); final Object e = new int[] {}; model.notifyEvent(e); SL.assertHas(new Object[] { "someEvent", model, e }); } public void testGot( final WatchStatementListener sl, final String how, final String template ) { assertSameBag(Arrays.asList(ModelHelper.statements(model, template)), sl.contents()); Assert.assertEquals(how, sl.getAddOrRem()); Assert.assertTrue(sl.contents().size() == 0); } /** * Test that the null listener doesn't appear to do anything. Or at least * doesn't crash .... */ public void testNullListener() { final ModelChangedListener NL = new NullListener(); model.register(NL); model.add(ModelHelper.statement(model, "S P O ")); model.remove(ModelHelper.statement(model, "X Y Z")); model.add(ModelHelper.statements(model, "a B c; d E f")); model.remove(ModelHelper.statements(model, "g H i; j K l")); model.add(asIterator(ModelHelper.statements(model, "model N o; p Q r"))); model.remove(asIterator(ModelHelper.statements(model, "s T u; v W x"))); model.add(ModelHelper.modelWithStatements(this, "leaves fall softly")); model.remove(ModelHelper.modelWithStatements(this, "water drips endlessly")); model.add(Arrays.asList(ModelHelper.statements(model, "xx RR yy"))); model.remove(Arrays.asList(ModelHelper.statements(model, "aa VV rr"))); } public void testObjectListener() { final OL ll = new OL(); model.register(ll); final Statement s = ModelHelper.statement(model, "aa BB cc"), s2 = ModelHelper .statement(model, "dd EE ff"); model.add(s); ll.recent("add", s); model.remove(s2); ll.recent("rem", s2); /* */ final List<Statement> sList = Arrays.asList(ModelHelper.statements( model, "gg HH ii; jj KK ll")); model.add(sList); ll.recent("add", sList); final List<Statement> sList2 = Arrays.asList(ModelHelper.statements( model, "mm NN oo; pp QQ rr; ss TT uu")); model.remove(sList2); ll.recent("rem", sList2); /* */ final Model m1 = ModelHelper.modelWithStatements(this, "vv WW xx; yy ZZ aa"); model.add(m1); ll.recent("add", m1); final Model m2 = ModelHelper.modelWithStatements(this, "a B g; d E z"); model.remove(m2); ll.recent("rem", m2); /* */ final Statement[] sa1 = ModelHelper.statements(model, "th i k; l model n"); model.add(sa1); ll.recent("add", sa1); final Statement[] sa2 = ModelHelper.statements(model, "x o p; r u ch"); model.remove(sa2); ll.recent("rem", sa2); /* */ final Statement[] si1 = ModelHelper.statements(model, "u ph ch; psi om eh"); model.add(asIterator(si1)); ll.recent("add", asIterator(si1)); final Statement[] si2 = ModelHelper.statements(model, "at last the; end of these; tests ok guv"); model.remove(asIterator(si2)); ll.recent("rem", asIterator(si2)); } public void testRegistrationCompiles() { Assert.assertSame(model, model.register(new RecordingModelListener())); } public void testRemoveSingleStatements() { final Statement S = ModelHelper.statement(model, "D E F"); model.register(SL); model.add(S); model.remove(S); SL.assertHas(new Object[] { "add", S, "remove", S }); } public void testTripleListener() { final WatchStatementListener sl = new WatchStatementListener(); model.register(sl); model.add(ModelHelper.statement(model, "b C d")); testGot(sl, "add", "b C d"); model.remove(ModelHelper.statement(model, "e F g")); testGot(sl, "rem", "e F g"); /* */ model.add(ModelHelper.statements(model, "h I j; k L model")); testGot(sl, "add", "h I j; k L model"); model.remove(ModelHelper.statements(model, "n O p; q R s")); testGot(sl, "rem", "n O p; q R s"); /* */ model.add(Arrays.asList(ModelHelper.statements(model, "t U v; w X y"))); testGot(sl, "add", "t U v; w X y"); model.remove(Arrays.asList(ModelHelper .statements(model, "z A b; c D e"))); testGot(sl, "rem", "z A b; c D e"); /* */ model.add(asIterator(ModelHelper.statements(model, "f G h; i J k"))); testGot(sl, "add", "f G h; i J k"); model.remove(asIterator(ModelHelper.statements(model, "l M n; o P q"))); testGot(sl, "rem", "l M n; o P q"); /* */ model.add(ModelHelper.modelWithStatements(this, "r S t; u V w; x Y z")); testGot(sl, "add", "r S t; u V w; x Y z"); model.remove(ModelHelper.modelWithStatements(this, "a E i; o U y")); testGot(sl, "rem", "a E i; o U y"); } public void testTwoListeners() { final Statement S = ModelHelper.statement(model, "S P O"); final RecordingModelListener SL1 = new RecordingModelListener(); final RecordingModelListener SL2 = new RecordingModelListener(); model.register(SL1).register(SL2); model.add(S); SL2.assertHas(new Object[] { "add", S }); SL1.assertHas(new Object[] { "add", S }); } public void testUnregisterWorks() { model.register(SL); model.unregister(SL); model.add(ModelHelper.statement(model, "X R Y")); SL.assertHas(new Object[] {}); } public void testUnregistrationCompiles() { model.unregister(new RecordingModelListener()); } }