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}