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

org.redkale.convert.MapDecoder Maven / Gradle / Ivy

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.redkale.convert;

import org.redkale.util.Creator;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;

/**
 * Map的反序列化操作类 
* *

* 详情见: https://redkale.org * * @author zhangjx * @param Map key的数据类型 * @param Map value的数据类型 */ @SuppressWarnings("unchecked") public class MapDecoder implements Decodeable> { protected final Type type; protected final Type keyType; protected final Type valueType; protected Creator> creator; protected final Decodeable keyDecoder; protected final Decodeable valueDecoder; protected boolean inited = false; protected final Object lock = new Object(); public MapDecoder(final ConvertFactory factory, final Type type) { this.type = type; try { if (type == java.util.Properties.class) { this.keyType = String.class; this.valueType = String.class; this.creator = factory.loadCreator(java.util.Properties.class); factory.register(type, this); this.keyDecoder = factory.loadDecoder(String.class); this.valueDecoder = factory.loadDecoder(String.class); } else if (type instanceof ParameterizedType) { final ParameterizedType pt = (ParameterizedType) type; this.keyType = pt.getActualTypeArguments()[0]; this.valueType = pt.getActualTypeArguments()[1]; this.creator = factory.loadCreator((Class) pt.getRawType()); factory.register(type, this); this.keyDecoder = factory.loadDecoder(this.keyType); this.valueDecoder = factory.loadDecoder(this.valueType); } else if (factory.isReversible()) { this.keyType = Object.class; this.valueType = Object.class; this.creator = factory.loadCreator((Class) type); this.keyDecoder = factory.loadDecoder(this.keyType); this.valueDecoder = factory.loadDecoder(this.valueType); } else { throw new ConvertException("mapdecoder not support the type (" + type + ")"); } } finally { inited = true; synchronized (lock) { lock.notifyAll(); } } } @Override public Map convertFrom(Reader in) { return convertFrom(in, null); } public Map convertFrom(Reader in, DeMember member) { if (this.keyDecoder == null || this.valueDecoder == null) { if (!this.inited) { synchronized (lock) { try { lock.wait(); } catch (Exception e) { e.printStackTrace(); } } } } int len = in.readMapB(member, this.keyDecoder); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { contentLength = in.readMemberContentLength(member, null); len = Reader.SIGN_NOLENGTH; } final Map result = this.creator.create(); boolean first = true; if (len == Reader.SIGN_NOLENGTH) { int startPosition = in.position(); while (hasNext(in, member, startPosition, contentLength, first)) { Reader entryReader = getEntryReader(in, member, first); if (entryReader == null) break; K key = readKeyMember(entryReader, member, first); entryReader.readBlank(); V value = readValueMember(entryReader, member, first); result.put(key, value); first = false; } } else { for (int i = 0; i < len; i++) { K key = readKeyMember(in, member, first); in.readBlank(); V value = readValueMember(in, member, first); result.put(key, value); first = false; } } in.readMapE(); return result; } protected boolean hasNext(Reader in, DeMember member, int startPosition, int contentLength, boolean first) { return in.hasNext(startPosition, contentLength); } protected Reader getEntryReader(Reader in, DeMember member, boolean first) { return in; } protected K readKeyMember(Reader in, DeMember member, boolean first) { return keyDecoder.convertFrom(in); } protected V readValueMember(Reader in, DeMember member, boolean first) { return valueDecoder.convertFrom(in); } @Override public Type getType() { return this.type; } public Type getKeyType() { return keyType; } public Type getValueType() { return valueType; } public Decodeable getKeyDecoder() { return keyDecoder; } public Decodeable getValueDecoder() { return valueDecoder; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy