/* *------------------------------------------------------------------------------ * Copyright (C) 2006-2015 University of Dundee. All rights reserved. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.env.data.util; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import omero.gateway.model.TagAnnotationData; import omero.gateway.model.TextualAnnotationData; /** * Helper class storing the filtering parameters. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author Donald MacDonald      * <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a> * @version 3.0 * @since OME3.0 */ public class FilterContext { /** Indicates that the rating context only is selected. */ public static final int RATE = 0; /** Indicates that the tag context only is selected. */ public static final int TAG = 1; /** Indicates that the comment context only is selected. */ public static final int COMMENT = 2; /** Indicates that several context are selected. */ public static final int MULTI = 3; /** Indicates that no contexts selected. */ public static final int NONE = 4; /** Indicates that the name context selected. */ public static final int NAME = 5; /** Indicates that the ROI context selected. */ public static final int ROI = 6; /** Indicate to retrieve objects with a value greater than the passed level. */ public static final int GREATER_EQUAL = 0; /** Indicate to retrieve objects with a value lower than the passed level. */ public static final int LOWER_EQUAL = 1; /** Indicate to retrieve objects rated with passed level. */ public static final int EQUAL = 2; /** Indicate to retrieve the union of the all parameters. */ public static final int UNION = 100; /** Indicate to retrieve the union of the all parameters. */ public static final int INTERSECTION = 101; /** The selected rating level. */ private int rate; /** The selected number of ROIs */ private int rois; /** One of the constants defined by this class. */ private int rateIndex; /** One of the constants defined by this class. */ private int roiIndex; /** The collection of annotation type. */ private Map<Class, List<String>> annotationType; /** The lower bound of the time interval. */ private Timestamp fromDate; /** The upper bound of the time interval. */ private Timestamp toDate; /** The type of result either: {@link #UNION} or {@link #INTERSECTION}. */ private int resultType; /** The type of filter. */ private List<Integer> type; /** The collection of name to filter by. */ private List<String> names; /** The time interval to check.*/ private int timeType; /** Creates a new instance. */ public FilterContext() { annotationType = new HashMap<Class, List<String>>(); rate = -1; rateIndex = -1; rois = -1; roiIndex = GREATER_EQUAL; resultType = INTERSECTION; type = new ArrayList<Integer>(); } /** * Returns <code>true</code> if it is only filtered by name, * <code>false</code> otherwise. * * @return See above. */ public boolean isNameOnly() { int size = type.size(); if (size > 1) return false; return type.contains(NAME); } /** * Returns <code>true</code> if it is only filtered by name, * <code>false</code> otherwise. * * @return See above. */ public boolean isTagsOnly() { int size = type.size(); if (size > 1) return false; return type.contains(TAG); } /** * Returns one of the following constants: {@link #RATE}, {@link #TAG} or * {@link #COMMENT}, {@link #NAME}, {@link #ROI} or * <code>-1</code> when more than one type is selected. * * @return See above. */ public int getContext() { int size = type.size(); if (size == 0) return NONE; if (size > 1) return MULTI; return type.get(0); } /** * Returns the type of filter used if any. * * @return See above. */ public List<Integer> getContextList() { return type; } /** * Sets the result type. * * @param type The value to set. */ public void setResultType(int type) { switch (type) { case UNION: case INTERSECTION: resultType = type; break; default: resultType = INTERSECTION; } } /** * Returns the result type. * * @return See above. */ public int getResultType() { return resultType; } /** * Sets the rating index and the selected rate. * * @param index One of the constants defined by this class. * @param rate The selected rating index. A value between 0 and 5. */ public void setRate(int index, int rate) { switch (index) { case LOWER_EQUAL: case GREATER_EQUAL: case EQUAL: this.rateIndex = index; break; default: this.rateIndex = GREATER_EQUAL; } this.rate = rate; type.add(RATE); } /** * Sets the ROI index and the selected number of ROIs. * * @param index One of the constants defined by this class. * @param rois The selected number of ROIs. */ public void setRois(int index, int rois) { this.roiIndex = index; this.rois = rois; type.add(ROI); } /** * Sets the time interval. * * @param fromDate The lower bound of the time interval. * @param toDate The upper bound of the time interval. */ public void setTimeInterval(Timestamp fromDate, Timestamp toDate) { if (fromDate != null && toDate != null && fromDate.after(toDate)) { this.fromDate = toDate; this.toDate = fromDate; } else { this.fromDate = fromDate; this.toDate = toDate; } } /** * Sets the time interval to check. * * @param type The value to set. */ public void setTimeType(int type) { timeType = type; } /** * Return the time interval to check. * * @return See above. */ public int getTimeType() { return timeType; } /** * Returns the lower bound of the time interval. * * @return See above */ public Timestamp getFromDate() { return fromDate; } /** * Returns the upper bound of the time interval. * * @return See above */ public Timestamp getToDate() { return toDate; } /** * Returns the selected rate. * * @return See above. */ public int getRate() { return rate; } /** * Returns the selected number of ROIs. * * @return See above. */ public int getROIs() { return rois; } /** * Returns one of rating filtering constants defined by this class. * * @return See above. */ public int getRateIndex() { return rateIndex; } /** * Returns one of rating filtering constants defined by this class. * * @return See above. */ public int getRoiIndex() { return roiIndex; } /** * Returns the collection of annotations contained text to filter * by. * * @return See above. */ public Map<Class, List<String>> getAnnotationType() { return annotationType; } /** * Returns the collection of terms corresponding to the passed type * of annotation. * * @param klass The type of annotation. * @return See above. */ public List<String> getAnnotation(Class klass) { return annotationType.get(klass); } /** * Adds the specified type to the collection of types. * * @param klass The type to add. * @param terms The terms related to the annotation type. */ public void addAnnotationType(Class klass, List<String> terms) { if (klass != null && terms != null && terms.size() > 0) { if (klass.equals(TagAnnotationData.class)) type.add(TAG); else if (klass.equals(TextualAnnotationData.class)) type.add(COMMENT); annotationType.put(klass, terms); } } /** * Adds the name to filter by. * * @param terms The collection of name. */ public void addName(List<String> terms) { if (terms == null || terms.size() == 0) return; type.add(NAME); names = terms; } /** * Returns the collection of names to filter by. * * @return See above. */ public List<String> getNames() { return names; } }