001package org.hl7.fhir.convertors.misc.xver;
002
003import java.io.FileInputStream;
004import java.io.FileOutputStream;
005import java.io.IOException;
006
007import lombok.extern.slf4j.Slf4j;
008import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_30;
009import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_40;
010import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_50;
011import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_30;
012import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_40;
013import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_50;
014import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_40;
015import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_50;
016import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50;
017import org.hl7.fhir.utilities.FileUtilities;
018import org.hl7.fhir.utilities.Utilities;
019import org.hl7.fhir.utilities.VersionUtilities;
020import org.hl7.fhir.utilities.filesystem.ManagedFileAccess;
021import org.hl7.fhir.utilities.json.model.JsonArray;
022import org.hl7.fhir.utilities.json.model.JsonObject;
023import org.hl7.fhir.utilities.json.parser.JsonParser;
024import org.hl7.fhir.utilities.npm.NpmPackage;
025import org.hl7.fhir.utilities.npm.NpmPackage.NpmPackageFolder;
026
027@Slf4j
028public class CorePackageVersionConvertor {
029
030  public interface IContentConvertor {
031    byte[] convert(byte[] cnt) throws IOException;
032  }
033
034  public class BaseConvertor {
035    protected String version;
036
037    public BaseConvertor(String version) {
038      super();
039      this.version = version;
040    }
041  }
042
043  public class ContentConverter3to4 extends BaseConvertor implements IContentConvertor {
044
045    public ContentConverter3to4(String version) {
046      super(version);
047    }
048
049    @Override
050    public byte[] convert(byte[] cnt) throws IOException {
051      org.hl7.fhir.dstu3.model.Resource r3 = new org.hl7.fhir.dstu3.formats.JsonParser().parse(cnt);
052      if (r3 instanceof org.hl7.fhir.dstu3.model.MetadataResource) {
053        org.hl7.fhir.dstu3.model.MetadataResource cr = (org.hl7.fhir.dstu3.model.MetadataResource) r3;
054        if (!cr.hasVersion()) {
055          cr.setVersion(version);          
056        }
057      }
058      org.hl7.fhir.r4.model.Resource r4 = VersionConvertorFactory_30_40.convertResource(r3);
059      return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(r4);
060    }
061  }
062  public class ContentConverter2to4 extends BaseConvertor implements IContentConvertor {
063
064    public ContentConverter2to4(String version) {
065      super(version);
066    }
067
068    @Override
069    public byte[] convert(byte[] cnt) throws IOException {
070      org.hl7.fhir.dstu2.model.Resource r2 = new org.hl7.fhir.dstu2.formats.JsonParser().parse(cnt);      
071      org.hl7.fhir.r4.model.Resource r4 = VersionConvertorFactory_10_40.convertResource(r2);
072      if (r4 instanceof org.hl7.fhir.r4.model.MetadataResource) {
073        org.hl7.fhir.r4.model.MetadataResource cr = (org.hl7.fhir.r4.model.MetadataResource) r4;
074        if (!cr.hasVersion()) {
075          cr.setVersion(version);          
076        }
077      }
078      return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(r4);
079    }
080  }
081  public class ContentConverter2Bto4 extends BaseConvertor implements IContentConvertor {
082
083    public ContentConverter2Bto4(String version) {
084      super(version);
085    }
086
087    @Override
088    public byte[] convert(byte[] cnt) throws IOException {
089      org.hl7.fhir.dstu2016may.model.Resource r2 = new org.hl7.fhir.dstu2016may.formats.JsonParser().parse(cnt);      
090      org.hl7.fhir.r4.model.Resource r4 = VersionConvertorFactory_14_40.convertResource(r2);
091      if (r4 instanceof org.hl7.fhir.r4.model.MetadataResource) {
092        org.hl7.fhir.r4.model.MetadataResource cr = (org.hl7.fhir.r4.model.MetadataResource) r4;
093        if (!cr.hasVersion()) {
094          cr.setVersion(version);          
095        }
096      }
097      return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(r4);
098    }
099  }
100  public class ContentConverter5to4 extends BaseConvertor implements IContentConvertor {
101    public ContentConverter5to4(String version) {
102      super(version);
103    }
104
105    @Override
106    public byte[] convert(byte[] cnt) throws IOException {
107      org.hl7.fhir.r5.model.Resource r5 = new org.hl7.fhir.r5.formats.JsonParser().parse(cnt);
108      if (r5 instanceof org.hl7.fhir.r5.model.MetadataResource) {
109        org.hl7.fhir.r5.model.MetadataResource cr = (org.hl7.fhir.r5.model.MetadataResource) r5;
110        if (!cr.hasVersion()) {
111          cr.setVersion(version);          
112        }
113      }
114      org.hl7.fhir.r4.model.Resource r4 = VersionConvertorFactory_40_50.convertResource(r5);
115      return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(r4);
116    }
117  }
118 
119  public class ContentConverter4to3 extends BaseConvertor implements IContentConvertor {
120
121    public ContentConverter4to3(String version) {
122      super(version);
123    }
124
125    @Override
126    public byte[] convert(byte[] cnt) throws IOException {
127      org.hl7.fhir.r4.model.Resource r4 = new org.hl7.fhir.r4.formats.JsonParser().parse(cnt);
128      if (r4 instanceof org.hl7.fhir.r4.model.MessageDefinition) {
129        return null;
130      }
131      if (r4 instanceof org.hl7.fhir.r4.model.GraphDefinition) {
132        return null;
133      }
134      if (r4 instanceof org.hl7.fhir.r4.model.TerminologyCapabilities) {
135        return null;
136      }
137      
138      if (r4 instanceof org.hl7.fhir.r4.model.MetadataResource) {
139        org.hl7.fhir.r4.model.MetadataResource cr = (org.hl7.fhir.r4.model.MetadataResource) r4;
140        if (!cr.hasVersion()) {
141          cr.setVersion(version);          
142        }
143      }
144      org.hl7.fhir.dstu3.model.Resource r3 = VersionConvertorFactory_30_40.convertResource(r4);
145      return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(r3);
146    }
147  }
148  public class ContentConverter2to3 extends BaseConvertor implements IContentConvertor {
149
150    public ContentConverter2to3(String version) {
151      super(version);
152    }
153
154    @Override
155    public byte[] convert(byte[] cnt) throws IOException {
156      org.hl7.fhir.dstu2.model.Resource r2 = new org.hl7.fhir.dstu2.formats.JsonParser().parse(cnt);      
157      org.hl7.fhir.dstu3.model.Resource r3 = VersionConvertorFactory_10_30.convertResource(r2);
158      if (r3 instanceof org.hl7.fhir.dstu3.model.MetadataResource) {
159        org.hl7.fhir.dstu3.model.MetadataResource cr = (org.hl7.fhir.dstu3.model.MetadataResource) r3;
160        if (!cr.hasVersion()) {
161          cr.setVersion(version);          
162        }
163      }
164      return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(r3);
165    }
166  }
167  public class ContentConverter2Bto3 extends BaseConvertor implements IContentConvertor {
168
169    public ContentConverter2Bto3(String version) {
170      super(version);
171    }
172
173    @Override
174    public byte[] convert(byte[] cnt) throws IOException {
175      org.hl7.fhir.dstu2016may.model.Resource r2 = new org.hl7.fhir.dstu2016may.formats.JsonParser().parse(cnt);  
176      if (r2 instanceof org.hl7.fhir.dstu2016may.model.StructureMap) {
177        return null;
178      }
179      org.hl7.fhir.dstu3.model.Resource r3 = VersionConvertorFactory_14_30.convertResource(r2);
180      if (r3 instanceof org.hl7.fhir.dstu3.model.MetadataResource) {
181        org.hl7.fhir.dstu3.model.MetadataResource cr = (org.hl7.fhir.dstu3.model.MetadataResource) r3;
182        if (!cr.hasVersion()) {
183          cr.setVersion(version);          
184        }
185      }
186      return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(r3);
187    }
188  }
189  public class ContentConverter5to3 extends BaseConvertor implements IContentConvertor {
190    public ContentConverter5to3(String version) {
191      super(version);
192    }
193
194    @Override
195    public byte[] convert(byte[] cnt) throws IOException {
196      org.hl7.fhir.r5.model.Resource r5 = new org.hl7.fhir.r5.formats.JsonParser().parse(cnt);
197      if (r5 instanceof org.hl7.fhir.r5.model.TerminologyCapabilities) {
198        return null;
199      }
200      
201      if (r5 instanceof org.hl7.fhir.r5.model.MetadataResource) {
202        org.hl7.fhir.r5.model.MetadataResource cr = (org.hl7.fhir.r5.model.MetadataResource) r5;
203        if (!cr.hasVersion()) {
204          cr.setVersion(version);          
205        }
206      }
207      org.hl7.fhir.dstu3.model.Resource r3 = VersionConvertorFactory_30_50.convertResource(r5);
208      return new org.hl7.fhir.dstu3.formats.JsonParser().composeBytes(r3);
209    }
210  }
211 
212  public class ContentConverter3to5 extends BaseConvertor implements IContentConvertor {
213
214    public ContentConverter3to5(String version) {
215      super(version);
216    }
217
218    @Override
219    public byte[] convert(byte[] cnt) throws IOException {
220      org.hl7.fhir.dstu3.model.Resource r3 = new org.hl7.fhir.dstu3.formats.JsonParser().parse(cnt);
221      if (r3 instanceof org.hl7.fhir.dstu3.model.MetadataResource) {
222        org.hl7.fhir.dstu3.model.MetadataResource cr = (org.hl7.fhir.dstu3.model.MetadataResource) r3;
223        if (!cr.hasVersion()) {
224          cr.setVersion(version);          
225        }
226      }
227      org.hl7.fhir.r5.model.Resource r5 = VersionConvertorFactory_30_50.convertResource(r3);
228      return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(r5);
229    }
230  }
231  public class ContentConverter2to5 extends BaseConvertor implements IContentConvertor {
232
233    public ContentConverter2to5(String version) {
234      super(version);
235    }
236
237    @Override
238    public byte[] convert(byte[] cnt) throws IOException {
239      org.hl7.fhir.dstu2.model.Resource r2 = new org.hl7.fhir.dstu2.formats.JsonParser().parse(cnt);      
240      org.hl7.fhir.r5.model.Resource r5 = VersionConvertorFactory_10_50.convertResource(r2);
241      if (r5 instanceof org.hl7.fhir.r5.model.MetadataResource) {
242        org.hl7.fhir.r5.model.MetadataResource cr = (org.hl7.fhir.r5.model.MetadataResource) r5;
243        if (!cr.hasVersion()) {
244          cr.setVersion(version);          
245        }
246      }
247      return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(r5);
248    }
249  }
250  public class ContentConverter2Bto5 extends BaseConvertor implements IContentConvertor {
251
252    public ContentConverter2Bto5(String version) {
253      super(version);
254    }
255
256    @Override
257    public byte[] convert(byte[] cnt) throws IOException {
258      org.hl7.fhir.dstu2016may.model.Resource r2 = new org.hl7.fhir.dstu2016may.formats.JsonParser().parse(cnt);      
259      org.hl7.fhir.r5.model.Resource r5 = VersionConvertorFactory_14_50.convertResource(r2);
260      if (r5 instanceof org.hl7.fhir.r5.model.MetadataResource) {
261        org.hl7.fhir.r5.model.MetadataResource cr = (org.hl7.fhir.r5.model.MetadataResource) r5;
262        if (!cr.hasVersion()) {
263          cr.setVersion(version);          
264        }
265      }
266      return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(r5);
267    }
268  }
269  public class ContentConverter4to5 extends BaseConvertor implements IContentConvertor {
270    public ContentConverter4to5(String version) {
271      super(version);
272    }
273
274    @Override
275    public byte[] convert(byte[] cnt) throws IOException {
276      org.hl7.fhir.r4.model.Resource r4 = new org.hl7.fhir.r4.formats.JsonParser().parse(cnt);
277      if (r4 instanceof org.hl7.fhir.r4.model.MetadataResource) {
278        org.hl7.fhir.r4.model.MetadataResource cr = (org.hl7.fhir.r4.model.MetadataResource) r4;
279        if (!cr.hasVersion()) {
280          cr.setVersion(version);          
281        }
282      }
283      org.hl7.fhir.r5.model.Resource r5 = VersionConvertorFactory_40_50.convertResource(r4);
284      return new org.hl7.fhir.r5.formats.JsonParser().composeBytes(r5);
285    }
286  }
287
288  public class ContentConverter5to2 extends BaseConvertor implements IContentConvertor {
289
290    public ContentConverter5to2(String version) {
291      super(version);
292    }
293
294    @Override
295    public byte[] convert(byte[] cnt) throws IOException {
296      org.hl7.fhir.r5.model.Resource r5 = new org.hl7.fhir.r5.formats.JsonParser().parse(cnt);      
297      if (r5 instanceof org.hl7.fhir.r5.model.MetadataResource) {
298        org.hl7.fhir.r5.model.MetadataResource cr = (org.hl7.fhir.r5.model.MetadataResource) r5;
299        if (!cr.hasVersion()) {
300          cr.setVersion(version);          
301        }
302      }
303      org.hl7.fhir.dstu2.model.Resource r2 = VersionConvertorFactory_10_50.convertResource(r5);
304      return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(r2);
305    }
306  }
307
308  public class ContentConverter5to2B extends BaseConvertor implements IContentConvertor {
309
310    public ContentConverter5to2B(String version) {
311      super(version);
312    }
313
314    @Override
315    public byte[] convert(byte[] cnt) throws IOException {
316      org.hl7.fhir.r5.model.Resource r5 = new org.hl7.fhir.r5.formats.JsonParser().parse(cnt);      
317      if (r5 instanceof org.hl7.fhir.r5.model.MessageDefinition) {
318        return null;
319      }
320      if (r5 instanceof org.hl7.fhir.r5.model.GraphDefinition) {
321        return null;
322      }
323      if (r5 instanceof org.hl7.fhir.r5.model.TerminologyCapabilities) {
324        return null;
325      }
326      
327      if (r5 instanceof org.hl7.fhir.r5.model.MetadataResource) {
328        org.hl7.fhir.r5.model.MetadataResource cr = (org.hl7.fhir.r5.model.MetadataResource) r5;
329        if (!cr.hasVersion()) {
330          cr.setVersion(version);          
331        }
332      }
333      org.hl7.fhir.dstu2016may.model.Resource r2 = VersionConvertorFactory_14_50.convertResource(r5);
334      return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(r2);
335    }
336  }
337
338  public class ContentConverter4to2 extends BaseConvertor implements IContentConvertor {
339
340    public ContentConverter4to2(String version) {
341      super(version);
342    }
343
344    @Override
345    public byte[] convert(byte[] cnt) throws IOException {
346      org.hl7.fhir.r4.model.Resource r4 = new org.hl7.fhir.r4.formats.JsonParser().parse(cnt);      
347      if (r4 instanceof org.hl7.fhir.r4.model.MetadataResource) {
348        org.hl7.fhir.r4.model.MetadataResource cr = (org.hl7.fhir.r4.model.MetadataResource) r4;
349        if (!cr.hasVersion()) {
350          cr.setVersion(version);          
351        }
352      }
353      org.hl7.fhir.dstu2.model.Resource r2 = VersionConvertorFactory_10_40.convertResource(r4);
354      return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(r2);
355    }
356  }
357
358  public class ContentConverter4to2B extends BaseConvertor implements IContentConvertor {
359
360    public ContentConverter4to2B(String version) {
361      super(version);
362    }
363
364    @Override
365    public byte[] convert(byte[] cnt) throws IOException {
366      org.hl7.fhir.r4.model.Resource r4 = new org.hl7.fhir.r4.formats.JsonParser().parse(cnt);  
367      if (r4 instanceof org.hl7.fhir.r4.model.MessageDefinition) {
368        return null;
369      }
370      if (r4 instanceof org.hl7.fhir.r4.model.GraphDefinition) {
371        return null;
372      }
373      if (r4 instanceof org.hl7.fhir.r4.model.TerminologyCapabilities) {
374        return null;
375      }
376      if (r4 instanceof org.hl7.fhir.r4.model.MetadataResource) {
377        org.hl7.fhir.r4.model.MetadataResource cr = (org.hl7.fhir.r4.model.MetadataResource) r4;
378        if (!cr.hasVersion()) {
379          cr.setVersion(version);          
380        }
381      }
382      org.hl7.fhir.dstu2016may.model.Resource r2 = VersionConvertorFactory_14_40.convertResource(r4);
383      return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(r2);
384    }
385  }
386
387  public class ContentConverter3to2 extends BaseConvertor implements IContentConvertor {
388
389    public ContentConverter3to2(String version) {
390      super(version);
391    }
392
393    @Override
394    public byte[] convert(byte[] cnt) throws IOException {
395      org.hl7.fhir.dstu3.model.Resource r3 = new org.hl7.fhir.dstu3.formats.JsonParser().parse(cnt);      
396      if (r3 instanceof org.hl7.fhir.dstu3.model.MetadataResource) {
397        org.hl7.fhir.dstu3.model.MetadataResource cr = (org.hl7.fhir.dstu3.model.MetadataResource) r3;
398        if (!cr.hasVersion()) {
399          cr.setVersion(version);          
400        }
401      }
402      org.hl7.fhir.dstu2.model.Resource r2 = VersionConvertorFactory_10_30.convertResource(r3);
403      return new org.hl7.fhir.dstu2.formats.JsonParser().composeBytes(r2);
404    }
405  }
406
407  public class ContentConverter3to2B extends BaseConvertor implements IContentConvertor {
408
409    public ContentConverter3to2B(String version) {
410      super(version);
411    }
412
413    @Override
414    public byte[] convert(byte[] cnt) throws IOException {
415      org.hl7.fhir.dstu3.model.Resource r3 = new org.hl7.fhir.dstu3.formats.JsonParser().parse(cnt);      
416      if (r3 instanceof org.hl7.fhir.dstu3.model.StructureMap) {
417        return null;
418      }
419
420      if (r3 instanceof org.hl7.fhir.dstu3.model.MetadataResource) {
421        org.hl7.fhir.dstu3.model.MetadataResource cr = (org.hl7.fhir.dstu3.model.MetadataResource) r3;
422        if (!cr.hasVersion()) {
423          cr.setVersion(version);          
424        }
425      }
426      org.hl7.fhir.dstu2016may.model.Resource r2 = VersionConvertorFactory_14_30.convertResource(r3);
427      return new org.hl7.fhir.dstu2016may.formats.JsonParser().composeBytes(r2);
428    }
429  }
430
431  public class ContentConverter4to4 extends BaseConvertor implements IContentConvertor {
432
433    public ContentConverter4to4(String version) {
434      super(version);
435    }
436
437    @Override
438    public byte[] convert(byte[] cnt) throws IOException {
439      org.hl7.fhir.r4.model.Resource r4 = new org.hl7.fhir.r4.formats.JsonParser().parse(cnt);      
440      if (r4 instanceof org.hl7.fhir.r4.model.MetadataResource) {
441        org.hl7.fhir.r4.model.MetadataResource cr = (org.hl7.fhir.r4.model.MetadataResource) r4;
442        if (!cr.hasVersion()) {
443          cr.setVersion(version);          
444        }
445      }
446      return new org.hl7.fhir.r4.formats.JsonParser().composeBytes(r4);
447    }
448  }
449
450
451  public static void main(String[] args) throws Exception {
452    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r2b.core.tgz"),  "3.0.1");
453    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r2b.core.tgz"),  "4.0.1");
454    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r2b.core.tgz"),  "4.3.0");
455    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r2b.core.tgz"),  "5.0.0");
456
457    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r3.core.tgz"),  "1.4.0");
458    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r3.core.tgz"),  "4.0.1");
459    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r3.core.tgz"),  "4.3.0");
460    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r3.core.tgz"),  "5.0.0");
461
462    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r4.core.tgz"),  "1.4.0");
463    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r4.core.tgz"),  "3.0.1");
464    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r4.core.tgz"),  "4.3.0");
465    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r4.core.tgz"),  "5.0.0");
466
467    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r4b.core.tgz"),  "1.4.0");
468    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r4b.core.tgz"),  "3.0.1");
469    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r4b.core.tgz"),  "4.0.1");
470    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r4b.core.tgz"),  "5.0.0");
471
472    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r5.core.tgz"),  "1.4.0");
473    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r5.core.tgz"),  "3.0.1");
474    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r5.core.tgz"),  "4.0.1");
475    new CorePackageVersionConvertor().execute(Utilities.path(args[0], "hl7.fhir.r5.core.tgz"),  "4.3.0");
476
477  }
478
479  public void execute(String packageSource, String versionTarget) throws Exception {
480    // open the existing package 
481    // chose the version converter 
482    // build a new package
483    log.info("Convert "+packageSource+" to "+versionTarget);
484    
485    NpmPackage src = NpmPackage.fromPackage(ManagedFileAccess.inStream(packageSource));
486    IContentConvertor conv = contentConvertorFactory(src.fhirVersion(), versionTarget);
487    
488    NpmPackage dst = NpmPackage.empty();
489    
490    for (NpmPackageFolder folder : src.getFolders().values()) {
491      for (String s : folder.getContent().keySet()) {
492        byte[] cnt = folder.getContent().get(s);
493        if (s.endsWith(".json")) {
494          if (s.equals("package.json")) {
495           cnt = convertPackage(cnt, versionTarget); 
496          } else {
497            String sJ = new String(cnt);
498            if (sJ.contains("\"resourceType\"") && !s.equals(".index.json") && !s.endsWith(".schema.json")) {
499              try {
500                cnt = conv.convert(cnt);
501              } catch (Exception e) {
502                throw new Exception("Error processing "+folder.getFolderName()+"/"+s+": "+e.getMessage(), e);
503              }
504            } else {
505              // nothing
506            }
507          }        
508          if (cnt != null) {
509            dst.addFile(folder.getFolderName(), s, cnt, null);
510          }
511        } else {
512          dst.addFile(folder.getFolderName(), s, cnt, null);
513        }
514      }
515    }
516    dst.save(ManagedFileAccess.outStream(FileUtilities.changeFileExt(packageSource, ".as."+VersionUtilities.getNameForVersion(versionTarget).toLowerCase()+".tgz")));
517  }
518
519  private IContentConvertor contentConvertorFactory(String fhirVersion, String versionTarget) throws Exception {
520    if (VersionUtilities.isR3Ver(fhirVersion)) {
521      if (VersionUtilities.isR4Ver(versionTarget) || VersionUtilities.isR4BVer(versionTarget)) {
522        return new ContentConverter3to4(fhirVersion);
523      } else if (VersionUtilities.isR5Plus(versionTarget)) {
524        return new ContentConverter3to5(fhirVersion);
525      } else if (VersionUtilities.isR2Ver(versionTarget)) {
526        return new ContentConverter3to2(fhirVersion);
527      } else if (VersionUtilities.isR2BVer(versionTarget)) {
528        return new ContentConverter3to2B(fhirVersion);
529      }
530    } else if (VersionUtilities.isR2Ver(fhirVersion)) {
531      if (VersionUtilities.isR4Ver(versionTarget) || VersionUtilities.isR4BVer(versionTarget)) {
532        return new ContentConverter2to4(fhirVersion);
533      } else if (VersionUtilities.isR5Plus(versionTarget)) {
534        return new ContentConverter2to5(fhirVersion);
535      } else if (VersionUtilities.isR3Ver(versionTarget)) {
536        return new ContentConverter2to3(fhirVersion);
537      }
538    } else if (VersionUtilities.isR2BVer(fhirVersion)) {
539      if (VersionUtilities.isR4Ver(versionTarget) || VersionUtilities.isR4BVer(versionTarget)) {
540        return new ContentConverter2Bto4(fhirVersion);
541      } else if (VersionUtilities.isR5Plus(versionTarget)) {
542        return new ContentConverter2Bto5(fhirVersion);
543      } else if (VersionUtilities.isR3Ver(versionTarget)) {
544        return new ContentConverter2Bto3(fhirVersion);
545      }
546    } else if (VersionUtilities.isR4Ver(fhirVersion)) {
547      if (VersionUtilities.isR3Ver(versionTarget)) {
548        return new ContentConverter4to3(fhirVersion);
549      } else if (VersionUtilities.isR5Plus(versionTarget)) {
550        return new ContentConverter4to5(fhirVersion);
551      } else if (VersionUtilities.isR2Ver(versionTarget)) {
552        return new ContentConverter4to2(fhirVersion);
553      } else if (VersionUtilities.isR4BVer(versionTarget)) {
554        return new ContentConverter4to4(fhirVersion);
555      } else if (VersionUtilities.isR2BVer(versionTarget)) {
556        return new ContentConverter4to2B(fhirVersion);
557      }
558    } else if (VersionUtilities.isR4BVer(fhirVersion)) {
559      if (VersionUtilities.isR3Ver(versionTarget)) {
560        return new ContentConverter4to3(fhirVersion);
561      } else if (VersionUtilities.isR5Plus(versionTarget)) {
562        return new ContentConverter4to5(fhirVersion);
563      } else if (VersionUtilities.isR4Ver(versionTarget)) {
564        return new ContentConverter4to4(fhirVersion);
565      } else if (VersionUtilities.isR2Ver(versionTarget)) {
566        return new ContentConverter4to2(fhirVersion);
567      } else if (VersionUtilities.isR2BVer(versionTarget)) {
568        return new ContentConverter4to2B(fhirVersion);
569      }
570    } else     if (VersionUtilities.isR5Plus(fhirVersion)) {
571      if (VersionUtilities.isR4Ver(versionTarget) || VersionUtilities.isR4BVer(versionTarget)) {
572        return new ContentConverter5to4(fhirVersion);
573      } else if (VersionUtilities.isR3Ver(versionTarget)) {
574        return new ContentConverter5to3(fhirVersion);
575      } else if (VersionUtilities.isR2Ver(versionTarget)) {
576        return new ContentConverter5to2(fhirVersion);
577      } else if (VersionUtilities.isR2BVer(versionTarget)) {
578        return new ContentConverter5to2B(fhirVersion);
579      }
580    }
581    throw new Exception("Unable to convert from "+fhirVersion+" to "+versionTarget);
582  }
583
584  private byte[] convertPackage(byte[] cnt, String version) throws IOException {
585    JsonObject json = JsonParser.parseObject(cnt);
586    json.remove("fhir-version-list");
587    JsonArray vl = new JsonArray();
588    json.add("fhirVersions", vl);
589    vl.add(version);
590    json.add("name", json.asString("name")+".as."+VersionUtilities.getNameForVersion(version).toLowerCase());
591    json.add("title", json.asString("title")+" (as Version "+VersionUtilities.getNameForVersion(version).toLowerCase()+")");
592    return JsonParser.composeBytes(json);
593  }
594}