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

dev.dsf.fhir.dao.command.CheckReferencesCommand Maven / Gradle / Ivy

package dev.dsf.fhir.dao.command;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.EnumSet;
import java.util.Map;

import org.hl7.fhir.r4.model.Bundle;
import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent;
import org.hl7.fhir.r4.model.Bundle.HTTPVerb;
import org.hl7.fhir.r4.model.IdType;
import org.hl7.fhir.r4.model.Resource;
import org.hl7.fhir.r4.model.Task;
import org.hl7.fhir.r4.model.Task.TaskStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import dev.dsf.common.auth.conf.Identity;
import dev.dsf.fhir.dao.ResourceDao;
import dev.dsf.fhir.help.ExceptionHandler;
import dev.dsf.fhir.help.ParameterConverter;
import dev.dsf.fhir.help.ResponseGenerator;
import dev.dsf.fhir.prefer.PreferReturnType;
import dev.dsf.fhir.service.ReferenceExtractor;
import dev.dsf.fhir.service.ReferenceResolver;
import dev.dsf.fhir.service.ResourceReference;
import dev.dsf.fhir.service.ResourceReference.ReferenceType;
import dev.dsf.fhir.validation.SnapshotGenerator;
import jakarta.ws.rs.WebApplicationException;

public class CheckReferencesCommand>
		extends AbstractCommandWithResource implements Command
{
	private static final Logger logger = LoggerFactory.getLogger(CheckReferencesCommand.class);

	private final HTTPVerb verb;

	public CheckReferencesCommand(int index, Identity identity, PreferReturnType returnType, Bundle bundle,
			BundleEntryComponent entry, String serverBase, AuthorizationHelper authorizationHelper, R resource,
			HTTPVerb verb, D dao, ExceptionHandler exceptionHandler, ParameterConverter parameterConverter,
			ResponseGenerator responseGenerator, ReferenceExtractor referenceExtractor,
			ReferenceResolver referenceResolver)
	{
		super(4, index, identity, returnType, bundle, entry, serverBase, authorizationHelper, resource, dao,
				exceptionHandler, parameterConverter, responseGenerator, referenceExtractor, referenceResolver);

		this.verb = verb;
	}

	@Override
	public void execute(Map idTranslationTable, Connection connection,
			ValidationHelper validationHelper, SnapshotGenerator snapshotGenerator)
			throws SQLException, WebApplicationException
	{
		referencesHelper.checkReferences(idTranslationTable, connection, this::checkReferenceAfterUpdate);
	}

	// See also TaskServiceImpl#checkReferenceAfterUpdate
	// See also AbstractResourceServiceImpl#checkReferenceAfterUpdate
	// See also AbstractResourceServiceImpl#checkReferenceAfterCreate
	private boolean checkReferenceAfterUpdate(ResourceReference ref)
	{
		if (resource instanceof Task task && HTTPVerb.PUT.equals(verb))
		{
			if (EnumSet.of(TaskStatus.COMPLETED, TaskStatus.FAILED).contains(task.getStatus()))
			{
				ReferenceType refType = ref.getType(serverBase);
				if ("Task.input".equals(ref.getLocation()) && ReferenceType.LITERAL_EXTERNAL.equals(refType))
				{
					logger.warn("Skipping check of {} reference '{}' at {} in resource with {}, version {}", refType,
							ref.getReference().getReference(), "Task.input", resource.getIdElement().getIdPart(),
							// we are checking against the pre-update resource
							resource.getIdElement().getVersionIdPartAsLong() + 1);
					return false;
				}
			}
		}

		return true;
	}

	@Override
	public String getResourceTypeName()
	{
		throw new UnsupportedOperationException();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy