001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.oscal.lib.model.metadata;
007
008import java.net.URI;
009import java.util.LinkedList;
010import java.util.List;
011import java.util.stream.Collectors;
012import java.util.stream.Stream;
013
014import dev.metaschema.core.datatype.markup.MarkupLine;
015import dev.metaschema.core.util.ObjectUtils;
016import dev.metaschema.oscal.lib.model.Link;
017import edu.umd.cs.findbugs.annotations.NonNull;
018
019public abstract class AbstractLink implements ILink {
020
021  public static List<Link> merge(@NonNull List<Link> original, @NonNull List<Link> additional) {
022    return Stream.concat(original.stream(), additional.stream())
023        .collect(Collectors.toCollection(LinkedList::new));
024  }
025
026  @NonNull
027  public static Builder builder(@NonNull URI href) {
028    return new Builder(href);
029  }
030
031  public static class Builder {
032    @NonNull
033    private final URI href;
034    private String rel;
035    private String mediaType;
036    private MarkupLine text;
037
038    public Builder(@NonNull URI href) {
039      this.href = ObjectUtils.requireNonNull(href, "href");
040    }
041
042    @NonNull
043    public Builder relation(@NonNull String relation) {
044      this.rel = ObjectUtils.requireNonNull(relation, "rel");
045      return this;
046    }
047
048    @NonNull
049    public Builder value(@NonNull String mediaType) {
050      this.mediaType = ObjectUtils.requireNonNull(mediaType, "mediaType");
051      return this;
052    }
053
054    @NonNull
055    public Builder clazz(@NonNull MarkupLine text) {
056      this.text = ObjectUtils.requireNonNull(text, "text");
057      return this;
058    }
059
060    @NonNull
061    public Link build() {
062      Link retval = new Link();
063      retval.setHref(href);
064      if (rel != null) {
065        retval.setRel(rel);
066      }
067      if (mediaType != null) {
068        retval.setMediaType(mediaType);
069      }
070      if (text != null) {
071        retval.setText(text);
072      }
073
074      return retval;
075    }
076  }
077}