Use pattern matching on instanceof in yang-common
[yangtools.git] / common / yang-common / src / main / java / org / opendaylight / yangtools / yang / common / BiMapYangNamespaceContext.java
1 /*
2  * Copyright (c) 2019 Pantheon Technologies, s.r.o.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.common;
9
10 import static java.util.Objects.requireNonNull;
11
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;
23
24 /**
25  * A BiMap-based implementation of {@link YangNamespaceContext}.
26  *
27  * @author Robert Varga
28  */
29 @Beta
30 public final class BiMapYangNamespaceContext implements YangNamespaceContext, WritableObject {
31     private static final long serialVersionUID = 1L;
32
33     private final ImmutableBiMap<String, QNameModule> mapping;
34
35     public BiMapYangNamespaceContext(final BiMap<String, QNameModule> mapping) {
36         this.mapping = ImmutableBiMap.copyOf(mapping);
37     }
38
39     @Override
40     public Optional<QNameModule> findNamespaceForPrefix(final String prefix) {
41         return Optional.ofNullable(mapping.get(requireNonNull(prefix)));
42     }
43
44     @Override
45     public Optional<String> findPrefixForNamespace(final QNameModule namespace) {
46         return Optional.ofNullable(mapping.inverse().get(requireNonNull(namespace)));
47     }
48
49     @Override
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);
55         }
56     }
57
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);
65         }
66
67         return new BiMapYangNamespaceContext(builder.build());
68     }
69
70     @Override
71     public int hashCode() {
72         return mapping.hashCode();
73     }
74
75     @Override
76     public boolean equals(final Object obj) {
77         return this == obj || obj instanceof BiMapYangNamespaceContext other && mapping.equals(other.mapping);
78     }
79
80     @Override
81     public String toString() {
82         return MoreObjects.toStringHelper(this).add("mapping", mapping).toString();
83     }
84 }