/*
* @(#)SearchAnnouncementProcess.java
*
* Copyright 2009 Instituto Superior Tecnico
* Founding Authors: Luis Cruz, Nuno Ochoa, Paulo Abrantes
*
* https://fenix-ashes.ist.utl.pt/
*
* This file is part of the Expenditure Tracking Module.
*
* The Expenditure Tracking Module 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
* 3 of the License, or (at your option) any later version.
*
* The Expenditure Tracking Module 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Expenditure Tracking Module. If not, see <http://www.gnu.org/licenses/>.
*
*/
package pt.ist.expenditureTrackingSystem.domain.announcements;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import module.finance.util.Money;
import org.apache.commons.lang.StringUtils;
import org.fenixedu.commons.StringNormalizer;
import pt.ist.expenditureTrackingSystem.domain.Search;
import pt.ist.expenditureTrackingSystem.domain.organization.Person;
import pt.ist.expenditureTrackingSystem.domain.processes.GenericProcess;
/**
*
* @author Paulo Abrantes
* @author Luis Cruz
*
*/
public class SearchAnnouncementProcess extends Search<AnnouncementProcess> {
private String publisherName;
private String supplierName;
private Money totalPrice;
private String requestingUnitName;
private AnnouncementProcessStateType processStateType;
private class SearchAnnouncementResult extends SearchResultSet<AnnouncementProcess> {
public SearchAnnouncementResult(Collection<? extends AnnouncementProcess> c) {
super(c);
}
@Override
protected boolean matchesSearchCriteria(final AnnouncementProcess announcementProcess) {
final Person loggedPerson = Person.getLoggedPerson();
return announcementProcess.isVisible(loggedPerson) && matchCriteria(announcementProcess);
}
private boolean matchCriteria(AnnouncementProcess announcementProcess) {
CCPAnnouncement a = announcementProcess.getAnnouncement();
return matchCriteria(a.getPublisher().getUser().getName(), getPublisherName())
&& matchCriteria(a.getSupplier().getName(), getSupplierName())
&& matchCriteria(a.getTotalPrice(), getTotalPrice())
&& matchCriteria(a.getRequestingUnitName(), getRequestingUnitName())
&& matchCriteria(announcementProcess.getAnnouncementProcessStateType(), getProcessStateType());
}
private boolean matchCriteria(final AnnouncementProcessStateType value, final AnnouncementProcessStateType criteria) {
return criteria == null || value == criteria;
}
protected boolean matchCriteria(Money recordPrice, Money inputPrice) {
return inputPrice == null || recordPrice.isLessThanOrEqual(inputPrice);
}
@Override
protected boolean matchCriteria(String recordName, String inputName) {
inputName = inputName.trim();
if (StringUtils.isEmpty(recordName) && !StringUtils.isEmpty(inputName)) {
return false;
}
if (StringUtils.isEmpty(inputName)) {
return true;
}
recordName = StringNormalizer.normalize(recordName);
inputName = StringNormalizer.normalize(inputName);
String[] recordNameArray = recordName.split(" ");
for (String inputString : recordNameArray) {
if (inputString.trim().indexOf(inputName) >= 0) {
return true;
}
}
return false;
}
}
@Override
public Set<AnnouncementProcess> search() {
try {
return hasAnyCriteria() ? new SearchAnnouncementResult(GenericProcess.getAllProcesses(AnnouncementProcess.class)) : Collections.EMPTY_SET;
} catch (Exception ex) {
ex.printStackTrace();
throw new Error(ex);
}
}
protected boolean hasAnyCriteria() {
return hasCriteria(publisherName) || hasCriteria(supplierName) || totalPrice != null || hasCriteria(requestingUnitName)
|| processStateType != null;
}
protected boolean hasCriteria(String criteria) {
return !StringUtils.isEmpty(criteria);
}
public String getPublisherName() {
return publisherName;
}
public void setPublisherName(String publisherName) {
this.publisherName = publisherName;
}
public String getSupplierName() {
return supplierName;
}
public void setSupplierName(String supplierName) {
this.supplierName = supplierName;
}
public Money getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(Money totalPrice) {
this.totalPrice = totalPrice;
}
public String getRequestingUnitName() {
return requestingUnitName;
}
public void setRequestingUnitName(String requestingUnitName) {
this.requestingUnitName = requestingUnitName;
}
public AnnouncementProcessStateType getProcessStateType() {
return processStateType;
}
public void setProcessStateType(AnnouncementProcessStateType processStateType) {
this.processStateType = processStateType;
}
}