package restx.endpoint.mappers;
import com.google.common.base.Optional;
import restx.endpoint.EndpointParamDef;
import restx.factory.Component;
/**
* @author fcamblor
*/
@Component
public class DefaultEndpointParameterMapperFactory implements EndpointParameterMapperFactory {
private final BaseTypeAggregateEndpointParameterMapper baseTypeAggregateEndpointParameterMapper;
private final BaseTypeEndpointParameterMapper baseTypeEndpointParameterMapper;
private final ComplexTypeEndpointParameterMapper complexTypeEndpointParameterMapper;
public DefaultEndpointParameterMapperFactory(
BaseTypeAggregateEndpointParameterMapper baseTypeAggregateEndpointParameterMapper,
BaseTypeEndpointParameterMapper baseTypeEndpointParameterMapper,
ComplexTypeEndpointParameterMapper complexTypeEndpointParameterMapper
) {
this.baseTypeAggregateEndpointParameterMapper = baseTypeAggregateEndpointParameterMapper;
this.baseTypeEndpointParameterMapper = baseTypeEndpointParameterMapper;
this.complexTypeEndpointParameterMapper = complexTypeEndpointParameterMapper;
}
@Override
public Optional<? extends EndpointParameterMapper> getEndpointParameterMapperFor(EndpointParamDef endpointParamDef) {
// First option : we're on an aggregate (eg Array | Iterable) of "base" types
// => we should call BaseTypeAggregateEndpointParameterMapper
if(baseTypeAggregateEndpointParameterMapper.isBaseTypeAggregateParam(endpointParamDef)) {
return Optional.of(baseTypeAggregateEndpointParameterMapper);
// Second option : we're on a "base type" (eg a raw type, a Boxing type, or some type considered as "basic" such
// as Date or joda dates)
} else if(baseTypeEndpointParameterMapper.isBaseTypeParam(endpointParamDef)) {
return Optional.of(baseTypeEndpointParameterMapper);
// Third option : we're on a "complex type", that is to say a POJO which should be filled with request params
} else if(complexTypeEndpointParameterMapper.isComplexTypeParam(endpointParamDef)){
return Optional.of(complexTypeEndpointParameterMapper);
} else {
return Optional.absent();
}
}
}