main.java.info.jtrac.domain.ItemSearch.java Source code

Java tutorial

Introduction

Here is the source code for main.java.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 main.java.info.jtrac.domain;

import static main.java.info.jtrac.Constants.*;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.wicket.Component;
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 showDetail;

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

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

    public ItemSearch(User user, Component c) {
        this.user = user;
        this.columnHeadings = ColumnHeading.getColumnHeadings(user);
    }

    public ItemSearch(Space space, Component c) {
        this.space = space;
        this.columnHeadings = ColumnHeading.getColumnHeadings(space);
    }

    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, this);
        }
        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(String name) {
        for (ColumnHeading ch : columnHeadings) {
            if (ch.getName().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(ColumnHeading.ID);
        return getStringValue(ch);
    }

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

    public Collection<Space> getSelectedSpaces() {
        ColumnHeading ch = getColumnHeading(ColumnHeading.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(ColumnHeading.LOGGED_BY);
        ch.getFilterCriteria().setExpression(FilterCriteria.Expression.IN);
        ch.getFilterCriteria().setValues(getSingletonList(loggedBy));
    }

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

    public void setStatus(int i) {
        ColumnHeading ch = getColumnHeading(ColumnHeading.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 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 boolean isShowDetail() {
        return showDetail;
    }

    public void setShowDetail(boolean showDetail) {
        this.showDetail = showDetail;
    }

    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;
    }

}