• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CyclopsMC / IntegratedDynamics / 21104370479

18 Jan 2026 02:08AM UTC coverage: 45.176% (-0.008%) from 45.184%
21104370479

Pull #1594

github

web-flow
Merge 51f5da90d into 506a005e1
Pull Request #1594: Fix part capabilities not being invalidated when network is reinitialized

2633 of 8602 branches covered (30.61%)

Branch coverage included in aggregate %.

11924 of 23621 relevant lines covered (50.48%)

2.4 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

65.14
/src/main/java/org/cyclops/integrateddynamics/core/network/Network.java
1
package org.cyclops.integrateddynamics.core.network;
2

3
import com.google.common.collect.Lists;
4
import com.google.common.collect.Maps;
5
import com.google.common.collect.Sets;
6
import it.unimi.dsi.fastutil.objects.Object2IntAVLTreeMap;
7
import it.unimi.dsi.fastutil.objects.Object2IntMap;
8
import net.minecraft.core.BlockPos;
9
import net.minecraft.core.Direction;
10
import net.minecraft.core.HolderLookup;
11
import net.minecraft.nbt.CompoundTag;
12
import net.minecraft.world.level.Level;
13
import net.minecraft.world.level.block.state.BlockState;
14
import net.neoforged.fml.ModLoader;
15
import net.neoforged.neoforge.capabilities.ICapabilityProvider;
16
import org.cyclops.cyclopscore.datastructure.DimPos;
17
import org.cyclops.cyclopscore.helper.BlockEntityHelpers;
18
import org.cyclops.integrateddynamics.Capabilities;
19
import org.cyclops.integrateddynamics.IntegratedDynamics;
20
import org.cyclops.integrateddynamics.api.PartStateException;
21
import org.cyclops.integrateddynamics.api.network.*;
22
import org.cyclops.integrateddynamics.api.network.event.INetworkEvent;
23
import org.cyclops.integrateddynamics.api.network.event.INetworkEventBus;
24
import org.cyclops.integrateddynamics.api.path.IPathElement;
25
import org.cyclops.integrateddynamics.api.path.ISidedPathElement;
26
import org.cyclops.integrateddynamics.capability.path.SidedPathElement;
27
import org.cyclops.integrateddynamics.core.network.diagnostics.NetworkDiagnostics;
28
import org.cyclops.integrateddynamics.core.network.event.NetworkElementAddEvent;
29
import org.cyclops.integrateddynamics.core.network.event.NetworkElementRemoveEvent;
30
import org.cyclops.integrateddynamics.core.network.event.NetworkEventBus;
31
import org.cyclops.integrateddynamics.core.network.event.VariableContentsUpdatedEvent;
32
import org.cyclops.integrateddynamics.core.path.Cluster;
33
import org.cyclops.integrateddynamics.core.path.PathFinder;
34
import org.cyclops.integrateddynamics.core.persist.world.NetworkWorldStorage;
35

36
import java.util.*;
37

38
/**
39
 * A network instance that can hold a set of {@link INetworkElement}s.
40
 * Note that this network only contains references to the relevant data, it does not contain the actual information.
41
 * @author rubensworks
42
 */
