package org.simantics.db.tests.regression.bugs; import org.junit.Test; import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Session; import org.simantics.db.WriteGraph; import org.simantics.db.WriteOnlyGraph; import org.simantics.db.common.request.UniqueRead; import org.simantics.db.common.request.WriteOnlyRequest; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.event.ChangeEvent; import org.simantics.db.event.ChangeListener; import org.simantics.db.exception.DatabaseException; import org.simantics.db.service.GraphChangeListenerSupport; import org.simantics.db.service.VirtualGraphSupport; import org.simantics.db.testing.base.ExistingDatabaseTest; public class SimanticsBug3114Test extends ExistingDatabaseTest { private Resource newResource; @Test public void test() throws Exception { Session session = getSession(); GraphChangeListenerSupport support = session.getService(GraphChangeListenerSupport.class); // This listener writes 2 versions of a functional property into the same resource. The resulting model is broken if queries are not updated correctly. support.addMetadataListener(new ChangeListener() { @Override public void graphChanged(ChangeEvent e) throws DatabaseException { WriteGraph graph = (WriteGraph)e.getGraph(); graph.sync(new WriteRequest(graph.getService(VirtualGraphSupport.class).getMemoryPersistent("mem")) { @Override public void perform(WriteGraph graph) throws DatabaseException { graph.claimLiteral(newResource, L0.HasName, "name", Bindings.STRING); graph.claimLiteral(newResource, L0.HasName, "name2", Bindings.STRING); } }); } }); // Perform host request as write only. session.sync(new WriteOnlyRequest() { @Override public void perform(WriteOnlyGraph graph) throws DatabaseException { newResource = graph.newResource(); graph.claim(newResource, L0.InstanceOf, null, L0.Entity); } }); // Ensure correct results assertEquals("name2", getSession().sync(new UniqueRead() { @Override public String perform(ReadGraph graph) throws DatabaseException { return graph.getRelatedValue(newResource, L0.HasName, Bindings.STRING); } })); } }