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}