43
public class Network implements INetwork {
44

45
    private Cluster baseCluster;
46

47
    private final INetworkEventBus eventBus = new NetworkEventBus();
5✔
48
    private final TreeSet<INetworkElement> elements = Sets.newTreeSet();
3✔
49
    private Object2IntMap<INetworkElement> updateableElementsTicks = null;
3✔
50
    private TreeSet<INetworkElement> invalidatedElements = Sets.newTreeSet();
3✔
51
    private Map<INetworkElement, Long> lastSecondDurations = Maps.newHashMap();
3✔
52

53
    private Map<NetworkCapability<?>, List<ICapabilityProvider<INetwork, Void, ?>>> capabilityProviders;
54
    private IFullNetworkListener[] fullNetworkListeners;
55

56
    private CompoundTag toRead = null;
3✔
57
    private HolderLookup.Provider provider = null;
3✔
58
    private volatile boolean changed = false;
3✔
59
    private volatile boolean killed = false;
3✔
60

61
    private boolean crashed = false;
3✔
62

63
    /**
64
     * Initiate a full network from the given start position.
65
     * @param sidedPathElement The sided path element to start from.
66
     * @return The newly formed network.
67
     */
68
    public static Network initiateNetworkSetup(ISidedPathElement sidedPathElement) {
69
        Network network = new Network(PathFinder.getConnectedCluster(sidedPathElement));
6✔
70
        NetworkWorldStorage.getInstance(IntegratedDynamics._instance).addNewNetwork(network);
4✔
71
        return network;
2✔
72
    }
73

74
    /**
75
     * Check if two networks are equal.
76
     * @param networkA A network.
77
     * @param networkB Another network.
78
     * @return If they are equal.
79
     */
80
    public static boolean areNetworksEqual(Network networkA, Network networkB) {
81
        return networkA.elements.containsAll(networkB.elements) && networkA.elements.size() == networkB.elements.size();
×
82
    }
83

84
    /**
85
     * This constructor should not be called, except for the process of constructing networks from NBT.
86
     */
87
    public Network() {
×
88
        this.baseCluster = new Cluster();
×
89
        gatherCapabilities();
×
90
        onConstruct();
×
91
    }
×
92

93
    /**
94
     * Create a new network from a given cluster of path elements.
95
     * Each path element will be checked if it has a {@link INetworkElementProvider} capability at its position
96
     * and will add all its elements to the network in that case.
97
     * Each path element that has an {@link org.cyclops.integrateddynamics.api.part.IPartContainer} capability
98
     * will have the network stored in its part container.
99
     * @param pathElements The path elements that make up the connections in the network which can potentially provide network
100
     *               elements.
101
     */
102
    public Network(Cluster pathElements) {
2✔
103
        this.baseCluster = pathElements;
3✔
104
        gatherCapabilities();
2✔
105
        onConstruct();
2✔
106
        deriveNetworkElements(baseCluster, true);
5✔
107
    }
1✔
108

109
    protected void gatherCapabilities() {
110
        AttachCapabilitiesEventNetwork event = new AttachCapabilitiesEventNetwork(this);
5✔
111
        ModLoader.postEventWrapContainerInModOrder(event);
2✔
112
        List<IFullNetworkListener> listeners = event.getFullNetworkListeners();
3✔
113
        this.fullNetworkListeners = listeners.toArray(new IFullNetworkListener[listeners.size()]);
8✔
114
        this.capabilityProviders = event.getProviders();
4✔
115
    }
1✔
116

117
    protected IFullNetworkListener[] gatherFullNetworkListeners() {
118
        List<IFullNetworkListener> listeners = Lists.newArrayList();
×
119

120
        return listeners.toArray(new IFullNetworkListener[listeners.size()]);
×
121
    }
122

123
    protected void onConstruct() {
124

125
    }
1✔
126

127
    private void deriveNetworkElements(Cluster pathElements, boolean invalidateCapabilities) {
128
        if(!killIfEmpty()) {
3!
129
            for (ISidedPathElement sidedPathElement : pathElements) {
10✔
130
                Level world = sidedPathElement.getPathElement().getPosition().getLevel(true);
6✔
131
                BlockPos pos = sidedPathElement.getPathElement().getPosition().getBlockPos();
5✔
132
                Direction side = sidedPathElement.getSide();
3✔
133
                BlockEntityHelpers.getCapability(world, pos, side, Capabilities.NetworkCarrier.BLOCK).ifPresent(networkCarrier -> {
13✔
134
                    // Correctly remove any previously saved network in this carrier
135
                    // and set the new network to this.
136
                    INetwork network = networkCarrier.getNetwork();
3✔
137
                    if (network != null) {
2✔
138
                        network.removePathElement(sidedPathElement.getPathElement(), side, world.getBlockState(pos));
9✔
139
                    }
140
                    networkCarrier.setNetwork(null);
3✔
141
                    networkCarrier.setNetwork(this);
3✔
142
                    if (invalidateCapabilities) {
2!
143
                        world.invalidateCapabilities(pos);
3✔
144
                    }
145
                });
1✔
146
                BlockEntityHelpers.getCapability(world, pos, side, Capabilities.NetworkElementProvider.BLOCK).ifPresent(networkElementProvider -> {
10✔
147
                    for(INetworkElement element : networkElementProvider.createNetworkElements(world, pos)) {
13✔
148
                        addNetworkElement(element, true);
5✔
149
                    }
1✔
150
                });
1✔
151
            }
1✔
152
            onNetworkChanged();
2✔
153
        }
154
    }
1✔
155

156
    @Override
157
    public boolean isInitialized() {
158
        return updateableElementsTicks != null;
6!
159
    }
160

161
    @Override
162
    public INetworkEventBus getEventBus() {
163
        return this.eventBus;
3✔
164
    }
165

166
    /**
167
     * Initialize the network element data.
168
     */
169
    public void initialize() {
170
        initialize(false);
3✔
171
    }
1✔
172

173
    @Override
174
    public boolean equals(Object object) {
175
        return object instanceof Network && areNetworksEqual(this, (Network) object);
×
176
    }
177

178
    @Override
179
    public CompoundTag toNBT(HolderLookup.Provider provider) {
180
        CompoundTag tag = new CompoundTag();
4✔
181
        tag.put("baseCluster", this.baseCluster.toNBT(provider));
8✔
182
        tag.putBoolean("crashed", this.crashed);
5✔
183
        return tag;
2✔
184
    }
185

186
    @Override
187
    public void fromNBT(HolderLookup.Provider provider, CompoundTag tag) {
188
        // NBT reading is postponed until the first network tick, to ensure that the game is properly initialized.
189
        // Because other mods may register things such as dimensions at the same time when networks
190
        // are being constructed (as was the case in #349)
191
        this.toRead = tag;
×
192
        this.provider = provider;
×
193
    }
×
194

195
    public void fromNBTEffective(HolderLookup.Provider provider, CompoundTag tag) {
196
        this.baseCluster.fromNBT(provider, tag.getCompound("baseCluster"));
×
197
        this.crashed = tag.getBoolean("crashed");
×
198
        deriveNetworkElements(baseCluster, false);
×
199
        initialize(true);
×
200
    }
×
201

202
    @Override
203
    public synchronized boolean addNetworkElement(INetworkElement element, boolean networkPreinit) {
204
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
205
            if (!fullNetworkListener.addNetworkElement(element, networkPreinit)) {
5!
206
                return false;
×
207
            }
208
        }
209

210
        if(getEventBus().postCancelable(new NetworkElementAddEvent.Pre(this, element))) {
9!
211
            elements.add(element);
5✔
212
            if (!element.onNetworkAddition(this)) {
4!
213
                elements.remove(element);
×
214
                return false;
×
215
            }
216
            if (!networkPreinit) {
2✔
217
                addNetworkElementUpdateable(element);
3✔
218
            }
219
            if (element instanceof IEventListenableNetworkElement) {
3✔
220
                IEventListenableNetworkElement<?> listenableElement = (IEventListenableNetworkElement<?>) element;
3✔
221
                listenableElement.getNetworkEventListener().ifPresent(listener -> {
6✔
222
                    if (listener.hasEventSubscriptions()) {
3✔
223
                        for (Class<? extends INetworkEvent> eventType : listener.getSubscribedEvents()) {
11✔
224
                            getEventBus().register(listenableElement, eventType);
5✔
225
                        }
1✔
226
                    }
227
                });
1✔
228
            }
229
            getEventBus().post(new NetworkElementAddEvent.Post(this, element));
8✔
230
            onNetworkChanged();
2✔
231
            return true;
2✔
232
        }
233
        return false;
×
234
    }
