package restx.endpoint.mappers;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.FluentIterable;
import restx.RestxRequest;
import restx.RestxRequestMatch;
import restx.common.AggregateType;
import restx.endpoint.EndpointParamDef;
import restx.endpoint.EndpointParameterKind;
import restx.factory.Component;
import java.util.List;
/**
* @author fcamblor
*/
@Component
public class BaseTypeAggregateEndpointParameterMapper implements EndpointParameterMapper {
private BaseTypeEndpointParameterMapper baseTypeEndpointParameterMapper;
public BaseTypeAggregateEndpointParameterMapper(BaseTypeEndpointParameterMapper baseTypeEndpointParameterMapper) {
this.baseTypeEndpointParameterMapper = baseTypeEndpointParameterMapper;
}
@Override
public <T> T mapRequest(
EndpointParamDef endpointParamDef,
RestxRequest request,
RestxRequestMatch match, EndpointParameterKind parameterKind) {
List<String> values = parameterKind.extractQueryParamStringedValuesFor(endpointParamDef, request, match);
if(values == null) {
return null;
}
final Optional<AggregateType> aggregateType = AggregateType.fromType(endpointParamDef.getRawType().getCanonicalName());
if(!aggregateType.isPresent()) {
throw new IllegalStateException("Called mapRequest() on base type aggregate whereas it is not considered as an aggregate !");
}
final Class aggregatedType = AggregateType.aggregatedTypeOf(endpointParamDef.getType());
List convertedValues = FluentIterable.from(values).transform(new Function<String, Object>() {
@Override
public Object apply(String requestValue) {
return baseTypeEndpointParameterMapper.convertRequestParamValue(Optional.fromNullable(requestValue), aggregatedType, aggregatedType);
}
}).toList();
return (T) aggregateType.get().createFrom(convertedValues, aggregatedType);
}
public boolean isBaseTypeAggregateParam(EndpointParamDef endpointParamDef) {
return AggregateType.isAggregate(endpointParamDef.getRawType().getCanonicalName());
}
}