org.neo4j.packstream.struct.AbstractStructRegistry Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of neo4j-bolt Show documentation
Show all versions of neo4j-bolt Show documentation
The core of Neo4j Bolt Protocol, this contains the state machine for Bolt sessions.
/*
* Copyright (c) "Neo4j"
* Neo4j Sweden AB [https://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package org.neo4j.packstream.struct;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
public abstract class AbstractStructRegistry implements StructRegistry {
protected final Map> tagToReaderMap;
protected final Map, StructWriter super CTX, ? super S>> typeToWriterMap;
public AbstractStructRegistry(
Map> tagToReaderMap,
Map, StructWriter super CTX, ? super S>> typeToWriterMap) {
this.tagToReaderMap = tagToReaderMap;
this.typeToWriterMap = typeToWriterMap;
}
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public StructRegistry.Builder builderOf() {
return StructRegistry.builder()
.registerReaders((Map) this.tagToReaderMap)
.registerWriters(this.typeToWriterMap);
}
@Override
public Optional extends StructReader super CTX, ? extends S>> getReader(StructHeader header) {
return Optional.ofNullable(this.tagToReaderMap.get(header.tag()));
}
@Override
@SuppressWarnings("unchecked")
public Optional extends StructWriter super CTX, ? super O>> getWriter(O payload) {
var payloadType = payload.getClass();
var directMatch = (StructWriter super CTX, ? super O>) this.typeToWriterMap.get(payloadType);
if (directMatch != null) {
return Optional.of(directMatch);
}
return this.typeToWriterMap.entrySet().stream()
.filter(entry -> entry.getKey().isAssignableFrom(payloadType))
.map(entry -> (StructWriter super CTX, ? super O>) entry.getValue())
.findAny();
}
public abstract static class Builder implements StructRegistry.Builder {
protected final Map> tagToReaderMap;
protected final Map, StructWriter super CTX, ? super S>> typeToWriterMap;
protected Builder() {
this(Collections.emptyMap(), Collections.emptyMap());
}
protected Builder(
Map> tagToReaderMap,
Map, StructWriter super CTX, ? super S>> typeToWriterMap) {
this.tagToReaderMap = new HashMap<>(tagToReaderMap);
this.typeToWriterMap = new HashMap<>(typeToWriterMap);
}
@Override
public StructRegistry.Builder register(short tag, StructReader super CTX, ? extends S> reader) {
this.tagToReaderMap.put(tag, reader);
return this;
}
@Override
public StructRegistry.Builder unregisterReader(short tag) {
this.tagToReaderMap.remove(tag);
return this;
}
@Override
public StructRegistry.Builder unregisterWriter(Class type) {
this.typeToWriterMap.remove(type);
return this;
}
@Override
@SuppressWarnings("unchecked")
public StructRegistry.Builder register(
Class type, StructWriter super CTX, ? super T> writer) {
this.typeToWriterMap.put(type, (StructWriter super CTX, ? super S>) writer);
return this;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy