001
002package ca.uhn.fhir.jpa.rp.r5;
003
004import java.util.*;
005
006import org.apache.commons.lang3.StringUtils;
007
008import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
009import ca.uhn.fhir.model.api.Include;
010import ca.uhn.fhir.model.api.annotation.*;
011import org.hl7.fhir.r5.model.*;
012import ca.uhn.fhir.rest.annotation.*;
013import ca.uhn.fhir.rest.param.*;
014import ca.uhn.fhir.rest.api.SortSpec;
015import ca.uhn.fhir.rest.api.SummaryEnum;
016import ca.uhn.fhir.rest.api.SearchTotalModeEnum;
017import ca.uhn.fhir.rest.api.SearchContainedModeEnum;
018
019public class LocationResourceProvider extends 
020        ca.uhn.fhir.jpa.provider.BaseJpaResourceProvider<Location>
021        {
022
023        @Override
024        public Class<Location> getResourceType() {
025                return Location.class;
026        }
027
028        @Search(allowUnknownParams=true)
029        public ca.uhn.fhir.rest.api.server.IBundleProvider search(
030                        jakarta.servlet.http.HttpServletRequest theServletRequest,
031                        jakarta.servlet.http.HttpServletResponse theServletResponse,
032
033                        ca.uhn.fhir.rest.api.server.RequestDetails theRequestDetails,
034
035                        @Description(shortDefinition="Search the contents of the resource's data using a filter")
036                        @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_FILTER)
037                        StringAndListParam theFtFilter,
038
039                        @Description(shortDefinition="Search the contents of the resource's data using a fulltext search")
040                        @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_CONTENT)
041                        StringAndListParam theFtContent, 
042
043                        @Description(shortDefinition="Search the contents of the resource's narrative using a fulltext search")
044                        @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_TEXT)
045                        StringAndListParam theFtText, 
046
047                        @Description(shortDefinition="Search for resources which have the given tag")
048                        @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_TAG)
049                        TokenAndListParam theSearchForTag, 
050
051                        @Description(shortDefinition="Search for resources which have the given security labels")
052                        @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_SECURITY)
053                        TokenAndListParam theSearchForSecurity, 
054  
055                        @Description(shortDefinition="Search for resources which have the given profile")
056                        @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE)
057                        UriAndListParam theSearchForProfile,
058
059                        @Description(shortDefinition="Search the contents of the resource's data using a list")
060                        @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_LIST)
061                        StringAndListParam theList,
062
063                        @Description(shortDefinition="The language of the resource")
064                        @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_LANGUAGE)
065                        TokenAndListParam theResourceLanguage,
066
067                        @Description(shortDefinition="Search for resources which have the given source value (Resource.meta.source)")
068                        @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_SOURCE)
069                        UriAndListParam theSearchForSource,
070
071                        @Description(shortDefinition="Return resources linked to by the given target")
072                        @OptionalParam(name="_has")
073                        HasAndListParam theHas, 
074
075   
076
077                        @Description(shortDefinition="The ID of the resource")
078                        @OptionalParam(name="_id")
079                        TokenAndListParam the_id,
080   
081
082                        @Description(shortDefinition="Only return resources which were last updated as specified by the given range")
083                        @OptionalParam(name="_lastUpdated")
084                        DateRangeParam the_lastUpdated, 
085   
086
087                        @Description(shortDefinition="The profile of the resource")
088                        @OptionalParam(name="_profile")
089                        UriAndListParam the_profile, 
090   
091
092                        @Description(shortDefinition="The security of the resource")
093                        @OptionalParam(name="_security")
094                        TokenAndListParam the_security,
095   
096
097                        @Description(shortDefinition="The tag of the resource")
098                        @OptionalParam(name="_tag")
099                        TokenAndListParam the_tag,
100   
101
102                        @Description(shortDefinition="Search on the narrative of the resource")
103                        @OptionalParam(name="_text")
104                        SpecialAndListParam the_text,
105   
106
107                        @Description(shortDefinition="A (part of the) address of the location")
108                        @OptionalParam(name="address")
109                        StringAndListParam theAddress, 
110   
111
112                        @Description(shortDefinition="A city specified in an address")
113                        @OptionalParam(name="address-city")
114                        StringAndListParam theAddress_city, 
115   
116
117                        @Description(shortDefinition="A country specified in an address")
118                        @OptionalParam(name="address-country")
119                        StringAndListParam theAddress_country, 
120   
121
122                        @Description(shortDefinition="A postal code specified in an address")
123                        @OptionalParam(name="address-postalcode")
124                        StringAndListParam theAddress_postalcode, 
125   
126
127                        @Description(shortDefinition="A state specified in an address")
128                        @OptionalParam(name="address-state")
129                        StringAndListParam theAddress_state, 
130   
131
132                        @Description(shortDefinition="A use code specified in an address")
133                        @OptionalParam(name="address-use")
134                        TokenAndListParam theAddress_use,
135   
136
137                        @Description(shortDefinition="One of the Location's characteristics")
138                        @OptionalParam(name="characteristic")
139                        TokenAndListParam theCharacteristic,
140   
141
142                        @Description(shortDefinition="Select locations that contain the specified co-ordinates")
143                        @OptionalParam(name="contains")
144                        SpecialAndListParam theContains,
145   
146
147                        @Description(shortDefinition="Technical endpoints providing access to services operated for the location")
148                        @OptionalParam(name="endpoint", targetTypes={  } )
149                        ReferenceAndListParam theEndpoint, 
150   
151
152                        @Description(shortDefinition="An identifier for the location")
153                        @OptionalParam(name="identifier")
154                        TokenAndListParam theIdentifier,
155   
156
157                        @Description(shortDefinition="A portion of the location's name or alias")
158                        @OptionalParam(name="name")
159                        StringAndListParam theName, 
160   
161
162                        @Description(shortDefinition="Search for locations where the location.position is near to, or within a specified distance of, the provided coordinates expressed as [latitude]|[longitude]|[distance]|[units] (using the WGS84 datum, see notes).Servers which support the near parameter SHALL support the unit string 'km' for kilometers and SHOULD support '[mi_us]' for miles, support for other units is optional. If the units are omitted, then kms should be assumed. If the distance is omitted, then the server can use its own discretion as to what distances should be considered near (and units are irrelevant).If the server is unable to understand the units (and does support the near search parameter), it MIGHT return an OperationOutcome and fail the search with a http status 400 BadRequest. If the server does not support the near parameter, the parameter MIGHT report the unused parameter in a bundled OperationOutcome and still perform the search ignoring the near parameter.Note: The algorithm to determine the distance is not defined by the specification, and systems might have different engines that calculate things differently. They could consider geographic point to point, or path via road, or including current traffic conditions, or just simple neighboring postcodes/localities if that's all it had access to.")
163                        @OptionalParam(name="near")
164                        SpecialAndListParam theNear,
165   
166
167                        @Description(shortDefinition="Searches for locations (typically bed/room) that have an operational status (e.g. contaminated, housekeeping)")
168                        @OptionalParam(name="operational-status")
169                        TokenAndListParam theOperational_status,
170   
171
172                        @Description(shortDefinition="Searches for locations that are managed by the provided organization")
173                        @OptionalParam(name="organization", targetTypes={  } )
174                        ReferenceAndListParam theOrganization, 
175   
176
177                        @Description(shortDefinition="A location of which this location is a part")
178                        @OptionalParam(name="partof", targetTypes={  } )
179                        ReferenceAndListParam thePartof, 
180   
181
182                        @Description(shortDefinition="Searches for locations with a specific kind of status")
183                        @OptionalParam(name="status")
184                        TokenAndListParam theStatus,
185   
186
187                        @Description(shortDefinition="A code for the type of location")
188                        @OptionalParam(name="type")
189                        TokenAndListParam theType,
190
191                        @RawParam
192                        Map<String, List<String>> theAdditionalRawParams,
193
194        
195                        @IncludeParam
196                        Set<Include> theIncludes,
197
198                        @IncludeParam(reverse=true)
199                        Set<Include> theRevIncludes,
200
201                        @Sort
202                        SortSpec theSort,
203                        
204                        @ca.uhn.fhir.rest.annotation.Count
205                        Integer theCount,
206
207                        @ca.uhn.fhir.rest.annotation.Offset
208                        Integer theOffset,
209
210                        SummaryEnum theSummaryMode,
211
212                        SearchTotalModeEnum theSearchTotalMode,
213
214                        SearchContainedModeEnum theSearchContainedMode
215
216                        ) {
217                startRequest(theServletRequest);
218                try {
219                        SearchParameterMap paramMap = new SearchParameterMap();
220                        paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_FILTER, theFtFilter);
221                        paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_CONTENT, theFtContent);
222                        paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_TEXT, theFtText);
223                        paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_TAG, theSearchForTag);
224                        paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_SECURITY, theSearchForSecurity);
225                        paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE, theSearchForProfile);
226                        paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_SOURCE, theSearchForSource);
227                        paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_LIST, theList);
228                        paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_LANGUAGE, theResourceLanguage);
229
230                        paramMap.add("_has", theHas);
231                                paramMap.add("_id", the_id);
232                                                                paramMap.add("_profile", the_profile);
233                                paramMap.add("_security", the_security);
234                                paramMap.add("_tag", the_tag);
235                                paramMap.add("_text", the_text);
236                                paramMap.add("address", theAddress);
237                                paramMap.add("address-city", theAddress_city);
238                                paramMap.add("address-country", theAddress_country);
239                                paramMap.add("address-postalcode", theAddress_postalcode);
240                                paramMap.add("address-state", theAddress_state);
241                                paramMap.add("address-use", theAddress_use);
242                                paramMap.add("characteristic", theCharacteristic);
243                                paramMap.add("contains", theContains);
244                                paramMap.add("endpoint", theEndpoint);
245                                paramMap.add("identifier", theIdentifier);
246                                paramMap.add("name", theName);
247                                paramMap.add("near", theNear);
248                                paramMap.add("operational-status", theOperational_status);
249                                paramMap.add("organization", theOrganization);
250                                paramMap.add("partof", thePartof);
251                                paramMap.add("status", theStatus);
252                                paramMap.add("type", theType);
253paramMap.setRevIncludes(theRevIncludes);
254                        paramMap.setLastUpdated(the_lastUpdated);
255                        paramMap.setIncludes(theIncludes);
256                        paramMap.setSort(theSort);
257                        paramMap.setCount(theCount);
258                        paramMap.setOffset(theOffset);
259                        paramMap.setSummaryMode(theSummaryMode);
260                        paramMap.setSearchTotalMode(theSearchTotalMode);
261                        paramMap.setSearchContainedMode(theSearchContainedMode);
262
263                        getDao().translateRawParameters(theAdditionalRawParams, paramMap);
264
265                        ca.uhn.fhir.rest.api.server.IBundleProvider retVal = getDao().search(paramMap, theRequestDetails, theServletResponse);
266                        return retVal;
267                } finally {
268                        endRequest(theServletRequest);
269                }
270        }
271
272}