/* * 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.VascBackendState; import com.idcanet.vasc.core.VascEntry; import com.idcanet.vasc.core.VascException; /** * 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(VascBackendState state) */ @Override public List<Object> execute(VascBackendState state) throws VascException { List<Object> result = backend.execute(state); if (state.getSearchString()==null) { if (backend.isPageable()) { records = backend.fetchTotalExecuteSize(state); } else { records = result.size(); } return result; } String searchString = state.getSearchString().toLowerCase(); List<Object> search = new ArrayList<Object>(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; try { res = method.invoke(o,new Object[]{}); } catch (Exception e) { throw new VascException(e); } 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 fetchTotalExecuteSize(VascBackendState state) { return records; } }