package data; import static data.Filter.filterName.*; import java.util.*; import java.util.regex.Pattern; import gui.ValidationUtil; @SuppressWarnings("unchecked") public class Filter { private HashMap filter; public enum filterName { ANALYSIS_LEVEL, CALCULATE_FOR, WORD_PARTS, NGRAM_VALUE, SKIP_VALUE, IS_CVV, STRING_LENGTH, TAXONOMY, DISPLAY_TAXONOMY, MSD, HAS_MSD, WRITE_MSD_AT_THE_END, SOLAR_FILTERS, MULTIPLE_KEYS, NOTE_PUNCTUATIONS, MINIMAL_OCCURRENCES, MINIMAL_TAXONOMY } public Filter() { filter = new HashMap<>(); filter.put(WRITE_MSD_AT_THE_END, false); filter.put(WORD_PARTS, new ArrayList()); } public Filter(AnalysisLevel al, CalculateFor cf) { filter = new HashMap<>(); filter.put(ANALYSIS_LEVEL, al); filter.put(CALCULATE_FOR, cf); filter.put(WORD_PARTS, new ArrayList()); addWordPart(cf); filter.put(WRITE_MSD_AT_THE_END, false); } public void setAl(AnalysisLevel al) { filter.put(ANALYSIS_LEVEL, al); } public AnalysisLevel getAl() { return (AnalysisLevel) filter.get(ANALYSIS_LEVEL); } public void setCalculateFor(CalculateFor cf) { filter.put(CALCULATE_FOR, cf); filter.put(WORD_PARTS, new ArrayList()); addWordPart(cf); } public CalculateFor getCalculateFor() { return (CalculateFor) filter.get(CALCULATE_FOR); } public void setNgramValue(Integer ngramValue) { filter.put(NGRAM_VALUE, ngramValue); } public Integer getNgramValue() { return (Integer) filter.get(NGRAM_VALUE); } public void setSkipValue(Integer skipValue) { filter.put(SKIP_VALUE, skipValue); } public Integer getSkipValue() { return (Integer) filter.get(SKIP_VALUE); } public void setIsCvv(boolean isCvv) { filter.put(IS_CVV, isCvv); } public boolean isCvv() { return filter.containsKey(IS_CVV) && (boolean) filter.get(IS_CVV); } public void setStringLength(int stringLength) { filter.put(STRING_LENGTH, stringLength); } public Integer getStringLength() { return (Integer) filter.get(STRING_LENGTH); } public void setTaxonomy(ArrayList taxonomy) { filter.put(TAXONOMY, taxonomy); } public ArrayList getTaxonomy() { if (filter.containsKey(TAXONOMY) && filter.get(TAXONOMY) != null) { return (ArrayList) filter.get(TAXONOMY); } else { return new ArrayList<>(); } } public void setDisplayTaxonomy(boolean displayTaxonomy) { filter.put(DISPLAY_TAXONOMY, displayTaxonomy); } public boolean getDisplayTaxonomy() { return (boolean) filter.get(DISPLAY_TAXONOMY); } public void setMsd(ArrayList msd) { filter.put(MSD, msd); if (!ValidationUtil.isEmpty(msd)) { setHasMsd(true); } else { setHasMsd(false); } } public ArrayList getMsd() { return (ArrayList) filter.get(MSD); } public void setWriteMsdAtTheEnd(boolean writeMsdAtTheEnd) { filter.put(WRITE_MSD_AT_THE_END, writeMsdAtTheEnd); } public boolean getWriteMsdAtTheEnd() { return (boolean) filter.get(WRITE_MSD_AT_THE_END); } public void setHasMsd(boolean hasMsd) { filter.put(HAS_MSD, hasMsd); if (hasMsd && !((ArrayList) filter.get(MULTIPLE_KEYS)).contains(CalculateFor.MORPHOSYNTACTIC_SPECS)) addWordPart(CalculateFor.MORPHOSYNTACTIC_SPECS); } public boolean hasMsd() { return filter.containsKey(HAS_MSD) && (boolean) filter.get(HAS_MSD); } public String toString() { String newLine = "\n\t- "; StringBuilder sb = new StringBuilder(); sb.append(newLine).append("Filter:"); for (Map.Entry entry : filter.entrySet()) { sb.append(newLine) .append(entry.getKey().toString()) .append(": ") .append(entry.getValue() != null ? entry.getValue().toString() : "null"); } return sb.toString(); } public void setSolarFilters(HashMap> filters) { filter.put(SOLAR_FILTERS, filters); } public HashMap> getSolarFilters() { return (HashMap>) filter.get(SOLAR_FILTERS); } public void setMultipleKeys(ArrayList keys) { ArrayList newKeys = new ArrayList<>(); if (keys != null) { for (String key : keys) { CalculateFor cf = CalculateFor.factory(key); newKeys.add(cf); addWordPart(cf); } } filter.put(MULTIPLE_KEYS, newKeys); } public ArrayList getMultipleKeys() { if (filter.containsKey(MULTIPLE_KEYS) && filter.get(MULTIPLE_KEYS) != null) { return (ArrayList) filter.get(MULTIPLE_KEYS); } else { return new ArrayList<>(); } } public ArrayList getWordParts() { if (filter.containsKey(WORD_PARTS) && filter.get(WORD_PARTS) != null) { return (ArrayList) filter.get(WORD_PARTS); } else { return new ArrayList<>(); } } public void setNotePunctuations(boolean notePunctuations) { filter.put(NOTE_PUNCTUATIONS, notePunctuations); } public boolean getNotePunctuations() { return filter.containsKey(NOTE_PUNCTUATIONS) && (boolean) filter.get(NOTE_PUNCTUATIONS); } public void setMinimalOccurrences(Integer minOccurrences) { filter.put(MINIMAL_OCCURRENCES, minOccurrences); } public Integer getMinimalOccurrences() { return (Integer) filter.get(MINIMAL_OCCURRENCES); } public void setMinimalTaxonomy(Integer minTaxonomy) { filter.put(MINIMAL_TAXONOMY, minTaxonomy); } public Integer getMinimalTaxonomy() { return (Integer) filter.get(MINIMAL_TAXONOMY); } private void addWordPart(CalculateFor wp){ ArrayList oldWp = ((ArrayList) filter.get(WORD_PARTS)); switch (wp) { case WORD: case DIST_WORDS: if (!oldWp.contains(CalculateFor.WORD)) oldWp.add(CalculateFor.WORD); break; case LEMMA: case DIST_LEMMAS: if (!oldWp.contains(CalculateFor.LEMMA)) oldWp.add(CalculateFor.LEMMA); break; case MORPHOSYNTACTIC_PROPERTY: case MORPHOSYNTACTIC_SPECS: case WORD_TYPE: if (!oldWp.contains(CalculateFor.MORPHOSYNTACTIC_SPECS)) oldWp.add(CalculateFor.MORPHOSYNTACTIC_SPECS); break; case NORMALIZED_WORD: if (!oldWp.contains(CalculateFor.NORMALIZED_WORD)) oldWp.add(CalculateFor.NORMALIZED_WORD); break; } } }