001package org.hl7.fhir.dstu3.utils;
002
003/*
004Copyright (c) 2011+, HL7, Inc
005All rights reserved.
006
007Redistribution and use in source and binary forms, with or without modification, 
008are permitted provided that the following conditions are met:
009
010 * Redistributions of source code must retain the above copyright notice, this 
011   list of conditions and the following disclaimer.
012 * Redistributions in binary form must reproduce the above copyright notice, 
013   this list of conditions and the following disclaimer in the documentation 
014   and/or other materials provided with the distribution.
015 * Neither the name of HL7 nor the names of its contributors may be used to 
016   endorse or promote products derived from this software without specific 
017   prior written permission.
018
019THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
020ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
021WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
022IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
023INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
024NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
025PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
026WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
027ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
028POSSIBILITY OF SUCH DAMAGE.
029
030 */
031
032import java.util.ArrayList;
033import java.util.Iterator;
034import java.util.List;
035
036import org.apache.commons.lang3.StringUtils;
037import org.hl7.fhir.dstu3.model.BooleanType;
038import org.hl7.fhir.dstu3.model.CodeSystem.ConceptDefinitionComponent;
039import org.hl7.fhir.dstu3.model.CodeType;
040import org.hl7.fhir.dstu3.model.CodeableConcept;
041import org.hl7.fhir.dstu3.model.Coding;
042import org.hl7.fhir.dstu3.model.DataElement;
043import org.hl7.fhir.dstu3.model.DomainResource;
044import org.hl7.fhir.dstu3.model.Element;
045import org.hl7.fhir.dstu3.model.ElementDefinition;
046import org.hl7.fhir.dstu3.model.Extension;
047import org.hl7.fhir.dstu3.model.ExtensionHelper;
048import org.hl7.fhir.dstu3.model.Factory;
049import org.hl7.fhir.dstu3.model.Identifier;
050import org.hl7.fhir.dstu3.model.IntegerType;
051import org.hl7.fhir.dstu3.model.MarkdownType;
052import org.hl7.fhir.dstu3.model.PrimitiveType;
053import org.hl7.fhir.dstu3.model.Questionnaire.QuestionnaireItemComponent;
054import org.hl7.fhir.dstu3.model.Questionnaire.QuestionnaireItemType;
055import org.hl7.fhir.dstu3.model.StringType;
056import org.hl7.fhir.dstu3.model.StructureDefinition;
057import org.hl7.fhir.dstu3.model.Type;
058import org.hl7.fhir.dstu3.model.UriType;
059import org.hl7.fhir.dstu3.model.ValueSet.ConceptReferenceComponent;
060import org.hl7.fhir.dstu3.model.ValueSet.ConceptSetComponent;
061import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
062
063
064public class ToolingExtensions {
065
066  // validated
067  public static final String EXT_SUBSUMES = "http://hl7.org/fhir/StructureDefinition/codesystem-subsumes"; 
068//  private static final String EXT_OID = "http://hl7.org/fhir/StructureDefinition/valueset-oid";
069//  public static final String EXT_DEPRECATED = "http://hl7.org/fhir/StructureDefinition/codesystem-deprecated";
070  public static final String EXT_DEFINITION = "http://hl7.org/fhir/StructureDefinition/valueset-definition";
071  public static final String EXT_CS_COMMENT = "http://hl7.org/fhir/StructureDefinition/codesystem-comments";
072  public static final String EXT_VS_COMMENT = "http://hl7.org/fhir/StructureDefinition/valueset-comments";
073  private static final String EXT_IDENTIFIER = "http://hl7.org/fhir/StructureDefinition/identifier";
074  public static final String EXT_TRANSLATION = "http://hl7.org/fhir/StructureDefinition/translation";
075  public static final String EXT_ISSUE_SOURCE = "http://hl7.org/fhir/StructureDefinition/operationoutcome-issue-source";
076  public static final String EXT_DISPLAY_HINT = "http://hl7.org/fhir/StructureDefinition/structuredefinition-display-hint"; 
077  public static final String EXT_REPLACED_BY = "http://hl7.org/fhir/StructureDefinition/valueset-replacedby";
078  public static final String EXT_JSON_TYPE = "http://hl7.org/fhir/StructureDefinition/structuredefinition-json-type"; 
079  public static final String EXT_RDF_TYPE = "http://hl7.org/fhir/StructureDefinition/structuredefinition-rdf-type"; 
080  public static final String EXT_XML_TYPE = "http://hl7.org/fhir/StructureDefinition/structuredefinition-xml-type"; 
081  public static final String EXT_REGEX = "http://hl7.org/fhir/StructureDefinition/structuredefinition-regex"; 
082  public static final String EXT_CONTROL = "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl"; 
083  public static final String EXT_MINOCCURS = "http://hl7.org/fhir/StructureDefinition/questionnaire-minOccurs"; 
084  public static final String EXT_MAXOCCURS = "http://hl7.org/fhir/StructureDefinition/questionnaire-maxOccurs";
085  public static final String EXT_ALLOWEDRESOURCE = "http://hl7.org/fhir/StructureDefinition/questionnaire-allowedResource";
086  public static final String EXT_REFERENCEFILTER = "http://hl7.org/fhir/StructureDefinition/questionnaire-referenceFilter";
087  public static final String EXT_CODE_GENERATION_PARENT = "http://hl7.org/fhir/StructureDefinition/structuredefinition-codegen-super";
088
089  // unregistered?
090  public static final String EXT_MAPPING_PREFIX = "http://hl7.org/fhir/tools/StructureDefinition/logical-mapping-prefix";
091  public static final String EXT_MAPPING_SUFFIX = "http://hl7.org/fhir/tools/StructureDefinition/logical-mapping-suffix";
092
093//  public static final String EXT_FLYOVER = "http://hl7.org/fhir/Profile/questionnaire-extensions#flyover";
094  public static final String EXT_QTYPE = "http://hl7.org/fhir/StructureDefinition/questionnnaire-baseType";
095//  private static final String EXT_QREF = "http://www.healthintersections.com.au/fhir/Profile/metadata#reference";
096//  private static final String EXTENSION_FILTER_ONLY = "http://www.healthintersections.com.au/fhir/Profile/metadata#expandNeedsFilter";
097//  private static final String EXT_TYPE = "http://www.healthintersections.com.au/fhir/Profile/metadata#type";
098//  private static final String EXT_REFERENCE = "http://www.healthintersections.com.au/fhir/Profile/metadata#reference";
099  private static final String EXT_FHIRTYPE = "http://hl7.org/fhir/StructureDefinition/questionnaire-fhirType";
100  private static final String EXT_ALLOWABLE_UNITS = "http://hl7.org/fhir/StructureDefinition/elementdefinition-allowedUnits";
101  public static final String EXT_CIMI_REFERENCE = "http://hl7.org/fhir/StructureDefinition/cimi-reference";
102  public static final String EXT_UNCLOSED = "http://hl7.org/fhir/StructureDefinition/valueset-unclosed";
103  public static final String EXT_FMM_LEVEL = "http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm";
104  public static final String EXT_RESOURCE_CATEGORY = "http://hl7.org/fhir/StructureDefinition/structuredefinition-category";
105  public static final String EXT_TABLE_NAME = "http://hl7.org/fhir/StructureDefinition/structuredefinition-table-name";
106  public static final String EXT_OO_FILE = "http://hl7.org/fhir/StructureDefinition/operationoutcome-file";
107  public static final String EXT_WORKGROUP = "http://hl7.org/fhir/StructureDefinition/structuredefinition-wg";
108  public static final String EXT_BALLOT_STATUS = "http://hl7.org/fhir/StructureDefinition/structuredefinition-ballot-status";
109
110
111  // specific extension helpers
112
113  public static Extension makeIssueSource(Source source) {
114    Extension ex = new Extension();
115    // todo: write this up and get it published with the pack (and handle the redirect?)
116    ex.setUrl(ToolingExtensions.EXT_ISSUE_SOURCE);
117    CodeType c = new CodeType();
118    c.setValue(source.toString());
119    ex.setValue(c);
120    return ex;
121  }
122
123  public static boolean hasExtension(DomainResource de, String url) {
124    return getExtension(de, url) != null;
125  }
126
127  public static boolean hasExtension(Element e, String url) {
128    return getExtension(e, url) != null;
129  }
130
131//  public static void addStringExtension(DomainResource dr, String url, String content) {
132//    if (!StringUtils.isBlank(content)) {
133//      Extension ex = getExtension(dr, url);
134//      if (ex != null)
135//        ex.setValue(new StringType(content));
136//      else
137//        dr.getExtension().add(Factory.newExtension(url, new StringType(content), true));   
138//    }
139//  }
140
141  public static void addMarkdownExtension(DomainResource dr, String url, String content) {
142    if (!StringUtils.isBlank(content)) {
143      Extension ex = getExtension(dr, url);
144      if (ex != null)
145        ex.setValue(new StringType(content));
146      else
147        dr.getExtension().add(Factory.newExtension(url, new MarkdownType(content), true));   
148    }
149  }
150
151  public static void addStringExtension(Element e, String url, String content) {
152    if (!StringUtils.isBlank(content)) {
153      Extension ex = getExtension(e, url);
154      if (ex != null)
155        ex.setValue(new StringType(content));
156      else
157        e.getExtension().add(Factory.newExtension(url, new StringType(content), true));   
158    }
159  }
160
161  public static void addStringExtension(DomainResource e, String url, String content) {
162    if (!StringUtils.isBlank(content)) {
163      Extension ex = getExtension(e, url);
164      if (ex != null)
165        ex.setValue(new StringType(content));
166      else
167        e.getExtension().add(Factory.newExtension(url, new StringType(content), true));   
168    }
169  }
170
171  public static void addIntegerExtension(DomainResource dr, String url, int value) {
172    Extension ex = getExtension(dr, url);
173    if (ex != null)
174      ex.setValue(new IntegerType(value));
175    else
176      dr.getExtension().add(Factory.newExtension(url, new IntegerType(value), true));   
177  }
178
179  public static void addVSComment(ConceptSetComponent nc, String comment) {
180    if (!StringUtils.isBlank(comment))
181      nc.getExtension().add(Factory.newExtension(EXT_VS_COMMENT, Factory.newString_(comment), true));   
182  }
183  public static void addVSComment(ConceptReferenceComponent nc, String comment) {
184    if (!StringUtils.isBlank(comment))
185      nc.getExtension().add(Factory.newExtension(EXT_VS_COMMENT, Factory.newString_(comment), true));   
186  }
187
188  public static void addCSComment(ConceptDefinitionComponent nc, String comment) {
189    if (!StringUtils.isBlank(comment))
190      nc.getExtension().add(Factory.newExtension(EXT_CS_COMMENT, Factory.newString_(comment), true));   
191  }
192
193//  public static void markDeprecated(Element nc) {
194//    setDeprecated(nc);   
195//  }
196//
197  public static void addSubsumes(ConceptDefinitionComponent nc, String code) {
198    nc.getModifierExtension().add(Factory.newExtension(EXT_SUBSUMES, Factory.newCode(code), true));   
199  }
200
201  public static void addDefinition(Element nc, String definition) {
202    if (!StringUtils.isBlank(definition))
203      nc.getExtension().add(Factory.newExtension(EXT_DEFINITION, Factory.newString_(definition), true));   
204  }
205
206  public static void addDisplayHint(Element def, String hint) {
207    if (!StringUtils.isBlank(hint))
208      def.getExtension().add(Factory.newExtension(EXT_DISPLAY_HINT, Factory.newString_(hint), true));   
209  }
210
211  public static String getDisplayHint(Element def) {
212    return readStringExtension(def, EXT_DISPLAY_HINT);    
213  }
214
215  public static String readStringExtension(Element c, String uri) {
216    Extension ex = ExtensionHelper.getExtension(c, uri);
217    if (ex == null)
218      return null;
219    if (ex.getValue() instanceof UriType)
220      return ((UriType) ex.getValue()).getValue();
221    if (ex.getValue() instanceof CodeType)
222      return ((CodeType) ex.getValue()).getValue();
223    if (ex.getValue() instanceof IntegerType)
224      return ((IntegerType) ex.getValue()).asStringValue();
225    if ((ex.getValue() instanceof MarkdownType))
226      return ((MarkdownType) ex.getValue()).getValue();
227    if (!(ex.getValue() instanceof StringType))
228      return null;
229    return ((StringType) ex.getValue()).getValue();
230  }
231
232  public static String readStringExtension(DomainResource c, String uri) {
233    Extension ex = getExtension(c, uri);
234    if (ex == null)
235      return null;
236    if ((ex.getValue() instanceof StringType))
237      return ((StringType) ex.getValue()).getValue();
238    if ((ex.getValue() instanceof UriType))
239      return ((UriType) ex.getValue()).getValue();
240    if (ex.getValue() instanceof CodeType)
241      return ((CodeType) ex.getValue()).getValue();
242    if (ex.getValue() instanceof IntegerType)
243      return ((IntegerType) ex.getValue()).asStringValue();
244    if ((ex.getValue() instanceof MarkdownType))
245      return ((MarkdownType) ex.getValue()).getValue();
246    return null;
247  }
248
249  @SuppressWarnings("unchecked")
250  public static PrimitiveType<Type> readPrimitiveExtension(DomainResource c, String uri) {
251    Extension ex = getExtension(c, uri);
252    if (ex == null)
253      return null;
254    return (PrimitiveType<Type>) ex.getValue();
255  }
256
257  public static boolean findStringExtension(Element c, String uri) {
258    Extension ex = ExtensionHelper.getExtension(c, uri);
259    if (ex == null)
260      return false;
261    if (!(ex.getValue() instanceof StringType))
262      return false;
263    return !StringUtils.isBlank(((StringType) ex.getValue()).getValue());
264  }
265
266  public static Boolean readBooleanExtension(Element c, String uri) {
267    Extension ex = ExtensionHelper.getExtension(c, uri);
268    if (ex == null)
269      return null;
270    if (!(ex.getValue() instanceof BooleanType))
271      return null;
272    return ((BooleanType) ex.getValue()).getValue();
273  }
274
275  public static boolean findBooleanExtension(Element c, String uri) {
276    Extension ex = ExtensionHelper.getExtension(c, uri);
277    if (ex == null)
278      return false;
279    if (!(ex.getValue() instanceof BooleanType))
280      return false;
281    return true;
282  }
283
284  public static String getCSComment(ConceptDefinitionComponent c) {
285    return readStringExtension(c, EXT_CS_COMMENT);    
286  }
287//
288//  public static Boolean getDeprecated(Element c) {
289//    return readBooleanExtension(c, EXT_DEPRECATED);    
290//  }
291
292  public static boolean hasCSComment(ConceptDefinitionComponent c) {
293    return findStringExtension(c, EXT_CS_COMMENT);    
294  }
295
296//  public static boolean hasDeprecated(Element c) {
297//    return findBooleanExtension(c, EXT_DEPRECATED);    
298//  }
299
300  public static List<CodeType> getSubsumes(ConceptDefinitionComponent c) {
301    List<CodeType> res = new ArrayList<CodeType>();
302
303    for (Extension e : c.getExtension()) {
304      if (EXT_SUBSUMES.equals(e.getUrl()))
305        res.add((CodeType) e.getValue());
306    }
307    return res;
308  }
309
310  public static void addFlyOver(QuestionnaireItemComponent item, String text){
311    if (!StringUtils.isBlank(text)) {
312        QuestionnaireItemComponent display = item.addItem();
313        display.setType(QuestionnaireItemType.DISPLAY);
314        display.setText(text);
315        display.getExtension().add(Factory.newExtension(EXT_CONTROL, Factory.newCodeableConcept("flyover", "http://hl7.org/fhir/questionnaire-item-control", "Fly-over"), true));
316    }
317  }
318
319  public static void addMin(QuestionnaireItemComponent item, int min) {
320    item.getExtension().add(Factory.newExtension(EXT_MINOCCURS, Factory.newInteger(min), true));
321  }
322  
323  public static void addMax(QuestionnaireItemComponent item, int max) {
324    item.getExtension().add(Factory.newExtension(EXT_MAXOCCURS, Factory.newInteger(max), true));
325  }
326  
327  public static void addFhirType(QuestionnaireItemComponent group, String value) {
328    group.getExtension().add(Factory.newExtension(EXT_FHIRTYPE, Factory.newString_(value), true));       
329  }
330
331  public static void addControl(QuestionnaireItemComponent group, String value) {
332    group.getExtension().add(Factory.newExtension(EXT_CONTROL, Factory.newCodeableConcept(value, "http://hl7.org/fhir/questionnaire-item-control", value), true));
333  }
334
335  public static void addAllowedResource(QuestionnaireItemComponent group, String value) {
336    group.getExtension().add(Factory.newExtension(EXT_ALLOWEDRESOURCE, Factory.newCode(value), true));       
337  }
338
339  public static void addReferenceFilter(QuestionnaireItemComponent group, String value) {
340    group.getExtension().add(Factory.newExtension(EXT_REFERENCEFILTER, Factory.newString_(value), true));       
341  }
342
343  public static void addIdentifier(Element element, Identifier value) {
344    element.getExtension().add(Factory.newExtension(EXT_IDENTIFIER, value, true));       
345  }
346
347  /**
348   * @param name the identity of the extension of interest
349   * @return The extension, if on this element, else null
350   */
351  public static Extension getExtension(DomainResource resource, String name) {
352    if (name == null)
353      return null;
354    if (!resource.hasExtension())
355      return null;
356    for (Extension e : resource.getExtension()) {
357      if (name.equals(e.getUrl()))
358        return e;
359    }
360    return null;
361  }
362
363  public static Extension getExtension(Element el, String name) {
364    if (name == null)
365      return null;
366    if (!el.hasExtension())
367      return null;
368    for (Extension e : el.getExtension()) {
369      if (name.equals(e.getUrl()))
370        return e;
371    }
372    return null;
373  }
374
375  public static void setStringExtension(DomainResource resource, String uri, String value) {
376    Extension ext = getExtension(resource, uri);
377    if (ext != null)
378      ext.setValue(new StringType(value));
379    else
380      resource.getExtension().add(new Extension(new UriType(uri)).setValue(new StringType(value)));
381  }
382
383  public static void setStringExtension(Element element, String uri, String value) {
384    Extension ext = getExtension(element, uri);
385    if (ext != null)
386      ext.setValue(new StringType(value));
387    else
388      element.getExtension().add(new Extension(new UriType(uri)).setValue(new StringType(value)));
389  }
390
391  public static void setCodeExtension(DomainResource resource, String uri, String value) {
392    Extension ext = getExtension(resource, uri);
393    if (ext != null)
394      ext.setValue(new CodeType(value));
395    else
396      resource.getExtension().add(new Extension(new UriType(uri)).setValue(new CodeType(value)));
397  }
398
399  public static void setIntegerExtension(DomainResource resource, String uri, int value) {
400    Extension ext = getExtension(resource, uri);
401    if (ext != null)
402      ext.setValue(new IntegerType(value));
403    else
404      resource.getExtension().add(new Extension(new UriType(uri)).setValue(new IntegerType(value)));
405  }
406
407//  public static String getOID(CodeSystem define) {
408//    return readStringExtension(define, EXT_OID);    
409//  }
410//
411//  public static String getOID(ValueSet vs) {
412//    return readStringExtension(vs, EXT_OID);    
413//  }
414//
415//  public static void setOID(CodeSystem define, String oid) throws FHIRFormatError, URISyntaxException {
416//    if (!oid.startsWith("urn:oid:"))
417//      throw new FHIRFormatError("Error in OID format");
418//    if (oid.startsWith("urn:oid:urn:oid:"))
419//      throw new FHIRFormatError("Error in OID format");
420//    if (!hasExtension(define, EXT_OID))
421//    define.getExtension().add(Factory.newExtension(EXT_OID, Factory.newUri(oid), false));       
422//    else if (!oid.equals(readStringExtension(define, EXT_OID)))
423//      throw new Error("Attempt to assign multiple OIDs to a code system");
424//  }
425//  public static void setOID(ValueSet vs, String oid) throws FHIRFormatError, URISyntaxException {
426//    if (!oid.startsWith("urn:oid:"))
427//      throw new FHIRFormatError("Error in OID format");
428//    if (oid.startsWith("urn:oid:urn:oid:"))
429//      throw new FHIRFormatError("Error in OID format");
430//    if (!hasExtension(vs, EXT_OID))
431//    vs.getExtension().add(Factory.newExtension(EXT_OID, Factory.newUri(oid), false));       
432//    else if (!oid.equals(readStringExtension(vs, EXT_OID)))
433//      throw new Error("Attempt to assign multiple OIDs to value set "+vs.getName()+" ("+vs.getUrl()+"). Has "+readStringExtension(vs, EXT_OID)+", trying to add "+oid);
434//  }
435
436  public static boolean hasLanguageTranslation(Element element, String lang) {
437    for (Extension e : element.getExtension()) {
438      if (e.getUrl().equals(EXT_TRANSLATION)) {
439        Extension e1 = ExtensionHelper.getExtension(e, "lang");
440
441        if (e1 != null && e1.getValue() instanceof CodeType && ((CodeType) e.getValue()).getValue().equals(lang))
442          return true;
443      }
444    }
445    return false;
446  }
447
448  public static String getLanguageTranslation(Element element, String lang) {
449    for (Extension e : element.getExtension()) {
450      if (e.getUrl().equals(EXT_TRANSLATION)) {
451        Extension e1 = ExtensionHelper.getExtension(e, "lang");
452
453        if (e1 != null && e1.getValue() instanceof CodeType && ((CodeType) e.getValue()).getValue().equals(lang)) {
454          e1 = ExtensionHelper.getExtension(e, "content");
455          return ((StringType) e.getValue()).getValue();
456        }
457      }
458    }
459    return null;
460  }
461
462  public static void addLanguageTranslation(Element element, String lang, String value) {
463    Extension extension = new Extension().setUrl(EXT_TRANSLATION);
464    extension.addExtension().setUrl("lang").setValue(new StringType(lang));
465    extension.addExtension().setUrl("content").setValue(new StringType(value));
466    element.getExtension().add(extension);
467  }
468
469  public static Type getAllowedUnits(ElementDefinition eld) {
470    for (Extension e : eld.getExtension()) 
471      if (e.getUrl().equals(EXT_ALLOWABLE_UNITS)) 
472        return e.getValue();
473    return null;
474  }
475
476  public static void setAllowableUnits(ElementDefinition eld, CodeableConcept cc) {
477    for (Extension e : eld.getExtension()) 
478      if (e.getUrl().equals(EXT_ALLOWABLE_UNITS)) {
479        e.setValue(cc);
480        return;
481      }
482    eld.getExtension().add(new Extension().setUrl(EXT_ALLOWABLE_UNITS).setValue(cc));
483  }
484
485  public static List<Extension> getExtensions(Element element, String url) {
486    List<Extension> results = new ArrayList<Extension>();
487    for (Extension ex : element.getExtension())
488      if (ex.getUrl().equals(url))
489        results.add(ex);
490    return results;
491  }
492
493  public static List<Extension> getExtensions(DomainResource resource, String url) {
494    List<Extension> results = new ArrayList<Extension>();
495    for (Extension ex : resource.getExtension())
496      if (ex.getUrl().equals(url))
497        results.add(ex);
498    return results;
499  }
500
501  public static void addDEReference(DataElement de, String value) {
502    for (Extension e : de.getExtension()) 
503      if (e.getUrl().equals(EXT_CIMI_REFERENCE)) {
504        e.setValue(new UriType(value));
505        return;
506      }
507    de.getExtension().add(new Extension().setUrl(EXT_CIMI_REFERENCE).setValue(new UriType(value)));
508  }
509
510//  public static void setDeprecated(Element nc) {
511//    for (Extension e : nc.getExtension()) 
512//      if (e.getUrl().equals(EXT_DEPRECATED)) {
513//        e.setValue(new BooleanType(true));
514//        return;
515//      }
516//    nc.getExtension().add(new Extension().setUrl(EXT_DEPRECATED).setValue(new BooleanType(true)));    
517//  }
518
519  public static void setExtension(Element focus, String url, Coding c) {
520    for (Extension e : focus.getExtension()) 
521      if (e.getUrl().equals(url)) {
522        e.setValue(c);
523        return;
524      }
525    focus.getExtension().add(new Extension().setUrl(url).setValue(c));    
526  }
527
528  public static void removeExtension(DomainResource focus, String url) {
529    Iterator<Extension> i = focus.getExtension().iterator();
530    while (i.hasNext()) {
531      Extension e = i.next(); // must be called before you can call i.remove()
532      if (e.getUrl().equals(url)) {
533        i.remove();
534      }
535    }
536  }
537  
538  public static void removeExtension(Element focus, String url) {
539    Iterator<Extension> i = focus.getExtension().iterator();
540    while (i.hasNext()) {
541      Extension e = i.next(); // must be called before you can call i.remove()
542      if (e.getUrl().equals(url)) {
543        i.remove();
544      }
545    }
546  }
547
548
549//  public static boolean hasOID(ValueSet vs) {
550//    return hasExtension(vs, EXT_OID);
551//  }
552//  
553//  public static boolean hasOID(CodeSystem cs) {
554//    return hasExtension(cs, EXT_OID);
555//  }
556//  
557  
558}