diff --git a/src/main/java/li/cil/oc2/api/device/AbstractDevice.java b/src/main/java/li/cil/oc2/api/device/AbstractDevice.java deleted file mode 100644 index 290c8bd3..00000000 --- a/src/main/java/li/cil/oc2/api/device/AbstractDevice.java +++ /dev/null @@ -1,56 +0,0 @@ -package li.cil.oc2.api.device; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraftforge.common.util.INBTSerializable; - -import java.util.*; - -/** - * Convenience base class for {@link Device} implementations. - *

- * In particular, this implements the logic needed for generating and - * storing the unique ID for this device. - */ -public abstract class AbstractDevice implements Device, INBTSerializable { - protected static final String UUID_NBT_TAG_NAME = "uuid"; - - protected final List typeNames; - protected UUID uuid; - - protected AbstractDevice() { - this(Collections.emptyList()); - } - - protected AbstractDevice(final Collection typeNames) { - this.typeNames = new ArrayList<>(typeNames); - this.uuid = java.util.UUID.randomUUID(); - } - - @Override - public UUID getUniqueId() { - return uuid; - } - - public void setUniqueId(final UUID uuid) { - this.uuid = uuid; - } - - @Override - public List getTypeNames() { - return typeNames; - } - - @Override - public CompoundNBT serializeNBT() { - final CompoundNBT nbt = new CompoundNBT(); - nbt.putUniqueId(UUID_NBT_TAG_NAME, uuid); - return nbt; - } - - @Override - public void deserializeNBT(final CompoundNBT nbt) { - if (nbt.hasUniqueId(UUID_NBT_TAG_NAME)) { - uuid = nbt.getUniqueId(UUID_NBT_TAG_NAME); - } - } -} diff --git a/src/main/java/li/cil/oc2/api/device/CompoundDevice.java b/src/main/java/li/cil/oc2/api/device/CompoundDevice.java deleted file mode 100644 index f82c1557..00000000 --- a/src/main/java/li/cil/oc2/api/device/CompoundDevice.java +++ /dev/null @@ -1,95 +0,0 @@ -package li.cil.oc2.api.device; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.INBT; -import net.minecraftforge.common.util.INBTSerializable; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * A utility device type that allows grouping multiple {@link Device} instances. - *

- * Serialization of contained devices requires the added devices' unique id to - * have been restored prior to calling {@link #deserializeNBT(CompoundNBT)}. - */ -public class CompoundDevice extends AbstractDevice { - private final ArrayList devices; - - public CompoundDevice(final Collection devices) { - this.devices = new ArrayList<>(devices); - } - - public CompoundDevice(final Device... devices) { - this(Arrays.asList(devices)); - } - - public CompoundDevice() { - this(Collections.emptyList()); - } - - /** - * The list of devices grouped in this device. - *

