/*
* Copyright 2014 Brian Pellin.
*
* This file is part of KeePassDroid.
*
* KeePassDroid 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.
*
* KeePassDroid 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 KeePassDroid. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.database;
import java.util.Date;
import java.util.List;
import com.keepassdroid.database.iterator.EntrySearchStringIterator;
public abstract class EntrySearchHandler extends EntryHandler<PwEntry> {
private List<PwEntry> listStorage;
private SearchParameters sp;
private Date now;
public static EntrySearchHandler getInstance(PwGroup group, SearchParameters sp, List<PwEntry> listStorage) {
if (group instanceof PwGroupV3) {
return new EntrySearchHandlerV4(sp, listStorage);
} else if (group instanceof PwGroupV4) {
return new EntrySearchHandlerV4(sp, listStorage);
} else {
throw new RuntimeException("Not implemented.");
}
}
protected EntrySearchHandler(SearchParameters sp, List<PwEntry> listStorage) {
this.sp = sp;
this.listStorage = listStorage;
now = new Date();
}
@Override
public boolean operate(PwEntry entry) {
if (sp.respectEntrySearchingDisabled && !entry.isSearchingEnabled()) {
return true;
}
if (sp.excludeExpired && entry.expires() && now.after(entry.getExpiryTime())) {
return true;
}
String term = sp.searchString;
if (sp.ignoreCase) {
term = term.toLowerCase();
}
if (searchStrings(entry, term)) {
listStorage.add(entry);
return true;
}
if (sp.searchInGroupNames) {
PwGroup parent = entry.getParent();
if (parent != null) {
String groupName = parent.getName();
if (groupName != null) {
if (sp.ignoreCase) {
groupName = groupName.toLowerCase();
}
if (groupName.indexOf(term) >= 0) {
listStorage.add(entry);
return true;
}
}
}
}
if (searchID(entry)) {
listStorage.add(entry);
return true;
}
return true;
}
protected boolean searchID(PwEntry entry) {
return false;
}
private boolean searchStrings(PwEntry entry, String term) {
EntrySearchStringIterator iter = EntrySearchStringIterator.getInstance(entry, sp);
while (iter.hasNext()) {
String str = iter.next();
if (str != null & str.length() > 0) {
if (sp.ignoreCase) {
str = str.toLowerCase();
}
if (str.indexOf(term) >= 0) {
return true;
}
}
}
return false;
}
}