001package ca.uhn.fhir.jpa.subscription.module.subscriber;
002
003/*-
004 * #%L
005 * HAPI FHIR Subscription Server
006 * %%
007 * Copyright (C) 2014 - 2020 University Health Network
008 * %%
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 *
013 *      http://www.apache.org/licenses/LICENSE-2.0
014 *
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 * #L%
021 */
022
023import ca.uhn.fhir.context.FhirContext;
024import ca.uhn.fhir.jpa.subscription.module.CanonicalSubscription;
025import ca.uhn.fhir.jpa.subscription.module.ResourceModifiedMessage;
026import ca.uhn.fhir.rest.api.EncodingEnum;
027import com.fasterxml.jackson.annotation.JsonAutoDetect;
028import com.fasterxml.jackson.annotation.JsonIgnore;
029import com.fasterxml.jackson.annotation.JsonInclude;
030import com.fasterxml.jackson.annotation.JsonProperty;
031import org.apache.commons.lang3.builder.ToStringBuilder;
032import org.hl7.fhir.instance.model.api.IBaseResource;
033import org.hl7.fhir.instance.model.api.IIdType;
034
035import static org.apache.commons.lang3.StringUtils.isNotBlank;
036
037@SuppressWarnings("WeakerAccess")
038@JsonInclude(JsonInclude.Include.NON_NULL)
039@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
040public class ResourceDeliveryMessage extends BaseResourceMessage implements IResourceMessage {
041
042        @JsonProperty("canonicalSubscription")
043        private CanonicalSubscription mySubscription;
044        @JsonProperty("payload")
045        private String myPayloadString;
046        @JsonIgnore
047        private transient IBaseResource myPayload;
048        @JsonProperty("payloadId")
049        private String myPayloadId;
050        @JsonProperty("operationType")
051        private ResourceModifiedMessage.OperationTypeEnum myOperationType;
052
053        /**
054         * Constructor
055         */
056        public ResourceDeliveryMessage() {
057                super();
058        }
059
060        public ResourceModifiedMessage.OperationTypeEnum getOperationType() {
061                return myOperationType;
062        }
063
064        public void setOperationType(ResourceModifiedMessage.OperationTypeEnum theOperationType) {
065                myOperationType = theOperationType;
066        }
067
068        public IBaseResource getPayload(FhirContext theCtx) {
069                IBaseResource retVal = myPayload;
070                if (retVal == null && isNotBlank(myPayloadString)) {
071                        retVal = theCtx.newJsonParser().parseResource(myPayloadString);
072                        myPayload = retVal;
073                }
074                return retVal;
075        }
076
077        public String getPayloadString() {
078                if (this.myPayloadString != null) {
079                        return this.myPayloadString;
080                }
081
082                return "";
083        }
084
085        public IIdType getPayloadId(FhirContext theCtx) {
086                IIdType retVal = null;
087                if (myPayloadId != null) {
088                        retVal = theCtx.getVersion().newIdType().setValue(myPayloadId);
089                }
090                return retVal;
091        }
092
093        public CanonicalSubscription getSubscription() {
094                return mySubscription;
095        }
096
097        public void setSubscription(CanonicalSubscription theSubscription) {
098                mySubscription = theSubscription;
099        }
100
101        public void setPayload(FhirContext theCtx, IBaseResource thePayload, EncodingEnum theEncoding) {
102                myPayload = thePayload;
103                myPayloadString = theEncoding.newParser(theCtx).encodeResourceToString(thePayload);
104                myPayloadId = thePayload.getIdElement().toUnqualified().getValue();
105        }
106
107        @Override
108        public String getPayloadId() {
109                return myPayloadId;
110        }
111
112        public void setPayloadId(IIdType thePayloadId) {
113                myPayloadId = null;
114                if (thePayloadId != null) {
115                        myPayloadId = thePayloadId.getValue();
116                }
117        }
118
119        @Override
120        public String toString() {
121                return new ToStringBuilder(this)
122                        .append("mySubscription", mySubscription)
123                        .append("myPayloadString", myPayloadString)
124                        .append("myPayload", myPayload)
125                        .append("myPayloadId", myPayloadId)
126                        .append("myOperationType", myOperationType)
127                        .toString();
128        }
129
130        /**
131         * Helper method to fetch the subscription ID
132         */
133        public String getSubscriptionId(FhirContext theFhirContext) {
134                String retVal = null;
135                if (getSubscription() != null) {
136                        IIdType idElement = getSubscription().getIdElement(theFhirContext);
137                        if (idElement != null) {
138                                retVal = idElement.getValue();
139                        }
140                }
141                return retVal;
142        }
143}