/*
* 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.client.console.commons;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
public class AnyDataProvider<A extends AnyTO> extends DirectoryDataProvider<A> {
private static final long serialVersionUID = 6267494272884913376L;
private final SortableAnyProviderComparator<A> comparator;
private final AbstractAnyRestClient<A, ?> restClient;
protected String fiql;
protected final boolean filtered;
private final String realm;
private final String type;
public AnyDataProvider(
final AbstractAnyRestClient<A, ?> restClient,
final int paginatorRows,
final boolean filtered,
final String realm,
final String type) {
super(paginatorRows);
this.restClient = restClient;
this.filtered = filtered;
// default sorting
switch (type) {
case "USER":
setSort("username", SortOrder.ASCENDING);
break;
case "GROUP":
setSort("name", SortOrder.ASCENDING);
break;
default:
setSort("key", SortOrder.ASCENDING);
}
this.comparator = new SortableAnyProviderComparator<>(this);
this.realm = realm;
this.type = type;
}
@Override
public Iterator<A> iterator(final long first, final long count) {
List<A> result;
final int page = ((int) first / paginatorRows);
if (filtered) {
result = fiql == null
? Collections.<A>emptyList()
: restClient.search(realm, fiql, (page < 0 ? 0 : page) + 1, paginatorRows, getSort(), type);
} else {
result = restClient.search(realm, null, (page < 0 ? 0 : page) + 1, paginatorRows, getSort(), type);
}
Collections.sort(result, comparator);
return result.iterator();
}
@Override
public long size() {
long result;
if (filtered) {
result = fiql == null ? 0 : restClient.searchCount(realm, fiql, type);
} else {
result = restClient.searchCount(realm, null, type);
}
return result;
}
public AnyDataProvider<A> setFIQL(final String fiql) {
this.fiql = fiql;
return this;
}
@Override
public IModel<A> model(final A object) {
return new CompoundPropertyModel<>(object);
}
}