1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
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  }