
001package org.hl7.fhir.convertors.misc; 002 003import java.io.BufferedOutputStream; 004import java.io.ByteArrayOutputStream; 005import java.io.File; 006import java.io.FileInputStream; 007import java.io.FileNotFoundException; 008import java.io.IOException; 009import java.io.InputStream; 010import java.nio.charset.StandardCharsets; 011import java.util.ArrayList; 012import java.util.HashMap; 013import java.util.List; 014import java.util.Map; 015import java.util.UUID; 016import java.util.Map.Entry; 017 018import javax.annotation.Nonnull; 019 020import lombok.extern.slf4j.Slf4j; 021import org.apache.commons.compress.archivers.tar.TarArchiveEntry; 022import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; 023import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; 024import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; 025import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream; 026import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_40; 027import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_50; 028import org.hl7.fhir.convertors.context.ContextResourceLoaderFactory; 029import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_30; 030import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_40; 031import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_50; 032import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_30; 033import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_40; 034import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_50; 035import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_40; 036import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_50; 037import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50; 038import org.hl7.fhir.convertors.loaders.loaderR5.NullLoaderKnowledgeProviderR5; 039import org.hl7.fhir.exceptions.DefinitionException; 040import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; 041import org.hl7.fhir.r5.context.ContextUtilities; 042import org.hl7.fhir.r5.context.IContextResourceLoader; 043import org.hl7.fhir.r5.context.IWorkerContext; 044import org.hl7.fhir.r5.context.SimpleWorkerContext; 045import org.hl7.fhir.r5.model.CanonicalResource; 046import org.hl7.fhir.r5.model.CanonicalType; 047import org.hl7.fhir.r5.model.CodeSystem; 048import org.hl7.fhir.r5.model.ElementDefinition; 049import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent; 050import org.hl7.fhir.r5.model.Enumeration; 051import org.hl7.fhir.r5.model.Enumerations.FHIRVersion; 052import org.hl7.fhir.r5.model.Enumerations.FHIRVersionEnumFactory; 053import org.hl7.fhir.r5.model.ImplementationGuide; 054import org.hl7.fhir.r5.model.Resource; 055import org.hl7.fhir.r5.model.StructureDefinition; 056import org.hl7.fhir.r5.model.ValueSet; 057import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent; 058import org.hl7.fhir.utilities.FileUtilities; 059import org.hl7.fhir.utilities.Utilities; 060import org.hl7.fhir.utilities.VersionUtilities; 061import org.hl7.fhir.utilities.filesystem.ManagedFileAccess; 062import org.hl7.fhir.utilities.json.model.JsonArray; 063import org.hl7.fhir.utilities.json.model.JsonObject; 064import org.hl7.fhir.utilities.json.parser.JsonParser; 065import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager; 066import org.hl7.fhir.utilities.npm.NpmPackage; 067import org.hl7.fhir.utilities.npm.NpmPackageIndexBuilder; 068 069@Slf4j 070public class NpmPackageVersionConverter { 071 072 private static final int BUFFER_SIZE = 1024; 073 074 private final String source; 075 private final String dest; 076 private final String version; 077 private final String vCode; 078 private final List<String> errors = new ArrayList<>(); 079 private String currentVersion; 080 private String packageId; 081 private IWorkerContext context; 082 private Map<String, Resource> additionalResources = new HashMap<>(); 083 084 private NpmPackage targetNpm; 085 private SimpleWorkerContext tctxt; 086 private ContextUtilities cu; 087 088 public NpmPackageVersionConverter(String source, String dest, String version, String packageId, IWorkerContext context) { 089 super(); 090 this.source = source; 091 this.dest = dest; 092 this.vCode = version; 093 this.packageId = packageId; 094 this.version = VersionUtilities.versionFromCode(version); 095 this.context = context; 096 cu = new ContextUtilities(context); 097 } 098 099 public List<String> getErrors() { 100 return errors; 101 } 102 103 public void execute() throws IOException { 104 Map<String, byte[]> content = loadContentMap(ManagedFileAccess.inStream(source)); 105 106 Map<String, byte[]> output = new HashMap<>(); 107 output.put("package/package.json", convertPackage(content.get("package/package.json"))); 108 109 output.put("package/other/spec.internals", convertSpec(content.get("package/other/spec.internals"))); 110 111 for (Entry<String, byte[]> e : content.entrySet()) { 112 if (!e.getKey().equals("package/package.json") && !e.getKey().equals("package/other/spec.internals") && !e.getKey().endsWith("ig-r4.json") && !e.getKey().endsWith("ig-r4.jsonX")) { 113 byte[] cnv = e.getValue(); 114 try { 115 JsonObject json = JsonParser.parseObject(e.getValue()); 116 if (json.has("resourceType")) { 117 cnv = convertResource(e.getKey(), e.getValue()); 118 } 119 } catch (Exception ex) { 120 } 121 if (cnv != null && cnv.length > 0) { 122 output.put(e.getKey(), cnv); 123 } 124 } 125 } 126 for (Resource res : additionalResources.values()) { 127 byte[] cnv = convertResource(res); 128 String fn = "package/"+res.fhirType()+"-"+res.getId()+".json"; 129 if (output.containsKey(fn)) { 130 log.warn("Duplicate resource "+fn); 131 } else { 132 output.put(fn, cnv); 133 } 134 } 135 136 TarArchiveOutputStream tar; 137 ByteArrayOutputStream OutputStream; 138 BufferedOutputStream bufferedOutputStream; 139 GzipCompressorOutputStream gzipOutputStream; 140 141 OutputStream = new ByteArrayOutputStream(); 142 bufferedOutputStream = new BufferedOutputStream(OutputStream); 143 gzipOutputStream = new GzipCompressorOutputStream(bufferedOutputStream); 144 tar = new TarArchiveOutputStream(gzipOutputStream); 145 146 147 Map<String, NpmPackageIndexBuilder> indexers = new HashMap<>(); 148 for (Entry<String, byte[]> e : output.entrySet()) { 149 String n = e.getKey().substring(0, e.getKey().lastIndexOf("/")); 150 String s = e.getKey().substring(n.length() + 1); 151 byte[] b = e.getValue(); 152 NpmPackageIndexBuilder indexer = indexers.get(n); 153 if (indexer == null) { 154 indexer = new NpmPackageIndexBuilder(); 155 indexer.start(Utilities.path("[tmp]", "tmp-"+UUID.randomUUID().toString()+".db")); 156 indexers.put(n, indexer); 157 } 158 indexer.seeFile(s, b); 159 if (!s.equals(".index.json") && !s.equals("package.json") && !s.equals(".index.db")) { 160 TarArchiveEntry entry = new TarArchiveEntry(e.getKey()); 161 entry.setSize(b.length); 162 tar.putArchiveEntry(entry); 163 tar.write(b); 164 tar.closeArchiveEntry(); 165 } 166 } 167 for (Entry<String, NpmPackageIndexBuilder> e : indexers.entrySet()) { 168 byte[] cnt = e.getValue().build().getBytes(StandardCharsets.UTF_8); 169 TarArchiveEntry entry = new TarArchiveEntry(e.getKey() + "/.index.json"); 170 entry.setSize(cnt.length); 171 tar.putArchiveEntry(entry); 172 tar.write(cnt); 173 tar.closeArchiveEntry(); 174 cnt = FileUtilities.fileToBytes(e.getValue().getDbFilename()); 175 ManagedFileAccess.file(e.getValue().getDbFilename()).delete(); 176 entry = new TarArchiveEntry(e.getKey() + "/.index.db"); 177 entry.setSize(cnt.length); 178 tar.putArchiveEntry(entry); 179 tar.write(cnt); 180 tar.closeArchiveEntry(); 181 } 182 183 byte[] cnt = output.get("package/package.json"); 184 TarArchiveEntry entry = new TarArchiveEntry("package/package.json"); 185 entry.setSize(cnt.length); 186 tar.putArchiveEntry(entry); 187 tar.write(cnt); 188 tar.closeArchiveEntry(); 189 190 tar.finish(); 191 tar.close(); 192 gzipOutputStream.close(); 193 bufferedOutputStream.close(); 194 OutputStream.close(); 195 byte[] b = OutputStream.toByteArray(); 196 FileUtilities.bytesToFile(b, dest); 197 } 198 199 @Nonnull 200 protected Map<String, byte[]> loadContentMap(InputStream inputStream) throws IOException { 201 GzipCompressorInputStream gzipIn; 202 try { 203 gzipIn = new GzipCompressorInputStream(inputStream); 204 } catch (Exception e) { 205 throw new IOException("Error reading " + source + ": " + e.getMessage(), e); 206 } 207 Map<String, byte[]> content = new HashMap<>(); 208 209 try (TarArchiveInputStream tarIn = new TarArchiveInputStream(gzipIn)) { 210 TarArchiveEntry entry; 211 212 while ((entry = (TarArchiveEntry) tarIn.getNextEntry()) != null) { 213 String n = entry.getName(); 214 if (n.contains("..")) { 215 throw new RuntimeException("Entry with an illegal name: " + n); 216 } 217 if (!entry.isDirectory()) { 218 int count; 219 byte[] data = new byte[BUFFER_SIZE]; 220 ByteArrayOutputStream fos = new ByteArrayOutputStream(); 221 try (BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER_SIZE)) { 222 while ((count = tarIn.read(data, 0, BUFFER_SIZE)) != -1) { 223 dest.write(data, 0, count); 224 } 225 } 226 fos.close(); 227 content.put(n, fos.toByteArray()); 228 } 229 } 230 } 231 return content; 232 } 233 234 private byte[] convertPackage(byte[] cnt) throws IOException { 235 JsonObject json = JsonParser.parseObject(cnt); 236 currentVersion = json.getJsonArray("fhirVersions").get(0).asString(); 237 String name = json.asString("name"); 238 assert(packageId.equals(name + "." + vCode)); 239 json.remove("name"); 240 json.add("name", name + "." + vCode); 241 json.remove("fhirVersions"); 242 json.remove("dependencies"); 243 JsonArray fv = new JsonArray(); 244 json.add("fhirVersions", fv); 245 fv.add(version); 246 JsonObject dep = new JsonObject(); 247 json.add("dependencies", dep); 248 dep.add(VersionUtilities.packageForVersion(version), version); 249 return JsonParser.composeBytes(json); 250 } 251 252 private byte[] convertSpec(byte[] cnt) throws IOException { 253 JsonObject json = JsonParser.parseObject(cnt); 254 json.set("ig-version", version); 255 json.set("npm-name", packageId); 256 return JsonParser.composeBytes(json, true); 257 } 258 259 private byte[] convertResource(String n, byte[] cnt) { 260 try { 261 if (VersionUtilities.isR2Ver(currentVersion)) { 262 org.hl7.fhir.dstu2.model.Resource res = new org.hl7.fhir.dstu2.formats.JsonParser().parse(cnt); 263 convertResourceR2(res); 264 if (VersionUtilities.isR2Ver(version)) { 265 return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(res); 266 } else if (VersionUtilities.isR2BVer(version)) { 267 return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_30.convertResource(VersionConvertorFactory_10_30.convertResource(res))); 268 } else if (VersionUtilities.isR3Ver(version)) { 269 return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_10_30.convertResource(res)); 270 } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) { 271 return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(VersionConvertorFactory_10_40.convertResource(res)); 272 } else if (VersionUtilities.isR5Plus(version)) { 273 return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_10_50.convertResource(res)); 274 } 275 } else if (VersionUtilities.isR2BVer(currentVersion)) { 276 org.hl7.fhir.dstu2016may.model.Resource res = new org.hl7.fhir.dstu2016may.formats.JsonParser().parse(cnt); 277 convertResourceR2B(res); 278 if (VersionUtilities.isR2Ver(version)) { 279 return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_30.convertResource(VersionConvertorFactory_14_30.convertResource(res))); 280 } else if (VersionUtilities.isR2BVer(version)) { 281 return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(res); 282 } else if (VersionUtilities.isR3Ver(version)) { 283 return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_14_30.convertResource(res)); 284 } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) { 285 return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(VersionConvertorFactory_14_40.convertResource(res)); 286 } else if (VersionUtilities.isR5Plus(version)) { 287 return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_14_50.convertResource(res)); 288 } 289 } else if (VersionUtilities.isR3Ver(currentVersion)) { 290 org.hl7.fhir.dstu3.model.Resource res = new org.hl7.fhir.dstu3.formats.JsonParser().parse(cnt); 291 convertResourceR3(res); 292 if (VersionUtilities.isR2Ver(version)) { 293 return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_30.convertResource(res)); 294 } else if (VersionUtilities.isR2BVer(version)) { 295 return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_30.convertResource(res)); 296 } else if (VersionUtilities.isR3Ver(version)) { 297 return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(res); 298 } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) { 299 return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(VersionConvertorFactory_30_40.convertResource(res)); 300 } else if (VersionUtilities.isR5Plus(version)) { 301 return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_30_50.convertResource(res)); 302 } 303 } else if (VersionUtilities.isR4Ver(currentVersion)) { 304 org.hl7.fhir.r4.model.Resource res = new org.hl7.fhir.r4.formats.JsonParser().parse(cnt); 305 convertResourceR4(res); 306 if (VersionUtilities.isR2Ver(version)) { 307 return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_40.convertResource(res, new PR2Handler())); 308 } else if (VersionUtilities.isR2BVer(version)) { 309 return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_40.convertResource(res)); 310 } else if (VersionUtilities.isR3Ver(version)) { 311 return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_30_40.convertResource(res, new BaseAdvisor_30_40(false))); 312 } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) { 313 return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(res); 314 } else if (VersionUtilities.isR5Plus(version)) { 315 return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_40_50.convertResource(res)); 316 } 317 } else if (VersionUtilities.isR4BVer(currentVersion)) { 318 org.hl7.fhir.r4.model.Resource res = new org.hl7.fhir.r4.formats.JsonParser().parse(cnt); 319 convertResourceR4B(res); 320 if (VersionUtilities.isR2Ver(version)) { 321 return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_40.convertResource(res, new PR2Handler())); 322 } else if (VersionUtilities.isR2BVer(version)) { 323 return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_40.convertResource(res)); 324 } else if (VersionUtilities.isR3Ver(version)) { 325 return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_30_40.convertResource(res, new BaseAdvisor_30_40(false))); 326 } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) { 327 return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(res); 328 } else if (VersionUtilities.isR5Plus(version)) { 329 return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_40_50.convertResource(res)); 330 } 331 } else if (VersionUtilities.isR5Plus(currentVersion)) { 332 org.hl7.fhir.r5.model.Resource res = new org.hl7.fhir.r5.formats.JsonParser().parse(cnt); 333 checkForCoreDependencies(res); 334 convertResourceR5(res); 335 if (VersionUtilities.isR2Ver(version)) { 336 return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_50.convertResource(res)); 337 } else if (VersionUtilities.isR2BVer(version)) { 338 return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_50.convertResource(res)); 339 } else if (VersionUtilities.isR3Ver(version)) { 340 return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_30_50.convertResource(res, new BaseAdvisor_30_50(false))); 341 } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) { 342 return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(VersionConvertorFactory_40_50.convertResource(res)); 343 } else if (VersionUtilities.isR5Plus(version)) { 344 return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(res); 345 } 346 } 347 throw new Error("Unknown version " + currentVersion + " -> " + version); 348 } catch (Exception ex) { 349 errors.add("Error converting " + n + ": " + ex.getMessage()); 350 log.error("Error converting " + n + ": " + ex.getMessage(), ex); 351 return null; 352 } 353 } 354 private byte[] convertResource(Resource res) { 355 try { 356 convertResourceR5(res); 357 if (VersionUtilities.isR2Ver(version)) { 358 return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_50.convertResource(res)); 359 } else if (VersionUtilities.isR2BVer(version)) { 360 return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_50.convertResource(res)); 361 } else if (VersionUtilities.isR3Ver(version)) { 362 return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_30_50.convertResource(res, new BaseAdvisor_30_50(false))); 363 } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) { 364 return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(VersionConvertorFactory_40_50.convertResource(res)); 365 } else if (VersionUtilities.isR5Plus(version)) { 366 return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(res); 367 } 368 throw new Error("Unknown version " + currentVersion + " -> " + version); 369 } catch (Exception ex) { 370 errors.add("Error converting " + res.fhirType()+"/"+res.getId() + ": " + ex.getMessage()); 371 return null; 372 } 373 } 374 375 376 private void checkForCoreDependencies(Resource res) throws IOException { 377 if (res instanceof StructureDefinition) { 378 checkForCoreDependenciesSD((StructureDefinition) res); 379 } 380 if (res instanceof ValueSet) { 381 checkForCoreDependenciesVS((ValueSet) res); 382 } 383 } 384 385 private void checkForCoreDependenciesSD(StructureDefinition sd) throws IOException { 386 for (ElementDefinition ed : sd.getSnapshot().getElement()) { 387 if (ed.hasBinding() && ed.getBinding().hasValueSet()) { 388 ValueSet vs = context.fetchResource(ValueSet.class, ed.getBinding().getValueSet()); 389 if (vs != null) { 390 checkForCoreDependenciesVS(vs); 391 } 392 } 393 } 394 } 395 396 private void checkForCoreDependenciesVS(ValueSet valueSet) throws IOException { 397 if (isCoreResource(valueSet)) { 398 if (!inTargetCore(valueSet)) { 399 additionalResources.put(valueSet.getUrl(), valueSet); 400 } 401 } 402 for (ConceptSetComponent inc : valueSet.getCompose().getInclude()) { 403 for (CanonicalType c : inc.getValueSet()) { 404 ValueSet vs = context.fetchResource(ValueSet.class, c.getValue()); 405 if (vs != null) { 406 checkForCoreDependenciesVS(vs); 407 } 408 } 409 if (inc.hasSystem()) { 410 CodeSystem cs = context.fetchResource(CodeSystem.class, inc.getSystem(), inc.getVersion()); 411 if (cs != null) { 412 checkForCoreDependenciesCS(cs); 413 } 414 } 415 } 416 } 417 418 private void checkForCoreDependenciesCS(CodeSystem cs) throws IOException { 419 if (isCoreResource(cs)) { 420 if (!inTargetCore(cs)) { 421 additionalResources.put(cs.getUrl(), cs); 422 } 423 } 424 } 425 426 private boolean inTargetCore(CanonicalResource cr) throws IOException { 427 boolean res = targetNpm.hasCanonical(cr.getUrl()); 428 return res; 429 } 430 431 private boolean isCoreResource(CanonicalResource cr) { 432 return cr.hasSourcePackage() && Utilities.existsInList(cr.getSourcePackage().getId(), "hl7.fhir.r5.core", "hl7.fhir.r4.core"); 433 } 434 435 private void convertResourceR2(org.hl7.fhir.dstu2.model.Resource res) { 436 if (res instanceof org.hl7.fhir.dstu2.model.ImplementationGuide) { 437 org.hl7.fhir.dstu2.model.ImplementationGuide ig = (org.hl7.fhir.dstu2.model.ImplementationGuide) res; 438 ig.setFhirVersion(version); 439 } 440 if (res instanceof org.hl7.fhir.dstu2.model.StructureDefinition) { 441 org.hl7.fhir.dstu2.model.StructureDefinition sd = (org.hl7.fhir.dstu2.model.StructureDefinition) res; 442 sd.setFhirVersion(version); 443 } 444 } 445 446 private void convertResourceR2B(org.hl7.fhir.dstu2016may.model.Resource res) { 447 if (res instanceof org.hl7.fhir.dstu2016may.model.ImplementationGuide) { 448 org.hl7.fhir.dstu2016may.model.ImplementationGuide ig = (org.hl7.fhir.dstu2016may.model.ImplementationGuide) res; 449 ig.setFhirVersion(version); 450 } 451 if (res instanceof org.hl7.fhir.dstu2016may.model.StructureDefinition) { 452 org.hl7.fhir.dstu2016may.model.StructureDefinition sd = (org.hl7.fhir.dstu2016may.model.StructureDefinition) res; 453 sd.setFhirVersion(version); 454 } 455 } 456 457 private void convertResourceR3(org.hl7.fhir.dstu3.model.Resource res) { 458 if (res instanceof org.hl7.fhir.dstu3.model.ImplementationGuide) { 459 org.hl7.fhir.dstu3.model.ImplementationGuide ig = (org.hl7.fhir.dstu3.model.ImplementationGuide) res; 460 ig.setFhirVersion(version); 461 } 462 if (res instanceof org.hl7.fhir.dstu3.model.StructureDefinition) { 463 org.hl7.fhir.dstu3.model.StructureDefinition sd = (org.hl7.fhir.dstu3.model.StructureDefinition) res; 464 sd.setFhirVersion(version); 465 } 466 } 467 468 private void convertResourceR4(org.hl7.fhir.r4.model.Resource res) { 469 if (res instanceof org.hl7.fhir.r4.model.ImplementationGuide) { 470 org.hl7.fhir.r4.model.ImplementationGuide ig = (org.hl7.fhir.r4.model.ImplementationGuide) res; 471 ig.getFhirVersion().clear(); 472 ig.getFhirVersion().add(new org.hl7.fhir.r4.model.Enumeration<>(new org.hl7.fhir.r4.model.Enumerations.FHIRVersionEnumFactory(), version)); 473 ig.setPackageId(packageId); 474 } 475 if (res instanceof org.hl7.fhir.r4.model.StructureDefinition) { 476 org.hl7.fhir.r4.model.StructureDefinition sd = (org.hl7.fhir.r4.model.StructureDefinition) res; 477 sd.setFhirVersion(org.hl7.fhir.r4.model.Enumerations.FHIRVersion.fromCode(version)); 478 } 479 } 480 481 private void convertResourceR4B(org.hl7.fhir.r4.model.Resource res) { 482 if (res instanceof org.hl7.fhir.r4.model.ImplementationGuide) { 483 org.hl7.fhir.r4.model.ImplementationGuide ig = (org.hl7.fhir.r4.model.ImplementationGuide) res; 484 ig.getFhirVersion().clear(); 485 ig.getFhirVersion().add(new org.hl7.fhir.r4.model.Enumeration<>(new org.hl7.fhir.r4.model.Enumerations.FHIRVersionEnumFactory(), version)); 486 ig.setPackageId(packageId); 487 } 488 if (res instanceof org.hl7.fhir.r4.model.StructureDefinition) { 489 org.hl7.fhir.r4.model.StructureDefinition sd = (org.hl7.fhir.r4.model.StructureDefinition) res; 490 sd.setFhirVersion(org.hl7.fhir.r4.model.Enumerations.FHIRVersion.fromCode(version)); 491 } 492 } 493 494 private void convertResourceR5(Resource res) { 495 if (res instanceof ImplementationGuide) { 496 ImplementationGuide ig = (ImplementationGuide) res; 497 ig.getFhirVersion().clear(); 498 ig.getFhirVersion().add(new Enumeration<>(new FHIRVersionEnumFactory(), version)); 499 ig.setPackageId(packageId); 500 } 501 if (res instanceof StructureDefinition) { 502 StructureDefinition sd = (StructureDefinition) res; 503 sd.setFhirVersion(FHIRVersion.fromCode(version)); 504 } 505 } 506 507}