235

236
    @Override
237
    public void addNetworkElementUpdateable(INetworkElement element) {
238
        if(element.isUpdate()) {
3✔
239
            updateableElementsTicks.put(element, 0);
6✔
240
        }
241
    }
1✔
242

243
    @Override
244
    public boolean removeNetworkElementPre(INetworkElement element) {
245
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
246
            if (!fullNetworkListener.removeNetworkElementPre(element)) {
4!
247
                return false;
×
248
            }
249
        }
250
        return getEventBus().postCancelable(new NetworkElementRemoveEvent.Pre(this, element));
9✔
251
    }
252

253
    @Override
254
    public synchronized void setPriorityAndChannel(INetworkElement element, int priority, int channel) {
255
        elements.remove(element);
×
256
        int oldTickValue = updateableElementsTicks.defaultReturnValue();
×
257
        if (element.isUpdate()) {
×
258
            oldTickValue = updateableElementsTicks.removeInt(element);
×
259
        }
260

261
        //noinspection deprecation
262
        element.setPriorityAndChannel(this, priority, channel);
×
263

264
        elements.add(element);
×
265
        if (element.isUpdate()) {
×
266
            updateableElementsTicks.put(
×
267
                element,
268
                oldTickValue == updateableElementsTicks.defaultReturnValue()
×
269
                    ? element.getUpdateInterval()
×
270
                    : oldTickValue
×
271
            );
272
        }
273
    }
