@Override
public void onPartitionMapper(final Class<?> type, final PartitionMapper partitionMapper) {
final Constructor<?> constructor = findConstructor(type);
final List<ParameterMeta> parameterMetas = parameterModelService
.buildParameterMetas(constructor, getPackage(type), new BaseParameterEnricher.Context(
LocalConfiguration.class.cast(services.getServices().get(LocalConfiguration.class))));
final Function<Map<String, String>, Object[]> parameterFactory =
createParametersFactory(plugin, constructor, services.getServices(), parameterMetas);
final String name = of(partitionMapper.name()).filter(n -> !n.isEmpty()).orElseGet(type::getName);
final ComponentFamilyMeta component = getOrCreateComponent(partitionMapper.family());
final Function<Map<String, String>, Mapper> instantiator =
context.getOwningExtension() != null && context.getOwningExtension().supports(Mapper.class)
? config -> executeInContainer(plugin,
() -> context
.getOwningExtension()
.convert(new ComponentInstanceImpl(
doInvoke(constructor, parameterFactory.apply(config)), plugin,
component.getName(), name), Mapper.class))
: config -> new PartitionMapperImpl(component.getName(), name, null, plugin,
partitionMapper.infinite(), doInvoke(constructor, parameterFactory.apply(config)));
component
.getPartitionMappers()
.put(name,
new ComponentFamilyMeta.PartitionMapperMeta(component, name, findIcon(type),
findVersion(type), type, parameterMetas, instantiator,
migrationHandlerFactory.findMigrationHandler(parameterMetas, type, services),
!context.isNoValidation()));
}