View Javadoc
1   /*
2    * Copyright 2016 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *       http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.openehealth.ipf.commons.ihe.fhir;
18  
19  import ca.uhn.fhir.rest.client.api.IGenericClient;
20  import ca.uhn.fhir.rest.gclient.IClientExecutable;
21  import ca.uhn.fhir.rest.gclient.ICriterion;
22  import ca.uhn.fhir.rest.gclient.IQuery;
23  import org.hl7.fhir.instance.model.api.IBaseBundle;
24  import org.hl7.fhir.instance.model.api.IBaseResource;
25  
26  import java.util.Map;
27  
28  /**
29   * @author Christian Ohr
30   * @since 3.2
31   */
32  public class QueryClientRequestFactory<T extends IBaseBundle> implements ClientRequestFactory<IQuery<T>> {
33  
34      private final Class<? extends IBaseResource> type;
35      private final Class<T> bundleType;
36  
37      public QueryClientRequestFactory(Class<? extends IBaseResource> type, Class<T> bundleType) {
38          this.type = type;
39          this.bundleType = bundleType;
40      }
41  
42      @Override
43      public IClientExecutable<IQuery<T>, T> getClientExecutable(IGenericClient client, Object requestData, Map<String, Object> parameters) {
44          IQuery<IBaseBundle> query;
45          if (requestData instanceof ICriterion) {
46              query = client.search()
47                      .forResource(type)
48                      .where((ICriterion<?>) requestData);
49          } else {
50              query = client.search()
51                      .byUrl(requestData.toString());
52          }
53          if (parameters.containsKey(Constants.FHIR_COUNT)) {
54              query.count(Integer.parseInt(parameters.get(Constants.FHIR_COUNT).toString()));
55          }
56          return query.returnBundle(bundleType);
57      }
58  }