/** * Creates a new {@link StoreConversions} for the given store-specific {@link SimpleTypeHolder} and the given * converters. * * @param storeTypeHolder must not be {@literal null}. * @param converters must not be {@literal null}. * @return */ public static StoreConversions of(SimpleTypeHolder storeTypeHolder, Collection<?> converters) { Assert.notNull(storeTypeHolder, "SimpleTypeHolder must not be null!"); Assert.notNull(converters, "Converters must not be null!"); return new StoreConversions(storeTypeHolder, converters); }
/** * Creates a new {@link CustomConversions} instance registering the given converters. * * @param storeConversions must not be {@literal null}. * @param converters must not be {@literal null}. */ public CustomConversions(StoreConversions storeConversions, Collection<?> converters) { Assert.notNull(storeConversions, "StoreConversions must not be null!"); Assert.notNull(converters, "List of converters must not be null!"); List<Object> toRegister = new ArrayList<>(); // Add user provided converters to make sure they can override the defaults toRegister.addAll(converters); toRegister.addAll(storeConversions.getStoreConverters()); toRegister.addAll(DEFAULT_CONVERTERS); toRegister.stream()// .flatMap(it -> storeConversions.getRegistrationsFor(it).stream())// .forEach(this::register); Collections.reverse(toRegister); this.converters = Collections.unmodifiableList(toRegister); this.simpleTypeHolder = new SimpleTypeHolder(customSimpleTypes, storeConversions.getStoreTypeHolder()); }
private Streamable<ConverterRegistration> getRegistrationFor(Object converter, Class<?> type, boolean isReading, boolean isWriting) { Class<? extends Object> converterType = converter.getClass(); Class<?>[] arguments = GenericTypeResolver.resolveTypeArguments(converterType, type); if (arguments == null) { throw new IllegalStateException(String.format("Couldn't resolve type arguments for %s!", converterType)); } return Streamable.of(register(arguments[0], arguments[1], isReading, isWriting)); }
/** * Returns {@link ConverterRegistration}s for the given converter. * * @param converter must not be {@literal null}. * @return */ public Streamable<ConverterRegistration> getRegistrationsFor(Object converter) { Assert.notNull(converter, "Converter must not be null!"); Class<?> type = converter.getClass(); boolean isWriting = type.isAnnotationPresent(WritingConverter.class); boolean isReading = type.isAnnotationPresent(ReadingConverter.class); if (converter instanceof ConverterAware) { return Streamable.of(() -> ConverterAware.class.cast(converter).getConverters().stream()// .flatMap(it -> getRegistrationsFor(it).stream())); } else if (converter instanceof GenericConverter) { Set<ConvertiblePair> convertibleTypes = GenericConverter.class.cast(converter).getConvertibleTypes(); return convertibleTypes == null // ? Streamable.empty() // : Streamable.of(convertibleTypes).map(it -> register(it, isReading, isWriting)); } else if (converter instanceof ConverterFactory) { return getRegistrationFor(converter, ConverterFactory.class, isReading, isWriting); } else if (converter instanceof Converter) { return getRegistrationFor(converter, Converter.class, isReading, isWriting); } else { throw new IllegalArgumentException(String.format("Unsupported converter type %s!", converter)); } }
/** * Register custom {@link Converter}s in a {@link CustomConversions} object if required. These * {@link CustomConversions} will be registered with the {@link BasicRelationalConverter} and * {@link #r2dbcMappingContext(Optional, R2dbcCustomConversions)}. Returns an empty {@link R2dbcCustomConversions} * instance by default. * * @return must not be {@literal null}. */ @Bean public R2dbcCustomConversions r2dbcCustomConversions() { Dialect dialect = getDialect(connectionFactory()); StoreConversions storeConversions = StoreConversions.of(dialect.getSimpleTypeHolder()); return new R2dbcCustomConversions(storeConversions, Collections.emptyList()); }
private ConverterRegistration register(Class<?> source, Class<?> target, boolean isReading, boolean isWriting) { return register(new ConvertiblePair(source, target), isReading, isWriting); }
/** * Register custom {@link Converter}s in a {@link CustomConversions} object if required. These * {@link CustomConversions} will be registered with the {@link BasicRelationalConverter} and * {@link #r2dbcMappingContext(Optional, R2dbcCustomConversions)}. Returns an empty {@link R2dbcCustomConversions} * instance by default. * * @return must not be {@literal null}. */ @Bean public R2dbcCustomConversions r2dbcCustomConversions() { Dialect dialect = getDialect(connectionFactory()); StoreConversions storeConversions = StoreConversions.of(dialect.getSimpleTypeHolder()); return new R2dbcCustomConversions(storeConversions, Collections.emptyList()); }
/** * Creates a new {@link StoreConversions} for the given store-specific {@link SimpleTypeHolder} and the given * converters. * * @param storeTypeHolder must not be {@literal null}. * @param converters must not be {@literal null}. * @return */ public static StoreConversions of(SimpleTypeHolder storeTypeHolder, Object... converters) { Assert.notNull(storeTypeHolder, "SimpleTypeHolder must not be null!"); Assert.notNull(converters, "Converters must not be null!"); return new StoreConversions(storeTypeHolder, Arrays.asList(converters)); }
private static BasicRelationalConverter createConverter(Dialect dialect) { Assert.notNull(dialect, "Dialect must not be null"); R2dbcCustomConversions customConversions = new R2dbcCustomConversions( StoreConversions.of(dialect.getSimpleTypeHolder()), Collections.emptyList()); RelationalMappingContext context = new RelationalMappingContext(); context.setSimpleTypeHolder(customConversions.getSimpleTypeHolder()); return new BasicRelationalConverter(context, customConversions); }
private static BasicRelationalConverter createConverter(Dialect dialect) { Assert.notNull(dialect, "Dialect must not be null"); R2dbcCustomConversions customConversions = new R2dbcCustomConversions( StoreConversions.of(dialect.getSimpleTypeHolder()), Collections.emptyList()); RelationalMappingContext context = new RelationalMappingContext(); context.setSimpleTypeHolder(customConversions.getSimpleTypeHolder()); return new BasicRelationalConverter(context, customConversions); }