11package dev .openfeature .api ;
22
3+ import java .util .List ;
34import java .util .Objects ;
45
56/**
6- * The details of a particular event.
7+ * Event details delivered to event handlers, including provider context.
8+ * This represents the "event details" structure defined in the OpenFeature specification.
9+ * Contains all provider event details plus required provider identification.
710 */
8- public class EventDetails extends ProviderEventDetails {
9- /** The domain associated with this event. */
10- private String domain ;
11+ public class EventDetails implements EventDetailsInterface {
12+ /** The name of the provider that generated this event (required by OpenFeature spec) . */
13+ private final String providerName ;
1114
12- /** The name of the provider that generated this event . */
13- private String providerName ;
15+ /** The domain associated with this event (may be null for global providers) . */
16+ private final String domain ;
1417
15- public EventDetails () {
16- super ();
17- }
18+ /** The provider event details containing the actual event information. */
19+ private final ProviderEventDetails providerEventDetails ;
1820
1921 /**
20- * Constructs an EventDetails with the specified domain and provider name .
22+ * Constructs an EventDetails with the specified provider context and event details .
2123 *
22- * @param domain the domain associated with this event
23- * @param providerName the name of the provider that generated this event
24+ * @param providerName the name of the provider that generated this event (required)
25+ * @param domain the domain associated with this event (may be null)
26+ * @param providerEventDetails the provider event details (required)
2427 */
25- public EventDetails (String domain , String providerName ) {
26- super ();
28+ public EventDetails (String providerName , String domain , ProviderEventDetails providerEventDetails ) {
29+ this .providerName =
30+ Objects .requireNonNull (providerName , "providerName is required by OpenFeature specification" );
2731 this .domain = domain ;
28- this .providerName = providerName ;
32+ this .providerEventDetails = Objects .requireNonNull (providerEventDetails , "providerEventDetails cannot be null" );
33+ }
34+
35+ public String getProviderName () {
36+ return providerName ;
2937 }
3038
3139 public String getDomain () {
3240 return domain ;
3341 }
3442
35- public void setDomain (String domain ) {
36- this .domain = domain ;
43+ /**
44+ * Gets the underlying provider event details.
45+ *
46+ * @return the provider event details
47+ */
48+ public ProviderEventDetails getProviderEventDetails () {
49+ return providerEventDetails ;
3750 }
3851
39- public String getProviderName () {
40- return providerName ;
52+ // Delegation methods implementing EventDetailsInterface
53+
54+ @ Override
55+ public List <String > getFlagsChanged () {
56+ return providerEventDetails .getFlagsChanged ();
57+ }
58+
59+ @ Override
60+ public String getMessage () {
61+ return providerEventDetails .getMessage ();
4162 }
4263
43- public void setProviderName (String providerName ) {
44- this .providerName = providerName ;
64+ @ Override
65+ public ImmutableMetadata getEventMetadata () {
66+ return providerEventDetails .getEventMetadata ();
67+ }
68+
69+ @ Override
70+ public ErrorCode getErrorCode () {
71+ return providerEventDetails .getErrorCode ();
4572 }
4673
47- public static EventDetailsBuilder eventDetailsBuilder () {
74+ public static EventDetailsBuilder builder () {
4875 return new EventDetailsBuilder ();
4976 }
5077
@@ -53,14 +80,11 @@ public static EventDetailsBuilder eventDetailsBuilder() {
5380 *
5481 * @return a builder for EventDetails
5582 */
56- public EventDetailsBuilder eventDetailsToBuilder () {
57- return new EventDetailsBuilder ()
58- .domain (this .domain )
83+ public EventDetailsBuilder toBuilder () {
84+ return builder ()
5985 .providerName (this .providerName )
60- .flagsChanged (this .getFlagsChanged ())
61- .message (this .getMessage ())
62- .eventMetadata (this .getEventMetadata ())
63- .errorCode (this .getErrorCode ());
86+ .domain (this .domain )
87+ .providerEventDetails (this .providerEventDetails );
6488 }
6589
6690 @ Override
@@ -71,82 +95,117 @@ public boolean equals(Object obj) {
7195 if (obj == null || getClass () != obj .getClass ()) {
7296 return false ;
7397 }
74- if (!super .equals (obj )) {
75- return false ;
76- }
7798 EventDetails that = (EventDetails ) obj ;
78- return Objects .equals (domain , that .domain ) && Objects .equals (providerName , that .providerName );
99+ return Objects .equals (providerName , that .providerName )
100+ && Objects .equals (domain , that .domain )
101+ && Objects .equals (providerEventDetails , that .providerEventDetails );
79102 }
80103
81104 @ Override
82105 public int hashCode () {
83- return Objects .hash (super . hashCode () , domain , providerName );
106+ return Objects .hash (providerName , domain , providerEventDetails );
84107 }
85108
86109 @ Override
87110 public String toString () {
88- return "EventDetails{" + "domain='"
89- + domain + '\'' + ", providerName='"
90- + providerName + '\'' + ", flagsChanged="
91- + getFlagsChanged () + ", message='"
92- + getMessage () + '\'' + ", eventMetadata="
93- + getEventMetadata () + ", errorCode="
94- + getErrorCode () + '}' ;
111+ return "EventDetails{" + "providerName='"
112+ + providerName + '\'' + ", domain='"
113+ + domain + '\'' + ", providerEventDetails="
114+ + providerEventDetails + '}' ;
95115 }
96116
97117 /**
98118 * Builder class for creating instances of EventDetails.
99119 */
100120 public static class EventDetailsBuilder {
101- private String domain ;
102121 private String providerName ;
103- private java .util .List <String > flagsChanged ;
104- private String message ;
105- private ImmutableMetadata eventMetadata ;
106- private ErrorCode errorCode ;
122+ private String domain ;
123+ private ProviderEventDetails providerEventDetails ;
124+
125+ private EventDetailsBuilder () {}
126+
127+ public EventDetailsBuilder providerName (String providerName ) {
128+ this .providerName = providerName ;
129+ return this ;
130+ }
107131
108132 public EventDetailsBuilder domain (String domain ) {
109133 this .domain = domain ;
110134 return this ;
111135 }
112136
113- public EventDetailsBuilder providerName ( String providerName ) {
114- this .providerName = providerName ;
137+ public EventDetailsBuilder providerEventDetails ( ProviderEventDetails providerEventDetails ) {
138+ this .providerEventDetails = providerEventDetails ;
115139 return this ;
116140 }
117141
118- public EventDetailsBuilder flagsChanged (java .util .List <String > flagsChanged ) {
119- this .flagsChanged = flagsChanged != null ? new java .util .ArrayList <>(flagsChanged ) : null ;
142+ // Convenience methods for building provider event details inline
143+ public EventDetailsBuilder flagsChanged (List <String > flagsChanged ) {
144+ ensureProviderEventDetailsBuilder ();
145+ this .providerEventDetails = ProviderEventDetails .builder ()
146+ .flagsChanged (flagsChanged )
147+ .message (getProviderEventDetailsOrEmpty ().getMessage ())
148+ .eventMetadata (getProviderEventDetailsOrEmpty ().getEventMetadata ())
149+ .errorCode (getProviderEventDetailsOrEmpty ().getErrorCode ())
150+ .build ();
120151 return this ;
121152 }
122153
123154 public EventDetailsBuilder message (String message ) {
124- this .message = message ;
155+ ensureProviderEventDetailsBuilder ();
156+ this .providerEventDetails = ProviderEventDetails .builder ()
157+ .flagsChanged (getProviderEventDetailsOrEmpty ().getFlagsChanged ())
158+ .message (message )
159+ .eventMetadata (getProviderEventDetailsOrEmpty ().getEventMetadata ())
160+ .errorCode (getProviderEventDetailsOrEmpty ().getErrorCode ())
161+ .build ();
125162 return this ;
126163 }
127164
128165 public EventDetailsBuilder eventMetadata (ImmutableMetadata eventMetadata ) {
129- this .eventMetadata = eventMetadata ;
166+ ensureProviderEventDetailsBuilder ();
167+ this .providerEventDetails = ProviderEventDetails .builder ()
168+ .flagsChanged (getProviderEventDetailsOrEmpty ().getFlagsChanged ())
169+ .message (getProviderEventDetailsOrEmpty ().getMessage ())
170+ .eventMetadata (eventMetadata )
171+ .errorCode (getProviderEventDetailsOrEmpty ().getErrorCode ())
172+ .build ();
130173 return this ;
131174 }
132175
133176 public EventDetailsBuilder errorCode (ErrorCode errorCode ) {
134- this .errorCode = errorCode ;
177+ ensureProviderEventDetailsBuilder ();
178+ this .providerEventDetails = ProviderEventDetails .builder ()
179+ .flagsChanged (getProviderEventDetailsOrEmpty ().getFlagsChanged ())
180+ .message (getProviderEventDetailsOrEmpty ().getMessage ())
181+ .eventMetadata (getProviderEventDetailsOrEmpty ().getEventMetadata ())
182+ .errorCode (errorCode )
183+ .build ();
135184 return this ;
136185 }
137186
187+ private void ensureProviderEventDetailsBuilder () {
188+ if (this .providerEventDetails == null ) {
189+ this .providerEventDetails = ProviderEventDetails .builder ().build ();
190+ }
191+ }
192+
193+ private ProviderEventDetails getProviderEventDetailsOrEmpty () {
194+ return this .providerEventDetails != null
195+ ? this .providerEventDetails
196+ : ProviderEventDetails .builder ().build ();
197+ }
198+
138199 /**
139200 * Builds an EventDetails instance with the configured parameters.
140201 *
141202 * @return a new EventDetails instance
142203 */
143204 public EventDetails build () {
144- EventDetails eventDetails = new EventDetails (domain , providerName );
145- eventDetails .setFlagsChanged (flagsChanged );
146- eventDetails .setMessage (message );
147- eventDetails .setEventMetadata (eventMetadata );
148- eventDetails .setErrorCode (errorCode );
149- return eventDetails ;
205+ if (providerEventDetails == null ) {
206+ providerEventDetails = ProviderEventDetails .builder ().build ();
207+ }
208+ return new EventDetails (providerName , domain , providerEventDetails );
150209 }
151210 }
152211
@@ -172,12 +231,10 @@ public static EventDetails fromProviderEventDetails(
172231 */
173232 public static EventDetails fromProviderEventDetails (
174233 ProviderEventDetails providerEventDetails , String providerName , String domain ) {
175- return eventDetailsBuilder ()
176- .domain (domain )
234+ return builder ()
177235 .providerName (providerName )
178- .flagsChanged (providerEventDetails .getFlagsChanged ())
179- .eventMetadata (providerEventDetails .getEventMetadata ())
180- .message (providerEventDetails .getMessage ())
236+ .domain (domain )
237+ .providerEventDetails (providerEventDetails )
181238 .build ();
182239 }
183240}
0 commit comments