All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ca.uhn.fhir.mdm.model.CanonicalEID Maven / Gradle / Ivy

/*-
 * #%L
 * HAPI FHIR - Master Data Management
 * %%
 * Copyright (C) 2014 - 2024 Smile CDR, Inc.
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */
package ca.uhn.fhir.mdm.model;

import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.fhirpath.IFhirPath;
import org.hl7.fhir.instance.model.api.IBase;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IPrimitiveType;
import org.hl7.fhir.r4.model.Identifier;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class CanonicalEID {

	private String mySystem;
	private String myUse;
	private String myValue;

	public CanonicalEID(String theSystem, String theValue, String theUse) {
		mySystem = theSystem;
		myUse = theUse;
		myValue = theValue;
	}

	/**
	 * Constructor is private as we expect you to use the factory method.
	 */
	@SuppressWarnings("rawtypes")
	private CanonicalEID(IFhirPath theFhirPath, IBase theIBase) {
		List value = theFhirPath.evaluate(theIBase, "value", IPrimitiveType.class);
		List system = theFhirPath.evaluate(theIBase, "system", IPrimitiveType.class);
		List use = theFhirPath.evaluate(theIBase, "use", IPrimitiveType.class);

		myUse = use.isEmpty() ? null : use.get(0).getValueAsString();
		myValue = value.isEmpty() ? null : value.get(0).getValueAsString();
		mySystem = system.isEmpty() ? null : system.get(0).getValueAsString();
	}

	/**
	 * Get the appropriate FHIRPath expression to extract the EID identifier value, regardless of resource type.
	 * e.g. if theBaseResource is a patient, and the MDM EID system is test-system, this will return
	 *
	 * Patient.identifier.where(system='test-system').value
	 *
	 */
	private static String buildEidFhirPath(
			FhirContext theFhirContext, String theEidSystem, IBaseResource theBaseResource) {
		return theFhirContext.getResourceType(theBaseResource) + ".identifier.where(system='" + theEidSystem + "')";
	}

	public Identifier toR4() {
		return new Identifier()
				.setUse(Identifier.IdentifierUse.fromCode(myUse))
				.setSystem(mySystem)
				.setValue(myValue);
	}

	public org.hl7.fhir.dstu3.model.Identifier toDSTU3() {
		return new org.hl7.fhir.dstu3.model.Identifier()
				.setUse(org.hl7.fhir.dstu3.model.Identifier.IdentifierUse.fromCode(myUse))
				.setSystem(mySystem)
				.setValue(myValue);
	}

	public org.hl7.fhir.r5.model.Identifier toR5() {
		return new org.hl7.fhir.r5.model.Identifier()
				.setUse(org.hl7.fhir.r5.model.Identifier.IdentifierUse.fromCode(myUse))
				.setSystem(mySystem)
				.setValue(myValue);
	}

	public String getSystem() {
		return mySystem;
	}

	public String getUse() {
		return myUse;
	}

	public String getValue() {
		return myValue;
	}

	public void setSystem(String theSystem) {
		mySystem = theSystem;
	}

	public void setUse(String theUse) {
		myUse = theUse;
	}

	private void setValue(String theValue) {
		myValue = theValue;
	}

	@Override
	public String toString() {
		return mySystem + '|' + myValue;
	}

	/**
	 * A Factory method to generate a {@link CanonicalEID} object from an incoming resource.
	 *
	 * @param theFhirContext the {@link FhirContext} of the application, used to generate a FHIRPath parser.
	 * @param theEidSystem the enterprise identifier system URI used by this instance.
	 * @param theBaseResource the {@link IBaseResource} from which you would like to extract EIDs.
	 *
	 * @return an optional {@link CanonicalEID} object, representing a resource identifier that matched the given eidSystem.
	 */
	public static List extractFromResource(
			FhirContext theFhirContext, String theEidSystem, IBaseResource theBaseResource) {
		IFhirPath fhirPath = theFhirContext.newFhirPath();
		String eidPath = buildEidFhirPath(theFhirContext, theEidSystem, theBaseResource);
		List evaluate = fhirPath.evaluate(theBaseResource, eidPath, IBase.class);

		return evaluate.stream().map(ibase -> new CanonicalEID(fhirPath, ibase)).collect(Collectors.toList());
	}

	@Override
	public boolean equals(Object o) {
		if (!(o instanceof CanonicalEID)) {
			return false;
		}
		CanonicalEID otherEid = (CanonicalEID) o;
		return Objects.equals(otherEid.getSystem(), this.getSystem())
				&& Objects.equals(otherEid.getValue(), this.getValue())
				&& Objects.equals(otherEid.getUse(), this.getUse());
	}

	@Override
	public int hashCode() {
		return Objects.hash(mySystem, myValue, myUse);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy