diff options
author | BJ Hargrave | 2020-01-08 15:37:51 +0000 |
---|---|---|
committer | BJ Hargrave | 2020-01-09 17:28:16 +0000 |
commit | 7a2481aa40b36addd5c4cc10464c8637e0ae7e87 (patch) | |
tree | 341f5d7ccf265ab9aa3fb758ccb70f5f24862ccd | |
parent | de6e9eae35ff654ad1be04114f98b7f279b3ffcd (diff) | |
download | rt.equinox.framework-7a2481aa40b36addd5c4cc10464c8637e0ae7e87.tar.gz rt.equinox.framework-7a2481aa40b36addd5c4cc10464c8637e0ae7e87.tar.xz rt.equinox.framework-7a2481aa40b36addd5c4cc10464c8637e0ae7e87.zip |
filter: Improvements to FilterImpl
The implementation is updated to better exploit the String type of
value. We don't need to pass it as a parameter since it is a final
field in the object. We also don't need to cast it to String since
it is already known to be a String. This then leads to refactoring
of the FilterImpl sub-type hierarchy.
Change-Id: I57c94dd772f776fb6d7cbbbc12eb3d3f129c6386
Signed-off-by: BJ Hargrave <hargrave@us.ibm.com>
-rw-r--r-- | bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/FilterImpl.java | 656 |
1 files changed, 248 insertions, 408 deletions
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/FilterImpl.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/FilterImpl.java index f718ea1fe..c9f574709 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/FilterImpl.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/FilterImpl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2019 IBM Corporation and others. + * Copyright (c) 2003, 2020 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -466,146 +466,112 @@ public abstract class FilterImpl implements Filter { } } - static final class Present extends FilterImpl { - /** debug mode */ - final boolean debug; - private final String attr; - - Present(String attr, boolean debug) { - this.attr = attr; - this.debug = debug; - } - - @Override - boolean matches0(Map<String, ?> map) { - if (debug) { - Debug.println("PRESENT(" + attr + ")"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return map.get(attr) != null; - } - - @Override - StringBuilder normalize(StringBuilder sb) { - return sb.append('(').append(attr).append('=').append('*').append(')'); - } - - @Override - void getAttributesInternal(List<String> results) { - results.add(attr); - } - - @Override - void addAttributes(Map<String, String> attributes, Map<String, Range> versionAttrs, boolean not) { - attributes.put(attr, "*"); //$NON-NLS-1$ - } - } - static abstract class Item extends FilterImpl { /** debug mode */ final boolean debug; final String attr; - final Object value; - Item(String attr, Object value, boolean debug) { + Item(String attr, boolean debug) { this.attr = attr; - this.value = value; this.debug = debug; } @Override boolean matches0(Map<String, ?> map) { - return compare(map.get(attr), value); + return compare(map.get(attr)); } abstract String operation(); - private boolean compare(Object value1, Object value2) { + abstract String value(); + + private boolean compare(Object value1) { if (debug) { if (value1 == null) { - Debug.println("compare(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println("compare(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } else if (!(value1.getClass().isArray() || (value1 instanceof Collection<?>))) { - Debug.println(operation() + "(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println(operation() + "(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } if (value1 == null) { return false; } if (value1 instanceof String) { - return compare_String((String) value1, value2); + return compare_String((String) value1); } if (value1 instanceof Version) { - return compare_Version((Version) value1, value2); + return compare_Version((Version) value1); } Class<?> clazz = value1.getClass(); if (clazz.isArray()) { Class<?> type = clazz.getComponentType(); if (type.isPrimitive()) { - return compare_PrimitiveArray(type, value1, value2); + return compare_PrimitiveArray(type, value1); } - return compare_ObjectArray((Object[]) value1, value2); + return compare_ObjectArray((Object[]) value1); } if (value1 instanceof Collection<?>) { - return compare_Collection((Collection<?>) value1, value2); + return compare_Collection((Collection<?>) value1); } if (value1 instanceof Integer) { - return compare_Integer(((Integer) value1).intValue(), value2); + return compare_Integer(((Integer) value1).intValue()); } if (value1 instanceof Long) { - return compare_Long(((Long) value1).longValue(), value2); + return compare_Long(((Long) value1).longValue()); } if (value1 instanceof Byte) { - return compare_Byte(((Byte) value1).byteValue(), value2); + return compare_Byte(((Byte) value1).byteValue()); } if (value1 instanceof Short) { - return compare_Short(((Short) value1).shortValue(), value2); + return compare_Short(((Short) value1).shortValue()); } if (value1 instanceof Character) { - return compare_Character(((Character) value1).charValue(), value2); + return compare_Character(((Character) value1).charValue()); } if (value1 instanceof Float) { - return compare_Float(((Float) value1).floatValue(), value2); + return compare_Float(((Float) value1).floatValue()); } if (value1 instanceof Double) { - return compare_Double(((Double) value1).doubleValue(), value2); + return compare_Double(((Double) value1).doubleValue()); } if (value1 instanceof Boolean) { - return compare_Boolean(((Boolean) value1).booleanValue(), value2); + return compare_Boolean(((Boolean) value1).booleanValue()); } if (value1 instanceof Comparable<?>) { @SuppressWarnings("unchecked") Comparable<Object> comparable = (Comparable<Object>) value1; - return compare_Comparable(comparable, value2); + return compare_Comparable(comparable); } - return compare_Unknown(value1, value2); + return compare_Unknown(value1); } - private boolean compare_Collection(Collection<?> collection, Object value2) { + private boolean compare_Collection(Collection<?> collection) { for (Object value1 : collection) { - if (compare(value1, value2)) { + if (compare(value1)) { return true; } } return false; } - private boolean compare_ObjectArray(Object[] array, Object value2) { + private boolean compare_ObjectArray(Object[] array) { for (Object value1 : array) { - if (compare(value1, value2)) { + if (compare(value1)) { return true; } } return false; } - private boolean compare_PrimitiveArray(Class<?> type, Object primarray, Object value2) { + private boolean compare_PrimitiveArray(Class<?> type, Object primarray) { if (Integer.TYPE.isAssignableFrom(type)) { int[] array = (int[]) primarray; for (int value1 : array) { if (debug) { - Debug.println(operation() + "(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println(operation() + "(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - if (compare_Integer(value1, value2)) { + if (compare_Integer(value1)) { return true; } } @@ -615,9 +581,9 @@ public abstract class FilterImpl implements Filter { long[] array = (long[]) primarray; for (long value1 : array) { if (debug) { - Debug.println(operation() + "(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println(operation() + "(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - if (compare_Long(value1, value2)) { + if (compare_Long(value1)) { return true; } } @@ -627,9 +593,9 @@ public abstract class FilterImpl implements Filter { byte[] array = (byte[]) primarray; for (byte value1 : array) { if (debug) { - Debug.println(operation() + "(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println(operation() + "(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - if (compare_Byte(value1, value2)) { + if (compare_Byte(value1)) { return true; } } @@ -639,9 +605,9 @@ public abstract class FilterImpl implements Filter { short[] array = (short[]) primarray; for (short value1 : array) { if (debug) { - Debug.println(operation() + "(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println(operation() + "(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - if (compare_Short(value1, value2)) { + if (compare_Short(value1)) { return true; } } @@ -651,9 +617,9 @@ public abstract class FilterImpl implements Filter { char[] array = (char[]) primarray; for (char value1 : array) { if (debug) { - Debug.println(operation() + "(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println(operation() + "(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - if (compare_Character(value1, value2)) { + if (compare_Character(value1)) { return true; } } @@ -663,9 +629,9 @@ public abstract class FilterImpl implements Filter { float[] array = (float[]) primarray; for (float value1 : array) { if (debug) { - Debug.println(operation() + "(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println(operation() + "(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - if (compare_Float(value1, value2)) { + if (compare_Float(value1)) { return true; } } @@ -675,9 +641,9 @@ public abstract class FilterImpl implements Filter { double[] array = (double[]) primarray; for (double value1 : array) { if (debug) { - Debug.println(operation() + "(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println(operation() + "(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - if (compare_Double(value1, value2)) { + if (compare_Double(value1)) { return true; } } @@ -687,9 +653,9 @@ public abstract class FilterImpl implements Filter { boolean[] array = (boolean[]) primarray; for (boolean value1 : array) { if (debug) { - Debug.println(operation() + "(" + value1 + "," + value2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Debug.println(operation() + "(" + value1 + "," + value() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - if (compare_Boolean(value1, value2)) { + if (compare_Boolean(value1)) { return true; } } @@ -698,51 +664,51 @@ public abstract class FilterImpl implements Filter { return false; } - boolean compare_String(String string, Object value2) { + boolean compare_String(String string) { return false; } - boolean compare_Version(Version value1, Object value2) { + boolean compare_Version(Version value1) { return false; } - boolean compare_Comparable(Comparable<Object> value1, Object value2) { + boolean compare_Comparable(Comparable<Object> value1) { return false; } - boolean compare_Unknown(Object value1, Object value2) { + boolean compare_Unknown(Object value1) { return false; } - boolean compare_Boolean(boolean boolval, Object value2) { + boolean compare_Boolean(boolean boolval) { return false; } - boolean compare_Byte(byte byteval, Object value2) { + boolean compare_Byte(byte byteval) { return false; } - boolean compare_Character(char charval, Object value2) { + boolean compare_Character(char charval) { return false; } - boolean compare_Double(double doubleval, Object value2) { + boolean compare_Double(double doubleval) { return false; } - boolean compare_Float(float floatval, Object value2) { + boolean compare_Float(float floatval) { return false; } - boolean compare_Integer(int intval, Object value2) { + boolean compare_Integer(int intval) { return false; } - boolean compare_Long(long longval, Object value2) { + boolean compare_Long(long longval) { return false; } - boolean compare_Short(short shortval, Object value2) { + boolean compare_Short(short shortval) { return false; } @@ -774,62 +740,47 @@ public abstract class FilterImpl implements Filter { results.add(attr); } - static Object valueOf(Class<?> target, String value2) { - do { - Method method; - try { - method = target.getMethod("valueOf", String.class); //$NON-NLS-1$ - } catch (NoSuchMethodException e) { - break; - } - if (Modifier.isStatic(method.getModifiers()) && target.isAssignableFrom(method.getReturnType())) { - setAccessible(method); - try { - return method.invoke(null, value2.trim()); - } catch (Error e) { - throw e; - } catch (Throwable e) { - return null; - } - } - } while (false); - - do { - Constructor<?> constructor; - try { - constructor = target.getConstructor(String.class); - } catch (NoSuchMethodException e) { - break; - } - setAccessible(constructor); - try { - return constructor.newInstance(value2.trim()); - } catch (Error e) { - throw e; - } catch (Throwable e) { - return null; - } - } while (false); + @Override + void addAttributes(Map<String, String> attributes, Map<String, Range> versionAttrs, boolean not) { + attributes.put(attr, value()); + } + } - return null; + static final class Present extends Item { + Present(String attr, boolean debug) { + super(attr, debug); } - private static void setAccessible(final AccessibleObject accessible) { - if (!accessible.isAccessible()) { - AccessController.doPrivileged(new PrivilegedAction<Void>() { - @Override - public Void run() { - accessible.setAccessible(true); - return null; - } - }); + @Override + boolean matches0(Map<String, ?> map) { + if (debug) { + Debug.println("PRESENT(" + attr + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } + return map.get(attr) != null; + } + + @Override + String operation() { + return "PRESENT"; //$NON-NLS-1$ + } + + @Override + String value() { + return "*"; //$NON-NLS-1$ + } + + @Override + StringBuilder normalize(StringBuilder sb) { + return sb.append('(').append(attr).append('=').append('*').append(')'); } } static final class Substring extends Item { - Substring(String attr, Object value, boolean debug) { - super(attr, value, debug); + final String[] substrings; + + Substring(String attr, String[] substrings, boolean debug) { + super(attr, debug); + this.substrings = substrings; } @Override @@ -838,8 +789,12 @@ public abstract class FilterImpl implements Filter { } @Override - boolean compare_String(String string, Object value2) { - String[] substrings = (String[]) value2; + String value() { + return value(new StringBuilder()).toString(); + } + + @Override + boolean compare_String(String string) { int pos = 0; for (int i = 0, size = substrings.length; i < size; i++) { String substr = substrings[i]; @@ -896,7 +851,6 @@ public abstract class FilterImpl implements Filter { } private StringBuilder value(StringBuilder sb) { - String[] substrings = (String[]) value; for (String substr : substrings) { if (substr == null) /* * */ { sb.append('*'); @@ -906,16 +860,14 @@ public abstract class FilterImpl implements Filter { } return sb; } - - @Override - void addAttributes(Map<String, String> attributes, Map<String, Range> versionAttrs, boolean not) { - attributes.put(attr, value(new StringBuilder()).toString()); - } } static class Equal extends Item { - Equal(String attr, Object value, boolean debug) { - super(attr, value, debug); + final String value; + + Equal(String attr, String value, boolean debug) { + super(attr, debug); + this.value = value; } @Override @@ -924,15 +876,24 @@ public abstract class FilterImpl implements Filter { } @Override - boolean compare_String(String string, Object value2) { - return string.equals(value2); + String value() { + return value; + } + + boolean comparison(int compare) { + return compare == 0; + } + + @Override + boolean compare_String(String string) { + return comparison((string == value) ? 0 : string.compareTo(value)); } @Override - boolean compare_Version(Version value1, Object value2) { + boolean compare_Version(Version value1) { try { - Version version2 = Version.valueOf((String) value2); - return value1.compareTo(version2) == 0; + Version version2 = Version.valueOf(value); + return comparison(value1.compareTo(version2)); } catch (Exception e) { // if the valueOf or compareTo method throws an exception return false; @@ -940,85 +901,96 @@ public abstract class FilterImpl implements Filter { } @Override - boolean compare_Boolean(boolean boolval, Object value2) { - return boolval == Boolean.valueOf(((String) value2).trim()).booleanValue(); + boolean compare_Boolean(boolean boolval) { + boolean boolval2 = Boolean.parseBoolean(value.trim()); + return comparison(Boolean.compare(boolval, boolval2)); } @Override - boolean compare_Byte(byte byteval, Object value2) { + boolean compare_Byte(byte byteval) { + byte byteval2; try { - return byteval == Byte.parseByte(((String) value2).trim()); + byteval2 = Byte.parseByte(value.trim()); } catch (IllegalArgumentException e) { return false; } + return comparison(Byte.compare(byteval, byteval2)); } @Override - boolean compare_Character(char charval, Object value2) { + boolean compare_Character(char charval) { + char charval2; try { - return charval == ((String) value2).charAt(0); + charval2 = value.charAt(0); } catch (IndexOutOfBoundsException e) { return false; } + return comparison(Character.compare(charval, charval2)); } @Override - boolean compare_Double(double doubleval, Object value2) { + boolean compare_Double(double doubleval) { double doubleval2; try { - doubleval2 = Double.parseDouble(((String) value2).trim()); + doubleval2 = Double.parseDouble(value.trim()); } catch (IllegalArgumentException e) { return false; } - return Double.compare(doubleval, doubleval2) == 0; + return comparison(Double.compare(doubleval, doubleval2)); } @Override - boolean compare_Float(float floatval, Object value2) { + boolean compare_Float(float floatval) { float floatval2; try { - floatval2 = Float.parseFloat(((String) value2).trim()); + floatval2 = Float.parseFloat(value.trim()); } catch (IllegalArgumentException e) { return false; } - return Float.compare(floatval, floatval2) == 0; + return comparison(Float.compare(floatval, floatval2)); } @Override - boolean compare_Integer(int intval, Object value2) { + boolean compare_Integer(int intval) { + int intval2; try { - return intval == Integer.parseInt(((String) value2).trim()); + intval2 = Integer.parseInt(value.trim()); } catch (IllegalArgumentException e) { return false; } + return comparison(Integer.compare(intval, intval2)); } @Override - boolean compare_Long(long longval, Object value2) { + boolean compare_Long(long longval) { + long longval2; try { - return longval == Long.parseLong(((String) value2).trim()); + longval2 = Long.parseLong(value.trim()); } catch (IllegalArgumentException e) { return false; } + return comparison(Long.compare(longval, longval2)); } @Override - boolean compare_Short(short shortval, Object value2) { + boolean compare_Short(short shortval) { + short shortval2; try { - return shortval == Short.parseShort(((String) value2).trim()); + shortval2 = Short.parseShort(value.trim()); } catch (IllegalArgumentException e) { return false; } + return comparison(Short.compare(shortval, shortval2)); } @Override - boolean compare_Comparable(Comparable<Object> value1, Object value2) { - value2 = valueOf(value1.getClass(), (String) value2); + boolean compare_Comparable(Comparable<Object> value1) { + Object value2 = valueOf(value1.getClass()); if (value2 == null) { return false; } try { - return value1.compareTo(value2) == 0; + return comparison(value1.compareTo(value2)); } catch (Exception e) { // if the compareTo method throws an exception; return false return false; @@ -1026,8 +998,8 @@ public abstract class FilterImpl implements Filter { } @Override - boolean compare_Unknown(Object value1, Object value2) { - value2 = valueOf(value1.getClass(), (String) value2); + boolean compare_Unknown(Object value1) { + Object value2 = valueOf(value1.getClass()); if (value2 == null) { return false; } @@ -1042,13 +1014,65 @@ public abstract class FilterImpl implements Filter { @Override StringBuilder normalize(StringBuilder sb) { sb.append('(').append(attr).append('='); - return encodeValue(sb, (String) value).append(')'); + return encodeValue(sb, value).append(')'); + } + + Object valueOf(Class<?> target) { + do { + Method method; + try { + method = target.getMethod("valueOf", String.class); //$NON-NLS-1$ + } catch (NoSuchMethodException e) { + break; + } + if (Modifier.isStatic(method.getModifiers()) && target.isAssignableFrom(method.getReturnType())) { + setAccessible(method); + try { + return method.invoke(null, value.trim()); + } catch (Error e) { + throw e; + } catch (Throwable e) { + return null; + } + } + } while (false); + + do { + Constructor<?> constructor; + try { + constructor = target.getConstructor(String.class); + } catch (NoSuchMethodException e) { + break; + } + setAccessible(constructor); + try { + return constructor.newInstance(value.trim()); + } catch (Error e) { + throw e; + } catch (Throwable e) { + return null; + } + } while (false); + + return null; + } + + private static void setAccessible(final AccessibleObject accessible) { + if (!accessible.isAccessible()) { + AccessController.doPrivileged(new PrivilegedAction<Void>() { + @Override + public Void run() { + accessible.setAccessible(true); + return null; + } + }); + } } @Override public String getPrimaryKeyValue(String primaryKey) { - if (attr.equalsIgnoreCase(primaryKey) && (value instanceof String)) { - return (String) value; + if (attr.equalsIgnoreCase(primaryKey)) { + return value; } return null; } @@ -1056,7 +1080,7 @@ public abstract class FilterImpl implements Filter { @Override void addAttributes(Map<String, String> attributes, Map<String, Range> versionAttrs, boolean not) { if (!versionAttrs.containsKey(attr)) { - attributes.put(attr, (String) value); + attributes.put(attr, value); } else { // this is an exact range e.g. [value,value] Range currentRange = versionAttrs.get(attr); @@ -1064,13 +1088,13 @@ public abstract class FilterImpl implements Filter { if (not) { // this is an expanded form of the filter, e.g.: // [1.0,2.0) -> (&(version>=1.0)(version<=2.0)(!(version=2.0))) - currentRange.addExclude(Version.valueOf((String) value)); + currentRange.addExclude(Version.valueOf(value)); } else { throw new IllegalStateException("Invalid range for: " + attr); //$NON-NLS-1$ } } else { currentRange = new Range(); - Version version = Version.valueOf((String) value); + Version version = Version.valueOf(value); currentRange.setLeft('[', version); currentRange.setRight(']', version); versionAttrs.put(attr, currentRange); @@ -1079,8 +1103,8 @@ public abstract class FilterImpl implements Filter { } } - static final class Less extends Equal { - Less(String attr, Object value, boolean debug) { + static final class LessEqual extends Equal { + LessEqual(String attr, String value, boolean debug) { super(attr, value, debug); } @@ -1090,106 +1114,14 @@ public abstract class FilterImpl implements Filter { } @Override - boolean compare_String(String string, Object value2) { - return string.compareTo((String) value2) <= 0; - } - - @Override - boolean compare_Version(Version value1, Object value2) { - try { - Version version2 = Version.valueOf((String) value2); - return value1.compareTo(version2) <= 0; - } catch (Exception e) { - // if the valueOf or compareTo method throws an exception - return false; - } - } - - @Override - boolean compare_Byte(byte byteval, Object value2) { - try { - return byteval <= Byte.parseByte(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - } - - @Override - boolean compare_Character(char charval, Object value2) { - try { - return charval <= ((String) value2).charAt(0); - } catch (IndexOutOfBoundsException e) { - return false; - } - } - - @Override - boolean compare_Double(double doubleval, Object value2) { - double doubleval2; - try { - doubleval2 = Double.parseDouble(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - return Double.compare(doubleval, doubleval2) <= 0; - } - - @Override - boolean compare_Float(float floatval, Object value2) { - float floatval2; - try { - floatval2 = Float.parseFloat(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - return Float.compare(floatval, floatval2) <= 0; - } - - @Override - boolean compare_Integer(int intval, Object value2) { - try { - return intval <= Integer.parseInt(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - } - - @Override - boolean compare_Long(long longval, Object value2) { - try { - return longval <= Long.parseLong(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - } - - @Override - boolean compare_Short(short shortval, Object value2) { - try { - return shortval <= Short.parseShort(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - } - - @Override - boolean compare_Comparable(Comparable<Object> value1, Object value2) { - value2 = valueOf(value1.getClass(), (String) value2); - if (value2 == null) { - return false; - } - try { - return value1.compareTo(value2) <= 0; - } catch (Exception e) { - // if the compareTo method throws an exception; return false - return false; - } + boolean comparison(int compare) { + return compare <= 0; } @Override StringBuilder normalize(StringBuilder sb) { sb.append('(').append(attr).append('<').append('='); - return encodeValue(sb, (String) value).append(')'); + return encodeValue(sb, value).append(')'); } @Override @@ -1214,20 +1146,20 @@ public abstract class FilterImpl implements Filter { } if (not) { // this must be a range start "(value" - if (!currentRange.setLeft('(', Version.valueOf((String) value))) { + if (!currentRange.setLeft('(', Version.valueOf(value))) { throw new IllegalStateException("range start is already processed for attribute: " + attr); //$NON-NLS-1$ } } else { // this must be a range end "value]" - if (!currentRange.setRight(']', Version.valueOf((String) value))) { + if (!currentRange.setRight(']', Version.valueOf(value))) { throw new IllegalStateException("range end is already processed for attribute: " + attr); //$NON-NLS-1$ } } } } - static final class Greater extends Equal { - Greater(String attr, Object value, boolean debug) { + static final class GreaterEqual extends Equal { + GreaterEqual(String attr, String value, boolean debug) { super(attr, value, debug); } @@ -1237,106 +1169,14 @@ public abstract class FilterImpl implements Filter { } @Override - boolean compare_String(String string, Object value2) { - return string.compareTo((String) value2) >= 0; - } - - @Override - boolean compare_Version(Version value1, Object value2) { - try { - Version version2 = Version.valueOf((String) value2); - return value1.compareTo(version2) >= 0; - } catch (Exception e) { - // if the valueOf or compareTo method throws an exception - return false; - } - } - - @Override - boolean compare_Byte(byte byteval, Object value2) { - try { - return byteval >= Byte.parseByte(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - } - - @Override - boolean compare_Character(char charval, Object value2) { - try { - return charval >= ((String) value2).charAt(0); - } catch (IndexOutOfBoundsException e) { - return false; - } - } - - @Override - boolean compare_Double(double doubleval, Object value2) { - double doubleval2; - try { - doubleval2 = Double.parseDouble(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - return Double.compare(doubleval, doubleval2) >= 0; - } - - @Override - boolean compare_Float(float floatval, Object value2) { - float floatval2; - try { - floatval2 = Float.parseFloat(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - return Float.compare(floatval, floatval2) >= 0; - } - - @Override - boolean compare_Integer(int intval, Object value2) { - try { - return intval >= Integer.parseInt(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - } - - @Override - boolean compare_Long(long longval, Object value2) { - try { - return longval >= Long.parseLong(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - } - - @Override - boolean compare_Short(short shortval, Object value2) { - try { - return shortval >= Short.parseShort(((String) value2).trim()); - } catch (IllegalArgumentException e) { - return false; - } - } - - @Override - boolean compare_Comparable(Comparable<Object> value1, Object value2) { - value2 = valueOf(value1.getClass(), (String) value2); - if (value2 == null) { - return false; - } - try { - return value1.compareTo(value2) >= 0; - } catch (Exception e) { - // if the compareTo method throws an exception; return false - return false; - } + boolean comparison(int compare) { + return compare >= 0; } @Override StringBuilder normalize(StringBuilder sb) { sb.append('(').append(attr).append('>').append('='); - return encodeValue(sb, (String) value).append(')'); + return encodeValue(sb, value).append(')'); } @Override @@ -1361,12 +1201,12 @@ public abstract class FilterImpl implements Filter { } if (not) { // this must be a range end "value)" - if (!currentRange.setRight(')', Version.valueOf((String) value))) { + if (!currentRange.setRight(')', Version.valueOf(value))) { throw new IllegalStateException("range end is already processed for attribute: " + attr); //$NON-NLS-1$ } } else { // this must be a range start "[value" - if (!currentRange.setLeft('[', Version.valueOf((String) value))) { + if (!currentRange.setLeft('[', Version.valueOf(value))) { throw new IllegalStateException("range start is already processed for attribute: " + attr); //$NON-NLS-1$ } } @@ -1374,8 +1214,11 @@ public abstract class FilterImpl implements Filter { } static final class Approx extends Equal { - Approx(String attr, Object value, boolean debug) { + final String approx; + + Approx(String attr, String value, boolean debug) { super(attr, value, debug); + this.approx = approxString(value); } @Override @@ -1384,17 +1227,21 @@ public abstract class FilterImpl implements Filter { } @Override - boolean compare_String(String string, Object value2) { + String value() { + return approx; + } + + @Override + boolean compare_String(String string) { string = approxString(string); - String string2 = approxString((String) value2); - return string.equalsIgnoreCase(string2); + return string.equalsIgnoreCase(approx); } @Override - boolean compare_Character(char charval, Object value2) { + boolean compare_Character(char charval) { char charval2; try { - charval2 = ((String) value2).charAt(0); + charval2 = approx.charAt(0); } catch (IndexOutOfBoundsException e) { return false; } @@ -1404,7 +1251,7 @@ public abstract class FilterImpl implements Filter { @Override StringBuilder normalize(StringBuilder sb) { sb.append('(').append(attr).append('~').append('='); - return encodeValue(sb, approxString((String) value)).append(')'); + return encodeValue(sb, approx).append(')'); } /** @@ -1652,14 +1499,14 @@ public abstract class FilterImpl implements Filter { case '>' : { if (filterChars[pos + 1] == '=') { pos += 2; - return new FilterImpl.Greater(attr, parse_value(), debug); + return new FilterImpl.GreaterEqual(attr, parse_value(), debug); } break; } case '<' : { if (filterChars[pos + 1] == '=') { pos += 2; - return new FilterImpl.Less(attr, parse_value(), debug); + return new FilterImpl.LessEqual(attr, parse_value(), debug); } break; } @@ -1675,12 +1522,19 @@ public abstract class FilterImpl implements Filter { } pos++; - Object string = parse_substring(); + String[] substrings = parse_substring(); - if (string instanceof String) { - return new FilterImpl.Equal(attr, string, debug); + int length = substrings.length; + if (length == 0) { + return new FilterImpl.Equal(attr, "", debug); //$NON-NLS-1$ } - return new FilterImpl.Substring(attr, string, debug); + if (length == 1) { + String single = substrings[0]; + if (single != null) { + return new FilterImpl.Equal(attr, single, debug); + } + } + return new FilterImpl.Substring(attr, substrings, debug); } } @@ -1750,7 +1604,7 @@ public abstract class FilterImpl implements Filter { return sb.toString(); } - private Object parse_substring() throws InvalidSyntaxException { + private String[] parse_substring() throws InvalidSyntaxException { StringBuilder sb = new StringBuilder(filterChars.length - pos); List<String> operands = new ArrayList<>(10); @@ -1798,20 +1652,6 @@ public abstract class FilterImpl implements Filter { } } - int size = operands.size(); - - if (size == 0) { - return ""; //$NON-NLS-1$ - } - - if (size == 1) { - String single = operands.get(0); - - if (single != null) { - return single; - } - } - return operands.toArray(new String[0]); } |