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}