1
2
3
4
5
6 package dev.metaschema.oscal.lib.model.metadata;
7
8 import java.net.URI;
9 import java.util.LinkedList;
10 import java.util.List;
11 import java.util.stream.Collectors;
12 import java.util.stream.Stream;
13
14 import dev.metaschema.core.datatype.markup.MarkupLine;
15 import dev.metaschema.core.util.ObjectUtils;
16 import dev.metaschema.oscal.lib.model.Link;
17 import edu.umd.cs.findbugs.annotations.NonNull;
18
19 public abstract class AbstractLink implements ILink {
20
21 public static List<Link> merge(@NonNull List<Link> original, @NonNull List<Link> additional) {
22 return Stream.concat(original.stream(), additional.stream())
23 .collect(Collectors.toCollection(LinkedList::new));
24 }
25
26 @NonNull
27 public static Builder builder(@NonNull URI href) {
28 return new Builder(href);
29 }
30
31 public static class Builder {
32 @NonNull
33 private final URI href;
34 private String rel;
35 private String mediaType;
36 private MarkupLine text;
37
38 public Builder(@NonNull URI href) {
39 this.href = ObjectUtils.requireNonNull(href, "href");
40 }
41
42 @NonNull
43 public Builder relation(@NonNull String relation) {
44 this.rel = ObjectUtils.requireNonNull(relation, "rel");
45 return this;
46 }
47
48 @NonNull
49 public Builder value(@NonNull String mediaType) {
50 this.mediaType = ObjectUtils.requireNonNull(mediaType, "mediaType");
51 return this;
52 }
53
54 @NonNull
55 public Builder clazz(@NonNull MarkupLine text) {
56 this.text = ObjectUtils.requireNonNull(text, "text");
57 return this;
58 }
59
60 @NonNull
61 public Link build() {
62 Link retval = new Link();
63 retval.setHref(href);
64 if (rel != null) {
65 retval.setRel(rel);
66 }
67 if (mediaType != null) {
68 retval.setMediaType(mediaType);
69 }
70 if (text != null) {
71 retval.setText(text);
72 }
73
74 return retval;
75 }
76 }
77 }