/** * */ package querqy.rewrite.commonrules.model; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import querqy.ComparableCharSequence; /** * @author René Kriegler, @renekrie * */ public class TermMatches extends LinkedList<TermMatch> { /** * */ private static final long serialVersionUID = 1L; Map<Integer, ComparableCharSequence> replacements; public TermMatches() { super(); } public TermMatches(final Collection<? extends TermMatch> c) { super(); for (final TermMatch match: c) { add(match); } } public TermMatches(final TermMatch match) { super(); add(match); } public ComparableCharSequence getReplacement(final int position) { if (replacements == null) { throw new IndexOutOfBoundsException(Integer.toString(position)); } final ComparableCharSequence replacement = replacements.get(position); if (replacement == null) { throw new IndexOutOfBoundsException(Integer.toString(position)); } return replacement; } @Override public boolean add(final TermMatch match) { if (match.isPrefix) { updateReplacements(match); } return super.add(match); } @Override public void add(final int index, final TermMatch match) { throw new UnsupportedOperationException(); } @Override public void addFirst(final TermMatch match) { final Map<Integer, ComparableCharSequence> newReplacements = new HashMap<>(); newReplacements.put(1, match.getWildcardMatch()); for (final Map.Entry<Integer, ComparableCharSequence> entry : replacements.entrySet()) { newReplacements.put(entry.getKey() + 1, entry.getValue()); } replacements = newReplacements; } @Override public boolean addAll(final Collection<? extends TermMatch> c) { for (final TermMatch match: c) { updateReplacements(match); } return super.addAll(c); } protected void updateReplacements(final TermMatch match) { if (replacements == null) { replacements = new HashMap<>(); } replacements.put(replacements.size() + 1, match.getWildcardMatch()); } }