001package org.galaxyproject.gxformat2.v19_09.utils;
002
003import java.util.ArrayList;
004import java.util.Arrays;
005import java.util.List;
006import java.util.Map;
007
008public class LoadingOptions {
009  Fetcher fetcher;
010  String fileUri;
011  Map<String, String> namespaces;
012  List<String> schemas;
013  Map<String, Map<String, Object>> idx;
014  Map<String, String> vocab;
015  Map<String, String> rvocab;
016
017  LoadingOptions(
018      final Fetcher fetcher,
019      final String fileUri,
020      final Map<String, String> namespaces,
021      final List<String> schemas,
022      final Map<String, Map<String, Object>> idx) {
023    this.fetcher = fetcher;
024    this.fileUri = fileUri;
025    this.namespaces = namespaces;
026    this.schemas = schemas;
027    this.idx = idx;
028
029    if (namespaces != null) {
030      this.vocab = (Map<String, String>) ConstantMaps.vocab.clone();
031      this.rvocab = (Map<String, String>) ConstantMaps.rvocab.clone();
032      for (Map.Entry<String, String> namespaceEntry : namespaces.entrySet()) {
033        this.vocab.put(namespaceEntry.getKey(), namespaceEntry.getValue());
034        this.rvocab.put(namespaceEntry.getValue(), namespaceEntry.getKey());
035      }
036    } else {
037      this.vocab = (Map<String, String>) ConstantMaps.vocab;
038      this.rvocab = (Map<String, String>) ConstantMaps.rvocab;
039    }
040  }
041
042  public String expandUrl(
043      String url_,
044      final String baseUrl,
045      final boolean scopedId,
046      final boolean vocabTerm,
047      final Integer scopedRef) {
048    // NOT CONVERTING this - doesn't match type declaration
049    // if not isinstance(url, str):
050    //    return url
051    String url = url_;
052    if (url.equals("@id") || url.equals("@type")) {
053      return url;
054    }
055
056    if (vocabTerm && this.vocab.containsKey(url)) {
057      return url;
058    }
059
060    if (!this.vocab.isEmpty() && url.contains(":")) {
061      String prefix = url.split(":", 1)[0];
062      if (this.vocab.containsKey(prefix)) {
063        url = this.vocab.get(prefix) + url.substring(prefix.length() + 1);
064      }
065    }
066
067    Uris.UriSplit split = Uris.split(url);
068    final String scheme = split.scheme;
069    final boolean hasFragment = stringHasContent(split.fragment);
070    if (scheme != null
071        && ((scheme.length() > 0
072                && (scheme.equals("http") || scheme.equals("https") || scheme.equals("file")))
073            || url.startsWith("$(")
074            || url.startsWith("${"))) {
075      // pass
076    } else if (scopedId && !hasFragment) {
077      final Uris.UriSplit splitbase = Uris.split(baseUrl);
078      final String frg;
079      if (stringHasContent(splitbase.fragment)) {
080        frg = splitbase.fragment + "/" + split.path;
081      } else {
082        frg = split.path;
083      }
084      String pt;
085      if (!splitbase.path.equals("")) {
086        pt = splitbase.path;
087      } else {
088        pt = "/";
089      }
090      url = Uris.unsplit(splitbase.scheme, splitbase.netloc, pt, splitbase.query, frg);
091    } else if (scopedRef != null && !hasFragment) {
092      final Uris.UriSplit splitbase = Uris.split(baseUrl);
093      final ArrayList<String> sp = new ArrayList(Arrays.asList(splitbase.fragment.split("/")));
094      int n = scopedRef;
095      while (n > 0 && sp.size() > 0) {
096        sp.remove(0);
097        n -= 1;
098      }
099      sp.add(url);
100      final String fragment = String.join("/", sp);
101      url =
102          Uris.unsplit(
103              splitbase.scheme, splitbase.netloc, splitbase.path, splitbase.query, fragment);
104    } else {
105      url = this.fetcher.urlJoin(baseUrl, url);
106    }
107
108    if (vocabTerm) {
109      split = Uris.split(url);
110      if (stringHasContent(split.scheme)) {
111        if (this.rvocab.containsKey(url)) {
112          return this.rvocab.get(url);
113        }
114      } else {
115        throw new ValidationException("Term '{}' not in vocabulary".format(url));
116      }
117    }
118    return url;
119  }
120
121  static boolean stringHasContent(final String s) {
122    return s != null && s.length() > 0;
123  }
124}