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 org.apache.commons.compress.archivers.tar.TarArchiveEntry;
021import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
022import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
023import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
024import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
025import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_40;
026import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_50;
027import org.hl7.fhir.convertors.context.ContextResourceLoaderFactory;
028import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_30;
029import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_40;
030import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_50;
031import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_30;
032import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_40;
033import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_50;
034import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_40;
035import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_50;
036import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50;
037import org.hl7.fhir.convertors.loaders.loaderR5.NullLoaderKnowledgeProviderR5;
038import org.hl7.fhir.exceptions.DefinitionException;
039import org.hl7.fhir.r5.conformance.profile.ProfileUtilities;
040import org.hl7.fhir.r5.context.ContextUtilities;
041import org.hl7.fhir.r5.context.IContextResourceLoader;
042import org.hl7.fhir.r5.context.IWorkerContext;
043import org.hl7.fhir.r5.context.SimpleWorkerContext;
044import org.hl7.fhir.r5.model.CanonicalResource;
045import org.hl7.fhir.r5.model.CanonicalType;
046import org.hl7.fhir.r5.model.CodeSystem;
047import org.hl7.fhir.r5.model.ElementDefinition;
048import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent;
049import org.hl7.fhir.r5.model.Enumeration;
050import org.hl7.fhir.r5.model.Enumerations.FHIRVersion;
051import org.hl7.fhir.r5.model.Enumerations.FHIRVersionEnumFactory;
052import org.hl7.fhir.r5.model.ImplementationGuide;
053import org.hl7.fhir.r5.model.Resource;
054import org.hl7.fhir.r5.model.StructureDefinition;
055import org.hl7.fhir.r5.model.ValueSet;
056import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent;
057import org.hl7.fhir.utilities.FileUtilities;
058import org.hl7.fhir.utilities.Utilities;
059import org.hl7.fhir.utilities.VersionUtilities;
060import org.hl7.fhir.utilities.filesystem.ManagedFileAccess;
061import org.hl7.fhir.utilities.json.model.JsonArray;
062import org.hl7.fhir.utilities.json.model.JsonObject;
063import org.hl7.fhir.utilities.json.parser.JsonParser;
064import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
065import org.hl7.fhir.utilities.npm.NpmPackage;
066import org.hl7.fhir.utilities.npm.NpmPackageIndexBuilder;
067
068public class NpmPackageVersionConverter {
069
070  private static final int BUFFER_SIZE = 1024;
071
072  private final String source;
073  private final String dest;
074  private final String version;
075  private final String vCode;
076  private final List<String> errors = new ArrayList<>();
077  private String currentVersion;
078  private String packageId;
079  private IWorkerContext context;
080  private Map<String, Resource> additionalResources = new HashMap<>();
081
082  private NpmPackage targetNpm;
083  private SimpleWorkerContext tctxt;
084  private ContextUtilities cu;
085
086  public NpmPackageVersionConverter(String source, String dest, String version, String packageId, IWorkerContext context) {
087    super();
088    this.source = source;
089    this.dest = dest;
090    this.vCode = version;
091    this.packageId = packageId;
092    this.version = VersionUtilities.versionFromCode(version);
093    this.context = context;
094    cu = new ContextUtilities(context);
095  }
096
097  public List<String> getErrors() {
098    return errors;
099  }
100
101  public void execute() throws IOException {
102    Map<String, byte[]> content = loadContentMap(ManagedFileAccess.inStream(source));
103
104    Map<String, byte[]> output = new HashMap<>();
105    output.put("package/package.json", convertPackage(content.get("package/package.json")));
106
107    output.put("package/other/spec.internals", convertSpec(content.get("package/other/spec.internals")));
108
109    for (Entry<String, byte[]> e : content.entrySet()) {
110      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")) {
111        byte[] cnv = e.getValue();
112        try {
113          JsonObject json = JsonParser.parseObject(e.getValue());
114          if (json.has("resourceType")) {
115            cnv = convertResource(e.getKey(), e.getValue());
116          }
117        } catch (Exception ex) {
118        }
119        if (cnv != null && cnv.length > 0) {
120          output.put(e.getKey(), cnv);
121        }
122      }
123    }
124    for (Resource res : additionalResources.values()) {
125      byte[] cnv = convertResource(res);
126      String fn = "package/"+res.fhirType()+"-"+res.getId()+".json";
127      if (output.containsKey(fn)) {
128        System.out.println("Duplicate resource "+fn);
129      } else {
130        output.put(fn, cnv);
131      }
132    }
133
134    TarArchiveOutputStream tar;
135    ByteArrayOutputStream OutputStream;
136    BufferedOutputStream bufferedOutputStream;
137    GzipCompressorOutputStream gzipOutputStream;
138
139    OutputStream = new ByteArrayOutputStream();
140    bufferedOutputStream = new BufferedOutputStream(OutputStream);
141    gzipOutputStream = new GzipCompressorOutputStream(bufferedOutputStream);
142    tar = new TarArchiveOutputStream(gzipOutputStream);
143
144
145    Map<String, NpmPackageIndexBuilder> indexers = new HashMap<>();
146    for (Entry<String, byte[]> e : output.entrySet()) {
147      String n = e.getKey().substring(0, e.getKey().lastIndexOf("/"));
148      String s = e.getKey().substring(n.length() + 1);
149      byte[] b = e.getValue();
150      NpmPackageIndexBuilder indexer = indexers.get(n);
151      if (indexer == null) {
152        indexer = new NpmPackageIndexBuilder();
153        indexer.start(Utilities.path("[tmp]", "tmp-"+UUID.randomUUID().toString()+".db"));
154        indexers.put(n, indexer);
155      }
156      indexer.seeFile(s, b);
157      if (!s.equals(".index.json") && !s.equals("package.json") && !s.equals(".index.db")) {
158        TarArchiveEntry entry = new TarArchiveEntry(e.getKey());
159        entry.setSize(b.length);
160        tar.putArchiveEntry(entry);
161        tar.write(b);
162        tar.closeArchiveEntry();
163      }
164    }
165    for (Entry<String, NpmPackageIndexBuilder> e : indexers.entrySet()) {
166      byte[] cnt = e.getValue().build().getBytes(StandardCharsets.UTF_8);
167      TarArchiveEntry entry = new TarArchiveEntry(e.getKey() + "/.index.json");
168      entry.setSize(cnt.length);
169      tar.putArchiveEntry(entry);
170      tar.write(cnt);
171      tar.closeArchiveEntry();
172      cnt = FileUtilities.fileToBytes(e.getValue().getDbFilename());
173      ManagedFileAccess.file(e.getValue().getDbFilename()).delete();
174      entry = new TarArchiveEntry(e.getKey() + "/.index.db");
175      entry.setSize(cnt.length);
176      tar.putArchiveEntry(entry);
177      tar.write(cnt);
178      tar.closeArchiveEntry();
179    }
180
181    byte[] cnt = output.get("package/package.json");
182    TarArchiveEntry entry = new TarArchiveEntry("package/package.json");
183    entry.setSize(cnt.length);
184    tar.putArchiveEntry(entry);
185    tar.write(cnt);
186    tar.closeArchiveEntry();
187
188    tar.finish();
189    tar.close();
190    gzipOutputStream.close();
191    bufferedOutputStream.close();
192    OutputStream.close();
193    byte[] b = OutputStream.toByteArray();
194    FileUtilities.bytesToFile(b, dest);
195  }
196
197  @Nonnull
198  protected Map<String, byte[]> loadContentMap(InputStream inputStream) throws IOException {
199    GzipCompressorInputStream gzipIn;
200    try {
201      gzipIn = new GzipCompressorInputStream(inputStream);
202    } catch (Exception e) {
203      throw new IOException("Error reading " + source + ": " + e.getMessage(), e);
204    }
205    Map<String, byte[]> content = new HashMap<>();
206
207    try (TarArchiveInputStream tarIn = new TarArchiveInputStream(gzipIn)) {
208      TarArchiveEntry entry;
209
210      while ((entry = (TarArchiveEntry) tarIn.getNextEntry()) != null) {
211        String n = entry.getName();
212        if (n.contains("..")) {
213          throw new RuntimeException("Entry with an illegal name: " + n);
214        }
215        if (!entry.isDirectory()) {
216          int count;
217          byte[] data = new byte[BUFFER_SIZE];
218          ByteArrayOutputStream fos = new ByteArrayOutputStream();
219          try (BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER_SIZE)) {
220            while ((count = tarIn.read(data, 0, BUFFER_SIZE)) != -1) {
221              dest.write(data, 0, count);
222            }
223          }
224          fos.close();
225          content.put(n, fos.toByteArray());
226        }
227      }
228    }
229    return content;
230  }
231
232  private byte[] convertPackage(byte[] cnt) throws IOException {
233    JsonObject json = JsonParser.parseObject(cnt);
234    currentVersion = json.getJsonArray("fhirVersions").get(0).asString();
235    String name = json.asString("name");
236    assert(packageId.equals(name + "." + vCode));
237    json.remove("name");
238    json.add("name", name + "." + vCode);
239    json.remove("fhirVersions");
240    json.remove("dependencies");
241    JsonArray fv = new JsonArray();
242    json.add("fhirVersions", fv);
243    fv.add(version);
244    JsonObject dep = new JsonObject();
245    json.add("dependencies", dep);
246    dep.add(VersionUtilities.packageForVersion(version), version);
247    return JsonParser.composeBytes(json);
248  }
249
250  private byte[] convertSpec(byte[] cnt) throws IOException {
251    JsonObject json = JsonParser.parseObject(cnt);
252    json.set("ig-version", version);
253    json.set("npm-name", packageId);
254    return JsonParser.composeBytes(json, true);
255  }
256
257  private byte[] convertResource(String n, byte[] cnt) {
258    try {
259      if (VersionUtilities.isR2Ver(currentVersion)) {
260        org.hl7.fhir.dstu2.model.Resource res = new org.hl7.fhir.dstu2.formats.JsonParser().parse(cnt);
261        convertResourceR2(res);
262        if (VersionUtilities.isR2Ver(version)) {
263          return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(res);
264        } else if (VersionUtilities.isR2BVer(version)) {
265          return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_30.convertResource(VersionConvertorFactory_10_30.convertResource(res)));
266        } else if (VersionUtilities.isR3Ver(version)) {
267          return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_10_30.convertResource(res));
268        } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) {
269          return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(VersionConvertorFactory_10_40.convertResource(res));
270        } else if (VersionUtilities.isR5Plus(version)) {
271          return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_10_50.convertResource(res));
272        }
273      } else if (VersionUtilities.isR2BVer(currentVersion)) {
274        org.hl7.fhir.dstu2016may.model.Resource res = new org.hl7.fhir.dstu2016may.formats.JsonParser().parse(cnt);
275        convertResourceR2B(res);
276        if (VersionUtilities.isR2Ver(version)) {
277          return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_30.convertResource(VersionConvertorFactory_14_30.convertResource(res)));
278        } else if (VersionUtilities.isR2BVer(version)) {
279          return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(res);
280        } else if (VersionUtilities.isR3Ver(version)) {
281          return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_14_30.convertResource(res));
282        } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) {
283          return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(VersionConvertorFactory_14_40.convertResource(res));
284        } else if (VersionUtilities.isR5Plus(version)) {
285          return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_14_50.convertResource(res));
286        }
287      } else if (VersionUtilities.isR3Ver(currentVersion)) {
288        org.hl7.fhir.dstu3.model.Resource res = new org.hl7.fhir.dstu3.formats.JsonParser().parse(cnt);
289        convertResourceR3(res);
290        if (VersionUtilities.isR2Ver(version)) {
291          return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_30.convertResource(res));
292        } else if (VersionUtilities.isR2BVer(version)) {
293          return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_30.convertResource(res));
294        } else if (VersionUtilities.isR3Ver(version)) {
295          return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(res);
296        } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) {
297          return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(VersionConvertorFactory_30_40.convertResource(res));
298        } else if (VersionUtilities.isR5Plus(version)) {
299          return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_30_50.convertResource(res));
300        }
301      } else if (VersionUtilities.isR4Ver(currentVersion)) {
302        org.hl7.fhir.r4.model.Resource res = new org.hl7.fhir.r4.formats.JsonParser().parse(cnt);
303        convertResourceR4(res);
304        if (VersionUtilities.isR2Ver(version)) {
305          return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_40.convertResource(res, new PR2Handler()));
306        } else if (VersionUtilities.isR2BVer(version)) {
307          return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_40.convertResource(res));
308        } else if (VersionUtilities.isR3Ver(version)) {
309          return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_30_40.convertResource(res, new BaseAdvisor_30_40(false)));
310        } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) {
311          return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(res);
312        } else if (VersionUtilities.isR5Plus(version)) {
313          return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_40_50.convertResource(res));
314        }
315      } else if (VersionUtilities.isR4BVer(currentVersion)) {
316        org.hl7.fhir.r4.model.Resource res = new org.hl7.fhir.r4.formats.JsonParser().parse(cnt);
317        convertResourceR4B(res);
318        if (VersionUtilities.isR2Ver(version)) {
319          return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_40.convertResource(res, new PR2Handler()));
320        } else if (VersionUtilities.isR2BVer(version)) {
321          return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_40.convertResource(res));
322        } else if (VersionUtilities.isR3Ver(version)) {
323          return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_30_40.convertResource(res, new BaseAdvisor_30_40(false)));
324        } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) {
325          return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(res);
326        } else if (VersionUtilities.isR5Plus(version)) {
327          return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(VersionConvertorFactory_40_50.convertResource(res));
328        }
329      } else if (VersionUtilities.isR5Plus(currentVersion)) {
330        org.hl7.fhir.r5.model.Resource res = new org.hl7.fhir.r5.formats.JsonParser().parse(cnt);
331        checkForCoreDependencies(res);
332        convertResourceR5(res);
333        if (VersionUtilities.isR2Ver(version)) {
334          return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(VersionConvertorFactory_10_50.convertResource(res));
335        } else if (VersionUtilities.isR2BVer(version)) {
336          return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(VersionConvertorFactory_14_50.convertResource(res));
337        } else if (VersionUtilities.isR3Ver(version)) {
338          return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(VersionConvertorFactory_30_50.convertResource(res, new BaseAdvisor_30_50(false)));
339        } else if (VersionUtilities.isR4Ver(version) || VersionUtilities.isR4BVer(version)) {
340          return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(VersionConvertorFactory_40_50.convertResource(res));
341        } else if (VersionUtilities.isR5Plus(version)) {
342          return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(res);
343        }
344      }
345      throw new Error("Unknown version " + currentVersion + " -> " + version);
346    } catch (Exception ex) {
347      errors.add("Error converting " + n + ": " + ex.getMessage());
348
349      System.out.println("Error converting " + n + ": " + ex.getMessage());
350      ex.printStackTrace();
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}