Add interceptor
This commit is contained in:
parent
6226ae02d5
commit
659a877100
|
@ -0,0 +1,105 @@
|
|||
package ca.uhn.fhir.jpa.interceptor;
|
||||
|
||||
/*-
|
||||
* #%L
|
||||
* HAPI FHIR - Server Framework
|
||||
* %%
|
||||
* Copyright (C) 2014 - 2021 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%
|
||||
*/
|
||||
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.context.RuntimeSearchParam;
|
||||
import ca.uhn.fhir.interceptor.api.Hook;
|
||||
import ca.uhn.fhir.interceptor.api.Interceptor;
|
||||
import ca.uhn.fhir.interceptor.api.Pointcut;
|
||||
import ca.uhn.fhir.jpa.dao.index.IdHelperService;
|
||||
import ca.uhn.fhir.jpa.dao.mdm.MdmLinkExpandSvc;
|
||||
import ca.uhn.fhir.jpa.search.helper.SearchParamHelper;
|
||||
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
||||
import ca.uhn.fhir.model.api.IQueryParameterAnd;
|
||||
import ca.uhn.fhir.model.api.IQueryParameterType;
|
||||
import ca.uhn.fhir.model.primitive.IdDt;
|
||||
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||
import ca.uhn.fhir.rest.param.StringParam;
|
||||
import ca.uhn.fhir.util.ClasspathUtil;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.hl7.fhir.instance.model.api.IBaseConformance;
|
||||
import org.slf4j.Logger;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.slf4j.LoggerFactory.getLogger;
|
||||
|
||||
/**
|
||||
* This interceptor replaces the auto-generated CapabilityStatement that is generated
|
||||
* by the HAPI FHIR Server with a static hard-coded resource.
|
||||
*/
|
||||
@Interceptor
|
||||
public class MdmSearchExpandingInterceptorInterceptor {
|
||||
private static final Logger ourLog = getLogger(MdmSearchExpandingInterceptorInterceptor.class);
|
||||
|
||||
@Autowired
|
||||
private MdmLinkExpandSvc myMdmLinkExpandSvc;
|
||||
@Autowired
|
||||
private SearchParamHelper mySearchParamHelper;
|
||||
@Autowired
|
||||
private FhirContext myFhirContext;
|
||||
@Autowired
|
||||
private IdHelperService myIdHelperService;
|
||||
|
||||
|
||||
@Hook(Pointcut.STORAGE_PRECHECK_FOR_CACHED_SEARCH)
|
||||
public boolean hook(RequestDetails theRequestDetails, SearchParameterMap theSearchParameterMap) {
|
||||
Map<String, String[]> parameters =theRequestDetails.getParameters();
|
||||
boolean shouldExpandMdm = false;
|
||||
if (parameters.containsKey("_mdm")) {
|
||||
shouldExpandMdm = parameters.get("_mdm").length == 1 && parameters.get("_mdm")[0].equalsIgnoreCase("true");
|
||||
}
|
||||
|
||||
|
||||
if (shouldExpandMdm) {
|
||||
String resourceName = theRequestDetails.getResourceName();
|
||||
Collection<RuntimeSearchParam> patientSearchParams = mySearchParamHelper.getPatientSearchParamsForResourceType(resourceName);
|
||||
for (RuntimeSearchParam patientSearchParam: patientSearchParams) {
|
||||
if (!theSearchParameterMap.containsKey(patientSearchParam.getName())) {
|
||||
continue;
|
||||
}
|
||||
List<List<IQueryParameterType>> lists = theSearchParameterMap.get(patientSearchParam.getName());
|
||||
for (List<IQueryParameterType> list : lists) {
|
||||
List<IQueryParameterType> toAdd = new ArrayList<>();
|
||||
for (IQueryParameterType paramVal : list) {
|
||||
if (!paramVal.getMissing() && paramVal.getQueryParameterQualifier().equalsIgnoreCase("equals")){
|
||||
String valueAsQueryToken = paramVal.getValueAsQueryToken(myFhirContext);
|
||||
Long pidOrThrowException = myIdHelperService.getPidOrThrowException(new IdDt(valueAsQueryToken));
|
||||
Set<String> expandedIds= myMdmLinkExpandSvc.expandMdmBySourceResourcePid(pidOrThrowException);
|
||||
ourLog.info("Expanded to resource ids: [{}]", String.join(",", expandedIds));
|
||||
toAdd.addAll(expandedIds.stream().map(StringParam::new).collect(Collectors.toList()));
|
||||
}
|
||||
}
|
||||
list.addAll(toAdd);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue