]> gerrit.simantics Code Review - simantics/platform.git/blob - tests/org.simantics.db.tests/src/org/simantics/db/tests/api/request/misc/MultiListenerTest.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 / misc / MultiListenerTest.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.misc;
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 MultiListenerTest 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     }
78
79     Resource testResource;
80
81         @Test
82     public void testMultipleListeners() throws Exception {
83         final Session session = getSession();
84
85         session.syncRequest(new WriteRequest() {
86             @Override
87             public void perform(WriteGraph graph) throws DatabaseException {
88                 Layer0 b = Layer0.getInstance(graph);
89                 testResource = graph.newResource();
90                 graph.claim(testResource, b.InstanceOf, null, b.Entity);
91                 graph.claimLiteral(testResource, b.HasName, "Test Entity", Bindings.STRING);
92             }
93         });
94
95         TestListener l1 = new TestListener("L1");
96         TestListener l2 = new TestListener("L2");
97
98         if (DEBUG)
99             System.out.println("Start listening");
100         session.syncRequest(new TestRequest(testResource), l1);
101         session.syncRequest(new TestRequest(testResource), l2);
102         if (DEBUG)
103             System.out.println("Listening");
104
105         assertEquals(l1.getExecs(), 1);
106         assertEquals(l2.getExecs(), 1);
107
108         if (DEBUG)
109             System.out.println("Make modification, should fire listeners");
110         // Make a modification that should be notified for
111         session.syncRequest(new WriteRequest() {
112             @Override
113             public void perform(WriteGraph graph) throws DatabaseException {
114                 Layer0 b = Layer0.getInstance(graph);
115                 graph.claimLiteral(testResource, b.HasName, "Test Entity (modified name)", Bindings.STRING);
116             }
117         });
118
119         assertEquals(l1.getExecs(), 2);
120         assertEquals(l2.getExecs(), 2);
121
122         if (DEBUG)
123             System.out.println("Dispose listener L1");
124         l1.dispose();
125
126         if (DEBUG)
127             System.out.println("Make another modification, should fire only listener L2");
128         // Make a modification that should be notified for
129         session.syncRequest(new WriteRequest() {
130             @Override
131             public void perform(WriteGraph graph) throws DatabaseException {
132                 Layer0 b = Layer0.getInstance(graph);
133                 graph.claimLiteral(testResource, b.HasName, "Test Entity (even more modified name)", Bindings.STRING);
134             }
135         });
136
137         assertEquals(l1.getExecs(), 2);
138         assertEquals(l2.getExecs(), 3);
139
140     }
141 }