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