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