/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.function;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.SortedMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.threeten.bp.Instant;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Ordering;
import com.google.common.primitives.Ints;
import com.opengamma.engine.function.config.FunctionConfiguration;
import com.opengamma.engine.function.config.FunctionConfigurationBundle;
import com.opengamma.engine.function.config.FunctionConfigurationSource;
import com.opengamma.engine.function.config.ParameterizedFunctionConfiguration;
import com.opengamma.engine.function.config.StaticFunctionConfiguration;
/**
* Converts function configurations into a format suitable for viewing on the web. Can also handle filtering of query results via a predicate method.
*/
class WebFunctionQueryDelegate {
private static final Pattern s_simpleName = Pattern.compile("([^\\.]+)$");
private final FunctionConfigurationSource _functionConfigurationSource;
public WebFunctionQueryDelegate(FunctionConfigurationSource functionConfigurationSource) {
_functionConfigurationSource = functionConfigurationSource;
}
/**
* @return all function type details
*/
public SortedMap<String, WebFunctionTypeDetails> queryAll() {
return query(Predicates.<WebFunctionTypeDetails>alwaysTrue());
}
/**
* Returns the types which match the predicate.
*
* @param predicate
* @return
*/
public SortedMap<String, WebFunctionTypeDetails> query(Predicate<WebFunctionTypeDetails> predicate) {
FunctionConfigurationBundle functionConfiguration = _functionConfigurationSource.getFunctionConfiguration(Instant.now());
SortedMap<String, WebFunctionTypeDetails> allFunctions = Maps.newTreeMap();
for (FunctionConfiguration input : functionConfiguration.getFunctions()) {
StaticFunctionConfiguration config = ((StaticFunctionConfiguration) input);
String fullName = config.getDefinitionClassName();
Matcher matcher = s_simpleName.matcher(fullName);
String simpleName = matcher.find() ? matcher.group(1) : "Unknown";
WebFunctionTypeDetails typeDetails = new WebFunctionTypeDetails();
typeDetails.setFullyQualifiedName(fullName);
typeDetails.setSimpleName(simpleName);
boolean isParameterized = config instanceof ParameterizedFunctionConfiguration;
typeDetails.setParameterized(isParameterized);
List<String> parameters;
if (isParameterized) {
parameters = ((ParameterizedFunctionConfiguration) config).getParameter();
} else {
parameters = Lists.newArrayList();
}
List<List<String>> parametersList = Lists.newLinkedList();
parametersList.add(parameters);
typeDetails.setParameters(parametersList);
if (!predicate.apply(typeDetails)) {
continue;
}
if (allFunctions.containsKey(simpleName)) {
allFunctions.get(simpleName).getParameters().add(parameters);
} else {
allFunctions.put(simpleName, typeDetails);
}
}
for (WebFunctionTypeDetails typeDetails : allFunctions.values()) {
if (typeDetails.isParameterized()) {
sortParameters(typeDetails);
}
}
return allFunctions;
}
private void sortParameters(WebFunctionTypeDetails typeDetails) {
List<List<String>> parameters = typeDetails.getParameters();
final Ordering<Object> stringOrdering = Ordering.usingToString();
Collections.sort(parameters, new Comparator<List<String>>() {
@Override
public int compare(List<String> o1, List<String> o2) {
for (int i = 0; i < Ints.min(o1.size(), o2.size()); i++) {
int compare = stringOrdering.compare(o1, o2);
if (compare != 0) {
return compare;
}
}
return 0;
}
});
}
}