From 8a683e5bd20440537e82672e0d990d6e4e7dffc4 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 14 Oct 2026 14:10:23 +0200 Subject: [PATCH 1/5] CSSTUDIO-3793 Add interface DescriptionProvider --- .../src/main/java/org/epics/vtype/DescriptionProvider.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 epics-vtype/vtype/src/main/java/org/epics/vtype/DescriptionProvider.java diff --git a/epics-vtype/vtype/src/main/java/org/epics/vtype/DescriptionProvider.java b/epics-vtype/vtype/src/main/java/org/epics/vtype/DescriptionProvider.java new file mode 100644 index 00000000..8e532434 --- /dev/null +++ b/epics-vtype/vtype/src/main/java/org/epics/vtype/DescriptionProvider.java @@ -0,0 +1,7 @@ +package org.epics.vtype; + +import java.util.Optional; + +public interface DescriptionProvider { + public Optional getDescription(); +} From 6d27ff89b123c58c39f09a6736730febef65b180 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 14 Oct 2026 14:11:31 +0200 Subject: [PATCH 2/5] CSSTUDIO-3793 Let the interface DisplayProvider extend DescriptionProvider with a default implementation. --- .../src/main/java/org/epics/vtype/DisplayProvider.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/epics-vtype/vtype/src/main/java/org/epics/vtype/DisplayProvider.java b/epics-vtype/vtype/src/main/java/org/epics/vtype/DisplayProvider.java index 58751cf7..02848ccd 100644 --- a/epics-vtype/vtype/src/main/java/org/epics/vtype/DisplayProvider.java +++ b/epics-vtype/vtype/src/main/java/org/epics/vtype/DisplayProvider.java @@ -4,12 +4,14 @@ */ package org.epics.vtype; +import java.util.Optional; + /** * A value that provides display information. * * @author carcassi */ -public interface DisplayProvider { +public interface DisplayProvider extends DescriptionProvider { /** * The display associated with this value. @@ -17,4 +19,7 @@ public interface DisplayProvider { * @return the display; not null */ Display getDisplay(); + default Optional getDescription() { + return Optional.ofNullable(getDisplay().getDescription()); + } } From e9c6996e706d606adfcfa1deb09dafa739b47322 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Thu, 15 Oct 2026 10:03:16 +0200 Subject: [PATCH 3/5] CSSTUDIO-3793 Implement DescriptionProvider for VString. --- .../main/java/org/epics/vtype/IVString.java | 11 ++++++++++- .../main/java/org/epics/vtype/VString.java | 19 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/epics-vtype/vtype/src/main/java/org/epics/vtype/IVString.java b/epics-vtype/vtype/src/main/java/org/epics/vtype/IVString.java index 68dbb1ae..87742076 100644 --- a/epics-vtype/vtype/src/main/java/org/epics/vtype/IVString.java +++ b/epics-vtype/vtype/src/main/java/org/epics/vtype/IVString.java @@ -4,6 +4,8 @@ */ package org.epics.vtype; +import java.util.Optional; + /** * Immutable {@code VString} implementation. * @@ -14,14 +16,17 @@ final class IVString extends VString { private final String value; private final Alarm alarm; private final Time time; + private final Optional description; - IVString(String value, Alarm alarm, Time time) { + IVString(String value, Alarm alarm, Time time, Optional description) { VType.argumentNotNull("value", value); VType.argumentNotNull("alarm", alarm); VType.argumentNotNull("time", time); + VType.argumentNotNull("description", description); this.value = value; this.alarm = alarm; this.time = time; + this.description = description; } @Override @@ -39,4 +44,8 @@ public Time getTime() { return time; } + @Override + public Optional getDescription() { + return description; + } } diff --git a/epics-vtype/vtype/src/main/java/org/epics/vtype/VString.java b/epics-vtype/vtype/src/main/java/org/epics/vtype/VString.java index 7569a2c2..4eb82ea8 100644 --- a/epics-vtype/vtype/src/main/java/org/epics/vtype/VString.java +++ b/epics-vtype/vtype/src/main/java/org/epics/vtype/VString.java @@ -5,13 +5,14 @@ package org.epics.vtype; import java.util.Objects; +import java.util.Optional; /** * Scalar string with alarm and timestamp. * * @author carcassi */ -public abstract class VString extends Scalar { +public abstract class VString extends Scalar implements DescriptionProvider { /** * {@inheritDoc } @@ -22,14 +23,28 @@ public abstract class VString extends Scalar { /** * Creates a new VString. + * + * @param value the string value + * @param alarm the alarm + * @param time the time + * @param description the description (Optional.empty() if not present.) + * @return the new value + */ + public static VString of(final String value, final Alarm alarm, final Time time, final Optional description) { + return new IVString(value, alarm, time, description); + } + + /** + * Creates a new VString with no description. * * @param value the string value * @param alarm the alarm * @param time the time * @return the new value */ + @Deprecated public static VString of(final String value, final Alarm alarm, final Time time) { - return new IVString(value, alarm, time); + return new IVString(value, alarm, time, Optional.empty()); } @Override From 7f50daae612c99022b5bc857da06b1b2933fe659 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Thu, 15 Oct 2026 10:03:44 +0200 Subject: [PATCH 4/5] CSSTUDIO-3793 Implement DescriptionProvider for VEnum. --- .../src/main/java/org/epics/vtype/IVEnum.java | 11 +++++++++- .../src/main/java/org/epics/vtype/VEnum.java | 20 +++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/epics-vtype/vtype/src/main/java/org/epics/vtype/IVEnum.java b/epics-vtype/vtype/src/main/java/org/epics/vtype/IVEnum.java index fb0f0339..ba89e8ad 100644 --- a/epics-vtype/vtype/src/main/java/org/epics/vtype/IVEnum.java +++ b/epics-vtype/vtype/src/main/java/org/epics/vtype/IVEnum.java @@ -4,6 +4,8 @@ */ package org.epics.vtype; +import java.util.Optional; + /** * Immutable {@code VEnum} implementation. * @@ -15,16 +17,19 @@ final class IVEnum extends VEnum { private final Time time; private final int index; private final EnumDisplay enumDisplay; + private final Optional description; - IVEnum(int index, EnumDisplay enumDisplay, Alarm alarm, Time time) { + IVEnum(int index, EnumDisplay enumDisplay, Alarm alarm, Time time, Optional description) { VType.argumentNotNull("enumDisplay", enumDisplay); VType.argumentNotNull("alarm", alarm); VType.argumentNotNull("time", time); VType.argumentNotNull("index", index); + VType.argumentNotNull("description", description); this.index = index; this.enumDisplay = enumDisplay; this.alarm = alarm; this.time = time; + this.description = description; } @Override @@ -56,4 +61,8 @@ public Time getTime() { return time; } + @Override + public Optional getDescription() { + return description; + } } diff --git a/epics-vtype/vtype/src/main/java/org/epics/vtype/VEnum.java b/epics-vtype/vtype/src/main/java/org/epics/vtype/VEnum.java index 9b0b1338..89d2c0a2 100644 --- a/epics-vtype/vtype/src/main/java/org/epics/vtype/VEnum.java +++ b/epics-vtype/vtype/src/main/java/org/epics/vtype/VEnum.java @@ -5,6 +5,7 @@ package org.epics.vtype; import java.util.Objects; +import java.util.Optional; /** * Scalar enum with alarm and timestamp. @@ -15,7 +16,7 @@ * * @author carcassi */ -public abstract class VEnum extends Scalar { +public abstract class VEnum extends Scalar implements DescriptionProvider { /** * {@inheritDoc } @@ -39,6 +40,20 @@ public abstract class VEnum extends Scalar { /** * Create a new VEnum. + * + * @param index the index in the label array + * @param metaData the metadata + * @param alarm the alarm + * @param time the time + * @param description the description (Optional.empty() if not present.) + * @return the new value + */ + public static VEnum of(int index, EnumDisplay metaData, Alarm alarm, Time time, Optional description) { + return new IVEnum(index, metaData, alarm, time, description); + } + + /** + * Create a new VEnum with no description. * * @param index the index in the label array * @param metaData the metadata @@ -46,8 +61,9 @@ public abstract class VEnum extends Scalar { * @param time the time * @return the new value */ + @Deprecated public static VEnum of(int index, EnumDisplay metaData, Alarm alarm, Time time) { - return new IVEnum(index, metaData, alarm, time); + return new IVEnum(index, metaData, alarm, time, Optional.empty()); } @Override From b3ed581967b106484d26ecf4364e61dc304308fe Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Thu, 15 Oct 2026 10:06:08 +0200 Subject: [PATCH 5/5] CSSTUDIO-3793 Implement DescriptionProvider for VBoolean. --- .../main/java/org/epics/vtype/IVBoolean.java | 11 ++++++++++- .../main/java/org/epics/vtype/VBoolean.java | 19 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/epics-vtype/vtype/src/main/java/org/epics/vtype/IVBoolean.java b/epics-vtype/vtype/src/main/java/org/epics/vtype/IVBoolean.java index 0e8fd66d..396b8747 100644 --- a/epics-vtype/vtype/src/main/java/org/epics/vtype/IVBoolean.java +++ b/epics-vtype/vtype/src/main/java/org/epics/vtype/IVBoolean.java @@ -4,6 +4,8 @@ */ package org.epics.vtype; +import java.util.Optional; + /** * Immutable {@code VBoolean} implementation. * @@ -14,14 +16,17 @@ final class IVBoolean extends VBoolean { private final Boolean value; private final Alarm alarm; private final Time time; + private final Optional description; - IVBoolean(Boolean value, Alarm alarm, Time time) { + IVBoolean(Boolean value, Alarm alarm, Time time, Optional description) { VType.argumentNotNull("value", value); VType.argumentNotNull("alarm", alarm); VType.argumentNotNull("time", time); + VType.argumentNotNull("description", description); this.value = value; this.alarm = alarm; this.time = time; + this.description = description; } @Override @@ -39,4 +44,8 @@ public Time getTime() { return time; } + @Override + public Optional getDescription() { + return description; + } } diff --git a/epics-vtype/vtype/src/main/java/org/epics/vtype/VBoolean.java b/epics-vtype/vtype/src/main/java/org/epics/vtype/VBoolean.java index 5dc1931d..ce7f11a4 100644 --- a/epics-vtype/vtype/src/main/java/org/epics/vtype/VBoolean.java +++ b/epics-vtype/vtype/src/main/java/org/epics/vtype/VBoolean.java @@ -5,13 +5,14 @@ package org.epics.vtype; import java.util.Objects; +import java.util.Optional; /** * Scalar boolean with alarm and timestamp. * * @author carcassi */ -public abstract class VBoolean extends Scalar { +public abstract class VBoolean extends Scalar implements DescriptionProvider { /** * {@inheritDoc } @@ -26,10 +27,24 @@ public abstract class VBoolean extends Scalar { * @param value the boolean value * @param alarm the alarm * @param time the time + * @param description the description (Optional.empty() if not present.) * @return the new value */ + public static VBoolean of(final Boolean value, final Alarm alarm, final Time time, final Optional description) { + return new IVBoolean(value, alarm, time, description); + } + + /** + * Creates a new VBoolean with empty description field. + * + * @param value the boolean value + * @param alarm the alarm + * @param time the time + * @return the new value + */ + @Deprecated public static VBoolean of(final Boolean value, final Alarm alarm, final Time time) { - return new IVBoolean(value, alarm, time); + return new IVBoolean(value, alarm, time, null); } @Override