001package org.hl7.fhir.r5.comparison;
002
003import java.util.ArrayList;
004import java.util.HashMap;
005import java.util.List;
006import java.util.Map;
007
008import org.hl7.fhir.r5.comparison.CanonicalResourceComparer.CanonicalResourceComparison;
009import org.hl7.fhir.r5.model.Base;
010import org.hl7.fhir.r5.model.CanonicalResource;
011import org.hl7.fhir.r5.utils.UserDataNames;
012import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
013
014@MarkedToMoveToAdjunctPackage
015public class VersionComparisonAnnotation {
016
017  public enum AnotationType {
018    NoChange, Added, Changed, Deleted;
019  }
020
021
022  private AnotationType type;
023  private String original;  
024  private Map<String, List<Base>> deletedChildren;
025  private CanonicalResourceComparison<? extends CanonicalResource> comp;
026
027  public VersionComparisonAnnotation(AnotationType type) {
028    super();
029    this.type = type;
030  }
031
032  public void added() {
033    assert type == AnotationType.NoChange;
034    type = AnotationType.Added;    
035  }
036
037  public void changed(Base orig) {
038    assert type == AnotationType.NoChange;
039    type = AnotationType.Changed;
040    if (orig != null && orig.isPrimitive() && orig.primitiveValue().length() < 120) { // arbitrary, but we don't a whack of markdown 
041      this.original = orig.primitiveValue();
042    }
043  }
044
045  public void deleted() {    
046    assert type == AnotationType.NoChange;
047    type = AnotationType.Deleted;
048
049
050  }
051
052  public void deleted(String name, Base other) {
053    if (deletedChildren == null) {
054      deletedChildren = new HashMap<>();
055    }
056    if (!deletedChildren.containsKey(name)) {
057      deletedChildren.put(name, new ArrayList<>());
058    }
059    deletedChildren.get(name).add(other);    
060  }
061
062  public void comp(CanonicalResourceComparison<? extends CanonicalResource> comp) {
063    assert this.comp == null;
064    // TODO Auto-generated method stub
065    if (!comp.noUpdates()) {
066      type = AnotationType.Changed;
067    }
068    this.comp = comp;
069  }
070
071  public AnotationType getType() {
072    return type;
073  }
074
075  public String getOriginal() {
076    return original;
077  }
078
079  public Map<String, List<Base>> getDeletedChildren() {
080    return deletedChildren;
081  }
082
083  public CanonicalResourceComparison<? extends CanonicalResource> getComp() {
084    return comp;
085  }
086
087
088  public static boolean hasDeleted(Base base, String... names) {
089    boolean result = false;
090    if (base.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
091      VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
092      for (String name : names) {
093        if (self.deletedChildren != null && self.deletedChildren.containsKey(name))  {
094          result = true;
095        }
096      }
097    }
098    return result;
099  }
100
101  public static List<Base> getDeleted(Base base, String... names) {
102    List<Base> result = new ArrayList<>();
103    if (base.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
104      VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
105      for (String name : names) {
106        if (self.deletedChildren != null && self.deletedChildren.containsKey(name))  {
107          result.addAll(self.deletedChildren.get(name));
108        }
109      }
110    }
111    return result;
112  }
113
114  public static Base getDeletedItem(Base base, String name) {
115    List<Base> result = new ArrayList<>();
116    if (base.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
117      VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
118      if (self.deletedChildren != null && self.deletedChildren.containsKey(name))  {
119        result.addAll(self.deletedChildren.get(name));
120      }
121    }
122    return result.isEmpty() ? null : result.get(0);
123  }
124
125
126
127
128  public static CanonicalResourceComparison<? extends CanonicalResource> artifactComparison(Base base) {
129    if (base.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
130      VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
131      return self.comp;
132    } else {
133      return null;
134    }
135  }
136
137  
138}