
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}