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);
+ }
+}