/* Copyright 2008-2010 Gephi Authors : Martin Škurla Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.neo4j.plugin.api; import java.lang.reflect.Array; import java.util.LinkedList; import java.util.List; /** * * @author Martin Škurla */ public enum FilterOperator { EQUALS("==") // <editor-fold defaultstate="collapsed" desc="implementation"> { @Override public boolean executeOnWholeNumbers(Number number1, Number number2) { return number1.longValue() == number2.longValue(); } @Override public boolean executeOnWholeNumberArrays(Object array1, Object array2) { if (Array.getLength(array1) != Array.getLength(array2)) { return false; } for (int index = 0; index < Array.getLength(array1); index++) { boolean comparisonResult = EQUALS.executeOnWholeNumbers((Number) Array.get(array1, index), (Number) Array.get(array2, index)); if (comparisonResult == false) { return false; } } return true; } @Override public boolean executeOnRealNumbers(Number number1, Number number2) { return number1.doubleValue() == number2.doubleValue(); } @Override public boolean executeOnRealNumberArrays(Object array1, Object array2) { if (Array.getLength(array1) != Array.getLength(array2)) { return false; } for (int index = 0; index < Array.getLength(array1); index++) { boolean comparisonResult = EQUALS.executeOnRealNumbers((Number) Array.get(array1, index), (Number) Array.get(array2, index)); if (comparisonResult == false) { return false; } } return true; } @Override public boolean executeOnBooleans(Boolean boolean1, Boolean boolean2) { return boolean1.booleanValue() == boolean2.booleanValue(); } @Override public boolean executeOnBooleanArrays(Object array1, Object array2) { if (Array.getLength(array1) != Array.getLength(array2)) { return false; } for (int index = 0; index < Array.getLength(array1); index++) { boolean comparisonResult = EQUALS.executeOnBooleans((Boolean) Array.get(array1, index), (Boolean) Array.get(array2, index)); if (comparisonResult == false) { return false; } } return true; } @Override public boolean executeOnCharacters(Character char1, Character char2, boolean matchCase) { return matchCase ? char1.charValue() == char2.charValue() : Character.toLowerCase(char1) == Character.toLowerCase(char2); } @Override public boolean executeOnCharacterArrays(Object array1, Object array2, boolean matchCase) { if (Array.getLength(array1) != Array.getLength(array2)) { return false; } for (int index = 0; index < Array.getLength(array1); index++) { boolean comparisonResult = EQUALS.executeOnCharacters((Character) Array.get(array1, index), (Character) Array.get(array2, index), matchCase); if (comparisonResult == false) { return false; } } return true; } @Override public boolean executeOnStrings(String str1, String str2, boolean matchCase) { return matchCase ? str1.equals(str2) : str1.equalsIgnoreCase(str2); } @Override public boolean executeOnStringArrays(Object array1, Object array2, boolean matchCase) { if (Array.getLength(array1) != Array.getLength(array2)) { return false; } for (int index = 0; index < Array.getLength(array1); index++) { boolean comparisonResult = EQUALS.executeOnStrings((String) Array.get(array1, index), (String) Array.get(array2, index), matchCase); if (comparisonResult == false) { return false; } } return true; } },// </editor-fold> NOT_EQUALS("!=") // <editor-fold defaultstate="collapsed" desc="implementation"> { @Override public boolean executeOnWholeNumbers(Number number1, Number number2) { return number1.longValue() != number2.longValue(); } @Override public boolean executeOnRealNumbers(Number number1, Number number2) { return number1.doubleValue() != number2.doubleValue(); } @Override public boolean executeOnBooleans(Boolean boolean1, Boolean boolean2) { return boolean1.booleanValue() != boolean2.booleanValue(); } @Override public boolean executeOnCharacters(Character char1, Character char2, boolean matchCase) { return matchCase ? char1.charValue() != char2.charValue() : Character.toLowerCase(char1) != Character.toLowerCase(char2); } @Override public boolean executeOnStrings(String str1, String str2, boolean matchCase) { return matchCase ? !str1.equals(str2) : !str1.equalsIgnoreCase(str2); } },// </editor-fold> LESS("<") // <editor-fold defaultstate="collapsed" desc="implementation"> { @Override public boolean executeOnWholeNumbers(Number number1, Number number2) { return number1.longValue() < number2.longValue(); } @Override public boolean executeOnRealNumbers(Number number1, Number number2) { return number1.doubleValue() < number2.doubleValue(); } @Override public boolean executeOnCharacters(Character char1, Character char2, boolean matchCase) { return matchCase ? char1.charValue() < char2.charValue() : Character.toLowerCase(char1) < Character.toLowerCase(char2); } },// </editor-fold> LESS_OR_EQUALS("<=") // <editor-fold defaultstate="collapsed" desc="implementation"> { @Override public boolean executeOnWholeNumbers(Number number1, Number number2) { return number1.longValue() <= number2.longValue(); } @Override public boolean executeOnRealNumbers(Number number1, Number number2) { return number1.doubleValue() <= number2.doubleValue(); } @Override public boolean executeOnCharacters(Character char1, Character char2, boolean matchCase) { return matchCase ? char1.charValue() <= char2.charValue() : Character.toLowerCase(char1) <= Character.toLowerCase(char2); } },// </editor-fold> GREATER(">") // <editor-fold defaultstate="collapsed" desc="implementation"> { @Override public boolean executeOnWholeNumbers(Number number1, Number number2) { return number1.longValue() > number2.longValue(); } @Override public boolean executeOnRealNumbers(Number number1, Number number2) { return number1.doubleValue() > number2.doubleValue(); } @Override public boolean executeOnCharacters(Character char1, Character char2, boolean matchCase) { return matchCase ? char1.charValue() > char2.charValue() : Character.toLowerCase(char1) > Character.toLowerCase(char2); } },// </editor-fold> GREATER_OR_EQUALS(">=") // <editor-fold defaultstate="collapsed" desc="implementation"> { @Override public boolean executeOnWholeNumbers(Number number1, Number number2) { return number1.longValue() >= number2.longValue(); } @Override public boolean executeOnRealNumbers(Number number1, Number number2) { return number1.doubleValue() >= number2.doubleValue(); } @Override public boolean executeOnCharacters(Character char1, Character char2, boolean matchCase) { return matchCase ? char1.charValue() >= char2.charValue() : Character.toLowerCase(char1) >= Character.toLowerCase(char2); } };// </editor-fold> private static final boolean RESTRICTIVE_MODE = false; private final String textRepresentation; private FilterOperator(String textRepresentation) { this.textRepresentation = textRepresentation; } public boolean executeOnWholeNumbers(Number number1, Number number2) { return !RESTRICTIVE_MODE; } public boolean executeOnWholeNumberArrays(Object array1, Object array2) { return !RESTRICTIVE_MODE; } public boolean executeOnRealNumbers(Number number1, Number number2) { return !RESTRICTIVE_MODE; } public boolean executeOnRealNumberArrays(Object array1, Object array2) { return !RESTRICTIVE_MODE; } public boolean executeOnBooleans(Boolean boolean1, Boolean boolean2) { return !RESTRICTIVE_MODE; } public boolean executeOnBooleanArrays(Object array1, Object array2) { return !RESTRICTIVE_MODE; } public boolean executeOnCharacters(Character char1, Character char2, boolean matchCase) { return !RESTRICTIVE_MODE; } public boolean executeOnCharacterArrays(Object array1, Object array2, boolean matchCase) { return !RESTRICTIVE_MODE; } public boolean executeOnStrings(String str1, String str2, boolean matchCase) { return !RESTRICTIVE_MODE; } public boolean executeOnStringArrays(Object array1, Object array2, boolean matchCase) { return !RESTRICTIVE_MODE; } public static String[] getTextRepresentations() { List<String> textRepresentations = new LinkedList<String>(); for (FilterOperator filterOperator : FilterOperator.values()) { textRepresentations.add(filterOperator.textRepresentation); } return textRepresentations.toArray(new String[0]); } public static FilterOperator fromTextRepresentation(String textRepresentation) { for (FilterOperator filterOperator : values()) { if (filterOperator.textRepresentation.equals(textRepresentation)) { return filterOperator; } } throw new AssertionError(); } }