diff --git a/scm-core/src/main/java/sonia/scm/Filter.java b/scm-core/src/main/java/sonia/scm/Filter.java new file mode 100644 index 0000000000..1703bc5e59 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/Filter.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * 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. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE REGENTS 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. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm; + +/** + * + * @author Sebastian Sdorra + * + * @param + */ +public interface Filter +{ + + /** + * Method description + * + * + * @param item + * + * @return + */ + public boolean accept(T item); +} diff --git a/scm-core/src/main/java/sonia/scm/TransformFilter.java b/scm-core/src/main/java/sonia/scm/TransformFilter.java new file mode 100644 index 0000000000..fb1538cf84 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/TransformFilter.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * 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. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE REGENTS 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. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm; + +/** + * + * @author Sebastian Sdorra + * + * @param + */ +public interface TransformFilter +{ + + /** + * Method description + * + * + * @param item + * + * @return + */ + public T accept(T item); +} diff --git a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java index 8ae14ddd69..d82f2df4d5 100644 --- a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java +++ b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java @@ -35,8 +35,17 @@ package sonia.scm.search; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.Filter; +import sonia.scm.TransformFilter; import sonia.scm.util.Util; +//~--- JDK imports ------------------------------------------------------------ + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + /** * * @author Sebastian Sdorra @@ -120,6 +129,49 @@ public class SearchUtil return result; } + /** + * Method description + * + * + * @param searchRequest + * @param collection + * @param filter + * @param + * + * @return + */ + public static Collection search(SearchRequest searchRequest, + Collection collection, TransformFilter filter) + { + List items = new ArrayList(); + int index = 0; + int counter = 0; + Iterator it = collection.iterator(); + + while (it.hasNext()) + { + T item = filter.accept(it.next()); + + if (item != null) + { + index++; + + if (searchRequest.getStartWith() <= index) + { + items.add(item); + counter++; + + if (searchRequest.getMaxResults() <= counter) + { + break; + } + } + } + } + + return items; + } + /** * Method description * diff --git a/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java index bd65b54dbc..6da9b2b31b 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java @@ -44,6 +44,7 @@ import org.slf4j.LoggerFactory; import sonia.scm.HandlerEvent; import sonia.scm.SCMContextProvider; +import sonia.scm.TransformFilter; import sonia.scm.search.SearchRequest; import sonia.scm.search.SearchUtil; import sonia.scm.security.ScmSecurityException; @@ -64,11 +65,8 @@ import sonia.scm.web.security.WebSecurityContext; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; import java.util.Collection; -import java.util.Iterator; import java.util.LinkedList; -import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -340,34 +338,23 @@ public class XmlUserManager extends AbstractUserManager logger.debug("search user with query {}", searchRequest.getQuery()); } - List users = new ArrayList(); - int index = 0; - int counter = 0; - Iterator it = userDB.values().iterator(); - - while (it.hasNext()) + return SearchUtil.search(searchRequest, userDB.values(), + new TransformFilter() { - User user = it.next(); - - if (SearchUtil.matchesOne(searchRequest, user.getName(), - user.getDisplayName(), user.getMail())) + @Override + public User accept(User user) { - index++; + User result = null; - if (searchRequest.getStartWith() <= index) + if (SearchUtil.matchesOne(searchRequest, user.getName(), + user.getDisplayName(), user.getMail())) { - users.add(user.clone()); - counter++; - - if (searchRequest.getMaxResults() <= counter) - { - break; - } + result = user.clone(); } - } - } - return users; + return result; + } + }); } //~--- get methods ----------------------------------------------------------