001package ca.uhn.fhir.mdm.rules.matcher;
002
003/*-
004 * #%L
005 * HAPI FHIR - Master Data Management
006 * %%
007 * Copyright (C) 2014 - 2022 Smile CDR, Inc.
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 */
022
023import org.hl7.fhir.dstu3.model.BaseDateTimeType;
024import org.hl7.fhir.dstu3.model.DateTimeType;
025import org.hl7.fhir.dstu3.model.DateType;
026import org.hl7.fhir.instance.model.api.IBase;
027
028public class HapiDateMatcherDstu3 {
029        // TODO KHS code duplication (tried generalizing it with generics, but it got too convoluted)
030        public boolean match(IBase theLeftBase, IBase theRightBase) {
031                if (theLeftBase instanceof BaseDateTimeType && theRightBase instanceof BaseDateTimeType) {
032                        BaseDateTimeType leftDate = (BaseDateTimeType) theLeftBase;
033                        BaseDateTimeType rightDate = (BaseDateTimeType) theRightBase;
034                        int comparison = leftDate.getPrecision().compareTo(rightDate.getPrecision());
035                        if (comparison == 0) {
036                                return leftDate.getValueAsString().equals(rightDate.getValueAsString());
037                        }
038                        BaseDateTimeType leftPDate;
039                        BaseDateTimeType rightPDate;
040                        if (comparison > 0) {
041                                leftPDate = leftDate;
042                                if (rightDate instanceof DateType) {
043                                        rightPDate = new DateType(rightDate.getValue(), leftDate.getPrecision());
044                                } else {
045                                        rightPDate = new DateTimeType(rightDate.getValue(), leftDate.getPrecision());
046                                }
047                        } else {
048                                rightPDate = rightDate;
049                                if (leftDate instanceof DateType) {
050                                        leftPDate = new DateType(leftDate.getValue(), rightDate.getPrecision());
051                                } else {
052                                        leftPDate = new DateTimeType(leftDate.getValue(), rightDate.getPrecision());
053                                }
054                        }
055                        return leftPDate.getValueAsString().equals(rightPDate.getValueAsString());
056                }
057
058                return false;
059        }
060}