001package org.hl7.fhir.r5.context;
002
003import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
004
005import java.util.*;
006
007public interface IOIDServices {
008
009  public static class OIDDefinitionComparer implements Comparator<OIDDefinition> {
010
011    @Override
012    public int compare(OIDDefinition o1, OIDDefinition o2) {
013      if (o1.getUrl().equals(o2.getUrl())) {
014        return -o1.getVersion().compareTo(o2.getVersion());
015      } else {
016        return o1.getUrl().compareTo(o2.getUrl());
017      }
018    }
019  }
020
021  public static class OIDDefinition {
022    private String type;
023    private String oid;
024    private String url;
025    private String version;
026    private String packageSrc;
027    private String status;
028    protected OIDDefinition(String type, String oid, String url, String version, String status, String packageSrc) {
029      super();
030      this.type = type;
031      this.oid = oid;
032      this.url = url;
033      this.version = version == null ? "" : version;
034      this.packageSrc = packageSrc;
035      this.status = status;
036    }
037    public String getType() {
038      return type;
039    }
040    public String getOid() {
041      return oid;
042    }
043    public String getUrl() {
044      return url;
045    }
046    public String getVersion() {
047      return version;
048    }
049    public String getStatus() {
050      return status;
051    }
052    public String getPackageSrc() {
053      return packageSrc;
054    }
055    public String summary() {
056      return url+(version == null ? "" : "|"+version)+(packageSrc != null ? "("+packageSrc+")" : "");
057    }
058    public boolean matches(OIDDefinition t) {
059      return url.equals(t.url) && version.equals(t.version);
060    }
061
062  }
063
064  public static class OIDSummary {
065    private List<OIDDefinition> definitions = new ArrayList<>();
066    private List<String> urls = new ArrayList<>();
067
068    public void addOID(OIDDefinition d) {
069      for (OIDDefinition t : definitions) {
070        if (d.matches(t)) {
071          return;
072        }
073      }
074      definitions.add(d);
075      if (!urls.contains(d.getUrl())) {
076        urls.add(d.getUrl());
077      }
078    }
079
080    public void addOIDs(Collection<OIDDefinition> collection) {
081      for (OIDDefinition t : collection) {
082        addOID(t);
083      }
084    }
085
086    public List<OIDDefinition> getDefinitions() {
087      return definitions;
088    }
089
090    public void sort() {
091      Collections.sort(definitions, new OIDDefinitionComparer());
092      Collections.sort(urls);
093    }
094    public String describe() {
095      CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
096      for (OIDDefinition d : definitions) {
097        b.append(d.summary());
098      }
099      return b.toString();
100    }
101
102    public String chooseBestUrl() {
103      for (OIDDefinition d : definitions) {
104        if (d.getPackageSrc() == null) {
105          return d.getUrl();
106        }
107      }
108      for (OIDDefinition d : definitions) {
109        if (d.getUrl().startsWith("http://hl7.org/fhir/")) {
110          return d.getUrl();
111        }
112      }
113      for (OIDDefinition d : definitions) {
114        if (!d.getUrl().contains("vsac")) {
115          return d.getUrl();
116        }
117      }
118      return null;
119    }
120
121    public int urlCount() {
122      return urls.size();
123    }
124
125    public String getUrl() {
126      return urls.iterator().next();
127    }
128  }
129
130  public IOIDServices.OIDSummary urlsForOid(String oid, String resourceType);
131
132}