001 /* 002 @license.text@ 003 */ 004 005 package biz.hammurapi.util; 006 007 import java.util.Collection; 008 import java.util.LinkedList; 009 010 import biz.hammurapi.RuntimeException; 011 012 /** 013 * @author Pavel Vlasov 014 * @version $Revision: 1.3 $ 015 */ 016 public abstract class AbstractSearchable implements Visitable, Searchable { 017 018 public Object find(final Acceptor acceptor) { 019 /** 020 * Doesn't indicate problem, but carries found object. 021 */ 022 class ReturnException extends RuntimeException { 023 /** 024 * Comment for <code>serialVersionUID</code> 025 */ 026 private static final long serialVersionUID = 358344825019870509L; 027 Object found; 028 029 ReturnException(Object found) { 030 this.found=found; 031 } 032 } 033 034 try { 035 accept(new Visitor() { 036 public boolean visit(Object target) { 037 if (acceptor.accept(target)) { 038 throw new ReturnException(target); 039 } 040 return true; 041 } 042 }); 043 return null; 044 } catch (ReturnException e) { 045 return e.found; 046 } 047 } 048 049 public Collection findAll(final Acceptor acceptor) { 050 final Collection ret=new LinkedList(); 051 accept(new Visitor() { 052 public boolean visit(Object target) { 053 if (acceptor.accept(target)) { 054 ret.add(target); 055 } 056 return true; 057 } 058 }); 059 return ret; 060 } 061 }