aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/viatra-runtime-rete/src/main/java/tools/refinery/viatra/runtime/rete/network/StandardNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/viatra-runtime-rete/src/main/java/tools/refinery/viatra/runtime/rete/network/StandardNode.java')
-rw-r--r--subprojects/viatra-runtime-rete/src/main/java/tools/refinery/viatra/runtime/rete/network/StandardNode.java121
1 files changed, 121 insertions, 0 deletions
diff --git a/subprojects/viatra-runtime-rete/src/main/java/tools/refinery/viatra/runtime/rete/network/StandardNode.java b/subprojects/viatra-runtime-rete/src/main/java/tools/refinery/viatra/runtime/rete/network/StandardNode.java
new file mode 100644
index 00000000..e7ec36dc
--- /dev/null
+++ b/subprojects/viatra-runtime-rete/src/main/java/tools/refinery/viatra/runtime/rete/network/StandardNode.java
@@ -0,0 +1,121 @@
1/*******************************************************************************
2 * Copyright (c) 2004-2008 Gabor Bergmann and Daniel Varro
3 * This program and the accompanying materials are made available under the
4 * terms of the Eclipse Public License v. 2.0 which is available at
5 * http://www.eclipse.org/legal/epl-v20.html.
6 *
7 * SPDX-License-Identifier: EPL-2.0
8 *******************************************************************************/
9
10package tools.refinery.viatra.runtime.rete.network;
11
12import java.util.Collection;
13import java.util.HashSet;
14import java.util.List;
15import java.util.Set;
16
17import tools.refinery.viatra.runtime.matchers.tuple.Tuple;
18import tools.refinery.viatra.runtime.matchers.tuple.TupleMask;
19import tools.refinery.viatra.runtime.matchers.util.CollectionsFactory;
20import tools.refinery.viatra.runtime.matchers.util.Direction;
21import tools.refinery.viatra.runtime.rete.index.GenericProjectionIndexer;
22import tools.refinery.viatra.runtime.rete.index.ProjectionIndexer;
23import tools.refinery.viatra.runtime.rete.network.communication.Timestamp;
24import tools.refinery.viatra.runtime.rete.network.mailbox.Mailbox;
25import tools.refinery.viatra.runtime.rete.traceability.TraceInfo;
26
27/**
28 * Base implementation for a supplier node.
29 *
30 * @author Gabor Bergmann
31 *
32 */
33public abstract class StandardNode extends BaseNode implements Supplier, NetworkStructureChangeSensitiveNode {
34 protected final List<Receiver> children = CollectionsFactory.createObserverList();
35 /**
36 * @since 2.2
37 */
38 protected final List<Mailbox> childMailboxes = CollectionsFactory.createObserverList();
39
40 public StandardNode(final ReteContainer reteContainer) {
41 super(reteContainer);
42 }
43
44 /**
45 * @since 2.4
46 */
47 protected void propagateUpdate(final Direction direction, final Tuple updateElement, final Timestamp timestamp) {
48 for (final Mailbox childMailbox : childMailboxes) {
49 childMailbox.postMessage(direction, updateElement, timestamp);
50 }
51 }
52
53 @Override
54 public void appendChild(final Receiver receiver) {
55 children.add(receiver);
56 childMailboxes.add(this.getCommunicationTracker().proxifyMailbox(this, receiver.getMailbox()));
57 }
58
59 @Override
60 public void removeChild(final Receiver receiver) {
61 children.remove(receiver);
62 Mailbox mailboxToRemove = null;
63 for (final Mailbox mailbox : childMailboxes) {
64 if (mailbox.getReceiver() == receiver) {
65 mailboxToRemove = mailbox;
66 break;
67 }
68 }
69 assert mailboxToRemove != null;
70 childMailboxes.remove(mailboxToRemove);
71 }
72
73 @Override
74 public void networkStructureChanged() {
75 childMailboxes.clear();
76 for (final Receiver receiver : children) {
77 childMailboxes.add(this.getCommunicationTracker().proxifyMailbox(this, receiver.getMailbox()));
78 }
79 }
80
81 @Override
82 public Collection<Receiver> getReceivers() {
83 return children;
84 }
85
86 /**
87 * @since 2.2
88 */
89 public Collection<Mailbox> getChildMailboxes() {
90 return this.childMailboxes;
91 }
92
93 @Override
94 public Set<Tuple> getPulledContents(final boolean flush) {
95 final HashSet<Tuple> results = new HashSet<Tuple>();
96 pullInto(results, flush);
97 return results;
98 }
99
100 @Override
101 public ProjectionIndexer constructIndex(final TupleMask mask, final TraceInfo... traces) {
102 final GenericProjectionIndexer indexer = new GenericProjectionIndexer(reteContainer, mask);
103 for (final TraceInfo traceInfo : traces) {
104 indexer.assignTraceInfo(traceInfo);
105 }
106 reteContainer.connectAndSynchronize(this, indexer);
107 return indexer;
108 }
109
110 /**
111 * @since 1.6
112 */
113 protected void issueError(final String message, final Exception ex) {
114 if (ex == null) {
115 this.reteContainer.getNetwork().getEngine().getLogger().error(message);
116 } else {
117 this.reteContainer.getNetwork().getEngine().getLogger().error(message, ex);
118 }
119 }
120
121}