2 * Copyright (c) 2019 Pantheon Technologies, s.r.o. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.common;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.annotations.Beta;
13 import com.google.common.base.MoreObjects;
14 import com.google.common.collect.BiMap;
15 import com.google.common.collect.ImmutableBiMap;
16 import com.google.common.collect.ImmutableBiMap.Builder;
17 import java.io.DataInput;
18 import java.io.DataOutput;
19 import java.io.IOException;
20 import java.util.Map.Entry;
21 import java.util.Optional;
22 import org.opendaylight.yangtools.concepts.WritableObject;
25 * A BiMap-based implementation of {@link YangNamespaceContext}.
27 * @author Robert Varga
30 public final class BiMapYangNamespaceContext implements YangNamespaceContext, WritableObject {
31 private static final long serialVersionUID = 1L;
33 private final ImmutableBiMap<String, QNameModule> mapping;
35 public BiMapYangNamespaceContext(final BiMap<String, QNameModule> mapping) {
36 this.mapping = ImmutableBiMap.copyOf(mapping);
40 public Optional<QNameModule> findNamespaceForPrefix(final String prefix) {
41 return Optional.ofNullable(mapping.get(requireNonNull(prefix)));
45 public Optional<String> findPrefixForNamespace(final QNameModule namespace) {
46 return Optional.ofNullable(mapping.inverse().get(requireNonNull(namespace)));
50 public void writeTo(final DataOutput out) throws IOException {
51 out.writeInt(mapping.size());
52 for (Entry<String, QNameModule> entry : mapping.entrySet()) {
53 out.writeUTF(entry.getKey());
54 entry.getValue().writeTo(out);
58 public static BiMapYangNamespaceContext readFrom(final DataInput in) throws IOException {
59 final int size = in.readInt();
60 final Builder<String, QNameModule> builder = ImmutableBiMap.builder();
61 for (int i = 0; i < size; ++i) {
62 final String prefix = in.readUTF();
63 final QNameModule namespace = QNameModule.readFrom(in);
64 builder.put(prefix, namespace);
67 return new BiMapYangNamespaceContext(builder.build());
71 public int hashCode() {
72 return mapping.hashCode();
76 public boolean equals(final Object obj) {
77 return this == obj || obj instanceof BiMapYangNamespaceContext
78 && mapping.equals(((BiMapYangNamespaceContext) obj).mapping);
82 public String toString() {
83 return MoreObjects.toStringHelper(this).add("mapping", mapping).toString();