info.jtrac.domain.ItemSearch.java Source code

Java tutorial

Introduction

Here is the source code for info.jtrac.domain.ItemSearch.java

Source

/*
 * Copyright 2002-2005 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package info.jtrac.domain;

import info.jtrac.Jtrac;
import static info.jtrac.domain.ColumnHeading.Name.*;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.wicket.PageParameters;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

/**
 * Object that holds filter criteria when searching for Items
 * and also creates a Hibernate Criteria query to pass to the DAO
 */
public class ItemSearch implements Serializable {

    private Space space; // if null, means aggregate across all spaces
    private User user; // this will be set in the case space is null

    private int pageSize = 25;
    private int currentPage;
    private long resultCount;
    private String sortFieldName = "id";
    private boolean sortDescending = true;
    private boolean showHistory;
    private boolean batchMode;

    private long selectedItemId;
    private String relatingItemRefId;
    private Collection<Long> itemIds;

    private List<ColumnHeading> columnHeadings;
    private Map<String, FilterCriteria> filterCriteriaMap = new LinkedHashMap<String, FilterCriteria>();

    private String defaultVisibleFlags;

    public ItemSearch(User user) {
        this.user = user;
        this.columnHeadings = ColumnHeading.getColumnHeadings();
        this.defaultVisibleFlags = getVisibleFlags();
    }

    public ItemSearch(Space space) {
        this.space = space;
        this.columnHeadings = ColumnHeading.getColumnHeadings(space);
        this.defaultVisibleFlags = getVisibleFlags();
    }

    public void initFromPageParameters(PageParameters params, User user, Jtrac jtrac) {
        showHistory = params.getBoolean("showHistory");
        pageSize = params.getInt("pageSize", 25);
        sortDescending = !params.getBoolean("sortAscending");
        sortFieldName = params.getString("sortFieldName", "id");
        for (Object o : params.keySet()) {
            String name = o.toString();
            if (ColumnHeading.isValidFieldOrColumnName(name)) {
                ColumnHeading ch = getColumnHeading(name);
                ch.loadFromQueryString(params.getString(name), user, jtrac);
            }
        }
        relatingItemRefId = params.getString("relatingItemRefId", null);
        String visibleFlags = params.getString("cols", null);
        if (visibleFlags != null) {
            int i = 0;
            for (ColumnHeading ch : columnHeadings) {
                if (i >= visibleFlags.length()) {
                    break;
                }
                char flag = visibleFlags.charAt(i);
                if (flag == '1') {
                    ch.setVisible(true);
                } else {
                    ch.setVisible(false);
                }
                i++;
            }
        }
    }

    private String getVisibleFlags() {
        StringBuilder visibleFlags = new StringBuilder();
        for (ColumnHeading ch : columnHeadings) {
            if (ch.isVisible()) {
                visibleFlags.append("1");
            } else {
                visibleFlags.append("0");
            }
        }
        return visibleFlags.toString();
    }

    public PageParameters getAsQueryString() {
        Map<String, String> map = new HashMap<String, String>();
        if (space != null) {
            map.put("s", space.getId() + "");
        }
        for (ColumnHeading ch : columnHeadings) {
            String s = ch.getAsQueryString();
            if (s != null) {
                map.put(ch.getNameText(), s);
            }
        }
        String visibleFlags = getVisibleFlags();
        if (!visibleFlags.equals(defaultVisibleFlags)) {
            map.put("cols", visibleFlags.toString());
        }
        if (showHistory) {
            map.put("showHistory", "true");
        }
        if (pageSize != 25) {
            map.put("pageSize", pageSize + "");
        }
        if (!sortDescending) {
            map.put("sortAscending", "true");
        }
        if (!sortFieldName.equals("id")) {
            map.put("sortFieldName", sortFieldName);
        }
        if (relatingItemRefId != null) {
            map.put("relatingItemRefId", relatingItemRefId);
        }
        return new PageParameters(map);
    }

