001package ca.uhn.fhir.rest.gclient; 002 003/* 004 * #%L 005 * HAPI FHIR - Core Library 006 * %% 007 * Copyright (C) 2014 - 2017 University Health Network 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022import static org.apache.commons.lang3.StringUtils.defaultString; 023 024import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum; 025import ca.uhn.fhir.rest.gclient.NumberClientParam.IMatches; 026import ca.uhn.fhir.rest.param.ParamPrefixEnum; 027 028/** 029 * Token parameter type for use in fluent client interfaces 030 */ 031@SuppressWarnings("deprecation") 032public class QuantityClientParam extends BaseClientParam implements IParam { 033 034 private String myParamName; 035 036 public QuantityClientParam(String theParamName) { 037 myParamName = theParamName; 038 } 039 040 public IMatches<IAndUnits> approximately() { 041 return new NumberClientParam.IMatches<IAndUnits>() { 042 @Override 043 public IAndUnits number(long theNumber) { 044 return new AndUnits(ParamPrefixEnum.APPROXIMATE, Long.toString(theNumber)); 045 } 046 047 @Override 048 public IAndUnits number(String theNumber) { 049 return new AndUnits(ParamPrefixEnum.APPROXIMATE, theNumber); 050 } 051 }; 052 } 053 054 public IMatches<IAndUnits> exactly() { 055 return new NumberClientParam.IMatches<IAndUnits>() { 056 @Override 057 public IAndUnits number(long theNumber) { 058 return new AndUnits(null, Long.toString(theNumber)); 059 } 060 061 @Override 062 public IAndUnits number(String theNumber) { 063 return new AndUnits(null, theNumber); 064 } 065 }; 066 } 067 068 @Override 069 public String getParamName() { 070 return myParamName; 071 } 072 073 public IMatches<IAndUnits> greaterThan() { 074 return new NumberClientParam.IMatches<IAndUnits>() { 075 @Override 076 public IAndUnits number(long theNumber) { 077 return new AndUnits(ParamPrefixEnum.GREATERTHAN, Long.toString(theNumber)); 078 } 079 080 @Override 081 public IAndUnits number(String theNumber) { 082 return new AndUnits(ParamPrefixEnum.GREATERTHAN, theNumber); 083 } 084 }; 085 } 086 087 public IMatches<IAndUnits> greaterThanOrEquals() { 088 return new NumberClientParam.IMatches<IAndUnits>() { 089 @Override 090 public IAndUnits number(long theNumber) { 091 return new AndUnits(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, Long.toString(theNumber)); 092 } 093 094 @Override 095 public IAndUnits number(String theNumber) { 096 return new AndUnits(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, theNumber); 097 } 098 }; 099 } 100 101 public IMatches<IAndUnits> lessThan() { 102 return new NumberClientParam.IMatches<IAndUnits>() { 103 @Override 104 public IAndUnits number(long theNumber) { 105 return new AndUnits(ParamPrefixEnum.LESSTHAN, Long.toString(theNumber)); 106 } 107 108 @Override 109 public IAndUnits number(String theNumber) { 110 return new AndUnits(ParamPrefixEnum.LESSTHAN, theNumber); 111 } 112 }; 113 } 114 115 public IMatches<IAndUnits> lessThanOrEquals() { 116 return new NumberClientParam.IMatches<IAndUnits>() { 117 @Override 118 public IAndUnits number(long theNumber) { 119 return new AndUnits(ParamPrefixEnum.LESSTHAN_OR_EQUALS, Long.toString(theNumber)); 120 } 121 122 @Override 123 public IAndUnits number(String theNumber) { 124 return new AndUnits(ParamPrefixEnum.LESSTHAN_OR_EQUALS, theNumber); 125 } 126 }; 127 } 128 129 /** 130 * @deprecated Use {@link #withPrefix(ParamPrefixEnum)} instead, as {@link QuantityCompararatorEnum} has been deprecated 131 */ 132 @Deprecated 133 public IMatches<IAndUnits> withComparator(QuantityCompararatorEnum theComparator) { 134 final String cmpString = theComparator != null ? theComparator.getCode() : ""; 135 final ParamPrefixEnum prefix = ParamPrefixEnum.forDstu1Value(cmpString); 136 return new NumberClientParam.IMatches<IAndUnits>() { 137 @Override 138 public IAndUnits number(long theNumber) { 139 return new AndUnits(prefix, Long.toString(theNumber)); 140 } 141 142 @Override 143 public IAndUnits number(String theNumber) { 144 return new AndUnits(prefix, theNumber); 145 } 146 }; 147 } 148 149 /** 150 * Use the given quantity prefix 151 * 152 * @param thePrefix The prefix, or <code>null</code> for no prefix 153 */ 154 public IMatches<IAndUnits> withPrefix(final ParamPrefixEnum thePrefix) { 155 return new NumberClientParam.IMatches<IAndUnits>() { 156 @Override 157 public IAndUnits number(long theNumber) { 158 return new AndUnits(thePrefix, Long.toString(theNumber)); 159 } 160 161 @Override 162 public IAndUnits number(String theNumber) { 163 return new AndUnits(thePrefix, theNumber); 164 } 165 }; 166 } 167 168 public interface IAndUnits { 169 170 ICriterion<QuantityClientParam> andNoUnits(); 171 172 ICriterion<QuantityClientParam> andUnits(String theUnits); 173 174 ICriterion<QuantityClientParam> andUnits(String theSystem, String theUnits); 175 } 176 177 private class AndUnits implements IAndUnits { 178 179 private ParamPrefixEnum myPrefix; 180 private String myValue; 181 182 public AndUnits(ParamPrefixEnum thePrefix, String theNumber) { 183 myPrefix = thePrefix; 184 myValue = theNumber; 185 } 186 187 @Override 188 public ICriterion<QuantityClientParam> andNoUnits() { 189 return andUnits(null, null); 190 } 191 192 @Override 193 public ICriterion<QuantityClientParam> andUnits(String theUnits) { 194 return andUnits(null, theUnits); 195 } 196 197 @Override 198 public ICriterion<QuantityClientParam> andUnits(String theSystem, String theUnits) { 199 return new QuantityCriterion(getParamName(), myPrefix, myValue , defaultString(theSystem) , defaultString(theUnits)); 200 } 201 202 } 203 204}