/
ThingBuilder.java
executable file
·1321 lines (1193 loc) · 60.6 KB
/
ThingBuilder.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* Copyright (c) 2017 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.ditto.model.things;
import java.time.Instant;
import java.util.UUID;
import java.util.function.Predicate;
import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.model.base.auth.AuthorizationSubject;
/**
* Builder for instances of {@link Thing} which uses Object Scoping and Method Chaining to provide a convenient usage
* experience.
*/
public interface ThingBuilder {
/**
* Generates a random Thing ID with the ditto namespace.
*
* @return the ID
*/
static String generateRandomThingId() {
return "org.eclipse.ditto:" + UUID.randomUUID();
}
/**
* A mutable builder with a fluent API for an immutable {@link Thing} from scratch.
*
*/
@NotThreadSafe
interface FromScratch {
/**
* Sets the given permissions to this builder. Previously set permissions for the same authorization subject are
* replaced.
*
* @param authorizationSubject the authorization subject to set the permissions for.
* @param permission the permission of the authorization subject to be set.
* @param furtherPermissions additional permissions of the authorization subject to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromScratch setPermissions(AuthorizationSubject authorizationSubject, Permission permission,
Permission... furtherPermissions);
/**
* Sets the given permissions to this builder. Previously set permissions for the same authorization subject are
* replaced.
*
* @param authorizationSubject the authorization subject to set the permissions for.
* @param permissions the permission of of the authorization subject to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromScratch setPermissions(AuthorizationSubject authorizationSubject, Permissions permissions);
/**
* Sets the given permissions to this builder. All previously set ACL entries with the same authorization
* subject are replaced.
*
* @param aclEntries the entries to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code aclEntries} is {@code null}.
*/
FromScratch setPermissions(Iterable<AclEntry> aclEntries);
/**
* Sets permissions to this builder. The permissions are parsed from the JSON object representation of an Access
* Control List. All previously set ACL entries with the same authorization subject are replaced.
*
* @param accessControlListJsonObject the JSON object representation of an Access Control List.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code accessControlListJsonObject} is {@code null}.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code accessControlListJsonObject} cannot be parsed
* to {@link AccessControlList}.
*/
FromScratch setPermissions(JsonObject accessControlListJsonObject);
/**
* Sets permissions to this builder. The permissions are parsed from the JSON string representation of an Access
* Control List. All previously set ACL entries with the same authorization subject are replaced.
*
* @param accessControlListJsonString the JSON string representation of an Access Control List.
* @return this builder to allow method chaining.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code accessControlListJsonString} cannot be parsed
* to {@link AccessControlList}.
* @see #setPermissions(JsonObject)
*/
FromScratch setPermissions(String accessControlListJsonString);
/**
* Sets the given permissions to this builder. All previously set ACL entries with the same authorization
* subject are replaced.
*
* @param aclEntry the ACL entry of the be set.
* @param furtherAclEntries additional ACL entries to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromScratch setPermissions(AclEntry aclEntry, AclEntry... furtherAclEntries);
/**
* Removes all permissions of the given authorization subject from this builder.
*
* @param authorizationSubject the authorization subject of which all permissions are to be removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code authorizationSubject} is {@code null}.
*/
FromScratch removePermissionsOf(AuthorizationSubject authorizationSubject);
/**
* Removes all permissions from this builder.
*
* @return this builder to allow method chaining.
*/
FromScratch removeAllPermissions();
/**
* Sets the given Policy ID to this builder.
*
* @param policyId the Policy ID to set.
* @return this builder to allow method chaining.
*/
FromScratch setPolicyId(@Nullable String policyId);
/**
* Removes the Policy ID from this builder.
*
* @return this builder to allow method chaining.
*/
FromScratch removePolicyId();
/**
* Sets the given attributes to this builder.
*
* @param attributes the attributes to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code attributes} is {@code null}.
*/
FromScratch setAttributes(Attributes attributes);
/**
* Sets the attributes to this builder. The attributes are parsed from the given JSON object representation of
* {@link Attributes}.
*
* @param attributesJsonObject the JSON object representation of the attributes to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code attributesJsonObject} is {@code null}.
*/
FromScratch setAttributes(JsonObject attributesJsonObject);
/**
* Sets the attributes to this builder. The attributes are parsed from the given JSON string representation of
* {@link Attributes}.
*
* @param attributesJsonString JSON string representation of the attributes to be set.
* @return this builder to allow method chaining.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code attributesJsonString} is not a valid JSON
* object.
*/
FromScratch setAttributes(String attributesJsonString);
/**
* Removes all attributes from this builder.
*
* @return this builder to allow method chaining.
*/
FromScratch removeAllAttributes();
/**
* Sets empty attributes to this builder. All already set attributes are discarded.
*
* @return this builder to allow method chaining.
*/
FromScratch setEmptyAttributes();
/**
* Sets attributes to this builder which represent semantically {@code null}. All already set attributes are
* discarded.
*
* @return this builder to allow method chaining.
*/
FromScratch setNullAttributes();
/**
* Sets the given attribute to this builder.
*
* @param attributePath the hierarchical path to the attribute value.
* @param attributeValue the value to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
* @throws IllegalArgumentException if {@code attributePath} is empty.
*/
FromScratch setAttribute(JsonPointer attributePath, JsonValue attributeValue);
/**
* Removes the attribute at the given path from this builder.
*
* @param attributePath the hierarchical path to the attribute to be removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if attributes were set already and {@code attributePath} is {@code null}.
*/
FromScratch removeAttribute(JsonPointer attributePath);
/**
* Sets the given Feature to this builder. A previously set Feature with the same ID is replaced.
*
* @param feature the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code feature} is {@code null}.
*/
FromScratch setFeature(Feature feature);
/**
* Sets a Feature with the given ID to this builder. A previously set Feature with the same ID is replaced.
*
* @param featureId the identifier of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
FromScratch setFeature(String featureId);
/**
* Sets a Feature with the given ID and properties to this builder. A previously set Feature with the
* same ID is replaced.
*
* @param featureId the ID of the Feature to be set.
* @param featureDefinition the definition of the Feature to be set.
* @param featureProperties the properties of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
FromScratch setFeature(String featureId, FeatureDefinition featureDefinition,
FeatureProperties featureProperties);
/**
* Sets a Feature with the given ID and properties to this builder. A previously set Feature with the
* same ID is replaced.
*
* @param featureId the ID of the Feature to be set.
* @param featureProperties the properties of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
FromScratch setFeature(String featureId, FeatureProperties featureProperties);
/**
* Removes the Feature with the given ID from this builder. If this was the last Feature the Thing will
* not have features.
*
* @param featureId the ID of the Feature to be removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
FromScratch removeFeature(String featureId);
/**
* Sets the given definition to the Feature with the given ID on this builder. If this builder does not yet
* know a Feature with the given ID it creates one.
*
* @param featureId the ID of the Feature to be set.
* @param featureDefinition the definition of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromScratch setFeatureDefinition(String featureId, FeatureDefinition featureDefinition);
/**
* Removes the definition from Feature with the given identifier on this builder.
*
* @param featureId the ID of the Feature from which the definition is to be deleted.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
FromScratch removeFeatureDefinition(String featureId);
/**
* Sets the given property to the Feature with the given ID on this builder.
*
* @param featureId the ID of the Feature.
* @param propertyPath the hierarchical path within the Feature to the property to be set.
* @param propertyValue the property value to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromScratch setFeatureProperty(String featureId, JsonPointer propertyPath, JsonValue propertyValue);
/**
* Removes the given property from the Feature with the given ID on this builder.
*
* @param featureId the ID of the Feature.
* @param propertyPath the hierarchical path to within the Feature to the property to be removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromScratch removeFeatureProperty(String featureId, JsonPointer propertyPath);
/**
* Sets the given properties to the Feature with the given ID on this builder.
*
* @param featureId the ID of the Feature.
* @param featureProperties the properties to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromScratch setFeatureProperties(String featureId, FeatureProperties featureProperties);
/**
* Removes all properties from the Feature with the given ID on this builder.
*
* @param featureId the ID of the Feature.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
FromScratch removeFeatureProperties(String featureId);
/**
* Sets the features to this builder. The features are parsed from the given JSON object representation of
* {@link Features}.
*
* @param featuresJsonObject JSON object representation of the features to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featuresJsonObject} is {@code null}.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code featuresJsonObject} cannot be parsed to
* {@link Features}.
*/
FromScratch setFeatures(JsonObject featuresJsonObject);
/**
* Sets the Features of the Thing based on the given JSON object.
*
* @param featuresJsonString JSON string providing the Features of the Thing.
* @return this builder to allow method chaining.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code featuresJsonString} cannot be parsed to
* {@link Features}.
*/
FromScratch setFeatures(String featuresJsonString);
/**
* Sets the given Features to this builder.
*
* @param features the Features to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code features} is {@code null}.
*/
FromScratch setFeatures(Iterable<Feature> features);
/**
* Removes all features from this builder.
*
* @return this builder to allow method chaining.
*/
FromScratch removeAllFeatures();
/**
* Sets empty features to this builder. All already set features are discarded.
*
* @return this builder to allow method chaining.
*/
FromScratch setEmptyFeatures();
/**
* Sets features to this builder which represents semantically {@code null}. All already set features are
* discarded.
*
* @return this builder to allow method chaining.
*/
FromScratch setNullFeatures();
/**
* Sets the given lifecycle to this builder.
*
* @param lifecycle the lifecycle to be set.
* @return this builder to allow method chaining.
*/
FromScratch setLifecycle(ThingLifecycle lifecycle);
/**
* Sets the given revision to this builder.
*
* @param revision the revision to be set.
* @return this builder to allow method chaining.
*/
FromScratch setRevision(ThingRevision revision);
/**
* Sets the given revision number to this builder.
*
* @param revisionNumber the revision number to be set.
* @return this builder to allow method chaining.
*/
FromScratch setRevision(long revisionNumber);
/**
* Sets the given modified to this builder.
*
* @param modified the modified to be set.
* @return this builder to allow method chaining.
*/
FromScratch setModified(@Nullable Instant modified);
/**
* Sets the given Thing ID to this builder. The ID is required to include the Thing's namespace.
*
* @param thingId the Thing ID to be set.
* @return this builder to allow method chaining.
* @throws ThingIdInvalidException if {@code thingId} does not comply to the required pattern.
*/
FromScratch setId(@Nullable String thingId);
/**
* Sets a generated Thing ID to this builder.
*
* @return this builder to allow method chaining.
*/
FromScratch setGeneratedId();
/**
* Creates a new immutable {@link Thing} containing all properties which were set to this builder beforehand.
*
* @return the new Thing.
*/
Thing build();
}
/**
* A mutable builder with a fluent API for an immutable {@link Thing}. This builder is initialised with the
* properties of an existing Thing.
*
*/
@NotThreadSafe
interface FromCopy {
/**
* Sets the given permissions to this builder. Previously set permissions for the same authorization subject are
* replaced.
*
* @param authorizationSubject the authorization subject to set the permissions for.
* @param permission the permission of the authorization subject to be set.
* @param furtherPermissions additional permissions of the authorization subject to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
default FromCopy setPermissions(final AuthorizationSubject authorizationSubject, final Permission permission,
final Permission... furtherPermissions) {
return setPermissions(existingAcl -> true, authorizationSubject, permission, furtherPermissions);
}
/**
* Sets the given permissions to this builder. Previously set permissions for the same authorization subject are
* replaced.
*
* @param existingAclPredicate a predicate to decide whether the given permissions are set. The predicate
* receives the ACL which consists of the currently set permissions.
* @param authorizationSubject the authorization subject to set the permissions for.
* @param permission the permission of the authorization subject to be set.
* @param furtherPermissions additional permissions of the authorization subject to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setPermissions(Predicate<AccessControlList> existingAclPredicate,
AuthorizationSubject authorizationSubject, Permission permission, Permission... furtherPermissions);
/**
* Sets the given permissions to this builder. Previously set permissions for the same authorization subject are
* replaced.
*
* @param authorizationSubject the authorization subject to set the permissions for.
* @param permissions the permission of of the authorization subject to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
default FromCopy setPermissions(final AuthorizationSubject authorizationSubject,
final Permissions permissions) {
return setPermissions(existingAcl -> true, authorizationSubject, permissions);
}
/**
* Sets the given permissions to this builder. Previously set permissions for the same authorization subject are
* replaced.
*
* @param existingAclPredicate a predicate to decide whether the given permissions are set. The predicate
* receives the ACL which consists of the currently set permissions.
* @param authorizationSubject the authorization subject to set the permissions for.
* @param permissions the permission of of the authorization subject to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setPermissions(Predicate<AccessControlList> existingAclPredicate,
AuthorizationSubject authorizationSubject, Permissions permissions);
/**
* Sets the given permissions to this builder. All previously set ACL entries with the same authorization
* subject are replaced.
*
* @param aclEntries the entries to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code aclEntries} is {@code null}.
*/
default FromCopy setPermissions(final Iterable<AclEntry> aclEntries) {
return setPermissions(existingAcl -> true, aclEntries);
}
/**
* Sets the given permissions to this builder. All previously set ACL entries with the same authorization
* subject are replaced.
*
* @param existingAclPredicate a predicate to decide whether the given permissions are set. The predicate
* receives the ACL which consists of the currently set permissions.
* @param aclEntries the entries to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setPermissions(Predicate<AccessControlList> existingAclPredicate, Iterable<AclEntry> aclEntries);
/**
* Sets permissions to this builder. The permissions are parsed from the JSON object representation of an Access
* Control List. All previously set ACL entries with the same authorization subject are replaced.
*
* @param accessControlListJsonObject the JSON object representation of an Access Control List.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code accessControlListJsonObject} is {@code null}.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code accessControlListJsonObject} cannot be parsed
* to {@link AccessControlList}.
*/
default FromCopy setPermissions(final JsonObject accessControlListJsonObject) {
return setPermissions(existingAcl -> true, accessControlListJsonObject);
}
/**
* Sets permissions to this builder. The permissions are parsed from the JSON object representation of an Access
* Control List. All previously set ACL entries with the same authorization subject are replaced.
*
* @param existingAclPredicate a predicate to decide whether the given permissions are set. The predicate
* receives the ACL which consists of the currently set permissions.
* @param accessControlListJsonObject the JSON object representation of an Access Control List.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code accessControlListJsonObject} cannot be parsed
* to {@link AccessControlList}.
*/
FromCopy setPermissions(Predicate<AccessControlList> existingAclPredicate,
JsonObject accessControlListJsonObject);
/**
* Sets the permissions of the Thing based on the given JSON representation of an Access Control List.
*
* @param accessControlListJsonString the JSON string representation of an Access Control List.
* @return this builder to allow method chaining.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code accessControlListJsonString} cannot be parsed
* to {@link AccessControlList}.
*/
default FromCopy setPermissions(final String accessControlListJsonString) {
return setPermissions(existingAcl -> true, accessControlListJsonString);
}
/**
* Sets the permissions of the Thing based on the given JSON representation of an Access Control List.
*
* @param existingAclPredicate a predicate to decide whether the given permissions are set. The predicate
* receives the ACL which consists of the currently set permissions.
* @param accessControlListJsonString the JSON string representation of an Access Control List.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code existingAclPredicate} is {@code null}.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code accessControlListJsonString} cannot be parsed
* to {@link AccessControlList}.
*/
FromCopy setPermissions(Predicate<AccessControlList> existingAclPredicate, String accessControlListJsonString);
/**
* Sets the given permissions to this builder. All previously set ACL entries with the same authorization
* subject are replaced.
*
* @param aclEntry the ACL entry of the be set.
* @param furtherAclEntries additional ACL entries to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
default FromCopy setPermissions(final AclEntry aclEntry, final AclEntry... furtherAclEntries) {
return setPermissions(existingAcl -> true, aclEntry, furtherAclEntries);
}
/**
* Sets the given permissions to this builder. All previously set ACL entries with the same authorization
* subject are replaced.
*
* @param existingAclPredicate a predicate to decide whether the given permissions are set. The predicate
* receives the ACL which consists of the currently set permissions.
* @param aclEntry the ACL entry of the be set.
* @param furtherAclEntries additional ACL entries to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setPermissions(Predicate<AccessControlList> existingAclPredicate, AclEntry aclEntry,
AclEntry... furtherAclEntries);
/**
* Removes all permissions of the given authorization subject from the Thing.
*
* @param authorizationSubject the authorization subject of which all permissions are removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code authorizationSubject} is {@code null}.
*/
default FromCopy removePermissionsOf(final AuthorizationSubject authorizationSubject) {
return removePermissionsOf(existingAcl -> true, authorizationSubject);
}
/**
* Removes all permissions of the given authorization subject from the Thing.
*
* @param existingAclPredicate a predicate to decide whether the given permissions are set. The predicate
* receives the ACL which consists of the currently set permissions.
* @param authorizationSubject the authorization subject of which all permissions are removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy removePermissionsOf(Predicate<AccessControlList> existingAclPredicate,
AuthorizationSubject authorizationSubject);
/**
* Removes all permissions from this builder.
*
* @return this builder to allow method chaining.
*/
default FromCopy removeAllPermissions() {
return removeAllPermissions(existingAcl -> true);
}
/**
* Removes all permissions from this builder.
*
* @param existingAclPredicate a predicate to decide whether the given permissions are set. The predicate
* receives the ACL which consists of the currently set permissions.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code existingAclPredicate} is {@code null}.
*/
FromCopy removeAllPermissions(Predicate<AccessControlList> existingAclPredicate);
/**
* Sets the given Policy ID to this builder.
*
* @param policyId the Policy ID to set.
* @return this builder to allow method chaining.
*/
FromCopy setPolicyId(@Nullable String policyId);
/**
* Removes the Policy ID from this builder.
*
* @return this builder to allow method chaining.
*/
FromCopy removePolicyId();
/**
* Sets the given attributes to this builder.
*
* @param attributes the attributes to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code attributes} is {@code null}.
*/
default FromCopy setAttributes(final Attributes attributes) {
return setAttributes(existingAttributes -> true, attributes);
}
/**
* Sets the given attributes to this builder.
*
* @param existingAttributesPredicate a predicate to decide whether the given attributes are set. The predicate
* receives the currently set attributes.
* @param attributes the attributes to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setAttributes(Predicate<Attributes> existingAttributesPredicate, Attributes attributes);
/**
* Sets the attributes to this builder. The attributes are parsed from the given JSON object representation of
* {@link Attributes}.
*
* @param attributesJsonObject the JSON object representation of the attributes to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code attributesJsonObject} is {@code null}.
*/
default FromCopy setAttributes(final JsonObject attributesJsonObject) {
return setAttributes(existingAttributes -> true, attributesJsonObject);
}
/**
* Sets the attributes to this builder. The attributes are parsed from the given JSON object representation of
* {@link Attributes}.
*
* @param existingAttributesPredicate a predicate to decide whether the given attributes are set. The predicate
* receives the currently set attributes.
* @param attributesJsonObject the JSON object representation of the attributes to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setAttributes(Predicate<Attributes> existingAttributesPredicate, JsonObject attributesJsonObject);
/**
* Sets the attributes to this builder. The attributes are parsed from the given JSON string representation of
* {@link Attributes}.
*
* @param attributesJsonString JSON string representation of the attributes to be set.
* @return this builder to allow method chaining.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code attributesJsonString} is not a valid JSON
* object.
*/
default FromCopy setAttributes(final String attributesJsonString) {
return setAttributes(existingAttributes -> true, attributesJsonString);
}
/**
* Sets the attributes to this builder. The attributes are parsed from the given JSON string representation of
* {@link Attributes}.
*
* @param existingAttributesPredicate a predicate to decide whether the given attributes are set. The predicate
* receives the currently set attributes.
* @param attributesJsonString JSON string representation of the attributes to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code existingAttributesPredicate} is {@code null}.
* @throws org.eclipse.ditto.model.base.exceptions.DittoJsonException if {@code attributesJsonString} is not a valid JSON
* object.
*/
FromCopy setAttributes(Predicate<Attributes> existingAttributesPredicate, String attributesJsonString);
/**
* Removes all attributes from this builder.
*
* @return this builder to allow method chaining.
*/
default FromCopy removeAllAttributes() {
return removeAllAttributes(existingAttributes -> true);
}
/**
* Removes all attributes from this builder.
*
* @param existingAttributesPredicate a predicate to decide whether the given attributes are set. The predicate
* receives the currently set attributes.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code existingAttributesPredicate} is {@code null}.
*/
FromCopy removeAllAttributes(Predicate<Attributes> existingAttributesPredicate);
/**
* Sets attributes to this builder which represent semantically {@code null}. All already set attributes are
* discarded.
*
* @return this builder to allow method chaining.
*/
FromCopy setNullAttributes();
/**
* Sets the given attribute to this builder.
*
* @param attributePath the hierarchical path to the attribute value.
* @param attributeValue the value to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
* @throws IllegalArgumentException if {@code attributePath} is empty.
*/
default FromCopy setAttribute(final JsonPointer attributePath, final JsonValue attributeValue) {
return setAttribute(existingAttributes -> true, attributePath, attributeValue);
}
/**
* Sets the given attribute to this builder.
*
* @param existingAttributesPredicate a predicate to decide whether the given attributes are set. The predicate
* receives the currently set attributes.
* @param attributePath the hierarchical path to the attribute value.
* @param attributeValue the value to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
* @throws IllegalArgumentException if {@code attributePath} is empty.
*/
FromCopy setAttribute(Predicate<Attributes> existingAttributesPredicate, JsonPointer attributePath,
JsonValue attributeValue);
/**
* Removes the attribute at the given path from this builder.
*
* @param attributePath the hierarchical path to the attribute to be removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code attributePath} is {@code null}.
*/
default FromCopy removeAttribute(final JsonPointer attributePath) {
return removeAttribute(existingAttributes -> true, attributePath);
}
/**
* Removes the attribute at the given path from this builder.
*
* @param existingAttributesPredicate a predicate to decide whether the given attributes are set. The predicate
* receives the currently set attributes.
* @param attributePath the hierarchical path to the attribute to be removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy removeAttribute(Predicate<Attributes> existingAttributesPredicate, JsonPointer attributePath);
/**
* Sets the given Feature to this builder. A previously set Feature with the same ID is replaced.
*
* @param feature the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code feature} is {@code null}.
*/
default FromCopy setFeature(final Feature feature) {
return setFeature(existingFeatures -> true, feature);
}
/**
* Sets the given Feature to this builder. A previously set Feature with the same ID is replaced.
*
* @param existingFeaturesPredicate a predicate to decide whether the given features are set. The predicate
* receives the currently set features.
* @param feature the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setFeature(Predicate<Features> existingFeaturesPredicate, Feature feature);
/**
* Sets a Feature with the given ID to this builder. A previously set Feature with the same ID is replaced.
*
* @param featureId the ID of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
default FromCopy setFeature(final String featureId) {
return setFeature(existingFeatures -> true, featureId);
}
/**
* Sets a Feature with the given ID to this builder. A previously set Feature with the same ID is replaced.
*
* @param existingFeaturesPredicate a predicate to decide whether the given features are set. The predicate
* receives the currently set features.
* @param featureId the ID of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setFeature(Predicate<Features> existingFeaturesPredicate, String featureId);
/**
* Removes the Feature with the given ID from this builder.
*
* @param featureId the ID of the Feature to be removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
default FromCopy removeFeature(final String featureId) {
return removeFeature(existingFeatures -> true, featureId);
}
/**
* Removes the Feature with the given ID from this builder.
*
* @param existingFeaturesPredicate a predicate to decide whether the given features are set. The predicate
* receives the currently set features.
* @param featureId the ID of the Feature to be removed.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy removeFeature(Predicate<Features> existingFeaturesPredicate, String featureId);
/**
* Sets a Feature with the given ID and properties to this builder. A previously set Feature with the
* same ID is replaced.
*
* @param featureId the ID of the Feature to be set.
* @param featureProperties the properties of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
default FromCopy setFeature(final String featureId, final FeatureProperties featureProperties) {
return setFeature(existingFeatures -> true, featureId, featureProperties);
}
/**
* Sets a Feature with the given ID and properties to this builder. A previously set Feature with the
* same ID is replaced.
*
* @param existingFeaturesPredicate a predicate to decide whether the given features are set. The predicate
* receives the currently set features.
* @param featureId the ID of the Feature to be set.
* @param featureProperties the properties of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setFeature(Predicate<Features> existingFeaturesPredicate, String featureId,
FeatureProperties featureProperties);
/**
* Sets a Feature with the given ID and properties to this builder. A previously set Feature with the
* same ID is replaced.
*
* @param featureId the ID of the Feature to be set.
* @param featureDefinition the definition of the Feature to be set.
* @param featureProperties the properties of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
default FromCopy setFeature(final String featureId, final FeatureDefinition featureDefinition,
final FeatureProperties featureProperties) {
return setFeature(existingFeatures -> true, featureId, featureDefinition, featureProperties);
}
/**
* Sets a Feature with the given ID and properties to this builder. A previously set Feature with the
* same ID is replaced.
*
* @param existingFeaturesPredicate a predicate to decide whether the given features are set. The predicate
* receives the currently set features.
* @param featureId the ID of the Feature to be set.
* @param featureDefinition the definition of the Feature to be set.
* @param featureProperties the properties of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setFeature(Predicate<Features> existingFeaturesPredicate,
String featureId,
FeatureDefinition featureDefinition,
FeatureProperties featureProperties);
/**
* Sets the given definition to the Feature with the given ID on this builder.
*
* @param featureId the ID of the Feature to be set.
* @param featureDefinition the definition of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
default FromCopy setFeatureDefinition(final String featureId, final FeatureDefinition featureDefinition) {
return setFeatureDefinition(features -> true, featureId, featureDefinition);
}
/**
* Sets the given definition to the Feature with the given ID on this builder.
*
* @param existingFeaturesPredicate a predicate to decide whether the given definition is set. The predicate
* receives the currently set features.
* @param featureId the ID of the Feature to be set.
* @param featureDefinition the definition of the Feature to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
FromCopy setFeatureDefinition(Predicate<Features> existingFeaturesPredicate, String featureId,
FeatureDefinition featureDefinition);
/**
* Removes the definition from Feature with the given identifier on this builder.
*
* @param featureId the ID of the Feature from which the definition is to be deleted.
* @return this builder to allow method chaining.
* @throws NullPointerException if {@code featureId} is {@code null}.
*/
FromCopy removeFeatureDefinition(String featureId);
/**
* Sets the given property to the Feature with the given ID on this builder.
*
* @param featureId the ID of the Feature.
* @param propertyPath the hierarchical path within the Feature to the property to be set.
* @param propertyValue the property value to be set.
* @return this builder to allow method chaining.
* @throws NullPointerException if any argument is {@code null}.
*/
default FromCopy setFeatureProperty(final String featureId, final JsonPointer propertyPath,
final JsonValue propertyValue) {
return setFeatureProperty(existingFeatures -> true, featureId, propertyPath, propertyValue);
}
/**
* Sets the given property to the Feature with the given ID on this builder.
*
* @param existingFeaturesPredicate a predicate to decide whether the given features are set. The predicate
* receives the currently set features.
* @param featureId the ID of the Feature.