    private DetachedCriteria parent; // temp working variable hack

    // have to do this two step process as "order by" clause conflicts with "count (*)" clause
    // so the DAO has to use getCriteriaForCount() separately
    public DetachedCriteria getCriteria() {
        DetachedCriteria criteria = getCriteriaForCount();
        if (sortFieldName == null) { // can happen only for multi-space search
            sortFieldName = "id"; // effectively is a sort on created date
        }
        if (sortFieldName.equals("id") || sortFieldName.equals("space")) {
            if (showHistory) {
                // if showHistory: sort by item.id and then history.id
                if (sortDescending) {
                    if (space == null) {
                        DetachedCriteria parentSpace = parent.createCriteria("space");
                        parentSpace.addOrder(Order.desc("name"));
                    }
                    criteria.addOrder(Order.desc("parent.id"));
                    criteria.addOrder(Order.desc("id"));
                } else {
                    if (space == null) {
                        DetachedCriteria parentSpace = parent.createCriteria("space");
                        parentSpace.addOrder(Order.asc("name"));
                    }
                    criteria.addOrder(Order.asc("parent.id"));
                    criteria.addOrder(Order.asc("id"));
                }
            } else {
                if (sortDescending) {
                    if (space == null) {
                        DetachedCriteria parentSpace = criteria.createCriteria("space");
                        parentSpace.addOrder(Order.desc("name"));
                    }
                    criteria.addOrder(Order.desc("id"));
                } else {
                    if (space == null) {
                        DetachedCriteria parentSpace = criteria.createCriteria("space");
                        parentSpace.addOrder(Order.asc("name"));
                    }
                    criteria.addOrder(Order.asc("id"));
                }
            }
        } else {
            if (sortDescending) {
                criteria.addOrder(Order.desc(sortFieldName));
            } else {
                criteria.addOrder(Order.asc(sortFieldName));
            }
        }
        return criteria;
    }

    public DetachedCriteria getCriteriaForCount() {
        DetachedCriteria criteria = null;
        if (showHistory) {
            criteria = DetachedCriteria.forClass(History.class);
            // apply restrictions to parent, this is an inner join =============
            parent = criteria.createCriteria("parent");
            if (space == null) {
                parent.add(Restrictions.in("space", getSelectedSpaces()));
            } else {
                parent.add(Restrictions.eq("space", space));
            }
            if (itemIds != null) {
                parent.add(Restrictions.in("id", itemIds));
            }
        } else {
            criteria = DetachedCriteria.forClass(Item.class);
            if (space == null) {
                criteria.add(Restrictions.in("space", getSelectedSpaces()));
            } else {
                criteria.add(Restrictions.eq("space", space));
            }
            if (itemIds != null) {
                criteria.add(Restrictions.in("id", itemIds));
            }
        }
        for (ColumnHeading ch : columnHeadings) {
            ch.addRestrictions(criteria);
        }
        return criteria;
    }

    public List<Field> getFields() {
        if (space == null) {
            List<Field> list = new ArrayList<Field>(2);
            Field severity = new Field(Field.Name.SEVERITY);
            severity.initOptions();
            list.add(severity);
            Field priority = new Field(Field.Name.PRIORITY);
            priority.initOptions();
            list.add(priority);
            return list;
        } else {
            return space.getMetadata().getFieldList();
        }
    }

    private ColumnHeading getColumnHeading(ColumnHeading.Name name) {
        for (ColumnHeading ch : columnHeadings) {
            if (ch.getName() == name) {
                return ch;
            }
        }
        return null;
    }

    private ColumnHeading getColumnHeading(String name) {
        for (ColumnHeading ch : columnHeadings) {
            if (ch.getNameText().equals(name)) {
                return ch;
            }
        }
        return null;
    }

    private String getStringValue(ColumnHeading ch) {
        String s = (String) ch.getFilterCriteria().getValue();
        if (s == null || s.trim().length() == 0) {
            ch.getFilterCriteria().setExpression(null);
            return null;
        }
        return s;
    }