×
274

275
    @Override
276
    public void removeNetworkElementPost(INetworkElement element, BlockState blockState) {
277
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
278
            fullNetworkListener.removeNetworkElementPost(element, blockState);
4✔
279
        }
280
        if (element instanceof IEventListenableNetworkElement) {
3✔
281
            IEventListenableNetworkElement<?> listenableElement = (IEventListenableNetworkElement<?>) element;
3✔
282
            listenableElement.getNetworkEventListener().ifPresent(listener -> {
6✔
283
                if (listener.hasEventSubscriptions()) {
3✔
284
                    getEventBus().unregister(listenableElement);
4✔
285
                }
286
            });
1✔
287
        }
288
        element.beforeNetworkKill(this, blockState);
4✔
289
        element.onNetworkRemoval(this, blockState);
4✔
290
        removeNetworkElementInternal(element);
3✔
291
        getEventBus().post(new NetworkElementRemoveEvent.Post(this, element));
8✔
292
        onNetworkChanged();
2✔
293
    }
1✔
294

295
    public void removeNetworkElementInternal(INetworkElement element) {
296
        elements.remove(element);
5✔
297
        removeNetworkElementUpdateable(element);
3✔
298
        invalidatedElements.remove(element); // The element may be invalidated (like in an unloaded chunk) when it is being removed.
5✔
299
    }
1✔
300

301
    @Override
302
    public synchronized void removeNetworkElementUpdateable(INetworkElement element) {
303
        if (isInitialized()) {
3!
304
            updateableElementsTicks.removeInt(element);
5✔
305
        }
306
    }
1✔
307

308
    /**
309
     * Called when a network is server-loaded or newly created.
310
     * @param silent If the element should not be notified for the network becoming alive.
311
     */
312
    protected void initialize(boolean silent) {
313
        updateableElementsTicks = new Object2IntAVLTreeMap<>();
5✔
314
        updateableElementsTicks.defaultReturnValue(Integer.MIN_VALUE);
4✔
315
        for(INetworkElement element : elements) {
11✔
316
            addNetworkElementUpdateable(element);
3✔
317
            if(!silent) {
2!
318
                element.afterNetworkAlive(this);
3✔
319
            }
320
            element.afterNetworkReAlive(this);
3✔
321
        }
1✔
322

323
        // Once all elements are alive, send a single variable contents updated event.
324
        this.getEventBus().post(new VariableContentsUpdatedEvent(this));
7✔
325
    }
1✔
326

327
    @Override
328
    public void kill() {
329
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
330
            fullNetworkListener.kill();
2✔
331
        }
332
        for(INetworkElement element : elements) {
7!
333
            element.beforeNetworkKill(this);
×
334
        }
×
335
        killed = true;
3✔
336
    }
1✔
337

338
    @Override
339
    public boolean killIfEmpty() {
340
        if(baseCluster.isEmpty()) {
4✔
341
            kill();
2✔
342
            onNetworkChanged();
2✔
343
            return true;
2✔
344
        }
345
        return false;
2✔
346
    }
347

348
    @Override
349
    public boolean canUpdate(INetworkElement element) {
350
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
351
            if (!fullNetworkListener.canUpdate(element)) {
4!
352
                return false;
×
353
            }
354
        }
355
        return true;
2✔
356
    }
357

358
    @Override
359
    public void postUpdate(INetworkElement element) {
360
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
361
            fullNetworkListener.postUpdate(element);
3✔
362
        }
363
    }
1✔
364

365
    @Override