- * Use this in case you need to inspect the current list of devices, add new - * devices or remove existing devices. - */ - public List getDevices() { - return devices; - } - - @Override - public List getTypeNames() { - return devices.stream() - .map(Device::getTypeNames) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - } - - @Override - public List getMethods() { - return devices.stream() - .map(Device::getMethods) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - } - - @SuppressWarnings("rawtypes") - @Override - public CompoundNBT serializeNBT() { - final CompoundNBT nbt = super.serializeNBT(); - - final CompoundNBT devicesNbt = new CompoundNBT(); - for (final Device device : devices) { - if (device instanceof INBTSerializable) { - final INBTSerializable serializable = (INBTSerializable) device; - final String uuid = device.getUniqueId().toString(); - final INBT deviceNbt = serializable.serializeNBT(); - devicesNbt.put(uuid, deviceNbt); - } - } - nbt.put("devices", devicesNbt); - - return nbt; - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - @Override - public void deserializeNBT(final CompoundNBT nbt) { - super.deserializeNBT(nbt); - - final CompoundNBT devicesNbt = nbt.getCompound("devices"); - for (final Device device : devices) { - final String uuid = device.getUniqueId().toString(); - if (!devicesNbt.contains(uuid)) { - continue; - } - - if (device instanceof INBTSerializable) { - final INBTSerializable serializable = (INBTSerializable) device; - final INBT deviceNbt = devicesNbt.get(uuid); - serializable.deserializeNBT(deviceNbt); - } - } - } -} diff --git a/src/main/java/li/cil/oc2/api/device/DeviceMethod.java b/src/main/java/li/cil/oc2/api/device/DeviceMethod.java index 9f8ecf50..31fef05c 100644 --- a/src/main/java/li/cil/oc2/api/device/DeviceMethod.java +++ b/src/main/java/li/cil/oc2/api/device/DeviceMethod.java @@ -20,8 +20,7 @@ public interface DeviceMethod { *

* When invoked through a {@link DeviceBusController} this is what the method * will be referenced by, so the name should be unlikely to be duplicated in - * another device to avoid ambiguity when devices are combined, e.g. in a - * {@link CompoundDevice}. + * another device to avoid ambiguity when devices are combined. */ String getName(); diff --git a/src/main/java/li/cil/oc2/api/device/object/Callbacks.java b/src/main/java/li/cil/oc2/api/device/object/Callbacks.java index b6f5741b..4d023b79 100644 --- a/src/main/java/li/cil/oc2/api/device/object/Callbacks.java +++ b/src/main/java/li/cil/oc2/api/device/object/Callbacks.java @@ -47,7 +47,7 @@ public final class Callbacks { .filter(m -> m.isAnnotationPresent(Callback.class)) .collect(Collectors.toList())); - final List methods = new ArrayList<>(); + final ArrayList methods = new ArrayList<>(); for (final Method method : reflectedMethods) { try { methods.add(new ObjectDeviceMethod(methodContainer, method)); diff --git a/src/main/java/li/cil/oc2/api/device/object/ObjectDevice.java b/src/main/java/li/cil/oc2/api/device/object/ObjectDevice.java index ef810a4e..655293ca 100644 --- a/src/main/java/li/cil/oc2/api/device/object/ObjectDevice.java +++ b/src/main/java/li/cil/oc2/api/device/object/ObjectDevice.java @@ -1,11 +1,12 @@ package li.cil.oc2.api.device.object; -import li.cil.oc2.api.device.AbstractDevice; import li.cil.oc2.api.device.Device; import li.cil.oc2.api.device.DeviceMethod; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; /** * A reflection based implementation of {@link Device} using the {@link Callback} @@ -21,12 +22,15 @@ import java.util.List; * targeting the workflow using an external object being {@code public}, the ones targeting * subclassing being {@code protected}. */ -public class ObjectDevice extends AbstractDevice { +public class ObjectDevice implements Device { + private final ArrayList typeNames; private final List methods; + private final String className; public ObjectDevice(final Object object, final List typeNames) { - super(typeNames); + this.typeNames = new ArrayList<>(typeNames); this.methods = Callbacks.collectMethods(object); + this.className = object.getClass().getSimpleName(); } public ObjectDevice(final Object object, final String typeName) { @@ -38,8 +42,9 @@ public class ObjectDevice extends AbstractDevice { } protected ObjectDevice(final List typeNames) { - super(typeNames); + this.typeNames = new ArrayList<>(typeNames); this.methods = Callbacks.collectMethods(this); + this.className = getClass().getSimpleName(); } protected ObjectDevice(final String typeName) { @@ -50,8 +55,32 @@ public class ObjectDevice extends AbstractDevice { this(Collections.emptyList()); } + @Override + public List getTypeNames() { + return typeNames; + } + @Override public List getMethods() { return methods; } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final ObjectDevice that = (ObjectDevice) o; + return typeNames.equals(that.typeNames) && + methods.equals(that.methods); + } + + @Override + public int hashCode() { + return Objects.hash(typeNames, methods); + } + + @Override + public String toString() { + return className; + } } diff --git a/src/main/java/li/cil/oc2/common/capabilities/DeviceBusElementCapability.java b/src/main/java/li/cil/oc2/common/capabilities/DeviceBusElementCapability.java index 4a774e52..9cc0f5a3 100644 --- a/src/main/java/li/cil/oc2/common/capabilities/DeviceBusElementCapability.java +++ b/src/main/java/li/cil/oc2/common/capabilities/DeviceBusElementCapability.java @@ -1,7 +1,7 @@ package li.cil.oc2.common.capabilities; import li.cil.oc2.api.bus.DeviceBusElement; -import li.cil.oc2.common.vm.DeviceBusElementImpl; +import li.cil.oc2.common.bus.DeviceBusElementImpl; import net.minecraftforge.common.capabilities.CapabilityManager; public final class DeviceBusElementCapability { diff --git a/src/main/java/li/cil/oc2/common/device/CompoundDevice.java b/src/main/java/li/cil/oc2/common/device/CompoundDevice.java new file mode 100644 index 00000000..1727b0b3 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/device/CompoundDevice.java @@ -0,0 +1,47 @@ +package li.cil.oc2.common.device; + +import li.cil.oc2.api.device.Device; +import li.cil.oc2.api.device.DeviceMethod; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public final class CompoundDevice implements Device { + private final ArrayList devices; + + public CompoundDevice(final ArrayList devices) { + this.devices = devices; + } + + @Override + public List getTypeNames() { + return devices.stream() + .map(Device::getTypeNames) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } + + @Override + public List getMethods() { + return devices.stream() + .map(Device::getMethods) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final CompoundDevice that = (CompoundDevice) o; + return devices.equals(that.devices); + } + + @Override + public int hashCode() { + return Objects.hash(devices); + } +}