/*
* File : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.formgenerator/src/com/alkacon/opencms/formgenerator/database/CmsFormDatabaseFilter.java,v $
* Date : $Date: 2010/05/21 13:49:27 $
* Version: $Revision: 1.3 $
*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) 2010 Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.alkacon.opencms.formgenerator.database;
import org.opencms.file.CmsResource;
import org.opencms.util.CmsUUID;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* A filter to retrieve web form data.<p>
*
* @author Michael Moossen
*
* @version $Revision: 1.3 $
*
* @since 7.0.5
*/
public final class CmsFormDatabaseFilter implements Cloneable {
/** Constant to ignore start date. */
public static final long DATE_IGNORE_FROM = CmsResource.DATE_RELEASED_DEFAULT;
/** Constant to ignore end date. */
public static final long DATE_IGNORE_TO = CmsResource.DATE_EXPIRED_DEFAULT;
/** To filter all forms. */
public static final CmsFormDatabaseFilter DEFAULT = new CmsFormDatabaseFilter(false);
/** To filter all forms, as headers. */
public static final CmsFormDatabaseFilter HEADERS = new CmsFormDatabaseFilter(true);
/** Constant to ignore index from. */
public static final int INDEX_IGNORE_FROM = 0;
/** Constant to ignore index to. */
public static final int INDEX_IGNORE_TO = Integer.MAX_VALUE;
/** To filter forms older than the given date. */
private long m_dateFrom = DATE_IGNORE_FROM;
/** To filter forms newer than the given date. */
private long m_dateTo = DATE_IGNORE_TO;
/** To filter forms for a given entry id. */
private int m_entryId;
/** The fields to filter. */
private Map<String, String> m_fields = new HashMap<String, String>();
/** To filter forms for a given form id. */
private String m_formId;
/** To return only form headers, or full forms. */
private final boolean m_headersOnly;
/** To filter forms starting from the given index. */
private int m_indexFrom = INDEX_IGNORE_FROM;
/** To filter forms ending with the given index. */
private int m_indexTo = INDEX_IGNORE_TO;
/** If ascending order, descending order otherwise. */
private boolean m_orderAsc;
/** To filter forms for a given resource id. */
private CmsUUID m_resourceId;
/** The states to filter. */
private Set<Integer> m_states = new HashSet<Integer>();
/**
* Private constructor.<p>
*
* @param headersOnly if returning only form headers, or full forms
*/
private CmsFormDatabaseFilter(boolean headersOnly) {
m_headersOnly = headersOnly;
}
/**
* @see java.lang.Object#clone()
*/
@Override
public Object clone() {
CmsFormDatabaseFilter filter = new CmsFormDatabaseFilter(m_headersOnly);
filter.m_entryId = m_entryId;
filter.m_formId = m_formId;
filter.m_resourceId = m_resourceId;
filter.m_dateFrom = m_dateFrom;
filter.m_dateTo = m_dateTo;
filter.m_indexFrom = m_indexFrom;
filter.m_indexTo = m_indexTo;
filter.m_states = new HashSet<Integer>(m_states);
filter.m_fields = new HashMap<String, String>(m_fields);
filter.m_orderAsc = m_orderAsc;
return filter;
}
/**
* Returns an extended filter with the given dates restriction.<p>
*
* @param from the start date to filter
* @param to the end date to filter
*
* @return an extended filter with the given dates restriction
*/
public CmsFormDatabaseFilter filterDate(long from, long to) {
CmsFormDatabaseFilter filter = (CmsFormDatabaseFilter)this.clone();
filter.m_dateFrom = from;
filter.m_dateTo = to;
return filter;
}
/**
* Returns an extended filter with the given entry id restriction.<p>
*
* @param entryId the entry id to filter
*
* @return an extended filter with the given entry id restriction
*/
public CmsFormDatabaseFilter filterEntryId(int entryId) {
CmsFormDatabaseFilter filter = (CmsFormDatabaseFilter)this.clone();
filter.m_entryId = entryId;
return filter;
}
/**
* Returns an extended filter with the given field/value pair restriction.<p>
*
* @param field the field to filter
* @param value the value to filter
*
* @return an extended filter with the given field/value pair restriction
*/
public CmsFormDatabaseFilter filterField(String field, String value) {
CmsFormDatabaseFilter filter = (CmsFormDatabaseFilter)this.clone();
filter.m_fields.put(field, value);
return filter;
}
/**
* Returns an extended filter with the given form id restriction.<p>
*
* @param formId the form id to filter
*
* @return an extended filter with the given form id restriction
*/
public CmsFormDatabaseFilter filterFormId(String formId) {
CmsFormDatabaseFilter filter = (CmsFormDatabaseFilter)this.clone();
filter.m_formId = formId;
return filter;
}
/**
* Returns an extended filter with the given index restriction.<p>
*
* @param from the starting index to filter
* @param to the ending index to filter
*
* @return an extended filter with the given index restriction
*/
public CmsFormDatabaseFilter filterIndex(int from, int to) {
CmsFormDatabaseFilter filter = (CmsFormDatabaseFilter)this.clone();
filter.m_indexFrom = from;
filter.m_indexTo = to;
return filter;
}
/**
* Returns an extended filter with asc ordering.<p>
*
* @return an extended filter with asc ordering
*/
public CmsFormDatabaseFilter filterOrderAsc() {
CmsFormDatabaseFilter filter = (CmsFormDatabaseFilter)this.clone();
filter.m_orderAsc = true;
return filter;
}
/**
* Returns an extended filter with desc ordering.<p>
*
* @return an extended filter with desc ordering
*/
public CmsFormDatabaseFilter filterOrderDesc() {
CmsFormDatabaseFilter filter = (CmsFormDatabaseFilter)this.clone();
filter.m_orderAsc = false;
return filter;
}
/**
* Returns an extended filter with the given resource id restriction.<p>
*
* @param resourceId the resource id to filter
*
* @return an extended filter with the given resource id restriction
*/
public CmsFormDatabaseFilter filterResourceId(CmsUUID resourceId) {
CmsFormDatabaseFilter filter = (CmsFormDatabaseFilter)this.clone();
filter.m_resourceId = resourceId;
return filter;
}
/**
* Returns an extended filter with the given state restriction.<p>
*
* @param state the state to filter
*
* @return an extended filter with the given state restriction
*/
public CmsFormDatabaseFilter filterState(int state) {
CmsFormDatabaseFilter filter = (CmsFormDatabaseFilter)this.clone();
filter.m_states.add(new Integer(state));
return filter;
}
/**
* Returns the end Date.<p>
*
* @return the end Date
*/
public long getDateEnd() {
return m_dateTo;
}
/**
* Returns the entry Id.<p>
*
* @return the entry Id
*/
public int getEntryId() {
return m_entryId;
}
/**
* Returns the fields to filter.<p>
*
* @return the fields to filter
*/
public Map<String, String> getFields() {
return Collections.unmodifiableMap(m_fields);
}
/**
* Returns the form id restriction.<p>
*
* @return the form id restriction
*/
public String getFormId() {
return m_formId;
}
/**
* Returns the index From.<p>
*
* @return the index From
*/
public int getIndexFrom() {
return m_indexFrom;
}
/**
* Returns the index To.<p>
*
* @return the index To
*/
public int getIndexTo() {
return m_indexTo;
}
/**
* Returns the resource id to filter.<p>
*
* @return the resource id to filter
*/
public CmsUUID getResourceId() {
return m_resourceId;
}
/**
* Returns the start Date.<p>
*
* @return the start Date
*/
public long getStartDate() {
return m_dateFrom;
}
/**
* Returns the states to filter.<p>
*
* @return the states to filter
*/
public Set<Integer> getStates() {
return Collections.unmodifiableSet(m_states);
}
/**
* Checks if returning only form headers, or full forms.<p>
*
* @return <code>true</code> if returning only form headers
*/
public boolean isHeadersOnly() {
return m_headersOnly;
}
/**
* Checks if the order is ascending.<p>
*
* @return <code>true</code> if the order is ascending
*/
public boolean isOrderAsc() {
return m_orderAsc;
}
/**
* Checks if the given field/value pair matches this filter.<p>
*
* @param field the field to test
* @param value the value to test
*
* @return if the given field/value pair matches this filter
*/
public boolean matchField(String field, String value) {
if (m_fields.isEmpty()) {
return true;
}
if (m_fields.keySet().contains(field)) {
if (value == null) {
return true;
}
return m_fields.get(field).equals(value);
}
return false;
}
/**
* Checks if the given state matches this filter.<p>
*
* @param state the state to test
*
* @return if the given state matches this filter
*/
public boolean matchState(int state) {
if (m_states.isEmpty()) {
return true;
}
return m_states.contains(new Integer(state));
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuffer str = new StringBuffer(128);
str.append("[");
str.append("headersOnly").append("=").append(m_headersOnly);
if (m_entryId != 0) {
str.append(", ").append("entryId").append("=").append(m_entryId);
}
if (m_formId != null) {
str.append(", ").append("formId").append("=").append(m_formId);
}
if (m_resourceId != null) {
str.append(", ").append("resourceId").append("=").append(m_resourceId);
}
if (m_dateFrom != DATE_IGNORE_FROM) {
str.append(", ").append("startDate").append("=").append(m_dateFrom);
}
if (m_dateTo != DATE_IGNORE_TO) {
str.append(", ").append("endDate").append("=").append(m_dateTo);
}
if (m_indexFrom != INDEX_IGNORE_FROM) {
str.append(", ").append("indexFrom").append("=").append(m_indexFrom);
}
if (m_indexTo != INDEX_IGNORE_TO) {
str.append(", ").append("indexTo").append("=").append(m_indexTo);
}
if (!m_states.isEmpty()) {
str.append(", ").append("states").append("=").append(m_states);
}
if (!m_fields.isEmpty()) {
str.append(", ").append("fields").append("=").append(m_fields);
}
str.append("]");
return str.toString();
}
}