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