Skip to content

Commit

Permalink
feat: relay and subnetworking
Browse files Browse the repository at this point in the history
  • Loading branch information
raoulvdberge committed May 13, 2024
1 parent 0e4eaf4 commit e10f47e
Show file tree
Hide file tree
Showing 280 changed files with 6,387 additions and 733 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,16 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- Relay

### Changed

- The Detector, Network Receiver, Network Transmitter and Security Manager will now always connect regardless of color.
- The Relay now has a "pass-through" mode. By default, pass-through is on, which means that when the Relay is active, the network signal from the input network will be passed through as-is to the output side.
- When the "pass-through" mode on the Relay is off, the network signal from the input network will no longer be passed through as-is to the output side, but you can choose to pass the energy buffer, security settings or (specific) storage resources of the input network to the output network.
- When using the Relay when "pass-through" mode is off, and when passing all storage resources or specific storage resources, you can choose the filter mode, whether fuzzy mode is enabled, the access mode and the priority of the storage exposed to the output network.

### Fixed

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,13 @@ public ComponentMapFactory<C, X> copy() {
return new ComponentMapFactory<>(new LinkedHashMap<>(factories));
}

@SuppressWarnings("unchecked")
public ComponentMap<C> buildComponentMap(final X context) {
final Map<Class<? extends C>, C> components = new LinkedHashMap<>();
factories.forEach((componentType, factory) -> components.put(componentType, factory.apply(context)));
factories.forEach((componentType, factory) -> {
final C component = factory.apply(context);
components.put(componentType, component);
});
return new ComponentMap<>(components);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,8 @@ public interface EnergyProvider {
long getCapacity();

long extract(long amount);

default boolean contains(EnergyProvider energyProvider) {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ default SecurityDecision isAllowed(Permission permission) {
return SecurityDecision.PASS;
}

default boolean isActive() {
default boolean isProviderActive() {
return true;
}

default boolean contains(SecurityNetworkComponent component) {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import org.apiguardian.api.API;

@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5")
@FunctionalInterface
public interface SecurityNetworkComponent extends NetworkComponent {
boolean isAllowed(Permission permission, SecurityActor actor);

boolean contains(SecurityNetworkComponent component);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
public record SecurityPolicy(Set<Permission> allowedPermissions) {
public static final SecurityPolicy EMPTY = new SecurityPolicy(Collections.emptySet());

public static SecurityPolicy of(final Permission... permissions) {
return new SecurityPolicy(Set.of(permissions));
}

public boolean isAllowed(final Permission permission) {
return allowedPermissions.contains(permission);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.refinedmods.refinedstorage2.api.network.NetworkComponent;
import com.refinedmods.refinedstorage2.api.storage.Actor;
import com.refinedmods.refinedstorage2.api.storage.Storage;
import com.refinedmods.refinedstorage2.api.storage.TrackedResourceAmount;
import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel;

Expand All @@ -12,4 +13,6 @@
@API(status = API.Status.STABLE, since = "2.0.0-milestone.1.1")
public interface StorageNetworkComponent extends NetworkComponent, StorageChannel {
List<TrackedResourceAmount> getResources(Class<? extends Actor> actorType);

boolean contains(Storage storage);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.refinedmods.refinedstorage2.network.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface InjectNetworkSecurityComponent {
String networkId() default "default";
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface InjectNetworkStorageChannel {
public @interface InjectNetworkStorageComponent {
String networkId() default "default";
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import com.refinedmods.refinedstorage2.api.network.impl.node.iface.InterfaceNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.importer.ImporterNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.multistorage.MultiStorageNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.relay.RelayInputNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.relay.RelayOutputNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.storage.StorageNetworkNode;
import com.refinedmods.refinedstorage2.network.test.nodefactory.ControllerNetworkNodeFactory;
import com.refinedmods.refinedstorage2.network.test.nodefactory.DetectorNetworkNodeFactory;
Expand All @@ -18,6 +20,8 @@
import com.refinedmods.refinedstorage2.network.test.nodefactory.ImporterNetworkNodeFactory;
import com.refinedmods.refinedstorage2.network.test.nodefactory.InterfaceNetworkNodeFactory;
import com.refinedmods.refinedstorage2.network.test.nodefactory.MultiStorageNetworkNodeFactory;
import com.refinedmods.refinedstorage2.network.test.nodefactory.RelayInputNetworkNodeFactory;
import com.refinedmods.refinedstorage2.network.test.nodefactory.RelayOutputNetworkNodeFactory;
import com.refinedmods.refinedstorage2.network.test.nodefactory.SimpleNetworkNodeFactory;
import com.refinedmods.refinedstorage2.network.test.nodefactory.StorageNetworkNodeFactory;

Expand All @@ -41,5 +45,7 @@
@RegisterNetworkNode(value = InterfaceNetworkNodeFactory.class, clazz = InterfaceNetworkNode.class)
@RegisterNetworkNode(value = ExternalStorageNetworkNodeFactory.class, clazz = ExternalStorageNetworkNode.class)
@RegisterNetworkNode(value = DetectorNetworkNodeFactory.class, clazz = DetectorNetworkNode.class)
@RegisterNetworkNode(value = RelayInputNetworkNodeFactory.class, clazz = RelayInputNetworkNode.class)
@RegisterNetworkNode(value = RelayOutputNetworkNodeFactory.class, clazz = RelayOutputNetworkNode.class)
public @interface NetworkTest {
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@
import com.refinedmods.refinedstorage2.api.network.impl.energy.EnergyStorageImpl;
import com.refinedmods.refinedstorage2.api.network.impl.node.controller.ControllerNetworkNode;
import com.refinedmods.refinedstorage2.api.network.node.NetworkNode;
import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent;
import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent;
import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel;
import com.refinedmods.refinedstorage2.network.test.nodefactory.NetworkNodeFactory;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand All @@ -33,9 +34,10 @@ public class NetworkTestExtension implements BeforeEachCallback, ParameterResolv

@Override
public void beforeEach(final ExtensionContext extensionContext) {
extensionContext
.getTestInstances()
.ifPresent(testInstances -> testInstances.getAllInstances().forEach(this::processTestInstance));
extensionContext.getTestInstances().ifPresent(
testInstances -> testInstances.getAllInstances().forEach(this::processTestInstance)
);
extensionContext.getTestMethod().ifPresent(this::processTestMethod);
}

private void processTestInstance(final Object testInstance) {
Expand All @@ -45,6 +47,10 @@ private void processTestInstance(final Object testInstance) {
addNetworkNodes(testInstance);
}

private void processTestMethod(final Method method) {
setupNetworks(method);
}

private void registerNetworkNodes(final Object testInstance) {
for (final RegisterNetworkNode annotation : getAnnotations(testInstance, RegisterNetworkNode.class)) {
try {
Expand All @@ -61,10 +67,22 @@ private void registerNetworkNodes(final Object testInstance) {

private void setupNetworks(final Object testInstance) {
for (final SetupNetwork annotation : getAnnotations(testInstance, SetupNetwork.class)) {
final Network network = new NetworkImpl(NetworkTestFixtures.NETWORK_COMPONENT_MAP_FACTORY);
setupNetwork(annotation);
}
}

private void setupNetworks(final Method method) {
for (final SetupNetwork annotation : method.getAnnotationsByType(SetupNetwork.class)) {
setupNetwork(annotation);
}
}

private void setupNetwork(final SetupNetwork annotation) {
final Network network = new NetworkImpl(NetworkTestFixtures.NETWORK_COMPONENT_MAP_FACTORY);
if (annotation.setupEnergy()) {
setupNetworkEnergy(annotation.energyCapacity(), annotation.energyStored(), network);
networkMap.put(annotation.id(), network);
}
networkMap.put(annotation.id(), network);
}

private <A extends Annotation> List<A> getAnnotations(final Object testInstance, final Class<A> annotationType) {
Expand Down Expand Up @@ -173,35 +191,39 @@ private void setField(final Object instance, final Field field, final Object val
@Override
public boolean supportsParameter(final ParameterContext parameterContext,
final ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext.isAnnotated(InjectNetworkStorageChannel.class)
return parameterContext.isAnnotated(InjectNetworkStorageComponent.class)
|| parameterContext.isAnnotated(InjectNetworkEnergyComponent.class)
|| parameterContext.isAnnotated(InjectNetworkSecurityComponent.class)
|| parameterContext.isAnnotated(InjectNetwork.class);
}

@Override
public Object resolveParameter(final ParameterContext parameterContext,
final ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext
.findAnnotation(InjectNetworkStorageChannel.class)
.map(annotation -> (Object) getNetworkStorageChannel(annotation.networkId()))
.findAnnotation(InjectNetworkStorageComponent.class)
.map(annotation -> (Object) getNetworkStorage(annotation.networkId()))
.or(() -> parameterContext
.findAnnotation(InjectNetworkEnergyComponent.class)
.map(annotation -> (Object) getNetworkEnergy(annotation.networkId())))
.or(() -> parameterContext
.findAnnotation(InjectNetworkSecurityComponent.class)
.map(annotation -> (Object) getNetworkSecurity(annotation.networkId())))
.or(() -> parameterContext
.findAnnotation(InjectNetwork.class)
.map(annotation -> networkMap.get(annotation.value())))
.orElseThrow();
}

private StorageChannel getNetworkStorageChannel(final String networkId) {
return networkMap
.get(networkId)
.getComponent(StorageNetworkComponent.class);
private StorageNetworkComponent getNetworkStorage(final String networkId) {
return networkMap.get(networkId).getComponent(StorageNetworkComponent.class);
}

private EnergyNetworkComponent getNetworkEnergy(final String networkId) {
return networkMap
.get(networkId)
.getComponent(EnergyNetworkComponent.class);
return networkMap.get(networkId).getComponent(EnergyNetworkComponent.class);
}

private SecurityNetworkComponent getNetworkSecurity(final String networkId) {
return networkMap.get(networkId).getComponent(SecurityNetworkComponent.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@
import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent;
import com.refinedmods.refinedstorage2.api.network.impl.energy.EnergyNetworkComponentImpl;
import com.refinedmods.refinedstorage2.api.network.impl.node.GraphNetworkComponentImpl;
import com.refinedmods.refinedstorage2.api.network.impl.security.SecurityNetworkComponentImpl;
import com.refinedmods.refinedstorage2.api.network.impl.storage.StorageNetworkComponentImpl;
import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent;
import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent;
import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy;
import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent;
import com.refinedmods.refinedstorage2.api.resource.list.ResourceListImpl;
import com.refinedmods.refinedstorage2.network.test.fake.FakePermissions;

public final class NetworkTestFixtures {
public static final ComponentMapFactory<NetworkComponent, Network> NETWORK_COMPONENT_MAP_FACTORY =
Expand All @@ -28,6 +32,10 @@ public final class NetworkTestFixtures {
StorageNetworkComponent.class,
network -> new StorageNetworkComponentImpl(new ResourceListImpl())
);
NETWORK_COMPONENT_MAP_FACTORY.addFactory(
SecurityNetworkComponent.class,
network -> new SecurityNetworkComponentImpl(SecurityPolicy.of(FakePermissions.ALLOW_BY_DEFAULT))
);
}

private NetworkTestFixtures() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Target({ElementType.TYPE, ElementType.METHOD})
@Repeatable(SetupNetworks.class)
public @interface SetupNetwork {
long energyStored() default Long.MAX_VALUE;

long energyCapacity() default Long.MAX_VALUE;

boolean setupEnergy() default true;

String id() default "default";
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface SetupNetworks {
SetupNetwork[] value();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.refinedmods.refinedstorage2.network.test.util;
package com.refinedmods.refinedstorage2.network.test.fake;

import com.refinedmods.refinedstorage2.api.storage.Actor;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.refinedmods.refinedstorage2.network.test.fake;

import com.refinedmods.refinedstorage2.api.network.security.Permission;

public enum FakePermissions implements Permission {
ALLOW_BY_DEFAULT, OTHER, OTHER2
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.refinedmods.refinedstorage2.network.test;
package com.refinedmods.refinedstorage2.network.test.fake;

import com.refinedmods.refinedstorage2.api.resource.ResourceKey;

public enum TestResource implements ResourceKey {
public enum FakeResources implements ResourceKey {
A,
A_ALTERNATIVE,
A_ALTERNATIVE2,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.refinedmods.refinedstorage2.network.test.fake;

import com.refinedmods.refinedstorage2.api.network.security.SecurityActor;

public enum FakeSecurityActors implements SecurityActor {
A, B, C
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
@ParametersAreNonnullByDefault
@FieldsAndMethodsAreNonnullByDefault
package com.refinedmods.refinedstorage2.network.test.util;
package com.refinedmods.refinedstorage2.network.test.fake;

import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.refinedmods.refinedstorage2.network.test.nodefactory;

import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.api.network.node.NetworkNode;
import com.refinedmods.refinedstorage2.network.test.AddNetworkNode;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.refinedmods.refinedstorage2.network.test.nodefactory;

import com.refinedmods.refinedstorage2.api.network.impl.node.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.controller.ControllerNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.network.test.AddNetworkNode;

import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.refinedmods.refinedstorage2.network.test.nodefactory;

import com.refinedmods.refinedstorage2.api.network.impl.node.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.detector.DetectorNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.network.test.AddNetworkNode;

import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.refinedmods.refinedstorage2.network.test.nodefactory;

import com.refinedmods.refinedstorage2.api.network.impl.node.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.exporter.ExporterNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.network.test.AddNetworkNode;

import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.refinedmods.refinedstorage2.network.test.nodefactory;

import com.refinedmods.refinedstorage2.api.network.impl.node.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.externalstorage.ExternalStorageNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.api.storage.tracked.InMemoryTrackedStorageRepository;
import com.refinedmods.refinedstorage2.network.test.AddNetworkNode;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.refinedmods.refinedstorage2.network.test.nodefactory;

import com.refinedmods.refinedstorage2.api.network.impl.node.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.node.grid.GridNetworkNode;
import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode;
import com.refinedmods.refinedstorage2.network.test.AddNetworkNode;

import java.util.Map;
Expand Down
Loading

0 comments on commit e10f47e

Please sign in to comment.