/* * Copyright 2004-2008 IDCA. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the * following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and * the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions * and the following disclaimer in the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the authors and * should not be interpreted as representing official policies, either expressed or implied, of IDCA. */ package com.idcanet.vasc.impl; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import com.idcanet.vasc.core.AbstractVascBackendProxy; import com.idcanet.vasc.core.VascBackend; import com.idcanet.vasc.core.VascBackendPageNumber; import com.idcanet.vasc.core.VascEntry; /** * Simple text search * * @author Willem Cazander * @version 1.0 Oct 27, 2007 */ public class VascBackendProxySearch extends AbstractVascBackendProxy { private long records = 0; public VascBackendProxySearch(VascBackend backend,VascEntry entry) { super(backend); } /** * @see com.idcanet.vasc.core.VascBackend#isSearchable() */ @Override public boolean isSearchable() { return true; } /** * @see com.idcanet.vasc.core.VascBackend#execute() */ @Override public List execute() throws Exception { List result = backend.execute(); if (getSearchString()==null) { records = backend.getPagesTotalRecords(); return result; } String searchString = getSearchString().toLowerCase(); List search = new ArrayList(result.size()/4); for (Object o:result) { for (Method method:o.getClass().getMethods()) { if (method.getName().startsWith("get")==false) { //a bit durty continue; } if (method.getName().equals("getClass")) { continue; } if (method.getReturnType().isAssignableFrom(Collection.class)) { continue; } if (method.getReturnType().isAssignableFrom(List.class)) { continue; } if (method.getReturnType().isAssignableFrom(Set.class)) { continue; } if (method.getReturnType().isAssignableFrom(Map.class)) { continue; } Object res = method.invoke(o,null); if (res==null) { continue; } String r = res.toString().toLowerCase(); if (r.contains(searchString)) { search.add(o); break; } } } records = search.size(); return search; } @Override public long getPagesTotalRecords() { return records; } @Override public List getVascBackendPageNumbers() { if (getSearchString()==null) { return backend.getVascBackendPageNumbers(); } // limit the pages to the number of search results. List r = backend.getVascBackendPageNumbers(); int pages = new Long(getPagesTotalRecords()/getPageSize()).intValue(); return r.subList(0, pages); } }