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

dev.dsf.fhir.adapter.AbstractResource Maven / Gradle / Ivy

package dev.dsf.fhir.adapter;

import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import org.hl7.fhir.r4.model.BooleanType;
import org.hl7.fhir.r4.model.CanonicalType;
import org.hl7.fhir.r4.model.Enumeration;
import org.hl7.fhir.r4.model.Resource;

import ca.uhn.fhir.model.api.annotation.ResourceDef;

abstract class AbstractResource extends AbstractThymeleafContext
{
	private record ResourceData(String type, String id, String version, String lastUpdated, String profiles,
			Boolean active, String status)
	{
	}

	static class ActiveOrStatus
	{
		static  ActiveOrStatus active(Predicate hasActive, Function getActive)
		{
			return new ActiveOrStatus<>(Objects.requireNonNull(hasActive, "hasActive"),
					Objects.requireNonNull(getActive, "getActive"), null, null);
		}

		static  ActiveOrStatus status(Predicate hasStatus,
				Function> getStatus)
		{
			return new ActiveOrStatus<>(null, null, Objects.requireNonNull(hasStatus, "hasStatus"),
					Objects.requireNonNull(getStatus, "getStatus"));
		}

		private final Predicate hasActive;
		private final Function getActive;
		private final Predicate hasStatus;
		private final Function> getStatus;

		ActiveOrStatus(Predicate hasActive, Function getActive, Predicate hasStatus,
				Function> getStatus)
		{
			this.hasActive = hasActive;
			this.getActive = getActive;
			this.hasStatus = hasStatus;
			this.getStatus = getStatus;

		}

		Boolean getActive(R resource)
		{
			return hasActive != null && getActive != null && hasActive.test(resource)
					&& getActive.apply(resource).hasValue() ? getActive.apply(resource).getValue() : null;
		}

		String getStatus(R resource)
		{
			return hasStatus != null && getStatus != null && hasStatus.test(resource)
					&& getStatus.apply(resource).hasCode() ? getStatus.apply(resource).getCode() : null;
		}
	}

	private final String htmlResourceFragment;
	private final ActiveOrStatus activeOrStatus;

	protected AbstractResource(Class resourceType, ActiveOrStatus activeOrStatus)
	{
		this(resourceType, activeOrStatus, "resource" + resourceType.getAnnotation(ResourceDef.class).name());
	}

	protected AbstractResource(Class resourceType, ActiveOrStatus activeOrStatus, String htmlResourceFragment)
	{
		super(resourceType, "resource");

		this.activeOrStatus = activeOrStatus;
		this.htmlResourceFragment = htmlResourceFragment;
	}

	@Override
	public boolean isResourceSupported(String requestPathLastElement)
	{
		return true;
	}

	@Override
	protected final void doSetVariables(BiConsumer variables, R resource)
	{
		String type = getResourceType().getAnnotation(ResourceDef.class).name();
		String id = resource.hasIdElement() ? resource.getIdElement().getIdPart() : "";
		String version = resource.hasIdElement() ? resource.getIdElement().getVersionIdPart() : "";
		String lastUpdated = formatLastUpdated(resource);
		String profiles = resource.hasMeta() && resource.getMeta().hasProfile()
				? resource.getMeta().getProfile().stream().filter(CanonicalType::hasValue).map(CanonicalType::getValue)
						.map(s -> s.replace("|", " | ")).collect(Collectors.joining(", "))
				: null;

		Boolean active = activeOrStatus.getActive(resource);
		String status = activeOrStatus.getStatus(resource);

		variables.accept("htmlResourceFragment", htmlResourceFragment);
		variables.accept("resource", new ResourceData(type, id, version, lastUpdated, profiles, active, status));

		String resourceTypeName = getResourceType().getAnnotation(ResourceDef.class).name();
		variables.accept(resourceTypeName.substring(0, 1).toLowerCase() + resourceTypeName.substring(1),
				toElement(resource));

		doSetAdditionalVariables(variables, resource);
	}

	protected abstract Object toElement(R resource);

	protected void doSetAdditionalVariables(BiConsumer variables, R resource)
	{
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy