001/* 002 * #%L 003 * HAPI FHIR - Core Library 004 * %% 005 * Copyright (C) 2014 - 2024 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.rest.gclient; 021 022import ca.uhn.fhir.rest.gclient.NumberClientParam.IMatches; 023import ca.uhn.fhir.rest.param.ParamPrefixEnum; 024 025import static org.apache.commons.lang3.StringUtils.defaultString; 026 027/** 028 * Quantity parameter type for use in fluent client interfaces 029 */ 030@SuppressWarnings("deprecation") 031public class QuantityClientParam extends BaseClientParam implements IParam { 032 033 private String myParamName; 034 035 public QuantityClientParam(String theParamName) { 036 myParamName = theParamName; 037 } 038 039 public IMatches<IAndUnits> approximately() { 040 return new NumberClientParam.IMatches<IAndUnits>() { 041 @Override 042 public IAndUnits number(long theNumber) { 043 return new AndUnits(ParamPrefixEnum.APPROXIMATE, Long.toString(theNumber)); 044 } 045 046 @Override 047 public IAndUnits number(String theNumber) { 048 return new AndUnits(ParamPrefixEnum.APPROXIMATE, theNumber); 049 } 050 }; 051 } 052 053 public IMatches<IAndUnits> exactly() { 054 return new NumberClientParam.IMatches<IAndUnits>() { 055 @Override 056 public IAndUnits number(long theNumber) { 057 return new AndUnits(null, Long.toString(theNumber)); 058 } 059 060 @Override 061 public IAndUnits number(String theNumber) { 062 return new AndUnits(null, theNumber); 063 } 064 }; 065 } 066 067 @Override 068 public String getParamName() { 069 return myParamName; 070 } 071 072 public IMatches<IAndUnits> greaterThan() { 073 return new NumberClientParam.IMatches<IAndUnits>() { 074 @Override 075 public IAndUnits number(long theNumber) { 076 return new AndUnits(ParamPrefixEnum.GREATERTHAN, Long.toString(theNumber)); 077 } 078 079 @Override 080 public IAndUnits number(String theNumber) { 081 return new AndUnits(ParamPrefixEnum.GREATERTHAN, theNumber); 082 } 083 }; 084 } 085 086 public IMatches<IAndUnits> greaterThanOrEquals() { 087 return new NumberClientParam.IMatches<IAndUnits>() { 088 @Override 089 public IAndUnits number(long theNumber) { 090 return new AndUnits(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, Long.toString(theNumber)); 091 } 092 093 @Override 094 public IAndUnits number(String theNumber) { 095 return new AndUnits(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, theNumber); 096 } 097 }; 098 } 099 100 public IMatches<IAndUnits> lessThan() { 101 return new NumberClientParam.IMatches<IAndUnits>() { 102 @Override 103 public IAndUnits number(long theNumber) { 104 return new AndUnits(ParamPrefixEnum.LESSTHAN, Long.toString(theNumber)); 105 } 106 107 @Override 108 public IAndUnits number(String theNumber) { 109 return new AndUnits(ParamPrefixEnum.LESSTHAN, theNumber); 110 } 111 }; 112 } 113 114 public IMatches<IAndUnits> lessThanOrEquals() { 115 return new NumberClientParam.IMatches<IAndUnits>() { 116 @Override 117 public IAndUnits number(long theNumber) { 118 return new AndUnits(ParamPrefixEnum.LESSTHAN_OR_EQUALS, Long.toString(theNumber)); 119 } 120 121 @Override 122 public IAndUnits number(String theNumber) { 123 return new AndUnits(ParamPrefixEnum.LESSTHAN_OR_EQUALS, theNumber); 124 } 125 }; 126 } 127 128 /** 129 * Use the given quantity prefix 130 * 131 * @param thePrefix The prefix, or <code>null</code> for no prefix 132 */ 133 public IMatches<IAndUnits> withPrefix(final ParamPrefixEnum thePrefix) { 134 return new NumberClientParam.IMatches<IAndUnits>() { 135 @Override 136 public IAndUnits number(long theNumber) { 137 return new AndUnits(thePrefix, Long.toString(theNumber)); 138 } 139 140 @Override 141 public IAndUnits number(String theNumber) { 142 return new AndUnits(thePrefix, theNumber); 143 } 144 }; 145 } 146 147 public interface IAndUnits { 148 149 ICriterion<QuantityClientParam> andNoUnits(); 150 151 ICriterion<QuantityClientParam> andUnits(String theUnits); 152 153 ICriterion<QuantityClientParam> andUnits(String theSystem, String theUnits); 154 } 155 156 private class AndUnits implements IAndUnits { 157 158 private ParamPrefixEnum myPrefix; 159 private String myValue; 160 161 public AndUnits(ParamPrefixEnum thePrefix, String theNumber) { 162 myPrefix = thePrefix; 163 myValue = theNumber; 164 } 165 166 @Override 167 public ICriterion<QuantityClientParam> andNoUnits() { 168 return andUnits(null, null); 169 } 170 171 @Override 172 public ICriterion<QuantityClientParam> andUnits(String theUnits) { 173 return andUnits(null, theUnits); 174 } 175 176 @Override 177 public ICriterion<QuantityClientParam> andUnits(String theSystem, String theUnits) { 178 return new QuantityCriterion( 179 getParamName(), myPrefix, myValue, defaultString(theSystem), defaultString(theUnits)); 180 } 181 } 182}