
001/*- 002 * #%L 003 * HAPI FHIR JPA - Search Parameters 004 * %% 005 * Copyright (C) 2014 - 2025 Smile CDR, Inc. 006 * %% 007 * Licensed under the Apache License, Version 2.0 (the "License"); 008 * you may not use this file except in compliance with the License. 009 * You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 * #L% 019 */ 020package ca.uhn.fhir.jpa.searchparam.config; 021 022import ca.uhn.fhir.context.FhirContext; 023import ca.uhn.fhir.i18n.Msg; 024import ca.uhn.fhir.interceptor.model.RequestPartitionId; 025import ca.uhn.fhir.jpa.cache.IResourceChangeListener; 026import ca.uhn.fhir.jpa.cache.IResourceChangeListenerCacheRefresher; 027import ca.uhn.fhir.jpa.cache.IResourceChangeListenerRegistry; 028import ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache; 029import ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheFactory; 030import ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl; 031import ca.uhn.fhir.jpa.cache.ResourceChangeListenerRegistryImpl; 032import ca.uhn.fhir.jpa.searchparam.MatchUrlService; 033import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; 034import ca.uhn.fhir.jpa.searchparam.extractor.ISearchParamExtractor; 035import ca.uhn.fhir.jpa.searchparam.extractor.SearchParamExtractorDstu2; 036import ca.uhn.fhir.jpa.searchparam.extractor.SearchParamExtractorDstu3; 037import ca.uhn.fhir.jpa.searchparam.extractor.SearchParamExtractorR4; 038import ca.uhn.fhir.jpa.searchparam.extractor.SearchParamExtractorR4B; 039import ca.uhn.fhir.jpa.searchparam.extractor.SearchParamExtractorR5; 040import ca.uhn.fhir.jpa.searchparam.extractor.SearchParamExtractorService; 041import ca.uhn.fhir.jpa.searchparam.matcher.InMemoryResourceMatcher; 042import ca.uhn.fhir.jpa.searchparam.matcher.IndexedSearchParamExtractor; 043import ca.uhn.fhir.jpa.searchparam.matcher.SearchParamMatcher; 044import ca.uhn.fhir.jpa.searchparam.registry.SearchParamRegistryImpl; 045import ca.uhn.fhir.jpa.searchparam.registry.SearchParameterCanonicalizer; 046import ca.uhn.fhir.jpa.searchparam.util.SearchParameterHelper; 047import ca.uhn.fhir.rest.server.util.ISearchParamRegistry; 048import org.springframework.beans.factory.annotation.Autowired; 049import org.springframework.context.annotation.Bean; 050import org.springframework.context.annotation.Configuration; 051import org.springframework.context.annotation.Lazy; 052import org.springframework.context.annotation.Scope; 053 054@Configuration 055public class SearchParamConfig { 056 057 @Autowired 058 private FhirContext myFhirContext; 059 060 @Bean 061 public ISearchParamExtractor searchParamExtractor() { 062 switch (myFhirContext.getVersion().getVersion()) { 063 case DSTU2: 064 return new SearchParamExtractorDstu2(); 065 case DSTU3: 066 return new SearchParamExtractorDstu3(); 067 case R4: 068 return new SearchParamExtractorR4(); 069 case R4B: 070 return new SearchParamExtractorR4B(); 071 case R5: 072 return new SearchParamExtractorR5(); 073 case DSTU2_HL7ORG: 074 case DSTU2_1: 075 default: 076 throw new IllegalStateException(Msg.code(501) + "Can not handle version: " 077 + myFhirContext.getVersion().getVersion()); 078 } 079 } 080 081 @Bean 082 public ISearchParamRegistry searchParamRegistry() { 083 return new SearchParamRegistryImpl(); 084 } 085 086 @Bean 087 public MatchUrlService matchUrlService() { 088 return new MatchUrlService(); 089 } 090 091 @Bean 092 @Lazy 093 public SearchParamExtractorService searchParamExtractorService() { 094 return new SearchParamExtractorService(); 095 } 096 097 @Bean 098 @Lazy 099 public SearchParameterCanonicalizer searchParameterCanonicalizer(FhirContext theFhirContext) { 100 return new SearchParameterCanonicalizer(theFhirContext); 101 } 102 103 @Bean 104 public IndexedSearchParamExtractor indexedSearchParamExtractor() { 105 return new IndexedSearchParamExtractor(); 106 } 107 108 @Bean 109 public InMemoryResourceMatcher inMemoryResourceMatcher() { 110 return new InMemoryResourceMatcher(); 111 } 112 113 @Bean 114 public SearchParamMatcher searchParamMatcher() { 115 return new SearchParamMatcher(); 116 } 117 118 @Bean 119 IResourceChangeListenerRegistry resourceChangeListenerRegistry( 120 FhirContext theFhirContext, 121 ResourceChangeListenerCacheFactory theResourceChangeListenerCacheFactory, 122 InMemoryResourceMatcher theInMemoryResourceMatcher) { 123 return new ResourceChangeListenerRegistryImpl( 124 theFhirContext, theResourceChangeListenerCacheFactory, theInMemoryResourceMatcher); 125 } 126 127 @Bean 128 IResourceChangeListenerCacheRefresher resourceChangeListenerCacheRefresher() { 129 return new ResourceChangeListenerCacheRefresherImpl(); 130 } 131 132 @Bean 133 ResourceChangeListenerCacheFactory registeredResourceListenerFactory() { 134 return new ResourceChangeListenerCacheFactory(); 135 } 136 137 @Bean 138 @Scope("prototype") 139 ResourceChangeListenerCache registeredResourceChangeListener( 140 String theResourceName, 141 IResourceChangeListener theResourceChangeListener, 142 RequestPartitionId theRequestPartitionId, 143 SearchParameterMap theSearchParameterMap, 144 long theRemoteRefreshIntervalMs) { 145 return new ResourceChangeListenerCache( 146 theResourceName, 147 theResourceChangeListener, 148 theRequestPartitionId, 149 theSearchParameterMap, 150 theRemoteRefreshIntervalMs); 151 } 152 153 @Bean 154 @Lazy 155 SearchParameterHelper searchParameterHelper(FhirContext theFhirContext) { 156 return new SearchParameterHelper(searchParameterCanonicalizer(theFhirContext)); 157 } 158}