366
    public void onSkipUpdate(INetworkElement element) {
367
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
×
368
            fullNetworkListener.onSkipUpdate(element);
×
369
        }
370
    }
×
371

372
    @Override
373
    public void updateGuaranteed() {
374
        if (this.toRead != null) {
3!
375
            this.fromNBTEffective(this.provider, this.toRead);
×
376
            this.toRead = null;
×
377
            this.provider = null;
×
378
        }
379
    }
1✔
380

381
    @Override
382
    public final synchronized void update() {
383
        this.changed = false;
3✔
384
        if(killIfEmpty() || killed) {
6!
385
            NetworkWorldStorage.getInstance(IntegratedDynamics._instance).removeInvalidatedNetwork(this);
5✔
386
        } else {
387
            onUpdate();
2✔
388

389
            // Update updateable network elements
390
            boolean isBeingDiagnozed = NetworkDiagnostics.getInstance().isBeingDiagnozed();
3✔
391
            if (!isBeingDiagnozed && !lastSecondDurations.isEmpty()) {
6!
392
                // Make sure we aren't using any unnecessary memory.
393
                lastSecondDurations.clear();
×
394
            }
395
            for (Object2IntMap.Entry<INetworkElement> entry : updateableElementsTicks.object2IntEntrySet()) {
12✔
396
                var element = entry.getKey();
4✔
397
                try {
398
                    if (isValid(element)) {
4✔
399
                        long startTime = 0;
2✔
400
                        if (isBeingDiagnozed) {
2!
401
                            startTime = System.nanoTime();
×
402
                        }
403
                        int lastElementTick = entry.getIntValue();
3✔
404
                        if (canUpdate(element)) {
4!
405
                            if (lastElementTick <= 0) {
2!
406
                                entry.setValue(element.getUpdateInterval() - 1);
7✔
407
                                element.update(this);
3✔
408
                                postUpdate(element);
4✔
409
                            } else {
410
                                entry.setValue(lastElementTick - 1);
×
411
                            }
412
                        } else {
413
                            onSkipUpdate(element);
×
414
                            entry.setValue(lastElementTick - 1);
×
415
                        }
416
                        if (isBeingDiagnozed) {
2!
417
                            long duration = System.nanoTime() - startTime;
×
418
                            Long lastDuration = lastSecondDurations.get(element);
×
419
                            if (lastDuration != null) {
×
420
                                duration = duration + lastDuration;
×
421
                            }
422
                            lastSecondDurations.put(element, duration);
×
423
                        }
424
                    }
425
                } catch (PartStateException e) {
×
426
                    IntegratedDynamics.clog(org.apache.logging.log4j.Level.WARN, "Attempted to tick a part that was not properly unloaded. " +
×
427
                            "Report this to the Integrated Dynamics issue tracker with details on what you did " +
428
                            "leading up to this stacktrace. The part was forcefully unloaded");
429
                    e.printStackTrace();
×
430
                    element.invalidate(this);
×
431
                }
1✔
432
            }
1✔
433
        }
434
    }
1✔
435

436
    protected void onUpdate() {
437
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
438
            fullNetworkListener.update();
2✔
439
        }
440
    }
1✔
441

442
    @Override
443
    public synchronized boolean removePathElement(IPathElement pathElement, Direction side, BlockState blockState) {
444
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
445
            if (!fullNetworkListener.removePathElement(pathElement, side, blockState)) {
6!
446
                return false;
×
447
            }
448
        }
449
        if(baseCluster.remove(SidedPathElement.of(pathElement, null))) {
7!
450
            DimPos position = pathElement.getPosition();
3✔
451
            Level level = position.getLevel(true);
4✔
452
            INetworkElementProvider networkElementProvider = null;
2✔
453
            if (level != null) {
2!
454
                networkElementProvider = level.getCapability(Capabilities.NetworkElementProvider.BLOCK, position.getBlockPos(), blockState, null, side);
10✔
455
            }
456
            if (networkElementProvider != null) {
2!
457
                Collection<INetworkElement> networkElements = networkElementProvider.
3✔
458
                        createNetworkElements(position.getLevel(true), position.getBlockPos());
5✔
459
                for (INetworkElement networkElement : networkElements) {
10✔
460
                    if(!removeNetworkElementPre(networkElement)) {
4!
461
                        return false;
×
462
                    }
463
                }
1✔
464
                for (INetworkElement networkElement : networkElements) {
10✔
465
                    removeNetworkElementPost(networkElement, blockState);
4✔
466
                }
1✔
467
                onNetworkChanged();
2✔
468
                return true;
2✔
469
            }
470
        } else {
×
471
            Thread.dumpStack();
×
472
            IntegratedDynamics.clog(org.apache.logging.log4j.Level.WARN, "Tried to remove a path element from a network it was not present in.");
×
473
            System.out.println("Cluster: " + baseCluster);
×
474
            System.out.println("Tried removing element: " + pathElement);
×
475
        }
