Improving helper classes
diff --git a/rest-util/src/main/java/org/apache/archiva/components/rest/model/PropertyEntry.java b/rest-util/src/main/java/org/apache/archiva/components/rest/model/PropertyEntry.java
index ef41ef2..4431ce9 100644
--- a/rest-util/src/main/java/org/apache/archiva/components/rest/model/PropertyEntry.java
+++ b/rest-util/src/main/java/org/apache/archiva/components/rest/model/PropertyEntry.java
@@ -33,6 +33,15 @@
     private String key;
     private String value;
 
+    public PropertyEntry() {
+
+    }
+
+    public PropertyEntry(String key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
     public String getKey( )
     {
         return key;
diff --git a/rest-util/src/main/java/org/apache/archiva/components/rest/util/QueryHelper.java b/rest-util/src/main/java/org/apache/archiva/components/rest/util/QueryHelper.java
index c4b9d9c..5ad6c67 100644
--- a/rest-util/src/main/java/org/apache/archiva/components/rest/util/QueryHelper.java
+++ b/rest-util/src/main/java/org/apache/archiva/components/rest/util/QueryHelper.java
@@ -52,13 +52,23 @@
 public class QueryHelper<T>
 {
 
-    private final Map<String, BiPredicate<String, T>> FILTER_MAP;
-    private final Map<String, Comparator<T>> ORDER_MAP;
-    private final String[] DEFAULT_SEARCH_FIELDS;
+    private final Map<String, BiPredicate<String, T>> filterMap;
+    private final Map<String, Comparator<T>> orderMap;
+    private final String[] defaultSearchAttributes;
     private final Predicate<T> DEFAULT_FILTER = ( T att ) -> false;
 
 
     /**
+     * Initializes a helper with the given default search attributes.
+     * @param defaultSearchAttributes the attribute names to use for searching
+     */
+    public QueryHelper(String[] defaultSearchAttributes) {
+        this.filterMap = new HashMap<>( );
+        this.orderMap = new HashMap<>( );
+        this.defaultSearchAttributes = defaultSearchAttributes;
+    }
+
+    /**
      * Creates a new query helper with the given filters and comparators.
      *
      * @param filterMap a map of filters, where the key is the attribute name and the value is a predicate that matches
@@ -70,39 +80,57 @@
     public QueryHelper(Map<String, BiPredicate<String, T>> filterMap, Map<String, Comparator<T>> orderMap,
                        String[] defaultSearchFields)
     {
-        this.FILTER_MAP = filterMap;
-        this.DEFAULT_SEARCH_FIELDS = defaultSearchFields;
-        this.ORDER_MAP = new HashMap<>( orderMap );
+        this.filterMap = filterMap;
+        this.defaultSearchAttributes = defaultSearchFields;
+        this.orderMap = new HashMap<>( orderMap );
     }
 
-    public <U extends Comparable<? super U>> void addNullsafeFieldComparator( String fieldName, Function<? super T, U> keyExtractor) {
-        ORDER_MAP.put( fieldName, Comparator.comparing( keyExtractor, Comparator.nullsLast( Comparator.naturalOrder( ) ) ) );
+    /**
+     * This adds a null safe comparator, that compares the field values in natural order. Null values are sorted after
+     * any other values.
+     * @param attributeName the name of the attribute
+     * @param keyExtractor the extractor to use for getting the attribute value
+     * @param <U>
+     */
+    public <U extends Comparable<? super U>> void addNullsafeFieldComparator( String attributeName, Function<? super T, U> keyExtractor) {
+        orderMap.put( attributeName, Comparator.comparing( keyExtractor, Comparator.nullsLast( Comparator.naturalOrder( ) ) ) );
     }
 
-    public void addStringFilter(String attribute, Function<? super T, String> keyExtractor) {
-        this.FILTER_MAP.put( attribute, ( String q, T r ) -> StringUtils.containsIgnoreCase( keyExtractor.apply( r ), q ) );
+    /**
+     * Adds a filter for a string attribute.
+     * @param attributeName the name of the attribute, this is the name used in the query parameters
+     * @param keyExtractor the extractor to use for getting the attribute value, e.g. PropertyEntry::getKey
+     */
+    public void addStringFilter(String attributeName, Function<? super T, String> keyExtractor) {
+        this.filterMap.put( attributeName, ( String q, T r ) -> StringUtils.containsIgnoreCase( keyExtractor.apply( r ), q ) );
     }
 
-    public void addBooleanFilter(String attribute, Function<? super T, Boolean> keyExtractor) {
-        this.FILTER_MAP.put( attribute, ( String q, T r ) -> Boolean.valueOf( q ) == keyExtractor.apply( r ) );
+    /**
+     * Adds a filter for a boolean attribute. The boolean is extracted by Boolean.valueOf()
+     * @param attributeName the attribute name
+     * @param keyExtractor the extractor to use for getting the attribute value
+     */
+    public void addBooleanFilter(String attributeName, Function<? super T, Boolean> keyExtractor) {
+        this.filterMap.put( attributeName, ( String q, T r ) -> Boolean.valueOf( q ) == keyExtractor.apply( r ) );
     }
 
     /**
      * Get the comparator for a specific attribute.
      * @param attributeName the name of the attribute.
-     * @return
+     * @return the comparator for the attribute, if defined, or otherwise <code>null</code>
      */
     public Comparator<T> getAttributeComparator( String attributeName )
     {
-        return ORDER_MAP.get( attributeName );
+        return orderMap.get( attributeName );
     }
 
     /**
      * Get the combined order for the given attributes in the given order.
      *
      * @param orderBy the attributes to compare. The first attribute in the list will be used first for comparing.
-     * @param ascending
-     * @return
+     * @param ascending <code>true</code>, if the ordering should be ascending, otherwise <code>false</code>
+     * @return the comparator for the given order definition.
+     * @throws IllegalArgumentException if there is no comparator defined for one of the given orderBy values
      */
     public Comparator<T> getComparator( List<String> orderBy, boolean ascending )
     {
@@ -123,15 +151,16 @@
 
     /**
      * Returns a query filter for a specific attribute and query token.
-     * @param attribute the attribute name to filter for.
+     * @param attributeName the attribute name to filter for.
      * @param queryToken the search token.
-     * @return The predicate used to filter the token
+     * @return The predicate used to filter the token. If there exists no filter definition for the attribute, it will use a filter,
+     * that always returns <code>false</code>
      */
-    public Predicate<T> getAttributeQueryFilter( final String attribute, final String queryToken )
+    public Predicate<T> getAttributeQueryFilter( final String attributeName, final String queryToken )
     {
-        if ( FILTER_MAP.containsKey( attribute ) )
+        if ( filterMap.containsKey( attributeName ) )
         {
-            return ( T u ) -> FILTER_MAP.get( attribute ).test( queryToken, u );
+            return ( T u ) -> filterMap.get( attributeName ).test( queryToken, u );
         }
         else
         {
@@ -158,11 +187,19 @@
                     }
                     else
                     {
-                        return Arrays.stream( DEFAULT_SEARCH_FIELDS )
+                        return Arrays.stream( defaultSearchAttributes )
                             .map( att -> getAttributeQueryFilter( att, s ) ).reduce( Predicate::or ).get( );
                     }
                 }
             ).reduce( Predicate::or ).get( );
     }
 
+    /**
+     * Returns <code>false</code>, if the given order string equals to "desc", otherwise <code>true</code>
+     * @param order the string for ordering (asc, desc)
+     * @return <code>false</code>, if the string equals to 'desc', otherwise <code>true</code>
+     */
+    public boolean isAscending(String order) {
+        return !"desc".equals( order );
+    }
 }