diff --git a/src/main/java/io/github/eggy03/dmidecode/annotation/ImmutableEntityStyle.java b/src/main/java/io/github/eggy03/dmidecode/annotation/ImmutableEntityStyle.java index 8441871..6a8c882 100644 --- a/src/main/java/io/github/eggy03/dmidecode/annotation/ImmutableEntityStyle.java +++ b/src/main/java/io/github/eggy03/dmidecode/annotation/ImmutableEntityStyle.java @@ -1,7 +1,6 @@ package io.github.eggy03.dmidecode.annotation; import org.immutables.value.Value; -import tools.jackson.databind.annotation.JsonSerialize; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -15,17 +14,15 @@ *

*

* It modifies the naming and structural style of the generated immutable implementations via {@link Value.Style} - * and contains {@link JsonSerialize} for automatic Jackson integration. *

* * @since 0.2.0 */ @Target({ElementType.PACKAGE, ElementType.TYPE}) @Retention(RetentionPolicy.CLASS) // Make it class retention for incremental compilation -@JsonSerialize // Jackson automatic integration @Value.Style( - typeAbstract = {"Abstract*"}, // 'Abstract' prefix will be detected and trimmed - typeImmutable = "*", // No prefix or suffix for generated immutable type + typeAbstract = {"*"}, // No prefixes or suffixes will be detected and trimmed + typeImmutable = "Immutable*", // Generated immutable type will have Immutable prefix added visibility = Value.Style.ImplementationVisibility.PUBLIC, // Generated class will be always public builder = "new", // construct builder using 'new' instead of factory method (required for Jackson). // Generated builders will have attributes annotated with @JsonProperty so deserialization will work properly. diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIBIOS.java b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIBIOS.java similarity index 82% rename from src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIBIOS.java rename to src/main/java/io/github/eggy03/dmidecode/entity/board/DMIBIOS.java index 62de8f7..59c6066 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIBIOS.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIBIOS.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; import java.util.List; @@ -24,25 +26,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMIBIOS bios = new DMIBIOS.Builder()
- *     .vendor("American Megatrends Inc.")
- *     .version("F10")
- *     .releaseDate("07/15/2023")
- *     .build();
- *
- * // Create a modified copy
- * DMIBIOS updated = bios
- *     .withVersion("F11");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMIBIOS { +@JsonSerialize(as = ImmutableDMIBIOS.class) +@JsonDeserialize(as = ImmutableDMIBIOS.class) +public abstract class DMIBIOS { @JsonProperty("Vendor") @Nullable @@ -80,8 +71,7 @@ public abstract class AbstractDMIBIOS { @Nullable public abstract String firmwareRevision(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIBIOSLanguage.java b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIBIOSLanguage.java similarity index 74% rename from src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIBIOSLanguage.java rename to src/main/java/io/github/eggy03/dmidecode/entity/board/DMIBIOSLanguage.java index ba3cdb1..d9b5e37 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIBIOSLanguage.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIBIOSLanguage.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; import java.util.List; @@ -24,24 +26,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMIBIOSLanguage language = new DMIBIOSLanguage.Builder()
- *     .installableLanguages(List.of("en|US", "fr|FR"))
- *     .currentLanguage("en|US")
- *     .build();
- *
- * // Create a modified copy
- * DMIBIOSLanguage updated = language
- *     .withCurrentLanguage("fr|FR");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMIBIOSLanguage { +@JsonSerialize(as = ImmutableDMIBIOSLanguage.class) +@JsonDeserialize(as = ImmutableDMIBIOSLanguage.class) +public abstract class DMIBIOSLanguage { @JsonProperty("Installable Languages") @Nullable @@ -51,8 +43,7 @@ public abstract class AbstractDMIBIOSLanguage { @Nullable public abstract String currentLanguage(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIBaseboard.java b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIBaseboard.java similarity index 80% rename from src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIBaseboard.java rename to src/main/java/io/github/eggy03/dmidecode/entity/board/DMIBaseboard.java index 72adbed..bc7f0e5 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIBaseboard.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIBaseboard.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; import java.util.List; @@ -24,26 +26,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMIBaseboard board = new DMIBaseboard.Builder()
- *     .manufacturer("ASUSTeK COMPUTER INC.")
- *     .productName("PRIME B550M-A")
- *     .serialNumber("ABC123456")
- *     .build();
- *
- * // Create a modified copy
- * DMIBaseboard updated = board
- *     .withSerialNumber("XYZ987654")
- *     .withProductName("PRIME A320");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMIBaseboard { +@JsonSerialize(as = ImmutableDMIBaseboard.class) +@JsonDeserialize(as = ImmutableDMIBaseboard.class) +public abstract class DMIBaseboard { @JsonProperty("Manufacturer") @Nullable @@ -85,8 +75,7 @@ public abstract class AbstractDMIBaseboard { @Nullable public abstract Integer containedObjectHandles(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIChassis.java b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIChassis.java similarity index 85% rename from src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIChassis.java rename to src/main/java/io/github/eggy03/dmidecode/entity/board/DMIChassis.java index a36fce1..20c4edf 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIChassis.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIChassis.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; /** * Immutable representation of system chassis information retrieved via DMI. @@ -22,25 +24,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMIChassis chassis = new DMIChassis.Builder()
- *     .manufacturer("Dell Inc.")
- *     .type("Desktop")
- *     .serialNumber("ABC123456")
- *     .build();
- *
- * // Create a modified copy
- * DMIChassis updated = chassis
- *     .withAssetTag("OFFICE-PC-01");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMIChassis { +@JsonSerialize(as = ImmutableDMIChassis.class) +@JsonDeserialize(as = ImmutableDMIChassis.class) +public abstract class DMIChassis { @JsonProperty("Manufacturer") @Nullable @@ -102,8 +93,7 @@ public abstract class AbstractDMIChassis { @Nullable public abstract String skuNumber(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIPortConnectorInformation.java b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIPortConnectorInformation.java similarity index 76% rename from src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIPortConnectorInformation.java rename to src/main/java/io/github/eggy03/dmidecode/entity/board/DMIPortConnectorInformation.java index cfeaa3e..a5b9002 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMIPortConnectorInformation.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMIPortConnectorInformation.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; /** * Immutable representation of port connector information retrieved via DMI. @@ -22,25 +24,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMIPortConnectorInformation port = new DMIPortConnectorInformation.Builder()
- *     .externalReferenceDesignator("USB1")
- *     .externalConnectorType("USB")
- *     .portType("USB")
- *     .build();
- *
- * // Create a modified copy
- * DMIPortConnectorInformation updated = port
- *     .withPortType("USB Type-C");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMIPortConnectorInformation { +@JsonSerialize(as = ImmutableDMIPortConnectorInformation.class) +@JsonDeserialize(as = ImmutableDMIPortConnectorInformation.class) +public abstract class DMIPortConnectorInformation { @JsonProperty("External Reference Designator") @Nullable @@ -62,8 +53,7 @@ public abstract class AbstractDMIPortConnectorInformation { @Nullable public abstract String portType(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMISystemSlots.java b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMISystemSlots.java similarity index 78% rename from src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMISystemSlots.java rename to src/main/java/io/github/eggy03/dmidecode/entity/board/DMISystemSlots.java index 956f169..babaaac 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/board/AbstractDMISystemSlots.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/board/DMISystemSlots.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; import java.util.List; @@ -24,26 +26,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMISystemSlots slot = new DMISystemSlots.Builder()
- *     .designation("PCIEX16")
- *     .type("PCI Express")
- *     .currentUsage("In Use")
- *     .busAddress("0000:01:00.0")
- *     .build();
- *
- * // Create a modified copy
- * DMISystemSlots updated = slot
- *     .withCurrentUsage("Available");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMISystemSlots { +@JsonSerialize(as = ImmutableDMISystemSlots.class) +@JsonDeserialize(as = ImmutableDMISystemSlots.class) +public abstract class DMISystemSlots { @JsonProperty("Designation") @Nullable @@ -73,8 +63,7 @@ public abstract class AbstractDMISystemSlots { @Nullable public abstract String busAddress(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/memory/AbstractDMIMemoryDevice.java b/src/main/java/io/github/eggy03/dmidecode/entity/memory/DMIMemoryDevice.java similarity index 89% rename from src/main/java/io/github/eggy03/dmidecode/entity/memory/AbstractDMIMemoryDevice.java rename to src/main/java/io/github/eggy03/dmidecode/entity/memory/DMIMemoryDevice.java index b448655..3f906f0 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/memory/AbstractDMIMemoryDevice.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/memory/DMIMemoryDevice.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; /** * Immutable representation of memory device information retrieved via DMI. @@ -22,27 +24,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMIMemoryDevice memory = new DMIMemoryDevice.Builder()
- *     .locator("DIMM_A1")
- *     .size("16 GB")
- *     .type("DDR4")
- *     .speed("3200 MT/s")
- *     .manufacturer("Samsung")
- *     .build();
- *
- * // Create a modified copy
- * DMIMemoryDevice updated = memory
- *     .withConfiguredMemorySpeed("2933 MT/s");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMIMemoryDevice { +@JsonSerialize(as = ImmutableDMIMemoryDevice.class) +@JsonDeserialize(as = ImmutableDMIMemoryDevice.class) +public abstract class DMIMemoryDevice { @JsonProperty("Array Handle") @Nullable @@ -172,8 +161,7 @@ public abstract class AbstractDMIMemoryDevice { @Nullable public abstract String logicalSize(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/memory/AbstractDMIPhysicalMemoryArray.java b/src/main/java/io/github/eggy03/dmidecode/entity/memory/DMIPhysicalMemoryArray.java similarity index 75% rename from src/main/java/io/github/eggy03/dmidecode/entity/memory/AbstractDMIPhysicalMemoryArray.java rename to src/main/java/io/github/eggy03/dmidecode/entity/memory/DMIPhysicalMemoryArray.java index a6b2204..d87397c 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/memory/AbstractDMIPhysicalMemoryArray.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/memory/DMIPhysicalMemoryArray.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; /** * Immutable representation of physical memory array information retrieved via DMI. @@ -22,26 +24,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMIPhysicalMemoryArray array = new DMIPhysicalMemoryArray.Builder()
- *     .location("System Board Or Motherboard")
- *     .use("System Memory")
- *     .maximumCapacity("128 GB")
- *     .numberOfDevices(4)
- *     .build();
- *
- * // Create a modified copy
- * DMIPhysicalMemoryArray updated = array
- *     .withErrorCorrectionType("Multi-bit ECC");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMIPhysicalMemoryArray { +@JsonSerialize(as = ImmutableDMIPhysicalMemoryArray.class) +@JsonDeserialize(as = ImmutableDMIPhysicalMemoryArray.class) +public abstract class DMIPhysicalMemoryArray { @JsonProperty("Location") @Nullable @@ -67,8 +57,7 @@ public abstract class AbstractDMIPhysicalMemoryArray { @Nullable public abstract Integer numberOfDevices(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/peripheral/AbstractDMIPortableBattery.java b/src/main/java/io/github/eggy03/dmidecode/entity/peripheral/DMIPortableBattery.java similarity index 81% rename from src/main/java/io/github/eggy03/dmidecode/entity/peripheral/AbstractDMIPortableBattery.java rename to src/main/java/io/github/eggy03/dmidecode/entity/peripheral/DMIPortableBattery.java index 1bca010..73519a7 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/peripheral/AbstractDMIPortableBattery.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/peripheral/DMIPortableBattery.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; /** * Immutable representation of portable battery information retrieved via DMI. @@ -22,26 +24,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMIPortableBattery battery = new DMIPortableBattery.Builder()
- *     .location("Internal Battery")
- *     .manufacturer("LG")
- *     .designCapacity("50000 mWh")
- *     .designVoltage("11.4 V")
- *     .build();
- *
- * // Create a modified copy
- * DMIPortableBattery updated = battery
- *     .withMaximumError("2%");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMIPortableBattery { +@JsonSerialize(as = ImmutableDMIPortableBattery.class) +@JsonDeserialize(as = ImmutableDMIPortableBattery.class) +public abstract class DMIPortableBattery { @JsonProperty("Location") @Nullable @@ -87,8 +77,7 @@ public abstract class AbstractDMIPortableBattery { @Nullable public abstract String oemSpecificInformation(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/processor/AbstractDMICache.java b/src/main/java/io/github/eggy03/dmidecode/entity/processor/DMICache.java similarity index 82% rename from src/main/java/io/github/eggy03/dmidecode/entity/processor/AbstractDMICache.java rename to src/main/java/io/github/eggy03/dmidecode/entity/processor/DMICache.java index c50f1f5..33f6fc9 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/processor/AbstractDMICache.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/processor/DMICache.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; import java.util.List; @@ -24,26 +26,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMICache cache = new DMICache.Builder()
- *     .socketDesignation("L3-Cache")
- *     .location("Internal")
- *     .installedSize("32 MB")
- *     .associativity("16-way Set-Associative")
- *     .build();
- *
- * // Create a modified copy
- * DMICache updated = cache
- *     .withInstalledSize("64 MB");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMICache { +@JsonSerialize(as = ImmutableDMICache.class) +@JsonDeserialize(as = ImmutableDMICache.class) +public abstract class DMICache { @JsonProperty("Socket Designation") @Nullable @@ -93,8 +83,7 @@ public abstract class AbstractDMICache { @Nullable public abstract String associativity(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/processor/AbstractDMIProcessor.java b/src/main/java/io/github/eggy03/dmidecode/entity/processor/DMIProcessor.java similarity index 85% rename from src/main/java/io/github/eggy03/dmidecode/entity/processor/AbstractDMIProcessor.java rename to src/main/java/io/github/eggy03/dmidecode/entity/processor/DMIProcessor.java index c5e3ee6..6b54778 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/processor/AbstractDMIProcessor.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/processor/DMIProcessor.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; import java.util.List; @@ -24,28 +26,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMIProcessor processor = new DMIProcessor.Builder()
- *     .socketDesignation("CPU0")
- *     .manufacturer("Intel")
- *     .version("Intel(R) Core(TM) i7-12700H")
- *     .coreCount(14)
- *     .threadCount(20)
- *     .currentSpeed("2700 MHz")
- *     .build();
- *
- * // Create a modified copy
- * DMIProcessor updated = processor
- *     .withCurrentSpeed("3900 MHz");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMIProcessor { +@JsonSerialize(as = ImmutableDMIProcessor.class) +@JsonDeserialize(as = ImmutableDMIProcessor.class) +public abstract class DMIProcessor { @JsonProperty("Socket Designation") @Nullable @@ -143,8 +131,7 @@ public abstract class AbstractDMIProcessor { @Nullable public abstract List<@Nullable String> characteristics(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/entity/system/AbstractDMISystem.java b/src/main/java/io/github/eggy03/dmidecode/entity/system/DMISystem.java similarity index 78% rename from src/main/java/io/github/eggy03/dmidecode/entity/system/AbstractDMISystem.java rename to src/main/java/io/github/eggy03/dmidecode/entity/system/DMISystem.java index 91081e8..5a06d93 100644 --- a/src/main/java/io/github/eggy03/dmidecode/entity/system/AbstractDMISystem.java +++ b/src/main/java/io/github/eggy03/dmidecode/entity/system/DMISystem.java @@ -11,6 +11,8 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; /** * Immutable representation of system information retrieved via DMI. @@ -22,26 +24,14 @@ * Instances of this class are thread-safe. *

* - *

Usage example

- *
{@code
- * DMISystem system = new DMISystem.Builder()
- *     .manufacturer("LENOVO")
- *     .productName("ThinkPad T14 Gen 3")
- *     .serialNumber("PF123ABC")
- *     .uuid("4C4C4544-0038-4D10-8051-CAC04F4A1234")
- *     .build();
- *
- * // Create a modified copy
- * DMISystem updated = system
- *     .withSkuNumber("21CFCTO1WW");
- * }
- * * @since 0.2.0 */ @Value.Immutable @ImmutableEntityStyle @NullMarked -public abstract class AbstractDMISystem { +@JsonSerialize(as = ImmutableDMISystem.class) +@JsonDeserialize(as = ImmutableDMISystem.class) +public abstract class DMISystem { @JsonProperty("Manufacturer") @Nullable @@ -75,8 +65,7 @@ public abstract class AbstractDMISystem { @Nullable public abstract String family(); - @Override - public String toString() { + public String toJson() { return new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValueAsString(this); diff --git a/src/main/java/io/github/eggy03/dmidecode/mapper/CommonDMIMapper.java b/src/main/java/io/github/eggy03/dmidecode/mapper/CommonDMIMapper.java index 94e0b2e..b6ddd9c 100644 --- a/src/main/java/io/github/eggy03/dmidecode/mapper/CommonDMIMapper.java +++ b/src/main/java/io/github/eggy03/dmidecode/mapper/CommonDMIMapper.java @@ -89,8 +89,7 @@ public interface CommonDMIMapper { @FragileMethod( type = MethodType.INTERFACE_DEFAULT_METHOD, reason = "Parsing formatted human readable dmidecode output is always error-prone and subject to change without notice", - requiresReplacement = true, - replacementNote = "Consider using --json flag of dmidecode if available" + requiresReplacement = true ) default @NonNull Optional mapToEntity(@Nullable String rawDMIData, @NonNull Class mappableEntityClass) { @@ -191,8 +190,7 @@ public interface CommonDMIMapper { @FragileMethod( type = MethodType.INTERFACE_DEFAULT_METHOD, reason = "Parsing formatted human readable dmidecode output is always error-prone and subject to change without notice", - requiresReplacement = true, - replacementNote = "Consider using --json flag of dmidecode if available" + requiresReplacement = true ) default @NonNull @Unmodifiable List mapToList(@Nullable String rawDMIData, @NonNull Class mappableEntityClass) { diff --git a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBIOSLanguageServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBIOSLanguageServiceTest.java index 04800d3..02d8f21 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBIOSLanguageServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBIOSLanguageServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.board; import io.github.eggy03.dmidecode.entity.board.DMIBIOSLanguage; +import io.github.eggy03.dmidecode.entity.board.ImmutableDMIBIOSLanguage; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -33,7 +34,7 @@ static void setup() { "\tCurrently Installed Language: en|US" ); - mockDMIClass = new DMIBIOSLanguage.Builder() + mockDMIClass = new ImmutableDMIBIOSLanguage.Builder() .installableLanguages(Arrays.asList( "en|US", "fr|FR", @@ -65,7 +66,7 @@ void test_get_fail_invalidRawDmi_emptyOutput() { .when(() -> TerminalUtility.executeCommand(anyString(), anyLong())) .thenReturn("invalid output"); - assertThat(service.get(15)).contains(new DMIBIOSLanguage.Builder().build()); + assertThat(service.get(15)).contains(new ImmutableDMIBIOSLanguage.Builder().build()); } } } diff --git a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBIOSServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBIOSServiceTest.java index 5ce052f..1b6371e 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBIOSServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBIOSServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.board; import io.github.eggy03.dmidecode.entity.board.DMIBIOS; +import io.github.eggy03.dmidecode.entity.board.ImmutableDMIBIOS; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -39,7 +40,7 @@ static void setup() { "\tFirmware Revision: 1.12" ); - mockDMIClass = new DMIBIOS.Builder() + mockDMIClass = new ImmutableDMIBIOS.Builder() .vendor("American Megatrends Inc.") .version("F10") .releaseDate("07/15/2023") diff --git a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBaseboardServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBaseboardServiceTest.java index 6a1e65d..2585f4f 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBaseboardServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIBaseboardServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.board; import io.github.eggy03.dmidecode.entity.board.DMIBaseboard; +import io.github.eggy03.dmidecode.entity.board.ImmutableDMIBaseboard; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -41,7 +42,7 @@ static void setup() { ); - mockDMIClass = new DMIBaseboard.Builder() + mockDMIClass = new ImmutableDMIBaseboard.Builder() .manufacturer("ASUSTeK COMPUTER INC.") .productName("PRIME B550M-A") .version("Rev X.0x") @@ -84,7 +85,7 @@ void test_get_fail_invalidRawDmi_emptyOutput() { .thenReturn("invalid output"); - assertThat(service.get(15)).contains(new DMIBaseboard.Builder().build()); + assertThat(service.get(15)).contains(new ImmutableDMIBaseboard.Builder().build()); } } diff --git a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIChassisServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIChassisServiceTest.java index 5ee9f49..f77cc20 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIChassisServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIChassisServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.board; import io.github.eggy03.dmidecode.entity.board.DMIChassis; +import io.github.eggy03.dmidecode.entity.board.ImmutableDMIChassis; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -41,7 +42,7 @@ static void setup() { "\tSKU Number: SKU-001" ); - mockDMIClass = new DMIChassis.Builder() + mockDMIClass = new ImmutableDMIChassis.Builder() .manufacturer("Dell Inc.") .type("Desktop") .lock("Not Present") @@ -82,7 +83,7 @@ void test_get_fail_invalidRawDmi_emptyOutput() { .when(() -> TerminalUtility.executeCommand(anyString(), anyLong())) .thenReturn("invalid output"); - assertThat(service.get(15)).contains(new DMIChassis.Builder().build()); + assertThat(service.get(15)).contains(new ImmutableDMIChassis.Builder().build()); } } } diff --git a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIPortConnectorInformationServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIPortConnectorInformationServiceTest.java index b6a63c6..e88bb8a 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/board/DMIPortConnectorInformationServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/board/DMIPortConnectorInformationServiceTest.java @@ -2,6 +2,7 @@ import io.github.eggy03.dmidecode.entity.board.DMIPortConnectorInformation; +import io.github.eggy03.dmidecode.entity.board.ImmutableDMIPortConnectorInformation; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -32,7 +33,7 @@ static void setup() { "\tPort Type: USB" ); - mockDMIClass = new DMIPortConnectorInformation.Builder() + mockDMIClass = new ImmutableDMIPortConnectorInformation.Builder() .externalReferenceDesignator("USB1") .internalReferenceDesignator("JUSB1") .externalConnectorType("USB") diff --git a/src/test/java/io/github/eggy03/dmidecode/service/board/DMISystemSlotsServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/board/DMISystemSlotsServiceTest.java index 4589623..d0905c5 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/board/DMISystemSlotsServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/board/DMISystemSlotsServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.board; import io.github.eggy03.dmidecode.entity.board.DMISystemSlots; +import io.github.eggy03.dmidecode.entity.board.ImmutableDMISystemSlots; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -37,7 +38,7 @@ static void setup() { "\tBus Address: 0000:01:00.0" ); - mockDMIClass = new DMISystemSlots.Builder() + mockDMIClass = new ImmutableDMISystemSlots.Builder() .designation("PCIEX16") .type("PCI Express") .currentUsage("In Use") diff --git a/src/test/java/io/github/eggy03/dmidecode/service/memory/DMIMemoryDeviceServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/memory/DMIMemoryDeviceServiceTest.java index e7183c4..1a533c9 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/memory/DMIMemoryDeviceServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/memory/DMIMemoryDeviceServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.memory; import io.github.eggy03.dmidecode.entity.memory.DMIMemoryDevice; +import io.github.eggy03.dmidecode.entity.memory.ImmutableDMIMemoryDevice; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -47,7 +48,7 @@ static void setup() { "\tConfigured Voltage: 1.2 V" ); - mockDMIClass = new DMIMemoryDevice.Builder() + mockDMIClass = new ImmutableDMIMemoryDevice.Builder() .arrayHandle("0x002C") .errorInformationHandle("0x002D") .totalWidth("64 bits") diff --git a/src/test/java/io/github/eggy03/dmidecode/service/memory/DMIPhysicalMemoryArrayServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/memory/DMIPhysicalMemoryArrayServiceTest.java index 586dc89..9ff8f68 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/memory/DMIPhysicalMemoryArrayServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/memory/DMIPhysicalMemoryArrayServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.memory; import io.github.eggy03.dmidecode.entity.memory.DMIPhysicalMemoryArray; +import io.github.eggy03.dmidecode.entity.memory.ImmutableDMIPhysicalMemoryArray; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -32,7 +33,7 @@ static void setup() { "\tNumber Of Devices: 4" ); - mockDMIClass = new DMIPhysicalMemoryArray.Builder() + mockDMIClass = new ImmutableDMIPhysicalMemoryArray.Builder() .location("System Board Or Motherboard") .use("System Memory") .errorCorrectionType("Multi-bit ECC") @@ -65,7 +66,7 @@ void test_get_fail_invalidRawDmi_emptyOutput() { .thenReturn("invalid output"); assertThat(service.get(15)) - .contains(new DMIPhysicalMemoryArray.Builder().build()); + .contains(new ImmutableDMIPhysicalMemoryArray.Builder().build()); } } } diff --git a/src/test/java/io/github/eggy03/dmidecode/service/peripheral/DMIPortableBatteryServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/peripheral/DMIPortableBatteryServiceTest.java index 896ddb8..a1e6a83 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/peripheral/DMIPortableBatteryServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/peripheral/DMIPortableBatteryServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.peripheral; import io.github.eggy03.dmidecode.entity.peripheral.DMIPortableBattery; +import io.github.eggy03.dmidecode.entity.peripheral.ImmutableDMIPortableBattery; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -37,7 +38,7 @@ static void setup() { "\tOEM-specific Information: None" ); - mockDMIClass = new DMIPortableBattery.Builder() + mockDMIClass = new ImmutableDMIPortableBattery.Builder() .location("Internal Battery") .manufacturer("LG") .name("BAT0") diff --git a/src/test/java/io/github/eggy03/dmidecode/service/processor/DMICacheServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/processor/DMICacheServiceTest.java index a134e51..7280a19 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/processor/DMICacheServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/processor/DMICacheServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.processor; import io.github.eggy03.dmidecode.entity.processor.DMICache; +import io.github.eggy03.dmidecode.entity.processor.ImmutableDMICache; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -42,7 +43,7 @@ static void setup() { "\tAssociativity: 16-way Set-Associative" ); - mockDMIClass = new DMICache.Builder() + mockDMIClass = new ImmutableDMICache.Builder() .socketDesignation("L3-Cache") .configuration("Enabled, Not Socketed, Level 3") .operationalMode("Write Back") diff --git a/src/test/java/io/github/eggy03/dmidecode/service/processor/DMIProcessorServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/processor/DMIProcessorServiceTest.java index 4489b11..aa588ec 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/processor/DMIProcessorServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/processor/DMIProcessorServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.processor; import io.github.eggy03.dmidecode.entity.processor.DMIProcessor; +import io.github.eggy03.dmidecode.entity.processor.ImmutableDMIProcessor; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -59,7 +60,7 @@ static void setup() { "\t\tHardware Thread" ); - mockDMIClass = new DMIProcessor.Builder() + mockDMIClass = new ImmutableDMIProcessor.Builder() .socketDesignation("CPU0") .type("Central Processor") .family("Core i7") diff --git a/src/test/java/io/github/eggy03/dmidecode/service/system/DMISystemServiceTest.java b/src/test/java/io/github/eggy03/dmidecode/service/system/DMISystemServiceTest.java index 1d8d602..84b0635 100644 --- a/src/test/java/io/github/eggy03/dmidecode/service/system/DMISystemServiceTest.java +++ b/src/test/java/io/github/eggy03/dmidecode/service/system/DMISystemServiceTest.java @@ -1,6 +1,7 @@ package io.github.eggy03.dmidecode.service.system; import io.github.eggy03.dmidecode.entity.system.DMISystem; +import io.github.eggy03.dmidecode.entity.system.ImmutableDMISystem; import io.github.eggy03.dmidecode.utility.TerminalUtility; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -34,7 +35,7 @@ static void setup() { "\tFamily: ThinkPad" ); - mockDMIClass = new DMISystem.Builder() + mockDMIClass = new ImmutableDMISystem.Builder() .manufacturer("LENOVO") .productName("ThinkPad T14 Gen 3") .version("ThinkPad T14 Gen 3") @@ -68,7 +69,7 @@ void test_get_fail_invalidRawDmi_emptyOutput() { .when(() -> TerminalUtility.executeCommand(anyString(), anyLong())) .thenReturn("invalid output"); - assertThat(service.get(15)).contains(new DMISystem.Builder().build()); + assertThat(service.get(15)).contains(new ImmutableDMISystem.Builder().build()); } } }