You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2013/12/16 12:04:57 UTC

svn commit: r1551172 [3/7] - in /syncope/trunk: ./ client/ client/src/main/java/org/apache/syncope/client/ client/src/main/java/org/apache/syncope/client/rest/ common/ common/src/main/java/org/apache/syncope/common/ common/src/main/java/org/apache/sync...

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Users.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Users.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Users.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Users.java Mon Dec 16 11:04:52 2013
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.console.pages;
 
-import org.apache.syncope.common.search.NodeCond;
 import org.apache.syncope.common.to.UserTO;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.pages.panels.AbstractSearchResultPanel;
@@ -70,7 +69,6 @@ public class Users extends BasePage {
                 new UserSearchResultPanel("listResult", false, null, getPageReference(), restClient);
         add(listResult);
 
-
         // create new user
         final AjaxLink<Void> createLink = new ClearIndicatingAjaxLink<Void>("createLink", getPageReference()) {
 
@@ -106,39 +104,39 @@ public class Users extends BasePage {
         final ClearIndicatingAjaxButton searchButton =
                 new ClearIndicatingAjaxButton("search", new ResourceModel("search"), getPageReference()) {
 
-            private static final long serialVersionUID = -958724007591692537L;
+                    private static final long serialVersionUID = -958724007591692537L;
 
-            @Override
-            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
-                final NodeCond searchCond = searchPanel.buildSearchCond();
-                LOG.debug("Node condition " + searchCond);
+                    @Override
+                    protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+                        final String fiql = searchPanel.buildFIQL();
+                        LOG.debug("FIQL: " + fiql);
 
-                doSearch(target, searchCond, searchResult);
+                        doSearch(target, fiql, searchResult);
 
-                Session.get().getFeedbackMessages().clear();
-                target.add(searchPanel.getSearchFeedback());
-            }
+                        Session.get().getFeedbackMessages().clear();
+                        target.add(searchPanel.getSearchFeedback());
+                    }
 
-            @Override
-            protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+                    @Override
+                    protected void onError(final AjaxRequestTarget target, final Form<?> form) {
 
-                target.add(searchPanel.getSearchFeedback());
-            }
-        };
+                        target.add(searchPanel.getSearchFeedback());
+                    }
+                };
 
         searchForm.add(searchButton);
         searchForm.setDefaultButton(searchButton);
     }
 
-    private void doSearch(final AjaxRequestTarget target, final NodeCond searchCond,
+    private void doSearch(final AjaxRequestTarget target, final String fiql,
             final AbstractSearchResultPanel resultsetPanel) {
 
-        if (searchCond == null || !searchCond.isValid()) {
+        if (fiql == null) {
             error(getString(Constants.SEARCH_ERROR));
             return;
         }
 
-        resultsetPanel.search(searchCond, target);
+        resultsetPanel.search(fiql, target);
     }
 
     private void setWindowClosedReloadCallback(final ModalWindow window) {

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/VirtualSchemaModalPage.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/VirtualSchemaModalPage.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/VirtualSchemaModalPage.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/VirtualSchemaModalPage.java Mon Dec 16 11:04:52 2013
@@ -21,7 +21,7 @@ package org.apache.syncope.console.pages
 import org.apache.syncope.common.AbstractBaseBean;
 import org.apache.syncope.common.to.VirSchemaTO;
 import org.apache.syncope.common.types.AttributableType;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.wicket.markup.html.form.AjaxCheckBoxPanel;
 import org.apache.syncope.console.wicket.markup.html.form.AjaxTextFieldPanel;

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/XMLEditorPopupPage.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/XMLEditorPopupPage.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/XMLEditorPopupPage.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/XMLEditorPopupPage.java Mon Dec 16 11:04:52 2013
@@ -21,7 +21,7 @@ package org.apache.syncope.console.pages
 import java.io.IOException;
 import javax.ws.rs.core.MediaType;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.rest.WorkflowRestClient;
 import org.apache.syncope.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchPanel.java Mon Dec 16 11:04:52 2013
@@ -18,24 +18,23 @@
  */
 package org.apache.syncope.console.pages.panels;
 
-import java.lang.reflect.Field;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.syncope.common.search.AttributableCond;
-import org.apache.syncope.common.search.AttributeCond;
-import org.apache.syncope.common.search.EntitlementCond;
-import org.apache.syncope.common.search.MembershipCond;
-import org.apache.syncope.common.search.NodeCond;
-import org.apache.syncope.common.search.ResourceCond;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.apache.cxf.jaxrs.ext.search.ConditionType;
+import org.apache.cxf.jaxrs.ext.search.SearchBean;
+import org.apache.cxf.jaxrs.ext.search.SearchCondition;
+import org.apache.cxf.jaxrs.ext.search.client.CompleteCondition;
+import org.apache.cxf.jaxrs.ext.search.fiql.FiqlParser;
+import org.apache.syncope.client.SyncopeClient;
+import org.apache.syncope.common.search.SearchableFields;
+import org.apache.syncope.common.search.SpecialAttr;
+import org.apache.syncope.common.search.SyncopeFiqlSearchConditionBuilder;
+import org.apache.syncope.common.search.SyncopeProperty;
 import org.apache.syncope.common.to.ResourceTO;
-import org.apache.syncope.common.to.RoleTO;
-import org.apache.syncope.common.to.UserTO;
 import org.apache.syncope.common.types.AttributableType;
-import org.apache.syncope.console.commons.SearchCondWrapper;
-import org.apache.syncope.console.commons.SearchCondWrapper.OperationType;
 import org.apache.syncope.console.rest.AuthRestClient;
 import org.apache.syncope.console.rest.ResourceRestClient;
 import org.apache.syncope.console.rest.SchemaRestClient;
@@ -59,9 +58,14 @@ public abstract class AbstractSearchPane
      */
     protected static final Logger LOG = LoggerFactory.getLogger(AbstractSearchPanel.class);
 
-    protected static final String[] ATTRIBUTES_NOTINCLUDED = {"attrs", "derAttrs", "virAttrs",
-        "serialVersionUID", "memberships", "entitlements", "resources", "password",
-        "propagationTOs", "propagationStatusMap"};
+    @SpringBean
+    protected SchemaRestClient schemaRestClient;
+
+    @SpringBean
+    protected ResourceRestClient resourceRestClient;
+
+    @SpringBean
+    protected AuthRestClient authRestClient;
 
     protected IModel<List<String>> dnames;
 
@@ -71,24 +75,13 @@ public abstract class AbstractSearchPane
 
     protected IModel<List<String>> entitlements;
 
-    protected IModel<List<AttributeCond.Type>> attributeTypes;
-
-    protected IModel<List<SearchCondWrapper.FilterType>> filterTypes;
+    protected IModel<List<SearchClause.Type>> types;
 
     protected IModel<List<String>> roleNames;
 
-    @SpringBean
-    protected SchemaRestClient schemaRestClient;
-
-    @SpringBean
-    protected ResourceRestClient resourceRestClient;
-
-    @SpringBean
-    protected AuthRestClient authRestClient;
-
     protected FeedbackPanel searchFeedback;
 
-    protected List<SearchCondWrapper> searchConditionList;
+    protected List<SearchClause> searchClauses;
 
     protected WebMarkupContainer searchFormContainer;
 
@@ -100,8 +93,8 @@ public abstract class AbstractSearchPane
         this(id, attributableType, null, true);
     }
 
-    protected AbstractSearchPanel(final String id, final AttributableType attributableType, final NodeCond initCond,
-            final boolean required) {
+    protected AbstractSearchPanel(final String id, final AttributableType attributableType,
+            final String fiql, final boolean required) {
 
         super(id);
         populate();
@@ -136,15 +129,23 @@ public abstract class AbstractSearchPane
         searchFeedback.setOutputMarkupId(true);
         add(searchFeedback);
 
-        if (initCond == null) {
-            searchConditionList = new ArrayList<SearchCondWrapper>();
-            searchConditionList.add(new SearchCondWrapper());
-        } else {
-            searchConditionList = getSearchCondWrappers(initCond, null);
+        this.searchClauses = new ArrayList<SearchClause>();
+        this.searchClauses.add(new SearchClause());
+        if (StringUtils.isNotBlank(fiql)) {
+            try {
+                FiqlParser<SearchBean> fiqlParser = new FiqlParser<SearchBean>(
+                        SearchBean.class, SyncopeFiqlSearchConditionBuilder.CONTEXTUAL_PROPERTIES);
+                List<SearchClause> parsed = getSearchClauses(fiqlParser.parse(fiql));
+
+                this.searchClauses.clear();
+                this.searchClauses.addAll(parsed);
+            } catch (Exception e) {
+                LOG.error("Unparseable FIQL expression '{}'", fiql, e);
+            }
         }
-        searchFormContainer.add(new SearchView("searchView", searchConditionList, searchFormContainer, required,
-                attributeTypes, filterTypes, anames, dnames, roleNames, resourceNames, entitlements));
 
+        searchFormContainer.add(new SearchView("searchView", searchClauses, searchFormContainer, required,
+                types, anames, dnames, roleNames, resourceNames, entitlements));
         add(searchFormContainer);
     }
 
@@ -155,24 +156,7 @@ public abstract class AbstractSearchPane
 
             @Override
             protected List<String> load() {
-                final List<String> details = new ArrayList<String>();
-
-                Class<?> clazz = attributableType == AttributableType.USER
-                        ? UserTO.class
-                        : RoleTO.class;
-
-                // loop on class and all superclasses searching for field
-                while (clazz != null && clazz != Object.class) {
-                    for (Field field : clazz.getDeclaredFields()) {
-                        if (!ArrayUtils.contains(ATTRIBUTES_NOTINCLUDED, field.getName())) {
-                            details.add(field.getName());
-                        }
-                    }
-                    clazz = clazz.getSuperclass();
-                }
-
-                Collections.reverse(details);
-                return details;
+                return SearchableFields.get(attributableType);
             }
         };
 
@@ -215,180 +199,192 @@ public abstract class AbstractSearchPane
                 return result;
             }
         };
-
-        attributeTypes = new LoadableDetachableModel<List<AttributeCond.Type>>() {
-
-            private static final long serialVersionUID = 5275935387613157437L;
-
-            @Override
-            protected List<AttributeCond.Type> load() {
-                return Arrays.asList(AttributeCond.Type.values());
-            }
-        };
     }
 
     public FeedbackPanel getSearchFeedback() {
         return searchFeedback;
     }
 
