]> gerrit.simantics Code Review - simantics/platform.git/blob - tests/org.simantics.db.tests/src/org/simantics/db/tests/api/request/listening/EqualListenerDisposeTest.java
Added missing org.simantics.db.{tests,testing} plug-ins.
[simantics/platform.git] / tests / org.simantics.db.tests / src / org / simantics / db / tests / api / request / listening / EqualListenerDisposeTest.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.db.tests.api.request.listening;
13
14 import java.util.concurrent.atomic.AtomicBoolean;
15 import java.util.concurrent.atomic.AtomicInteger;
16
17 import org.junit.Test;
18 import org.simantics.databoard.Bindings;
19 import org.simantics.db.AsyncReadGraph;
20 import org.simantics.db.Resource;
21 import org.simantics.db.Session;
22 import org.simantics.db.WriteGraph;
23 import org.simantics.db.common.procedure.adapter.AsyncListenerAdapter;
24 import org.simantics.db.common.request.ResourceAsyncRead;
25 import org.simantics.db.common.request.WriteRequest;
26 import org.simantics.db.exception.DatabaseException;
27 import org.simantics.db.exception.RuntimeDatabaseException;
28 import org.simantics.db.procedure.AsyncProcedure;
29 import org.simantics.db.testing.base.ExistingDatabaseTest;
30 import org.simantics.layer0.Layer0;
31
32 /**
33  * @author Tuukka Lehtonen
34  */
35 public class EqualListenerDisposeTest extends ExistingDatabaseTest {
36
37     static class TestRequest extends ResourceAsyncRead<String> {
38         public TestRequest(Resource resource) {
39             super(resource);
40         }
41         @Override
42         public void perform(AsyncReadGraph graph, AsyncProcedure<String> procedure) {
43             Layer0 b;
44             try {
45                 b = Layer0.getInstance(graph.getSession());
46             } catch (DatabaseException e) {
47                 e.printStackTrace();
48                 throw new RuntimeDatabaseException(e);
49             }
50             graph.forRelatedValue(resource, b.HasName, procedure);
51         }
52     }
53
54     static class TestListener extends AsyncListenerAdapter<String> {
55         String id;
56         AtomicInteger execs = new AtomicInteger();
57         AtomicBoolean disposed = new AtomicBoolean(false);
58         public TestListener(String id) {
59             this.id = id;
60         }
61         public int getExecs() {
62             return execs.get();
63         }
64         public void dispose() {
65             disposed.set(true);
66         }
67         @Override
68         public boolean isDisposed() {
69             return disposed.get();
70         }
71         @Override
72         public void execute(AsyncReadGraph graph, String result) {
73             int c = execs.incrementAndGet();
74             if (DEBUG)
75                 System.out.println("Listener(" + id + ").execute(" + result + "), execution #" + c);
76         }
77         @Override
78         public int hashCode() {
79                 return TestListener.class.hashCode();
80         }
81         @Override
82         public boolean equals(Object obj) {
83                 return obj instanceof TestListener;
84         }
85     }
86
87     Resource testResource;
88
89         @Test
90     public void testMultipleListeners() throws Exception {
91         final Session session = getSession();
92
93         session.syncRequest(new WriteRequest() {
94             @Override
95             public void perform(WriteGraph graph) throws DatabaseException {
96                 Layer0 b = Layer0.getInstance(graph);
97                 testResource = graph.newResource();
98                 graph.claim(testResource, b.InstanceOf, null, b.Entity);
99                 graph.claimLiteral(testResource, b.HasName, "Test Entity", Bindings.STRING);
100             }
101         });
102
103         TestListener l1 = new TestListener("L1");
104         TestListener l2 = new TestListener("L2");
105         session.syncRequest(new TestRequest(testResource), l1);
106         
107         assertEquals(l1.getExecs(), 1);
108
109         // Make a modification that should be notified for
110         session.syncRequest(new WriteRequest() {
111             @Override
112             public void perform(WriteGraph graph) throws DatabaseException {
113                 Layer0 b = Layer0.getInstance(graph);
114                 graph.claimLiteral(testResource, b.HasName, "Test Entity (modified name)", Bindings.STRING);
115             }
116         });
117
118         assertEquals(l1.getExecs(), 2);
119
120         // The listener should be fired but not listened to (there is already an equal listener)
121         session.syncRequest(new TestRequest(testResource), l2);
122
123         assertEquals(l1.getExecs(), 2);
124         assertEquals(l2.getExecs(), 1);
125         
126         if (DEBUG)
127             System.out.println("Dispose listener L1");
128         l1.dispose();
129
130         // The listener should be fired and listened to (previous equal listener is disposed)
131         session.syncRequest(new TestRequest(testResource), l2);
132
133         assertEquals(l1.getExecs(), 2);
134         assertEquals(l2.getExecs(), 2);
135
136         if (DEBUG)
137             System.out.println("Make modification, should fire l2");
138         // Make a modification that should be notified for
139         session.syncRequest(new WriteRequest() {
140             @Override
141             public void perform(WriteGraph graph) throws DatabaseException {
142                 Layer0 b = Layer0.getInstance(graph);
143                 graph.claimLiteral(testResource, b.HasName, "Test Entity (modified name 2)", Bindings.STRING);
144             }
145         });
146
147         assertEquals(l1.getExecs(), 2);
148         assertEquals(l2.getExecs(), 3);
149
150         if (DEBUG)
151             System.out.println("Dispose listener L2");
152         l2.dispose();
153
154         if (DEBUG)
155             System.out.println("Make another modification, should not fire");
156         // Make a modification that should be notified for
157         session.syncRequest(new WriteRequest() {
158             @Override
159             public void perform(WriteGraph graph) throws DatabaseException {
160                 Layer0 b = Layer0.getInstance(graph);
161                 graph.claimLiteral(testResource, b.HasName, "Test Entity (even more modified name)", Bindings.STRING);
162             }
163         });
164
165         assertEquals(l1.getExecs(), 2);
166         assertEquals(l2.getExecs(), 3);
167
168     }
169 }