All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.springframework.data.redis.hash.ObjectHashMapper Maven / Gradle / Ivy

There is a newer version: 3.2.5
Show newest version
/*
 * Copyright 2016-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.data.redis.hash;

import java.util.Collections;
import java.util.Map;
import java.util.Set;

import org.springframework.data.redis.core.convert.CustomConversions;
import org.springframework.data.redis.core.convert.IndexResolver;
import org.springframework.data.redis.core.convert.IndexedData;
import org.springframework.data.redis.core.convert.MappingRedisConverter;
import org.springframework.data.redis.core.convert.RedisCustomConversions;
import org.springframework.data.redis.core.convert.RedisData;
import org.springframework.data.redis.core.convert.ReferenceResolver;
import org.springframework.data.redis.core.mapping.RedisMappingContext;
import org.springframework.data.util.TypeInformation;
import org.springframework.lang.Nullable;

/**
 * {@link HashMapper} based on {@link MappingRedisConverter}. Supports nested properties and simple types like
 * {@link String}.
 *
 * 
 * 
 * class Person {
 *
 *   String firstname;
 *   String lastname;
 *
 *   List<String> nicknames;
 *   List<Person> coworkers;
 *
 *   Address address;
 * }
 * 
 * 
* * The above is represented as: * *
 * 
 * _class=org.example.Person
 * firstname=rand
 * lastname=al'thor
 * coworkers.[0].firstname=mat
 * coworkers.[0].nicknames.[0]=prince of the ravens
 * coworkers.[1].firstname=perrin
 * coworkers.[1].address.city=two rivers
 * 
 * 
* * @author Christoph Strobl * @author Mark Paluch * @since 1.8 */ public class ObjectHashMapper implements HashMapper { private final MappingRedisConverter converter; /** * Creates new {@link ObjectHashMapper}. */ public ObjectHashMapper() { this(new RedisCustomConversions()); } /** * Creates new {@link ObjectHashMapper}. * * @param customConversions can be {@literal null}. * @deprecated since 2.0, use {@link #ObjectHashMapper(org.springframework.data.convert.CustomConversions)}. */ @Deprecated public ObjectHashMapper(CustomConversions customConversions) { this((org.springframework.data.convert.CustomConversions) customConversions); } /** * Creates new {@link ObjectHashMapper}. * * @param customConversions can be {@literal null}. * @since 2.0 */ public ObjectHashMapper(@Nullable org.springframework.data.convert.CustomConversions customConversions) { MappingRedisConverter mappingConverter = new MappingRedisConverter(new RedisMappingContext(), new NoOpIndexResolver(), new NoOpReferenceResolver()); mappingConverter.setCustomConversions(customConversions == null ? new RedisCustomConversions() : customConversions); mappingConverter.afterPropertiesSet(); converter = mappingConverter; } /* * (non-Javadoc) * @see org.springframework.data.redis.hash.HashMapper#toHash(java.lang.Object) */ @Override public Map toHash(Object source) { if (source == null) { return Collections.emptyMap(); } RedisData sink = new RedisData(); converter.write(source, sink); return sink.getBucket().rawMap(); } /* * (non-Javadoc) * @see org.springframework.data.redis.hash.HashMapper#fromHash(java.util.Map) */ @Override public Object fromHash(Map hash) { if (hash == null || hash.isEmpty()) { return null; } return converter.read(Object.class, new RedisData(hash)); } /** * Convert a {@code hash} (map) to an object and return the casted result. * * @param hash * @param type * @param * @return */ public T fromHash(Map hash, Class type) { return type.cast(fromHash(hash)); } /** * {@link ReferenceResolver} implementation always returning an empty {@link Map}. * * @author Christoph Strobl */ private static class NoOpReferenceResolver implements ReferenceResolver { private static final Map NO_REFERENCE = Collections.emptyMap(); /* * (non-Javadoc) * @see org.springframework.data.redis.core.convert.ReferenceResolver#resolveReference(java.lang.Object, java.lang.String) */ @Override public Map resolveReference(Object id, String keyspace) { return NO_REFERENCE; } } /** * {@link IndexResolver} always returning an empty {@link Set}. * * @author Christoph Strobl */ private static class NoOpIndexResolver implements IndexResolver { private static final Set NO_INDEXES = Collections.emptySet(); /* * (non-Javadoc) * @see org.springframework.data.redis.core.convert.IndexResolver#resolveIndexesFor(org.springframework.data.util.TypeInformation, java.lang.Object) */ @Override public Set resolveIndexesFor(TypeInformation typeInformation, Object value) { return NO_INDEXES; } /* * (non-Javadoc) * @see org.springframework.data.redis.core.convert.IndexResolver#resolveIndexesFor(java.lang.String, java.lang.String, org.springframework.data.util.TypeInformation, java.lang.Object) */ @Override public Set resolveIndexesFor(String keyspace, String path, TypeInformation typeInformation, Object value) { return NO_INDEXES; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy