19
19
20
20
import org .openqa .selenium .internal .Require ;
21
21
22
+ import java .util .Collections ;
22
23
import java .util .Map ;
24
+ import java .util .Objects ;
25
+ import java .util .Set ;
26
+ import java .util .TreeMap ;
27
+
28
+ import static org .openqa .selenium .SharedCapabilitiesMethods .setCapability ;
23
29
24
30
public class ImmutableCapabilities implements Capabilities {
25
31
26
- private MutableCapabilities delegate = new MutableCapabilities () ;
32
+ private final Map < String , Object > delegate ;
27
33
28
34
public ImmutableCapabilities () {
35
+ this .delegate = Collections .emptyMap ();
29
36
}
30
37
31
38
public ImmutableCapabilities (String k , Object v ) {
32
- delegate .setCapability (k , v );
39
+ Require .nonNull ("Capability" , k );
40
+ Require .nonNull ("Value" , v );
41
+
42
+ Map <String , Object > delegate = new TreeMap <>();
43
+ setCapability (delegate , k , v );
44
+
45
+ this .delegate = Collections .unmodifiableMap (delegate );
33
46
}
34
47
35
48
public ImmutableCapabilities (String k1 , Object v1 , String k2 , Object v2 ) {
36
- delegate .setCapability (k1 , v1 );
37
- delegate .setCapability (k2 , v2 );
49
+ Require .nonNull ("First capability" , k1 );
50
+ Require .nonNull ("First value" , v1 );
51
+ Require .nonNull ("Second capability" , k2 );
52
+ Require .nonNull ("Second value" , v2 );
53
+
54
+ Map <String , Object > delegate = new TreeMap <>();
55
+
56
+ setCapability (delegate , k1 , v1 );
57
+ setCapability (delegate , k2 , v2 );
58
+
59
+ this .delegate = Collections .unmodifiableMap (delegate );
38
60
}
39
61
40
62
public ImmutableCapabilities (String k1 , Object v1 , String k2 , Object v2 , String k3 , Object v3 ) {
41
- delegate .setCapability (k1 , v1 );
42
- delegate .setCapability (k2 , v2 );
43
- delegate .setCapability (k3 , v3 );
63
+ Require .nonNull ("First capability" , k1 );
64
+ Require .nonNull ("First value" , v1 );
65
+ Require .nonNull ("Second capability" , k2 );
66
+ Require .nonNull ("Second value" , v2 );
67
+ Require .nonNull ("Third capability" , k3 );
68
+ Require .nonNull ("Third value" , v3 );
69
+
70
+ Map <String , Object > delegate = new TreeMap <>();
71
+
72
+ setCapability (delegate , k1 , v1 );
73
+ setCapability (delegate , k2 , v2 );
74
+ setCapability (delegate , k3 , v3 );
75
+
76
+ this .delegate = Collections .unmodifiableMap (delegate );
44
77
}
45
78
46
79
public ImmutableCapabilities (
47
80
String k1 , Object v1 ,
48
81
String k2 , Object v2 ,
49
82
String k3 , Object v3 ,
50
83
String k4 , Object v4 ) {
51
- delegate .setCapability (k1 , v1 );
52
- delegate .setCapability (k2 , v2 );
53
- delegate .setCapability (k3 , v3 );
54
- delegate .setCapability (k4 , v4 );
84
+ Require .nonNull ("First capability" , k1 );
85
+ Require .nonNull ("First value" , v1 );
86
+ Require .nonNull ("Second capability" , k2 );
87
+ Require .nonNull ("Second value" , v2 );
88
+ Require .nonNull ("Third capability" , k3 );
89
+ Require .nonNull ("Third value" , v3 );
90
+ Require .nonNull ("Fourth capability" , k4 );
91
+ Require .nonNull ("Fourth value" , v4 );
92
+
93
+ Map <String , Object > delegate = new TreeMap <>();
94
+
95
+ setCapability (delegate , k1 , v1 );
96
+ setCapability (delegate , k2 , v2 );
97
+ setCapability (delegate , k3 , v3 );
98
+ setCapability (delegate , k4 , v4 );
99
+
100
+ this .delegate = Collections .unmodifiableMap (delegate );
55
101
}
56
102
57
103
public ImmutableCapabilities (
@@ -60,34 +106,67 @@ public ImmutableCapabilities(
60
106
String k3 , Object v3 ,
61
107
String k4 , Object v4 ,
62
108
String k5 , Object v5 ) {
63
- delegate .setCapability (k1 , v1 );
64
- delegate .setCapability (k2 , v2 );
65
- delegate .setCapability (k3 , v3 );
66
- delegate .setCapability (k4 , v4 );
67
- delegate .setCapability (k5 , v5 );
109
+ Require .nonNull ("First capability" , k1 );
110
+ Require .nonNull ("First value" , v1 );
111
+ Require .nonNull ("Second capability" , k2 );
112
+ Require .nonNull ("Second value" , v2 );
113
+ Require .nonNull ("Third capability" , k3 );
114
+ Require .nonNull ("Third value" , v3 );
115
+ Require .nonNull ("Fourth capability" , k4 );
116
+ Require .nonNull ("Fourth value" , v4 );
117
+ Require .nonNull ("Fifth capability" , k5 );
118
+ Require .nonNull ("Fifth value" , v5 );
119
+
120
+ Map <String , Object > delegate = new TreeMap <>();
121
+
122
+ setCapability (delegate , k1 , v1 );
123
+ setCapability (delegate , k2 , v2 );
124
+ setCapability (delegate , k3 , v3 );
125
+ setCapability (delegate , k4 , v4 );
126
+ setCapability (delegate , k5 , v5 );
127
+
128
+ this .delegate = Collections .unmodifiableMap (delegate );
68
129
}
69
130
70
131
public ImmutableCapabilities (Capabilities other ) {
71
132
Require .nonNull ("Capabilities" , other );
72
- other .getCapabilityNames ().forEach (name -> delegate .setCapability (name , other .getCapability (name )));
133
+
134
+ Map <String , Object > delegate = new TreeMap <>();
135
+ other .getCapabilityNames ().forEach (name -> {
136
+ Require .nonNull ("Capability name" , name );
137
+ Object value = other .getCapability (name );
138
+ Require .nonNull ("Capability value" , value );
139
+
140
+ setCapability (delegate , name , value );
141
+ });
142
+
143
+ this .delegate = Collections .unmodifiableMap (delegate );
73
144
}
74
145
75
146
public ImmutableCapabilities (Map <?, ?> capabilities ) {
76
147
Require .nonNull ("Capabilities" , capabilities );
148
+
149
+ Map <String , Object > delegate = new TreeMap <>();
77
150
capabilities .forEach ((key , value ) -> {
78
- Require .argument ("Key" , key ).instanceOf (String .class );
79
- delegate .setCapability (String .valueOf (key ), value );
151
+ Require .argument ("Capability key" , key ).instanceOf (String .class );
152
+ Object v = capabilities .get (key );
153
+ Require .nonNull ("Capability value" , value );
154
+
155
+ setCapability (delegate , (String ) key , v );
80
156
});
157
+
158
+ this .delegate = Collections .unmodifiableMap (delegate );
81
159
}
82
160
83
161
@ Override
84
162
public Object getCapability (String capabilityName ) {
85
- return delegate .getCapability (capabilityName );
163
+ Require .nonNull ("Capability name" , capabilityName );
164
+ return delegate .get (capabilityName );
86
165
}
87
166
88
167
@ Override
89
168
public Map <String , Object > asMap () {
90
- return delegate . asMap () ;
169
+ return delegate ;
91
170
}
92
171
93
172
@ Override
@@ -100,15 +179,29 @@ public boolean equals(Object o) {
100
179
if (this == o ) {
101
180
return true ;
102
181
}
182
+
103
183
if (!(o instanceof Capabilities )) {
104
184
return false ;
105
185
}
106
- return delegate .equals (o );
186
+
187
+ Capabilities other = (Capabilities ) o ;
188
+ Set <String > names = other .getCapabilityNames ();
189
+ if (names .size () != delegate .size ()) {
190
+ return false ;
191
+ }
192
+
193
+ for (String name : names ) {
194
+ if (!Objects .equals (delegate .get (name ), other .getCapability (name ))) {
195
+ return false ;
196
+ }
197
+ }
198
+
199
+ return true ;
107
200
}
108
201
109
202
@ Override
110
203
public String toString () {
111
- return delegate .toString ();
204
+ return SharedCapabilitiesMethods .toString (delegate );
112
205
}
113
206
114
207
public static ImmutableCapabilities copyOf (Capabilities capabilities ) {
@@ -120,4 +213,5 @@ public static ImmutableCapabilities copyOf(Capabilities capabilities) {
120
213
121
214
return new ImmutableCapabilities (capabilities );
122
215
}
216
+
123
217
}
0 commit comments