package com.brightgenerous.lucene.delegate; import org.apache.lucene.search.spell.JaroWinklerDistance; import org.apache.lucene.search.spell.LevensteinDistance; import org.apache.lucene.search.spell.StringDistance; @SuppressWarnings("deprecation") class LuceneDelegaterImpl implements LuceneDelegater { { check(); } private static void check() { try { Class.forName(JaroWinklerDistance.class.getName()); Class.forName(LevensteinDistance.class.getName()); Class.forName(StringDistance.class.getName()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } @Override public StringDistanceDelegater createLevensteinDistance() { return new LevensteinDistanceImpl(); } @Override public StringDistanceDelegater createJaroWinklerDistance() { return new JaroWinklerDistanceImpl(); } private static class LevensteinDistanceImpl implements StringDistanceDelegater { private static final long serialVersionUID = -5357020101808383240L; private transient volatile StringDistance deleg; protected StringDistance getDeleg() { if (deleg == null) { synchronized (this) { if (deleg == null) { deleg = new LevensteinDistance(); } } } return deleg; } @Override public float getDistance(String target, String other) { return getDeleg().getDistance(target, other); } } private static class JaroWinklerDistanceImpl implements StringDistanceDelegater { private static final long serialVersionUID = -3041177966407199566L; private transient volatile StringDistance deleg; protected StringDistance getDeleg() { if (deleg == null) { synchronized (this) { if (deleg == null) { deleg = new JaroWinklerDistance(); } } } return deleg; } @Override public float getDistance(String target, String other) { return getDeleg().getDistance(target, other); } } }