/**
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
*
* The Apereo Foundation licenses this file to you under the Educational
* Community 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://opensource.org/licenses/ecl2.txt
*
* 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.opencastproject.index.service.util;
import org.opencastproject.index.service.resources.list.api.ResourceListQuery;
import org.opencastproject.util.SmartIterator;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONAware;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
public final class ListProviderUtil {
private ListProviderUtil() {
}
/**
* Sorts the given map by its values, ascendantly or not
*
* @param map
* The map to sort
* @param asc
* If the sorting should be done ascendantly (true) or not
* @return a sorted map
*/
public static Map<String, String> sortMapByValue(Map<String, String> map, boolean asc) {
TreeMap<String, String> treeMap = new TreeMap<String, String>(new ValueComparer(map, asc));
treeMap.putAll(map);
return treeMap;
}
/** inner class to sort the map **/
private static class ValueComparer implements Comparator<String> {
private Map<String, String> baseMap = null;
private boolean ascending = true;
/**
* Comparator for a map of strings key/value
*
* @param data
* The base map to sort
* @param ascending
* If the sorting should be done ascendantly (true) or not
*/
ValueComparer(Map<String, String> data, boolean ascending) {
super();
this.baseMap = data;
this.ascending = ascending;
}
@Override
public int compare(String o1, String o2) {
String e1 = (String) baseMap.get(o1);
String e2 = (String) baseMap.get(o2);
if (ascending)
return e1.compareTo(e2);
else
return 0 - e1.compareTo(e2);
}
}
/**
* Filtered a simple map with the given query using the limit and offset parameters
*
* @param map
* The map to filter
* @param query
* The query
* @return the filtered map
*/
public static Map<String, String> filterMap(Map<String, String> map, ResourceListQuery query) {
if (noActionRequired(query))
return map;
int limit = query.getLimit().getOrElse(0);
int offset = query.getOffset().getOrElse(0);
SmartIterator<String> si = new SmartIterator<String>(limit, offset);
return si.applyLimitAndOffset(map);
}
private static boolean noActionRequired(ResourceListQuery query) {
return query == null || (query.getFilters().isEmpty() && query.getOffset().isNone() && query.getLimit().isNone());
}
public static List<JSONAware> filterMap(List<JSONAware> unfilteredList, ResourceListQuery query) {
if (noActionRequired(query)) {
return unfilteredList;
}
int limit = query.getLimit().getOrElse(0);
int offset = query.getOffset().getOrElse(0);
SmartIterator<JSONAware> si = new SmartIterator<JSONAware>(limit, offset);
return si.applyLimitAndOffset(unfilteredList);
}
/**
* Go through the given list of string and split the element with comma
*
* @param inputList
* the list with the element to split
* @return the list with the split strings
*/
public static List<String> splitStringList(List<String> inputList) {
List<String> outputList = new ArrayList<>();
for (String item : inputList) {
if (StringUtils.isNotBlank(item))
outputList.addAll(Arrays.asList(item.split(",")));
}
return outputList;
}
/**
* Invert the key & value in the given map
*
* @param map
* the map to invert
* @return an inverted map
*/
public static Map<String, String> invertMap(Map<String, String> map) {
Map<String, String> inv = new HashMap<String, String>();
for (Entry<String, String> entry : map.entrySet())
inv.put(entry.getValue(), entry.getKey());
return inv;
}
}