All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ca.uhn.fhir.util.PhoneticEncoderUtil Maven / Gradle / Ivy

There is a newer version: 7.4.5
Show newest version
/*-
 * #%L
 * HAPI FHIR - Core Library
 * %%
 * Copyright (C) 2014 - 2024 Smile CDR, Inc.
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */
package ca.uhn.fhir.util;

import ca.uhn.fhir.context.phonetic.ApacheEncoder;
import ca.uhn.fhir.context.phonetic.IPhoneticEncoder;
import ca.uhn.fhir.context.phonetic.NumericEncoder;
import ca.uhn.fhir.context.phonetic.PhoneticEncoderEnum;
import org.apache.commons.codec.language.Caverphone1;
import org.apache.commons.codec.language.Caverphone2;
import org.apache.commons.codec.language.ColognePhonetic;
import org.apache.commons.codec.language.DoubleMetaphone;
import org.apache.commons.codec.language.MatchRatingApproachEncoder;
import org.apache.commons.codec.language.Metaphone;
import org.apache.commons.codec.language.Nysiis;
import org.apache.commons.codec.language.RefinedSoundex;
import org.apache.commons.codec.language.Soundex;
import org.apache.commons.lang3.EnumUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public final class PhoneticEncoderUtil {

	// embedded class only for parameter returns
	private static class ParsedValues {
		private final Integer maxCodeLength;
		private final String encoderString;

		public ParsedValues(String theString, Integer theMaxCode) {
			maxCodeLength = theMaxCode;
			encoderString = theString;
		}

		public Integer getMaxCodeLength() {
			return maxCodeLength;
		}

		public String getEncoderString() {
			return encoderString;
		}
	}

	private static final Logger ourLog = LoggerFactory.getLogger(PhoneticEncoderUtil.class);

	private PhoneticEncoderUtil() {}

	/**
	 * Creates the phonetic encoder wrapper from
	 * an input string.
	 *
	 * 

* String must be in the format of... *

* * PhoneticEncoderEnum(MAX_LENGTH) * * @return The IPhoneticEncoder */ public static IPhoneticEncoder getEncoder(String theString) { ParsedValues values = parseIntValue(theString); String encoderType = values.getEncoderString(); Integer encoderMaxString = values.getMaxCodeLength(); IPhoneticEncoder encoder = getEncoderFromString(encoderType, encoderMaxString); if (encoder != null) { return encoder; } else { ourLog.warn("Invalid phonetic param string " + theString); return null; } } private static ParsedValues parseIntValue(String theString) { String encoderType = null; Integer encoderMaxString = null; int braceIndex = theString.indexOf("("); if (braceIndex != -1) { int len = theString.length(); if (theString.charAt(len - 1) == ')') { encoderType = theString.substring(0, braceIndex); String num = theString.substring(braceIndex + 1, len - 1); try { encoderMaxString = Integer.parseInt(num); } catch (NumberFormatException ex) { // invalid number parse error } if (encoderMaxString == null || encoderMaxString < 0) { // parse error ourLog.error("Invalid encoder max character length: " + num); encoderType = null; } } // else - parse error } else { encoderType = theString; } return new ParsedValues(encoderType, encoderMaxString); } private static IPhoneticEncoder getEncoderFromString(String theName, Integer theMax) { IPhoneticEncoder encoder = null; PhoneticEncoderEnum enumVal = EnumUtils.getEnum(PhoneticEncoderEnum.class, theName); if (enumVal != null) { switch (enumVal) { case CAVERPHONE1: Caverphone1 caverphone1 = new Caverphone1(); encoder = new ApacheEncoder(theName, caverphone1); break; case CAVERPHONE2: Caverphone2 caverphone2 = new Caverphone2(); encoder = new ApacheEncoder(theName, caverphone2); break; case COLOGNE: ColognePhonetic colognePhonetic = new ColognePhonetic(); encoder = new ApacheEncoder(theName, colognePhonetic); break; case DOUBLE_METAPHONE: DoubleMetaphone doubleMetaphone = new DoubleMetaphone(); if (theMax != null) { doubleMetaphone.setMaxCodeLen(theMax); } encoder = new ApacheEncoder(theName, doubleMetaphone); break; case MATCH_RATING_APPROACH: MatchRatingApproachEncoder matchRatingApproachEncoder = new MatchRatingApproachEncoder(); encoder = new ApacheEncoder(theName, matchRatingApproachEncoder); break; case METAPHONE: Metaphone metaphone = new Metaphone(); if (theMax != null) { metaphone.setMaxCodeLen(theMax); } encoder = new ApacheEncoder(theName, metaphone); break; case NYSIIS: Nysiis nysiis = new Nysiis(); encoder = new ApacheEncoder(theName, nysiis); break; case NYSIIS_LONG: Nysiis nysiis1_long = new Nysiis(false); encoder = new ApacheEncoder(theName, nysiis1_long); break; case REFINED_SOUNDEX: RefinedSoundex refinedSoundex = new RefinedSoundex(); encoder = new ApacheEncoder(theName, refinedSoundex); break; case SOUNDEX: Soundex soundex = new Soundex(); // soundex has deprecated setting the max size encoder = new ApacheEncoder(theName, soundex); break; case NUMERIC: encoder = new NumericEncoder(); break; default: // we don't ever expect to be here // this log message is purely for devs who update this // enum, but not this method ourLog.error("Unhandled PhoneticParamEnum value " + enumVal.name()); break; } } return encoder; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy