/******************************************************************************* * Copyright (c) 2010, 2014 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Patrick Tasse - Initial API and implementation *******************************************************************************/ package fr.inria.linuxtools.tmf.core.filter.model; import java.text.NumberFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import fr.inria.linuxtools.tmf.core.event.ITmfEvent; import fr.inria.linuxtools.tmf.core.timestamp.TmfTimestamp; /** * Filter node for the comparison operation * * @version 1.0 * @author Patrick Tasse */ @SuppressWarnings("javadoc") public class TmfFilterCompareNode extends TmfFilterTreeNode { public static final String NODE_NAME = "COMPARE"; //$NON-NLS-1$ public static final String NOT_ATTR = "not"; //$NON-NLS-1$ public static final String FIELD_ATTR = "field"; //$NON-NLS-1$ public static final String RESULT_ATTR = "result"; //$NON-NLS-1$ public static final String TYPE_ATTR = "type"; //$NON-NLS-1$ public static final String VALUE_ATTR = "value"; //$NON-NLS-1$ /** * Supported comparison types */ public static enum Type { NUM, ALPHA, TIMESTAMP } private boolean fNot = false; private String fField; private int fResult; private Type fType = Type.NUM; private String fValue; private Number fValueNumber; private TmfTimestamp fValueTimestamp; /** * @param parent the parent node */ public TmfFilterCompareNode(ITmfFilterTreeNode parent) { super(parent); } /** * @return the NOT state */ public boolean isNot() { return fNot; } /** * @param not the NOT state */ public void setNot(boolean not) { this.fNot = not; } /** * @return the field name */ public String getField() { return fField; } /** * @param field the field name */ public void setField(String field) { this.fField = field; } /** * @return the compare result */ public int getResult() { return fResult; } /** * @param result the compare result */ public void setResult(int result) { this.fResult = result; } /** * @return the comparison type */ public Type getType() { return fType; } /** * @param type the comparison type */ public void setType(Type type) { this.fType = type; setValue(fValue); } /** * @return the comparison value */ public String getValue() { return fValue; } /** * @param value the comparison value */ public void setValue(String value) { this.fValue = value; fValueNumber = null; fValueTimestamp = null; if (value == null) { return; } if (fType == Type.NUM) { try { fValueNumber = NumberFormat.getInstance().parse(value).doubleValue(); } catch (ParseException e) { } } else if (fType == Type.TIMESTAMP) { try { fValueTimestamp = new TmfTimestamp((long) (1E9 * NumberFormat.getInstance().parse(value.toString()).doubleValue())); } catch (ParseException e) { } } } @Override public String getNodeName() { return NODE_NAME; } @Override public boolean matches(ITmfEvent event) { Object value = getFieldValue(event, fField); if (value == null) { return false ^ fNot; } if (fType == Type.NUM) { if (fValueNumber != null) { if (value instanceof Number) { double valueDouble = ((Number) value).doubleValue(); return (Double.compare(valueDouble, fValueNumber.doubleValue()) == fResult) ^ fNot; } try { double valueDouble = NumberFormat.getInstance().parse(value.toString()).doubleValue(); return (Double.compare(valueDouble, fValueNumber.doubleValue()) == fResult) ^ fNot; } catch (ParseException e) { } } } else if (fType == Type.ALPHA) { String valueString = value.toString(); int comp = valueString.compareTo(fValue.toString()); if (comp < -1) { comp = -1; } else if (comp > 1) { comp = 1; } return (comp == fResult) ^ fNot; } else if (fType == Type.TIMESTAMP) { if (fValueTimestamp != null) { if (value instanceof TmfTimestamp) { TmfTimestamp valueTimestamp = (TmfTimestamp) value; return (valueTimestamp.compareTo(fValueTimestamp, false) == fResult) ^ fNot; } try { TmfTimestamp valueTimestamp = new TmfTimestamp((long) (1E9 * NumberFormat .getInstance().parse(value.toString()).doubleValue())); return (valueTimestamp.compareTo(fValueTimestamp, false) == fResult) ^ fNot; } catch (ParseException e) { } } } return false ^ fNot; } @Override public List<String> getValidChildren() { return new ArrayList<>(0); } @Override public String toString() { String result = (fResult == 0 ? "= " : fResult < 0 ? "< " : "> "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ String open = (fType == Type.NUM ? "" : fType == Type.ALPHA ? "\"" : "["); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ String close = (fType == Type.NUM ? "" : fType == Type.ALPHA ? "\"" : "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ return fField + (fNot ? " not " : " ") + result + open + fValue + close; //$NON-NLS-1$ //$NON-NLS-2$ } @Override public ITmfFilterTreeNode clone() { TmfFilterCompareNode clone = (TmfFilterCompareNode) super.clone(); clone.fField = fField; clone.setValue(fValue); return clone; } }