mirror of
https://github.com/hapifhir/hapi-fhir.git
synced 2025-02-17 02:15:22 +00:00
fix searchparam not found failure at startup (#2408)
* reproduced and fixed issue reported by Adi * undoing rearrange
This commit is contained in:
parent
65c9f5fbf8
commit
0e314a9382
@ -34,6 +34,7 @@ import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
|||||||
import ca.uhn.fhir.jpa.searchparam.JpaRuntimeSearchParam;
|
import ca.uhn.fhir.jpa.searchparam.JpaRuntimeSearchParam;
|
||||||
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
||||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
import ca.uhn.fhir.util.SearchParameterUtil;
|
import ca.uhn.fhir.util.SearchParameterUtil;
|
||||||
import ca.uhn.fhir.util.StopWatch;
|
import ca.uhn.fhir.util.StopWatch;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
@ -47,19 +48,19 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
|
|
||||||
public class SearchParamRegistryImpl implements ISearchParamRegistry, IResourceChangeListener {
|
public class SearchParamRegistryImpl implements ISearchParamRegistry, IResourceChangeListener {
|
||||||
private static final Logger ourLog = LoggerFactory.getLogger(SearchParamRegistryImpl.class);
|
private static final Logger ourLog = LoggerFactory.getLogger(SearchParamRegistryImpl.class);
|
||||||
private static final int MAX_MANAGED_PARAM_COUNT = 10000;
|
private static final int MAX_MANAGED_PARAM_COUNT = 10000;
|
||||||
private static long REFRESH_INTERVAL = DateUtils.MILLIS_PER_HOUR;
|
private static final long REFRESH_INTERVAL = DateUtils.MILLIS_PER_HOUR;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ModelConfig myModelConfig;
|
private ModelConfig myModelConfig;
|
||||||
@ -74,7 +75,7 @@ public class SearchParamRegistryImpl implements ISearchParamRegistry, IResourceC
|
|||||||
|
|
||||||
private volatile ReadOnlySearchParamCache myBuiltInSearchParams;
|
private volatile ReadOnlySearchParamCache myBuiltInSearchParams;
|
||||||
private volatile IPhoneticEncoder myPhoneticEncoder;
|
private volatile IPhoneticEncoder myPhoneticEncoder;
|
||||||
private volatile JpaSearchParamCache myJpaSearchParamCache = new JpaSearchParamCache();
|
private final JpaSearchParamCache myJpaSearchParamCache = new JpaSearchParamCache();
|
||||||
private volatile RuntimeSearchParamCache myActiveSearchParams;
|
private volatile RuntimeSearchParamCache myActiveSearchParams;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@ -282,7 +283,15 @@ public class SearchParamRegistryImpl implements ISearchParamRegistry, IResourceC
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleInit(Collection<IIdType> theResourceIds) {
|
public void handleInit(Collection<IIdType> theResourceIds) {
|
||||||
List<IBaseResource> searchParams = theResourceIds.stream().map(id -> mySearchParamProvider.read(id)).collect(Collectors.toList());
|
List<IBaseResource> searchParams = new ArrayList<>();
|
||||||
|
for (IIdType id : theResourceIds) {
|
||||||
|
try {
|
||||||
|
IBaseResource searchParam = mySearchParamProvider.read(id);
|
||||||
|
searchParams.add(searchParam);
|
||||||
|
} catch (ResourceNotFoundException e) {
|
||||||
|
ourLog.warn("SearchParameter {} not found. Excluding from list of active search params.", id);
|
||||||
|
}
|
||||||
|
}
|
||||||
initializeActiveSearchParams(searchParams);
|
initializeActiveSearchParams(searchParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,8 +17,11 @@ import ca.uhn.fhir.jpa.searchparam.MatchUrlService;
|
|||||||
import ca.uhn.fhir.jpa.searchparam.matcher.InMemoryMatchResult;
|
import ca.uhn.fhir.jpa.searchparam.matcher.InMemoryMatchResult;
|
||||||
import ca.uhn.fhir.jpa.searchparam.matcher.InMemoryResourceMatcher;
|
import ca.uhn.fhir.jpa.searchparam.matcher.InMemoryResourceMatcher;
|
||||||
import ca.uhn.fhir.jpa.searchparam.matcher.SearchParamMatcher;
|
import ca.uhn.fhir.jpa.searchparam.matcher.SearchParamMatcher;
|
||||||
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.rest.server.SimpleBundleProvider;
|
import ca.uhn.fhir.rest.server.SimpleBundleProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||||
import org.hl7.fhir.r4.model.Enumerations;
|
import org.hl7.fhir.r4.model.Enumerations;
|
||||||
import org.hl7.fhir.r4.model.SearchParameter;
|
import org.hl7.fhir.r4.model.SearchParameter;
|
||||||
@ -62,10 +65,10 @@ public class SearchParamRegistryImplTest {
|
|||||||
private static final ReadOnlySearchParamCache ourBuiltInSearchParams = ReadOnlySearchParamCache.fromFhirContext(ourFhirContext);
|
private static final ReadOnlySearchParamCache ourBuiltInSearchParams = ReadOnlySearchParamCache.fromFhirContext(ourFhirContext);
|
||||||
|
|
||||||
public static final int TEST_SEARCH_PARAMS = 3;
|
public static final int TEST_SEARCH_PARAMS = 3;
|
||||||
private static List<ResourceTable> ourEntities;
|
private static final List<ResourceTable> ourEntities;
|
||||||
private static ResourceVersionMap ourResourceVersionMap;
|
private static final ResourceVersionMap ourResourceVersionMap;
|
||||||
private static int ourLastId;
|
private static int ourLastId;
|
||||||
private static int ourBuiltinPatientSearchParamCount;
|
private static final int ourBuiltinPatientSearchParamCount;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
ourEntities = new ArrayList<>();
|
ourEntities = new ArrayList<>();
|
||||||
@ -172,6 +175,24 @@ public class SearchParamRegistryImplTest {
|
|||||||
mySearchParamRegistry.resetForUnitTest();
|
mySearchParamRegistry.resetForUnitTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void handleInit() {
|
||||||
|
assertEquals(25, mySearchParamRegistry.getActiveSearchParams("Patient").size());
|
||||||
|
|
||||||
|
IdDt idBad = new IdDt("SearchParameter/bad");
|
||||||
|
when(mySearchParamProvider.read(idBad)).thenThrow(new ResourceNotFoundException("id bad"));
|
||||||
|
|
||||||
|
IdDt idGood = new IdDt("SearchParameter/good");
|
||||||
|
SearchParameter goodSearchParam = buildSearchParameter(Enumerations.PublicationStatus.ACTIVE);
|
||||||
|
when(mySearchParamProvider.read(idGood)).thenReturn(goodSearchParam);
|
||||||
|
|
||||||
|
List<IIdType> idList = new ArrayList<>();
|
||||||
|
idList.add(idBad);
|
||||||
|
idList.add(idGood);
|
||||||
|
mySearchParamRegistry.handleInit(idList);
|
||||||
|
assertEquals(26, mySearchParamRegistry.getActiveSearchParams("Patient").size());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRefreshAfterExpiry() {
|
public void testRefreshAfterExpiry() {
|
||||||
mySearchParamRegistry.requestRefresh();
|
mySearchParamRegistry.requestRefresh();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user