-    private List<SearchCondWrapper> getSearchCondWrappers(final NodeCond searchCond, final NodeCond.Type type) {
-        LOG.debug("Search condition: {}", searchCond);
-
-        List<SearchCondWrapper> wrappers = new ArrayList<SearchCondWrapper>();
+    private SearchClause getPrimitiveSearchClause(final SearchCondition<SearchBean> sc) {
+        SearchClause searchClause = new SearchClause();
 
-        switch (searchCond.getType()) {
-            case LEAF:
-            case NOT_LEAF:
-                final SearchCondWrapper wrapper = getSearchCondWrapper(searchCond);
-
-                if (type != null) {
-                    switch (type) {
-                        case AND:
-                            wrapper.setOperationType(OperationType.AND);
-                            break;
-                        case OR:
-                            wrapper.setOperationType(OperationType.OR);
-                            break;
-                        default:
-                        // nothing to specify
-                    }
+        String property = sc.getCondition().getKeySet().iterator().next();
+        searchClause.setProperty(property);
+        String value = sc.getCondition().get(property);
+        searchClause.setValue(value);
+
+        if (SpecialAttr.ROLES.toString().equals(property)) {
+            searchClause.setType(SearchClause.Type.MEMBERSHIP);
+            for (String label : roleNames.getObject()) {
+                if (value.equals(label.substring(0, label.indexOf(' ')))) {
+                    searchClause.setProperty(label);
                 }
+            }
+        } else if (SpecialAttr.RESOURCES.toString().equals(property)) {
+            searchClause.setType(SearchClause.Type.RESOURCE);
+        } else if (SpecialAttr.ENTITLEMENTS.toString().equals(property)) {
+            searchClause.setType(SearchClause.Type.ENTITLEMENT);
+        } else {
+            searchClause.setType(SearchClause.Type.ATTRIBUTE);
+        }
 
-                wrappers.add(wrapper);
+        switch (sc.getConditionType()) {
+            case EQUALS:
+                searchClause.setComparator(SpecialAttr.NULL.toString().equals(value)
+                        ? SearchClause.Comparator.IS_NULL : SearchClause.Comparator.EQUALS);
                 break;
 
-            case AND:
-            case OR:
-                wrappers.addAll(getSearchCondWrappers(searchCond.getLeftNodeCond(), type));
-                wrappers.addAll(getSearchCondWrappers(searchCond.getRightNodeCond(), searchCond.getType()));
+            case NOT_EQUALS:
+                searchClause.setComparator(SpecialAttr.NULL.toString().equals(value)
+                        ? SearchClause.Comparator.IS_NOT_NULL : SearchClause.Comparator.NOT_EQUALS);
+                break;
+
+            case GREATER_OR_EQUALS:
+                searchClause.setComparator(SearchClause.Comparator.GREATER_OR_EQUALS);
+                break;
+
+            case GREATER_THAN:
+                searchClause.setComparator(SearchClause.Comparator.GREATER_THAN);
+                break;
+
+            case LESS_OR_EQUALS:
+                searchClause.setComparator(SearchClause.Comparator.LESS_OR_EQUALS);
+                break;
+
+            case LESS_THAN:
+                searchClause.setComparator(SearchClause.Comparator.LESS_THAN);
                 break;
 
             default:
+                break;
         }
 
-        LOG.debug("Search condition wrappers: {}", wrappers);
-
-        return wrappers;
+        return searchClause;
     }
 
-    private SearchCondWrapper getSearchCondWrapper(final NodeCond searchCond) {
-        SearchCondWrapper wrapper = new SearchCondWrapper();
+    private List<SearchClause> getCompoundSearchClause(final SearchCondition<SearchBean> sc) {
+        List<SearchClause> clauses = new ArrayList<SearchClause>();
 
-        if (searchCond.getAttributableCond() != null) {
-            wrapper.setFilterType(SearchCondWrapper.FilterType.ATTRIBUTE);
-            wrapper.setFilterName(searchCond.getAttributableCond().getSchema());
-            wrapper.setType(searchCond.getAttributableCond().getType());
-            wrapper.setFilterValue(searchCond.getAttributableCond().getExpression());
-        }
-        if (searchCond.getAttributeCond() != null) {
-            wrapper.setFilterType(SearchCondWrapper.FilterType.ATTRIBUTE);
-            wrapper.setFilterName(searchCond.getAttributeCond().getSchema());
-            wrapper.setType(searchCond.getAttributeCond().getType());
-            wrapper.setFilterValue(searchCond.getAttributeCond().getExpression());
-        }
-        if (searchCond.getMembershipCond() != null) {
-            wrapper.setFilterType(SearchCondWrapper.FilterType.MEMBERSHIP);
-            RoleTO role = new RoleTO();
-            role.setId(searchCond.getMembershipCond().getRoleId());
-            role.setName(searchCond.getMembershipCond().getRoleName());
-            wrapper.setFilterName(role.getDisplayName());
-        }
-        if (searchCond.getResourceCond() != null) {
-            wrapper.setFilterType(SearchCondWrapper.FilterType.RESOURCE);
-            wrapper.setFilterName(searchCond.getResourceCond().getResourceName());
-        }
-        if (searchCond.getEntitlementCond() != null) {
-            wrapper.setFilterType(SearchCondWrapper.FilterType.ENTITLEMENT);
-            wrapper.setFilterName(searchCond.getEntitlementCond().getExpression());
+        for (SearchCondition<SearchBean> searchCondition : sc.getSearchConditions()) {
+            if (searchCondition.getStatement() == null) {
+                clauses.addAll(getCompoundSearchClause(searchCondition));
+            } else {
+                SearchClause clause = getPrimitiveSearchClause(searchCondition);
+                if (sc.getConditionType() == ConditionType.AND) {
+                    clause.setOperator(SearchClause.Operator.AND);
+                }
+                if (sc.getConditionType() == ConditionType.OR) {
+                    clause.setOperator(SearchClause.Operator.OR);
+                }
+                clauses.add(clause);
+            }
         }
 
-        wrapper.setNotOperator(searchCond.getType() == NodeCond.Type.NOT_LEAF);
-
-        return wrapper;
+        return clauses;
     }
 
-    public NodeCond buildSearchCond() {
-        return buildSearchCond(searchConditionList);
-    }
+    private List<SearchClause> getSearchClauses(final SearchCondition<SearchBean> sc) {
+        List<SearchClause> clauses = new ArrayList<SearchClause>();
 
-    private NodeCond buildSearchCond(final List<SearchCondWrapper> conditions) {
-        SearchCondWrapper searchConditionWrapper = conditions.get(0);
-        if (searchConditionWrapper == null || searchConditionWrapper.getFilterType() == null) {
-            return null;
+        if (sc.getStatement() == null) {
+            clauses.addAll(getCompoundSearchClause(sc));
+        } else {
+            clauses.add(getPrimitiveSearchClause(sc));
         }
-        LOG.debug("Search condition wrapper: {}", searchConditionWrapper);
 
-        NodeCond nodeCond = null;
+        return clauses;
+    }
 
-        switch (searchConditionWrapper.getFilterType()) {
-            case ATTRIBUTE:
-                // AttributeCond or SyncopeUserCond
-                final String schema = searchConditionWrapper.getFilterName();
-
-                final AttributeCond attributeCond;
-                if (dnames.getObject().contains(schema)) {
-                    attributeCond = new AttributableCond();
-                    nodeCond = searchConditionWrapper.isNotOperator()
-                            ? NodeCond.getNotLeafCond((AttributableCond) attributeCond)
-                            : NodeCond.getLeafCond((AttributableCond) attributeCond);
-                } else {
-                    attributeCond = new AttributeCond();
-                    nodeCond = searchConditionWrapper.isNotOperator()
-                            ? NodeCond.getNotLeafCond(attributeCond)
-                            : NodeCond.getLeafCond(attributeCond);
-                }
+    public String buildFIQL() {
+        LOG.debug("Generating FIQL from List<SearchClause>: {}", searchClauses);
 
-                attributeCond.setSchema(schema);
-                attributeCond.setType(searchConditionWrapper.getType());
-                attributeCond.setExpression(searchConditionWrapper.getFilterValue());
+        SyncopeFiqlSearchConditionBuilder builder = SyncopeClient.getSearchConditionBuilder();
 
-                break;
-
-            case MEMBERSHIP:
-                final MembershipCond membershipCond = new MembershipCond();
-                membershipCond.setRoleId(RoleTO.fromDisplayName(searchConditionWrapper.getFilterName()));
-                membershipCond.setRoleName(searchConditionWrapper.getFilterName().
-                        substring(searchConditionWrapper.getFilterName().indexOf(' ') + 1));
-
-                nodeCond = searchConditionWrapper.isNotOperator()
-                        ? NodeCond.getNotLeafCond(membershipCond)
-                        : NodeCond.getLeafCond(membershipCond);
+        CompleteCondition prevCondition;
+        CompleteCondition condition = null;
+        for (int i = 0; i < searchClauses.size(); i++) {
+            prevCondition = condition;
+
+            switch (searchClauses.get(i).getType()) {
+                case ENTITLEMENT:
+                    condition = searchClauses.get(i).getComparator() == SearchClause.Comparator.EQUALS
+                            ? builder.hasEntitlements(searchClauses.get(i).getProperty())
+                            : builder.hasNotEntitlements(searchClauses.get(i).getProperty());
+                    break;
+
+                case MEMBERSHIP:
+                    Long roleId = Long.valueOf(searchClauses.get(i).getProperty().split(" ")[0]);
+                    condition = searchClauses.get(i).getComparator() == SearchClause.Comparator.EQUALS
+                            ? builder.hasRoles(roleId)
+                            : builder.hasNotRoles(roleId);
+                    break;
+
+                case RESOURCE:
+                    condition = searchClauses.get(i).getComparator() == SearchClause.Comparator.EQUALS
+                            ? builder.hasResources(searchClauses.get(i).getProperty())
+                            : builder.hasNotResources(searchClauses.get(i).getProperty());
+                    break;
+
+                case ATTRIBUTE:
+                    SyncopeProperty property = builder.is(searchClauses.get(i).getProperty());
+                    switch (searchClauses.get(i).getComparator()) {
+                        case IS_NULL:
+                            condition = builder.isNull(searchClauses.get(i).getProperty());
+                            break;
 
-                break;
+                        case IS_NOT_NULL:
+                            condition = builder.isNotNull(searchClauses.get(i).getProperty());
+                            break;
 
-            case RESOURCE:
-                final ResourceCond resourceCond = new ResourceCond();
-                resourceCond.setResourceName(searchConditionWrapper.getFilterName());
-
-                nodeCond = searchConditionWrapper.isNotOperator()
-                        ? NodeCond.getNotLeafCond(resourceCond)
-                        : NodeCond.getLeafCond(resourceCond);
+                        case LESS_THAN:
+                            condition = StringUtils.isNumeric(searchClauses.get(i).getProperty())
+                                    ? property.lessThan(NumberUtils.toDouble(searchClauses.get(i).getValue()))
+                                    : property.lexicalBefore(searchClauses.get(i).getValue());
+                            break;
 
-                break;
+                        case LESS_OR_EQUALS:
+                            condition = StringUtils.isNumeric(searchClauses.get(i).getProperty())
+                                    ? property.lessOrEqualTo(NumberUtils.toDouble(searchClauses.get(i).getValue()))
+                                    : property.lexicalNotAfter(searchClauses.get(i).getValue());
+                            break;
 
-            case ENTITLEMENT:
-                final EntitlementCond entitlementCond = new EntitlementCond();
-                entitlementCond.setExpression(searchConditionWrapper.getFilterName());
-
-                nodeCond = searchConditionWrapper.isNotOperator()
-                        ? NodeCond.getNotLeafCond(entitlementCond)
-                        : NodeCond.getLeafCond(entitlementCond);
-                break;
+                        case GREATER_THAN:
+                            condition = StringUtils.isNumeric(searchClauses.get(i).getProperty())
+                                    ? property.greaterThan(NumberUtils.toDouble(searchClauses.get(i).getValue()))
+                                    : property.lexicalAfter(searchClauses.get(i).getValue());
+                            break;
 
-            default:
-            // nothing to do
-        }
+                        case GREATER_OR_EQUALS:
+                            condition = StringUtils.isNumeric(searchClauses.get(i).getProperty())
+                                    ? property.greaterOrEqualTo(NumberUtils.toDouble(searchClauses.get(i).getValue()))
+                                    : property.lexicalNotBefore(searchClauses.get(i).getValue());
+                            break;
 
-        LOG.debug("Processed condition {}", nodeCond);
+                        case NOT_EQUALS:
+                            condition = property.notEqualTo(searchClauses.get(i).getValue());
+                            break;
 
-        if (conditions.size() > 1) {
-            List<SearchCondWrapper> subList = conditions.subList(1, conditions.size());
+                        case EQUALS:
+                        default:
+                            condition = property.equalTo(searchClauses.get(i).getValue());
+                            break;
+                    }
+                default:
+                    break;
+            }
 
-            nodeCond = OperationType.OR.equals(subList.get(0).getOperationType())
-                    ? NodeCond.getOrCond(nodeCond, buildSearchCond(subList))
-                    : NodeCond.getAndCond(nodeCond, buildSearchCond(subList));
+            if (i > 0) {
+                if (searchClauses.get(i).getOperator() == SearchClause.Operator.AND) {
+                    condition = builder.and(prevCondition, condition);
+                }
+                if (searchClauses.get(i).getOperator() == SearchClause.Operator.OR) {
+                    condition = builder.or(prevCondition, condition);
+                }
+            }
         }
 
-        return nodeCond;
+        String fiql = condition == null ? StringUtils.EMPTY : condition.query();
+        LOG.debug("Generated FIQL: {}", fiql);
+        return fiql;
     }
 }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchResultPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchResultPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchResultPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchResultPanel.java Mon Dec 16 11:04:52 2013
@@ -20,7 +20,6 @@ package org.apache.syncope.console.pages
 
 import java.util.Collection;
 import java.util.List;
-import org.apache.syncope.common.search.NodeCond;
 import org.apache.syncope.common.to.AbstractAttributableTO;
 import org.apache.syncope.console.commons.AttributableDataProvider;
 import org.apache.syncope.console.commons.Constants;
@@ -124,7 +123,7 @@ public abstract class AbstractSearchResu
     /**
      * Filter used in case of filtered search.
      */
-    private NodeCond filter;
+    private String fiql;
 
     /**
      * Result table.
@@ -157,7 +156,7 @@ public abstract class AbstractSearchResu
     protected final AbstractBasePage page;
 
     protected <T extends AbstractAttributableTO> AbstractSearchResultPanel(final String id, final boolean filtered,
-            final NodeCond searchCond, final PageReference pageRef, final AbstractAttributableRestClient restClient) {
+            final String fiql, final PageReference pageRef, final AbstractAttributableRestClient restClient) {
 
         super(id);
 
@@ -166,7 +165,7 @@ public abstract class AbstractSearchResu
         this.page = (AbstractBasePage) pageRef.getPage();
 
         this.filtered = filtered;
-        this.filter = searchCond;
+        this.fiql = fiql;
         this.feedbackPanel = page.getFeedbackPanel();
 
         this.restClient = restClient;
@@ -236,9 +235,9 @@ public abstract class AbstractSearchResu
         setWindowClosedReloadCallback(displaymodal);
     }
 
-    public void search(final NodeCond searchCond, final AjaxRequestTarget target) {
-        this.filter = searchCond;
-        dataProvider.setSearchCond(filter);
+    public void search(final String fiql, final AjaxRequestTarget target) {
+        this.fiql = fiql;
+        dataProvider.setFIQL(fiql);
         target.add(container);
     }
 
@@ -248,7 +247,7 @@ public abstract class AbstractSearchResu
 
     private void updateResultTable(final boolean create, final int rows) {
         dataProvider = new AttributableDataProvider(restClient, rows, filtered);
-        dataProvider.setSearchCond(filter);
+        dataProvider.setFIQL(fiql);
 
         final int currentPage = resultTable != null
                 ? (create

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AttributesPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AttributesPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AttributesPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AttributesPanel.java Mon Dec 16 11:04:52 2013
@@ -110,7 +110,7 @@ public class AttributesPanel extends Pan
                 final WebMarkupContainer jexlHelp = JexlHelpUtil.getJexlHelpWebContainer("jexlHelp");
                 item.add(jexlHelp);
 
-                final AjaxLink questionMarkJexlHelp = JexlHelpUtil.getAjaxLink(jexlHelp, "questionMarkJexlHelp");
+                final AjaxLink<Void> questionMarkJexlHelp = JexlHelpUtil.getAjaxLink(jexlHelp, "questionMarkJexlHelp");
                 item.add(questionMarkJexlHelp);
 
                 if (!templateMode) {

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/NotificationTasks.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/NotificationTasks.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/NotificationTasks.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/NotificationTasks.java Mon Dec 16 11:04:52 2013
@@ -22,7 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 import org.apache.syncope.common.to.NotificationTaskTO;
 import org.apache.syncope.common.to.AbstractTaskTO;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.pages.NotificationTaskModalPage;
 import org.apache.syncope.console.pages.Tasks;

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/PoliciesPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/PoliciesPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/PoliciesPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/PoliciesPanel.java Mon Dec 16 11:04:52 2013
@@ -27,7 +27,7 @@ import org.apache.syncope.common.to.Pass
 import org.apache.syncope.common.to.AbstractPolicyTO;
 import org.apache.syncope.common.to.SyncPolicyTO;
 import org.apache.syncope.common.types.PolicyType;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.commons.PreferenceManager;
 import org.apache.syncope.console.commons.SortableDataProviderComparator;

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/PropagationTasks.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/PropagationTasks.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/PropagationTasks.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/PropagationTasks.java Mon Dec 16 11:04:52 2013
@@ -22,7 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 import org.apache.syncope.common.to.PropagationTaskTO;
 import org.apache.syncope.common.to.AbstractTaskTO;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.pages.PropagationTaskModalPage;
 import org.apache.syncope.console.pages.Tasks;

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchPanel.java Mon Dec 16 11:04:52 2013
@@ -22,9 +22,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.syncope.common.search.NodeCond;
 import org.apache.syncope.common.types.AttributableType;
-import org.apache.syncope.console.commons.SearchCondWrapper;
 import org.apache.wicket.model.LoadableDetachableModel;
 
 public class RoleSearchPanel extends AbstractSearchPanel {
@@ -37,14 +35,14 @@ public class RoleSearchPanel extends Abs
 
         private String id;
 
-        private NodeCond initCond = null;
+        private String fiql = null;
 
         public Builder(final String id) {
             this.id = id;
         }
 
-        public RoleSearchPanel.Builder nodeCond(final NodeCond initCond) {
-            this.initCond = initCond;
+        public RoleSearchPanel.Builder fiql(final String fiql) {
+            this.fiql = fiql;
             return this;
         }
 
@@ -54,23 +52,23 @@ public class RoleSearchPanel extends Abs
     }
 
     private RoleSearchPanel(final Builder builder) {
-        super(builder.id, AttributableType.ROLE, builder.initCond, true);
+        super(builder.id, AttributableType.ROLE, builder.fiql, true);
     }
 
     @Override
     protected void populate() {
         super.populate();
 
-        this.filterTypes = new LoadableDetachableModel<List<SearchCondWrapper.FilterType>>() {
+        this.types = new LoadableDetachableModel<List<SearchClause.Type>>() {
 
             private static final long serialVersionUID = 5275935387613157437L;
 
             @Override
-            protected List<SearchCondWrapper.FilterType> load() {
-                final List<SearchCondWrapper.FilterType> result = new ArrayList<SearchCondWrapper.FilterType>();
-                result.add(SearchCondWrapper.FilterType.ATTRIBUTE);
-                result.add(SearchCondWrapper.FilterType.ENTITLEMENT);
-                result.add(SearchCondWrapper.FilterType.RESOURCE);
+            protected List<SearchClause.Type> load() {
+                final List<SearchClause.Type> result = new ArrayList<SearchClause.Type>();
+                result.add(SearchClause.Type.ATTRIBUTE);
+                result.add(SearchClause.Type.ENTITLEMENT);
+                result.add(SearchClause.Type.RESOURCE);
                 return result;
             }
         };

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchResultPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchResultPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchResultPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchResultPanel.java Mon Dec 16 11:04:52 2013
@@ -22,10 +22,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import org.apache.syncope.common.search.NodeCond;
 import org.apache.syncope.common.to.AbstractAttributableTO;
 import org.apache.syncope.common.to.RoleTO;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.pages.ResultStatusModalPage;
 import org.apache.syncope.console.pages.RoleModalPage;
@@ -53,10 +52,9 @@ public class RoleSearchResultPanel exten
     private final static String PAGEID = "Roles";
 
     public <T extends AbstractAttributableTO> RoleSearchResultPanel(final String id, final boolean filtered,
-            final NodeCond searchCond, final PageReference callerRef,
-            final AbstractAttributableRestClient restClient) {
+            final String fiql, final PageReference callerRef, final AbstractAttributableRestClient restClient) {
 
-        super(id, filtered, searchCond, callerRef, restClient);
+        super(id, filtered, fiql, callerRef, restClient);
         initResultTable();
     }
 
@@ -65,7 +63,7 @@ public class RoleSearchResultPanel exten
         final List<IColumn<AbstractAttributableTO, String>> columns =
                 new ArrayList<IColumn<AbstractAttributableTO, String>>();
 
-        final String[] colnames = {"id", "name", "entitlements"};
+        final String[] colnames = { "id", "name", "entitlements" };
         for (String name : colnames) {
             columns.add(
                     new PropertyColumn<AbstractAttributableTO, String>(new ResourceModel(name, name), name, name));

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSummaryPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSummaryPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSummaryPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSummaryPanel.java Mon Dec 16 11:04:52 2013
@@ -20,7 +20,7 @@ package org.apache.syncope.console.pages
 
 import java.io.Serializable;
 import org.apache.syncope.common.to.RoleTO;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.XMLRolesReader;
 import org.apache.syncope.console.pages.RoleModalPage;
 import org.apache.syncope.console.rest.RoleRestClient;

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleTabPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleTabPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleTabPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleTabPanel.java Mon Dec 16 11:04:52 2013
@@ -18,10 +18,9 @@
  */
 package org.apache.syncope.console.pages.panels;
 
-import org.apache.syncope.common.search.MembershipCond;
-import org.apache.syncope.common.search.NodeCond;
+import org.apache.syncope.client.SyncopeClient;
 import org.apache.syncope.common.to.RoleTO;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.commons.XMLRolesReader;
 import org.apache.syncope.console.pages.ResultStatusModalPage;
@@ -181,11 +180,11 @@ public class RoleTabPanel extends Panel 
 
             @Override
             protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
-                final MembershipCond membershipCond = new MembershipCond();
-                membershipCond.setRoleName(selectedNode.getName());
-                NodeCond cond = NodeCond.getLeafCond(membershipCond);
-
-                userListContainer.replace(new UserSearchResultPanel("userList", true, cond, pageRef, userRestClient));
+                userListContainer.replace(new UserSearchResultPanel("userList",
+                        true,
+                        SyncopeClient.getSearchConditionBuilder().hasRoles(selectedNode.getId()).query(),
+                        pageRef,
+                        userRestClient));
 
                 target.add(userListContainer);
             }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SchedTasks.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SchedTasks.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SchedTasks.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SchedTasks.java Mon Dec 16 11:04:52 2013
@@ -22,7 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 import org.apache.syncope.common.to.SchedTaskTO;
 import org.apache.syncope.common.to.AbstractTaskTO;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.pages.SchedTaskModalPage;
 import org.apache.syncope.console.pages.Tasks;

Added: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchClause.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchClause.java?rev=1551172&view=auto
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchClause.java (added)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchClause.java Mon Dec 16 11:04:52 2013
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.console.pages.panels;
+
+import java.io.Serializable;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class SearchClause implements Serializable {
+
+    private static final long serialVersionUID = 2010794463096110104L;
+
+    public enum Operator {
+
+        AND,
+        OR;
+
+    }
+
+    public enum Type {
+
+        ATTRIBUTE,
+        MEMBERSHIP,
+        RESOURCE,
+        ENTITLEMENT;
+
+    }
+
+    public enum Comparator {
+
+        IS_NULL,
+        IS_NOT_NULL,
+        EQUALS,
+        NOT_EQUALS,
+        GREATER_OR_EQUALS,
+        GREATER_THAN,
+        LESS_OR_EQUALS,
+        LESS_THAN;
+
+    }
+
+    private Operator operator;
+
+    private Type type;
+
+    private String property;
+
+    private Comparator comparator;
+
+    private String value;
+
+    public SearchClause() {
+        setOperator(SearchClause.Operator.AND);
+        setComparator(SearchClause.Comparator.EQUALS);
+    }
+
+    public Operator getOperator() {
+        return operator;
+    }
+
+    public void setOperator(final Operator operator) {
+        this.operator = operator;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public void setType(final Type type) {
+        this.type = type;
+    }
+
+    public String getProperty() {
+        return property;
+    }
+
+    public void setProperty(final String property) {
+        this.property = property;
+    }
+
+    public Comparator getComparator() {
+        return comparator;
+    }
+
+    public void setComparator(final Comparator comparator) {
+        this.comparator = comparator;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(final String value) {
+        this.value = value;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return EqualsBuilder.reflectionEquals(this, obj);
+    }
+
+    @Override
+    public int hashCode() {
+        return HashCodeBuilder.reflectionHashCode(this);
+    }
+
+    @Override
+    public String toString() {
+        return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE);
+    }
+}

Propchange: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchClause.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchClause.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchClause.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchView.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchView.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchView.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SearchView.java Mon Dec 16 11:04:52 2013
@@ -19,29 +19,26 @@
 package org.apache.syncope.console.pages.panels;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import org.apache.syncope.common.search.AttributeCond;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.console.commons.Constants;
-import org.apache.syncope.console.commons.SearchCondWrapper;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.CheckBox;
 import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.IChoiceRenderer;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.model.ResourceModel;
 
-public class SearchView extends ListView<SearchCondWrapper> {
+public class SearchView extends ListView<SearchClause> {
 
     private static final long serialVersionUID = -527351923968737757L;
 
@@ -49,9 +46,7 @@ public class SearchView extends ListView
 
     private final boolean required;
 
-    private final IModel<List<AttributeCond.Type>> attributeTypes;
-
-    private final IModel<List<SearchCondWrapper.FilterType>> filterTypes;
+    private final IModel<List<SearchClause.Type>> types;
 
     private final IModel<List<String>> anames;
 
@@ -63,11 +58,10 @@ public class SearchView extends ListView
 
     private final IModel<List<String>> entitlements;
 
-    public SearchView(final String id, final List<? extends SearchCondWrapper> list,
+    public SearchView(final String id, final List<? extends SearchClause> list,
             final WebMarkupContainer searchFormContainer,
             final boolean required,
-            final IModel<List<AttributeCond.Type>> attributeTypes,
-            final IModel<List<SearchCondWrapper.FilterType>> filterTypes,
+            final IModel<List<SearchClause.Type>> types,
             final IModel<List<String>> anames,
             final IModel<List<String>> dnames,
             final IModel<List<String>> roleNames,
@@ -78,8 +72,7 @@ public class SearchView extends ListView
 
         this.searchFormContainer = searchFormContainer;
         this.required = required;
-        this.attributeTypes = attributeTypes;
-        this.filterTypes = filterTypes;
+        this.types = types;
         this.anames = anames;
         this.dnames = dnames;
         this.roleNames = roleNames;
@@ -88,17 +81,15 @@ public class SearchView extends ListView
     }
 
     @Override
-    protected void populateItem(final ListItem<SearchCondWrapper> item) {
-        final SearchCondWrapper searchCondition = item.getModelObject();
+    protected void populateItem(final ListItem<SearchClause> item) {
+        final SearchClause searchClause = item.getModelObject();
 
-        if (item.getIndex() == 0) {
-            item.add(new Label("operationType", ""));
-        } else {
-            item.add(new Label("operationType", searchCondition.getOperationType().toString()));
-        }
-
-        final CheckBox notOperator = new CheckBox("notOperator", new PropertyModel(searchCondition, "notOperator"));
-        notOperator.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+        final DropDownChoice<SearchClause.Operator> operator = new DropDownChoice<SearchClause.Operator>("operator",
+                new PropertyModel<SearchClause.Operator>(searchClause, "operator"),
+                Arrays.asList(SearchClause.Operator.values()));
+        operator.setOutputMarkupPlaceholderTag(true);
+        operator.setNullValid(false);
+        operator.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
             private static final long serialVersionUID = -1107858522700306810L;
 
@@ -106,25 +97,32 @@ public class SearchView extends ListView
             protected void onUpdate(final AjaxRequestTarget target) {
             }
         });
-        item.add(notOperator);
+        item.add(operator);
+        if (item.getIndex() == 0) {
+            operator.setVisible(false);
+        }
 
-        final DropDownChoice<AttributeCond.Type> type = new DropDownChoice<AttributeCond.Type>("type",
-                new PropertyModel<AttributeCond.Type>(searchCondition, "type"), attributeTypes);
+        final DropDownChoice<SearchClause.Type> type = new DropDownChoice<SearchClause.Type>("type",
+                new PropertyModel<SearchClause.Type>(searchClause, "type"), types);
+        type.setOutputMarkupId(true);
+        type.setRequired(required);
         type.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
             private static final long serialVersionUID = -1107858522700306810L;
 
             @Override
             protected void onUpdate(final AjaxRequestTarget target) {
+                target.add(searchFormContainer);
             }
         });
         item.add(type);
 
-        final DropDownChoice<String> filterNameChooser = new DropDownChoice<String>("filterName",
-                new PropertyModel<String>(searchCondition, "filterName"), (IModel) null);
-        filterNameChooser.setOutputMarkupId(true);
-        filterNameChooser.setRequired(required);
-        filterNameChooser.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+        @SuppressWarnings("unchecked")
+        final DropDownChoice<String> property = new DropDownChoice<String>("property",
+                new PropertyModel<String>(searchClause, "property"), (IModel) null);
+        property.setOutputMarkupId(true);
+        property.setRequired(required);
+        property.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
             private static final long serialVersionUID = -1107858522700306810L;
 
@@ -132,11 +130,12 @@ public class SearchView extends ListView
             protected void onUpdate(final AjaxRequestTarget target) {
             }
         });
-        item.add(filterNameChooser);
+        item.add(property);
 
-        final TextField<String> filterValue = new TextField<String>("filterValue", new PropertyModel<String>(
-                searchCondition, "filterValue"));
-        filterValue.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+        final TextField<String> value = new TextField<String>("value",
+                new PropertyModel<String>(searchClause, "value"));
+        value.setOutputMarkupId(true);
+        value.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
             private static final long serialVersionUID = -1107858522700306810L;
 
@@ -144,117 +143,154 @@ public class SearchView extends ListView
             protected void onUpdate(final AjaxRequestTarget target) {
             }
         });
-        item.add(filterValue);
+        item.add(value);
 
-        final DropDownChoice<SearchCondWrapper.FilterType> filterTypeChooser =
-                new DropDownChoice<SearchCondWrapper.FilterType>("filterType",
-                new PropertyModel<SearchCondWrapper.FilterType>(searchCondition, "filterType"), filterTypes);
-        filterTypeChooser.setOutputMarkupId(true);
-        filterTypeChooser.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+        final DropDownChoice<SearchClause.Comparator> comparator =
+                new DropDownChoice<SearchClause.Comparator>("comparator",
+                        new PropertyModel<SearchClause.Comparator>(searchClause, "comparator"),
+                        Collections.<SearchClause.Comparator>emptyList());
+        comparator.setOutputMarkupId(true);
+        comparator.setNullValid(false);
+        comparator.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
             private static final long serialVersionUID = -1107858522700306810L;
 
             @Override
             protected void onUpdate(final AjaxRequestTarget target) {
-                target.add(searchFormContainer);
+                if (type.getModelObject() == SearchClause.Type.ATTRIBUTE) {
+                    if (comparator.getModelObject() == SearchClause.Comparator.IS_NULL
+                            || comparator.getModelObject() == SearchClause.Comparator.IS_NOT_NULL) {
+
+                        value.setEnabled(false);
+                    } else {
+                        value.setEnabled(true);
+                    }
+                    target.add(value);
+                }
             }
         });
-        filterTypeChooser.setRequired(required);
-        item.add(filterTypeChooser);
+        comparator.setRequired(required);
+        item.add(comparator);
 
-        AjaxButton addAndButton = new IndicatingAjaxButton("addAndButton", new ResourceModel("addAndButton")) {
+        AjaxLink<Void> drop = new IndicatingAjaxLink<Void>("drop") {
 
-            private static final long serialVersionUID = -4804368561204623354L;
-
-            @Override
-            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-                SearchCondWrapper conditionWrapper = new SearchCondWrapper();
-                conditionWrapper.setOperationType(SearchCondWrapper.OperationType.AND);
-                SearchView.this.getModelObject().add(conditionWrapper);
-                target.add(searchFormContainer);
-            }
-
-            @Override
-            protected void onError(final AjaxRequestTarget target, final Form<?> form) {
-                target.add(searchFormContainer);
-            }
-        };
-        addAndButton.setDefaultFormProcessing(false);
-        if (item.getIndex() != getModelObject().size() - 1) {
-            addAndButton.setVisible(false);
-        }
-        item.add(addAndButton);
-
-        AjaxButton addOrButton = new IndicatingAjaxButton("addOrButton", new ResourceModel("addOrButton")) {
-
-            private static final long serialVersionUID = -4804368561204623354L;
-
-            @Override
-            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-                SearchCondWrapper conditionWrapper = new SearchCondWrapper();
-                conditionWrapper.setOperationType(SearchCondWrapper.OperationType.OR);
-                SearchView.this.getModelObject().add(conditionWrapper);
-                target.add(searchFormContainer);
-            }
+            private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
-            protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+            public void onClick(final AjaxRequestTarget target) {
+                SearchView.this.getModel().getObject().remove(item.getModelObject());
                 target.add(searchFormContainer);
             }
         };
-        addOrButton.setDefaultFormProcessing(false);
-        if (item.getIndex() != getModelObject().size() - 1) {
-            addOrButton.setVisible(false);
+        item.add(drop);
+        if (item.getIndex() == 0) {
+            drop.setVisible(false);
+            drop.setEnabled(false);
+        } else {
+            drop.setVisible(true);
+            drop.setEnabled(true);
         }
-        item.add(addOrButton);
-
-        AjaxButton dropButton = new IndicatingAjaxButton("dropButton", new ResourceModel("dropButton")) {
 
-            private static final long serialVersionUID = -4804368561204623354L;
+        final AjaxLink<Void> add = new IndicatingAjaxLink<Void>("add") {
 
-            @Override
-            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-                getList().remove(Integer.valueOf(getParent().getId()).intValue());
-                target.add(searchFormContainer);
-            }
+            private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
-            protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+            public void onClick(final AjaxRequestTarget target) {
+                SearchClause clause = new SearchClause();
+                SearchView.this.getModel().getObject().add(clause);
                 target.add(searchFormContainer);
             }
         };
-        dropButton.setDefaultFormProcessing(false);
-        if (item.getIndex() == 0) {
-            dropButton.setVisible(false);
-        }
-        item.add(dropButton);
+        item.add(add);
 
-        if (searchCondition == null || searchCondition.getFilterType() == null) {
-            filterNameChooser.setChoices(Collections.<String>emptyList());
+        if (searchClause == null || searchClause.getType() == null) {
+            property.setChoices(Collections.<String>emptyList());
         } else {
-            switch (searchCondition.getFilterType()) {
+            switch (searchClause.getType()) {
                 case ATTRIBUTE:
                     final List<String> names = new ArrayList<String>(dnames.getObject());
-
                     if (anames.getObject() != null && !anames.getObject().isEmpty()) {
                         names.addAll(anames.getObject());
                     }
                     Collections.sort(names);
+                    property.setChoices(names);
 
-                    filterNameChooser.setChoices(names);
-                    if (!type.isEnabled()) {
-                        type.setEnabled(true);
-                        type.setRequired(true);
-                    }
-                    if (!filterValue.isEnabled()) {
-                        filterValue.setEnabled(true);
+                    comparator.setChoices(new LoadableDetachableModel<List<SearchClause.Comparator>>() {
+
+                        private static final long serialVersionUID = 5275935387613157437L;
+
+                        @Override
+                        protected List<SearchClause.Comparator> load() {
+                            return Arrays.asList(SearchClause.Comparator.values());
+                        }
+                    });
+                    comparator.setChoiceRenderer(new IChoiceRenderer<SearchClause.Comparator>() {
+
+                        private static final long serialVersionUID = -9086043750227867686L;
+
+                        @Override
+                        public Object getDisplayValue(final SearchClause.Comparator object) {
+                            String display;
+
+                            switch (object) {
+                                case IS_NULL:
+                                    display = "NULL";
+                                    break;
+
+                                case IS_NOT_NULL:
+                                    display = "NOT NULL";
+                                    break;
+
+                                case EQUALS:
+                                    display = "==";
+                                    break;
+
+                                case NOT_EQUALS:
+                                    display = "!=";
+                                    break;
+
+                                case LESS_THAN:
+                                    display = "<";
+                                    break;
+
+                                case LESS_OR_EQUALS:
+                                    display = "<=";
+                                    break;
+
+                                case GREATER_THAN:
+                                    display = ">";
+                                    break;
+
+                                case GREATER_OR_EQUALS:
+                                    display = ">=";
+                                    break;
+
+                                default:
+                                    display = StringUtils.EMPTY;
+                            }
+
+                            return display;
+                        }
+
+                        @Override
+                        public String getIdValue(final SearchClause.Comparator object, int index) {
+                            return getDisplayValue(object).toString();
+                        }
+                    });
+                    if (!comparator.isEnabled()) {
+                        comparator.setEnabled(true);
+                        comparator.setRequired(true);
                     }
 
+                    if (!value.isEnabled()) {
+                        value.setEnabled(true);
+                    }
                     break;
 
                 case MEMBERSHIP:
-                    filterNameChooser.setChoices(roleNames);
-                    filterNameChooser.setChoiceRenderer(new IChoiceRenderer<String>() {
+                    property.setChoices(roleNames);
+                    property.setChoiceRenderer(new IChoiceRenderer<String>() {
 
                         private static final long serialVersionUID = -4288397951948436434L;
 
@@ -268,39 +304,156 @@ public class SearchView extends ListView
                             return object;
                         }
                     });
-                    type.setEnabled(false);
-                    type.setRequired(false);
-                    type.setModelObject(null);
 
-                    filterValue.setEnabled(false);
-                    filterValue.setModelObject("");
+                    comparator.setChoices(new LoadableDetachableModel<List<SearchClause.Comparator>>() {
+
+                        private static final long serialVersionUID = 5275935387613157437L;
+
+                        @Override
+                        protected List<SearchClause.Comparator> load() {
+                            List<SearchClause.Comparator> comparators = new ArrayList<SearchClause.Comparator>();
+                            comparators.add(SearchClause.Comparator.EQUALS);
+                            comparators.add(SearchClause.Comparator.NOT_EQUALS);
+                            return comparators;
+                        }
+                    });
+                    comparator.setChoiceRenderer(new IChoiceRenderer<SearchClause.Comparator>() {
+
+                        private static final long serialVersionUID = -9086043750227867686L;
+
+                        @Override
+                        public Object getDisplayValue(final SearchClause.Comparator object) {
+                            String display;
+
+                            switch (object) {
+                                case EQUALS:
+                                    display = "IN";
+                                    break;
+
+                                case NOT_EQUALS:
+                                    display = "NOT IN";
+                                    break;
+
+                                default:
+                                    display = StringUtils.EMPTY;
+                            }
+
+                            return display;
+                        }
+
+                        @Override
+                        public String getIdValue(final SearchClause.Comparator object, final int index) {
+                            return getDisplayValue(object).toString();
+                        }
+                    });
+
+                    value.setEnabled(false);
+                    value.setModelObject("");
 
                     break;
 
                 case RESOURCE:
-                    filterNameChooser.setChoices(resourceNames);
-                    type.setEnabled(false);
-                    type.setRequired(false);
-                    type.setModelObject(null);
+                    property.setChoices(resourceNames);
+
+                    comparator.setChoices(new LoadableDetachableModel<List<SearchClause.Comparator>>() {
+
+                        private static final long serialVersionUID = 5275935387613157437L;
+
+                        @Override
+                        protected List<SearchClause.Comparator> load() {
+                            List<SearchClause.Comparator> comparators = new ArrayList<SearchClause.Comparator>();
+                            comparators.add(SearchClause.Comparator.EQUALS);
+                            comparators.add(SearchClause.Comparator.NOT_EQUALS);
+                            return comparators;
+                        }
+                    });
+                    comparator.setChoiceRenderer(new IChoiceRenderer<SearchClause.Comparator>() {
+
+                        private static final long serialVersionUID = -9086043750227867686L;
 
-                    filterValue.setEnabled(false);
-                    filterValue.setModelObject("");
+                        @Override
+                        public Object getDisplayValue(final SearchClause.Comparator object) {
+                            String display;
+
+                            switch (object) {
+                                case EQUALS:
+                                    display = "HAS";
+                                    break;
+
+                                case NOT_EQUALS:
+                                    display = "HAS NOT";
+                                    break;
+
+                                default:
+                                    display = StringUtils.EMPTY;
+                            }
+
+                            return display;
+                        }
+
+                        @Override
+                        public String getIdValue(final SearchClause.Comparator object, final int index) {
+                            return getDisplayValue(object).toString();
+                        }
+                    });
+
+                    value.setEnabled(false);
+                    value.setModelObject("");
 
                     break;
 
                 case ENTITLEMENT:
-                    filterNameChooser.setChoices(entitlements);
-                    type.setEnabled(false);
-                    type.setRequired(false);
-                    type.setModelObject(null);
+                    property.setChoices(entitlements);
+
+                    comparator.setChoices(new LoadableDetachableModel<List<SearchClause.Comparator>>() {
+
+                        private static final long serialVersionUID = 5275935387613157437L;
+
+                        @Override
+                        protected List<SearchClause.Comparator> load() {
+                            List<SearchClause.Comparator> comparators = new ArrayList<SearchClause.Comparator>();
+                            comparators.add(SearchClause.Comparator.EQUALS);
+                            comparators.add(SearchClause.Comparator.NOT_EQUALS);
+                            return comparators;
+                        }
+                    });
+                    comparator.setChoiceRenderer(new IChoiceRenderer<SearchClause.Comparator>() {
+
+                        private static final long serialVersionUID = -9086043750227867686L;
+
+                        @Override
+                        public Object getDisplayValue(final SearchClause.Comparator object) {
+                            String display;
+
+                            switch (object) {
+                                case EQUALS:
+                                    display = "HAS";
+                                    break;
+
+                                case NOT_EQUALS:
+                                    display = "HAS NOT";
+                                    break;
+
+                                default:
+                                    display = StringUtils.EMPTY;
+                            }
+
+                            return display;
+                        }
+
+                        @Override
+                        public String getIdValue(final SearchClause.Comparator object, final int index) {
+                            return getDisplayValue(object).toString();
+                        }
+                    });
 
-                    filterValue.setEnabled(false);
-                    filterValue.setModelObject("");
+                    value.setEnabled(false);
+                    value.setModelObject("");
 
                     break;
 
                 default:
-                    filterNameChooser.setChoices(Collections.<String>emptyList());
+                    property.setChoices(Collections.<String>emptyList());
             }
         }
     }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SelectOnlyUserSearchResultPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SelectOnlyUserSearchResultPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SelectOnlyUserSearchResultPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SelectOnlyUserSearchResultPanel.java Mon Dec 16 11:04:52 2013
@@ -20,7 +20,6 @@ package org.apache.syncope.console.pages
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.syncope.common.search.NodeCond;
 import org.apache.syncope.common.to.AbstractAttributableTO;
 import org.apache.syncope.console.pages.DisplayAttributesModalPage;
 import org.apache.syncope.console.rest.UserRestClient;
@@ -47,10 +46,9 @@ public class SelectOnlyUserSearchResultP
     private final ModalWindow window;
 
     public <T extends AbstractAttributableTO> SelectOnlyUserSearchResultPanel(final String id, final boolean filtered,
-            final NodeCond searchCond, final PageReference pageRef, final ModalWindow window,
-            final UserRestClient restClient) {
+            final String fiql, final PageReference pageRef, final ModalWindow window, final UserRestClient restClient) {
 
-        super(id, filtered, searchCond, pageRef, restClient);
+        super(id, filtered, fiql, pageRef, restClient);
 
         this.pageRef = pageRef;
         this.window = window;

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SyncTasks.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SyncTasks.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SyncTasks.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/SyncTasks.java Mon Dec 16 11:04:52 2013
@@ -22,7 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 import org.apache.syncope.common.to.SyncTaskTO;
 import org.apache.syncope.common.to.AbstractTaskTO;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.pages.RoleTemplateModalPage;
 import org.apache.syncope.console.pages.SyncTaskModalPage;

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchPanel.java Mon Dec 16 11:04:52 2013
@@ -21,10 +21,8 @@ package org.apache.syncope.console.pages
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.syncope.common.search.NodeCond;
 import org.apache.syncope.common.to.RoleTO;
 import org.apache.syncope.common.types.AttributableType;
-import org.apache.syncope.console.commons.SearchCondWrapper;
 import org.apache.syncope.console.rest.RoleRestClient;
 import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
@@ -42,7 +40,7 @@ public class UserSearchPanel extends Abs
 
         private String id;
 
-        private NodeCond initCond = null;
+        private String fiql = null;
 
         private boolean required = true;
 
@@ -50,8 +48,8 @@ public class UserSearchPanel extends Abs
             this.id = id;
         }
 
-        public UserSearchPanel.Builder nodeCond(final NodeCond initCond) {
-            this.initCond = initCond;
+        public UserSearchPanel.Builder fiql(final String fiql) {
+            this.fiql = fiql;
             return this;
         }
 
@@ -66,23 +64,23 @@ public class UserSearchPanel extends Abs
     }
 
     private UserSearchPanel(final Builder builder) {
-        super(builder.id, AttributableType.USER, builder.initCond, builder.required);
+        super(builder.id, AttributableType.USER, builder.fiql, builder.required);
     }
 
     @Override
     protected void populate() {
         super.populate();
 
-        this.filterTypes = new LoadableDetachableModel<List<SearchCondWrapper.FilterType>>() {
+        this.types = new LoadableDetachableModel<List<SearchClause.Type>>() {
 
             private static final long serialVersionUID = 5275935387613157437L;
 
             @Override
-            protected List<SearchCondWrapper.FilterType> load() {
-                List<SearchCondWrapper.FilterType> result = new ArrayList<SearchCondWrapper.FilterType>();
-                result.add(SearchCondWrapper.FilterType.ATTRIBUTE);
-                result.add(SearchCondWrapper.FilterType.MEMBERSHIP);
-                result.add(SearchCondWrapper.FilterType.RESOURCE);
+            protected List<SearchClause.Type> load() {
+                List<SearchClause.Type> result = new ArrayList<SearchClause.Type>();
+                result.add(SearchClause.Type.ATTRIBUTE);
+                result.add(SearchClause.Type.MEMBERSHIP);
+                result.add(SearchClause.Type.RESOURCE);
                 return result;
             }
         };

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchResultPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchResultPanel.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchResultPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchResultPanel.java Mon Dec 16 11:04:52 2013
@@ -24,12 +24,11 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
-import org.apache.syncope.common.search.NodeCond;
 import org.apache.syncope.common.to.AbstractAttributableTO;
 import org.apache.syncope.common.to.UserTO;
 import org.apache.syncope.common.types.AttributableType;
 import org.apache.syncope.common.types.SchemaType;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.pages.DisplayAttributesModalPage;
 import org.apache.syncope.console.pages.EditUserModalPage;
@@ -73,10 +72,9 @@ public class UserSearchResultPanel exten
     private final List<String> vSchemaNames;
 
     public <T extends AbstractAttributableTO> UserSearchResultPanel(final String id, final boolean filtered,
-            final NodeCond searchCond, final PageReference callerRef,
-            final AbstractAttributableRestClient restClient) {
+            final String fiql, final PageReference callerRef, final AbstractAttributableRestClient restClient) {
 
-        super(id, filtered, searchCond, callerRef, restClient);
+        super(id, filtered, fiql, callerRef, restClient);
 
         this.schemaNames = schemaRestClient.getSchemaNames(AttributableType.USER);
         this.dSchemaNames = schemaRestClient.getDerSchemaNames(AttributableType.USER);
@@ -88,7 +86,7 @@ public class UserSearchResultPanel exten
     @Override
     protected List<IColumn<AbstractAttributableTO, String>> getColumns() {
         final List<IColumn<AbstractAttributableTO, String>> columns =
-                 new ArrayList<IColumn<AbstractAttributableTO, String>>();
+                new ArrayList<IColumn<AbstractAttributableTO, String>>();
 
         for (String name : prefMan.getList(getRequest(), Constants.PREF_USERS_DETAILS_VIEW)) {
             final Field field = ReflectionUtils.findField(UserTO.class, name);

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/AbstractAttributableRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/AbstractAttributableRestClient.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/AbstractAttributableRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/AbstractAttributableRestClient.java Mon Dec 16 11:04:52 2013
@@ -19,29 +19,26 @@
 package org.apache.syncope.console.rest;
 
 import java.util.List;
-import org.apache.syncope.common.search.NodeCond;
-import org.apache.syncope.common.services.InvalidSearchConditionException;
 import org.apache.syncope.common.to.AbstractAttributableTO;
-import org.apache.syncope.common.to.BulkAction;
-import org.apache.syncope.common.to.BulkActionRes;
+import org.apache.syncope.common.reqres.BulkAction;
+import org.apache.syncope.common.reqres.BulkActionResult;
 import org.apache.syncope.common.to.ConnObjectTO;
 
 public abstract class AbstractAttributableRestClient extends BaseRestClient {
 
     private static final long serialVersionUID = 1962529678091410544L;
 
-    public abstract Integer count();
+    public abstract int count();
 
     public abstract List<? extends AbstractAttributableTO> list(int page, int size);
 
-    public abstract Integer searchCount(NodeCond searchCond) throws InvalidSearchConditionException;
+    public abstract int searchCount(String fiql);
 
-    public abstract List<? extends AbstractAttributableTO> search(NodeCond searchCond, int page, int size)
-            throws InvalidSearchConditionException;
+    public abstract List<? extends AbstractAttributableTO> search(String fiql, int page, int size);
 
     public abstract ConnObjectTO getConnectorObject(String resourceName, Long id);
 
     public abstract AbstractAttributableTO delete(Long id);
 
-    public abstract BulkActionRes bulkAction(BulkAction action);
+    public abstract BulkActionResult bulkAction(BulkAction action);
 }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java Mon Dec 16 11:04:52 2013
@@ -25,8 +25,8 @@ import java.util.List;
 import java.util.Set;
 import org.apache.syncope.common.services.ConnectorService;
 import org.apache.syncope.common.services.ResourceService;
-import org.apache.syncope.common.to.BulkAction;
-import org.apache.syncope.common.to.BulkActionRes;
+import org.apache.syncope.common.reqres.BulkAction;
+import org.apache.syncope.common.reqres.BulkActionResult;
 import org.apache.syncope.common.to.ConnBundleTO;
 import org.apache.syncope.common.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.to.ConnInstanceTO;
@@ -34,7 +34,7 @@ import org.apache.syncope.common.to.Reso
 import org.apache.syncope.common.to.SchemaTO;
 import org.apache.syncope.common.types.ConnConfProperty;
 import org.apache.syncope.common.util.BeanUtils;
-import org.apache.syncope.common.validation.SyncopeClientException;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.console.SyncopeSession;
 import org.springframework.stereotype.Component;
 
@@ -211,7 +211,7 @@ public class ConnectorRestClient extends
         getService(ConnectorService.class).reload();
     }
 
-    public BulkActionRes bulkAction(final BulkAction action) {
+    public BulkActionResult bulkAction(final BulkAction action) {
         return getService(ConnectorService.class).bulk(action);
     }
 }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/NotificationRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/NotificationRestClient.java?rev=1551172&r1=1551171&r2=1551172&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/NotificationRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/NotificationRestClient.java Mon Dec 16 11:04:52 2013
@@ -23,7 +23,7 @@ import java.util.List;
 
 import org.apache.syncope.common.services.ConfigurationService;
 import org.apache.syncope.common.services.NotificationService;
-import org.apache.syncope.common.to.MailTemplateTO;
+import org.apache.syncope.common.wrap.MailTemplate;
 import org.apache.syncope.common.to.NotificationTO;
 import org.apache.syncope.common.util.CollectionWrapper;
 import org.springframework.stereotype.Component;
@@ -55,6 +55,6 @@ public class NotificationRestClient exte
 
     public List<String> getMailTemplates() {
         return CollectionWrapper.unwrap(
-                new ArrayList<MailTemplateTO>(getService(ConfigurationService.class).getMailTemplates()));
+                new ArrayList<MailTemplate>(getService(ConfigurationService.class).getMailTemplates()));
     }
 }