    public String getRefId() {
        ColumnHeading ch = getColumnHeading(ID);
        return getStringValue(ch);
    }

    public String getSearchText() {
        ColumnHeading ch = getColumnHeading(DETAIL);
        return getStringValue(ch);
    }

    public Collection<Space> getSelectedSpaces() {
        ColumnHeading ch = getColumnHeading(SPACE);
        List values = ch.getFilterCriteria().getValues();
        if (values == null || values.size() == 0) {
            ch.getFilterCriteria().setExpression(null);
            return user.getSpaces();
        }
        return values;
    }

    public void toggleSortDirection() {
        sortDescending = !sortDescending;
    }

    private List getSingletonList(Object o) {
        List list = new ArrayList(1);
        list.add(o);
        return list;
    }

    public void setLoggedBy(User loggedBy) {
        ColumnHeading ch = getColumnHeading(LOGGED_BY);
        ch.getFilterCriteria().setExpression(FilterCriteria.Expression.IN);
        ch.getFilterCriteria().setValues(getSingletonList(loggedBy));
    }

    public void setAssignedTo(User assignedTo) {
        ColumnHeading ch = getColumnHeading(ASSIGNED_TO);
        ch.getFilterCriteria().setExpression(FilterCriteria.Expression.IN);
        ch.getFilterCriteria().setValues(getSingletonList(assignedTo));
    }

    public void setStatus(int i) {
        ColumnHeading ch = getColumnHeading(STATUS);
        ch.getFilterCriteria().setExpression(FilterCriteria.Expression.IN);
        ch.getFilterCriteria().setValues(getSingletonList(i));
    }

    public List<ColumnHeading> getColumnHeadingsToRender() {
        List<ColumnHeading> list = new ArrayList<ColumnHeading>(columnHeadings.size());
        for (ColumnHeading ch : columnHeadings) {
            if (ch.isVisible()) {
                list.add(ch);
            }
        }
        return list;
    }

    //==========================================================================

    public boolean isBatchMode() {
        return batchMode;
    }

    public void setBatchMode(boolean batchMode) {
        this.batchMode = batchMode;
    }

    public Space getSpace() {
        return space;
    }

    public void setSpace(Space space) {
        this.space = space;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    public long getResultCount() {
        return resultCount;
    }

    public void setResultCount(long resultCount) {
        this.resultCount = resultCount;
    }

    public String getSortFieldName() {
        return sortFieldName;
    }

    public void setSortFieldName(String sortFieldName) {
        this.sortFieldName = sortFieldName;
    }

    public boolean isSortDescending() {
        return sortDescending;
    }

    public void setSortDescending(boolean sortDescending) {
        this.sortDescending = sortDescending;
    }

    public boolean isShowHistory() {
        return showHistory;
    }

    public void setShowHistory(boolean showHistory) {
        this.showHistory = showHistory;
    }

    public long getSelectedItemId() {
        return selectedItemId;
    }

    public void setSelectedItemId(long selectedItemId) {
        this.selectedItemId = selectedItemId;
    }

    public String getRelatingItemRefId() {
        return relatingItemRefId;
    }

    public void setRelatingItemRefId(String relatingItemRefId) {
        this.relatingItemRefId = relatingItemRefId;
    }

    public Collection<Long> getItemIds() {
        return itemIds;
    }

    public void setItemIds(Collection<Long> itemIds) {
        this.itemIds = itemIds;
    }

    public List<ColumnHeading> getColumnHeadings() {
        return columnHeadings;
    }

    public void setColumnHeadings(List<ColumnHeading> columnHeadings) {
        this.columnHeadings = columnHeadings;
    }

    public Map<String, FilterCriteria> getFilterCriteriaMap() {
        return filterCriteriaMap;
    }

    public void setFilterCriteriaMap(Map<String, FilterCriteria> filterCriteriaMap) {
        this.filterCriteriaMap = filterCriteriaMap;
    }

}