476
        return false;
×
477
    }
478

479
    @Override
480
    public void afterServerLoad() {
481
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
×
482
            fullNetworkListener.afterServerLoad();
×
483
        }
484
        // All networks start from an invalidated state at server start
485
        for (INetworkElement element : getElements()) {
×
486
            invalidateElement(element);
×
487
        }
×
488

489
    }
×
490

491
    @Override
492
    public void beforeServerStop() {
493
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
494
            fullNetworkListener.beforeServerStop();
2✔
495
        }
496
    }
1✔
497

498
    @Override
499
    public Set<INetworkElement> getElements() {
500
        return this.elements;
3✔
501
    }
502

503
    @Override
504
    public boolean isKilled() {
505
        return this.killed;
×
506
    }
507

508
    protected void onNetworkChanged() {
509
        this.changed = true;
3✔
510
    }
1✔
511

512
    @Override
513
    public boolean hasChanged() {
514
        return this.changed;
×
515
    }
516

517
    @Override
518
    public int getCablesCount() {
519
        return baseCluster.size();
×
520
    }
521

522
    @Override
523
    public long getLastSecondDuration(INetworkElement networkElement) {
524
        Long duration = lastSecondDurations.get(networkElement);
×
525
        return duration == null ? 0 : duration;
×
526
    }
527

528
    @Override
529
    public void resetLastSecondDurations() {
530
        lastSecondDurations.clear();
×
531
    }
×
532

533
    @Override
534
    public boolean isCrashed() {
535
        return crashed;
3✔
536
    }
537

538
    @Override
539
    public void setCrashed(boolean crashed) {
540
        this.crashed = crashed;
×
541
    }
×
542

543
    @Override
544
    public <T> Optional<T> getCapability(NetworkCapability<T> capability) {
545
        return Optional.ofNullable(capability.getCapability(this.capabilityProviders, this));
7✔
546
    }
547

548
    @Override
549
    public void invalidateElement(INetworkElement element) {
550
        if (element.canRevalidate(this)) {
4!
551
            // If this element could already be revalidated,
552
            // this means that the element was not unloaded due to incorrect chunk unload,
553
            // and therefore is corrupted, so let's forcefully remove it.
554
            removeNetworkElementInternal(element);
×
555
        } else {
556
            for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
17✔
557
                fullNetworkListener.invalidateElement(element);
3✔
558
            }
559
            invalidatedElements.add(element);
5✔
560
        }
561
    }
1✔
562

563
    @Override
564
    public void revalidateElement(INetworkElement element) {
565
        for (IFullNetworkListener fullNetworkListener : this.fullNetworkListeners) {
×
566
            fullNetworkListener.revalidateElement(element);
×
567
        }
568
        invalidatedElements.remove(element);
×
569
    }
×
570

571
    @Override
572
    public boolean containsSidedPathElement(ISidedPathElement pathElement) {
573
        return baseCluster.contains(pathElement);
×
574
    }
575

576
    @Override
577
    public IFullNetworkListener[] getFullNetworkListeners() {
578
        return this.fullNetworkListeners;
×
579
    }
580

581
    @Override
582
    public boolean isValid(INetworkElement element) {
583
        if (!element.isLoaded()) {
3✔
584
            return false;
2✔
585
        }
586
        if (invalidatedElements.contains(element)) {
5!
587
            if (element.canRevalidate(this)) {
×
588
                element.revalidate(this);
×
589
                return true;
×
590
            }
591
            return false;
×
592
        }
593
        return true;
2✔
594
    }
595
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc