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.jpa.cache.IResourceChangeListener;
025import ca.uhn.fhir.jpa.cache.IResourceChangeListenerCacheRefresher;
026import ca.uhn.fhir.jpa.cache.IResourceChangeListenerRegistry;
027import ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache;
028import ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheFactory;
029import ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl;
030import ca.uhn.fhir.jpa.cache.ResourceChangeListenerRegistryImpl;
031import ca.uhn.fhir.jpa.searchparam.MatchUrlService;
032import ca.uhn.fhir.jpa.searchparam.SearchLimiterSvc;
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 ca.uhn.fhir.svcs.ISearchLimiterSvc;
049import org.springframework.beans.factory.annotation.Autowired;
050import org.springframework.context.annotation.Bean;
051import org.springframework.context.annotation.Configuration;
052import org.springframework.context.annotation.Lazy;
053import org.springframework.context.annotation.Scope;
054
055@Configuration
056public class SearchParamConfig {
057
058        @Autowired
059        private FhirContext myFhirContext;
060
061        @Bean
062        public ISearchParamExtractor searchParamExtractor() {
063                switch (myFhirContext.getVersion().getVersion()) {
064                        case DSTU2:
065                                return new SearchParamExtractorDstu2();
066                        case DSTU3:
067                                return new SearchParamExtractorDstu3();
068                        case R4:
069                                return new SearchParamExtractorR4();
070                        case R4B:
071                                return new SearchParamExtractorR4B();
072                        case R5:
073                                return new SearchParamExtractorR5();
074                        case DSTU2_HL7ORG:
075                        case DSTU2_1:
076                        default:
077                                throw new IllegalStateException(Msg.code(501) + "Can not handle version: "
078                                                + myFhirContext.getVersion().getVersion());
079                }
080        }
081
082        @Bean
083        public ISearchParamRegistry searchParamRegistry() {
084                return new SearchParamRegistryImpl();
085        }
086
087        @Bean
088        public MatchUrlService matchUrlService() {
089                return new MatchUrlService();
090        }
091
092        @Bean
093        @Lazy
094        public SearchParamExtractorService searchParamExtractorService() {
095                return new SearchParamExtractorService();
096        }
097
098        @Bean
099        @Lazy
100        public SearchParameterCanonicalizer searchParameterCanonicalizer(FhirContext theFhirContext) {
101                return new SearchParameterCanonicalizer(theFhirContext);
102        }
103
104        @Bean
105        public IndexedSearchParamExtractor indexedSearchParamExtractor() {
106                return new IndexedSearchParamExtractor();
107        }
108
109        @Bean
110        public InMemoryResourceMatcher inMemoryResourceMatcher() {
111                return new InMemoryResourceMatcher();
112        }
113
114        @Bean
115        public SearchParamMatcher searchParamMatcher() {
116                return new SearchParamMatcher();
117        }
118
119        @Bean
120        IResourceChangeListenerRegistry resourceChangeListenerRegistry(
121                        FhirContext theFhirContext,
122                        ResourceChangeListenerCacheFactory theResourceChangeListenerCacheFactory,
123                        InMemoryResourceMatcher theInMemoryResourceMatcher) {
124                return new ResourceChangeListenerRegistryImpl(
125                                theFhirContext, theResourceChangeListenerCacheFactory, theInMemoryResourceMatcher);
126        }
127
128        @Bean
129        IResourceChangeListenerCacheRefresher resourceChangeListenerCacheRefresher() {
130                return new ResourceChangeListenerCacheRefresherImpl();
131        }
132
133        @Bean
134        ResourceChangeListenerCacheFactory registeredResourceListenerFactory() {
135                return new ResourceChangeListenerCacheFactory();
136        }
137
138        @Bean
139        @Scope("prototype")
140        ResourceChangeListenerCache registeredResourceChangeListener(
141                        String theResourceName,
142                        IResourceChangeListener theResourceChangeListener,
143                        SearchParameterMap theSearchParameterMap,
144                        long theRemoteRefreshIntervalMs) {
145                return new ResourceChangeListenerCache(
146                                theResourceName, theResourceChangeListener, theSearchParameterMap, theRemoteRefreshIntervalMs);
147        }
148
149        @Bean
150        @Lazy
151        SearchParameterHelper searchParameterHelper(FhirContext theFhirContext) {
152                return new SearchParameterHelper(searchParameterCanonicalizer(theFhirContext));
153        }
154
155        @Bean
156        public ISearchLimiterSvc searchLimiterSvc() {
157                return new SearchLimiterSvc();
158        }
159}