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}