Migrate yang-common to use JDT annotations
[yangtools.git] / yang / yang-common / src / main / java / org / opendaylight / yangtools / yang / common / QNameModule.java
index b415834e9e97574919e375e300638711d7c4236a..92526280b8d5103d69235fdac5b3e212536a39d8 100644 (file)
@@ -12,28 +12,32 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.Interner;
 import com.google.common.collect.Interners;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
 import java.io.Serializable;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Objects;
 import java.util.Optional;
-import javax.annotation.Nullable;
-import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.concepts.Identifier;
 import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.concepts.WritableObject;
 
-public final class QNameModule implements Comparable<QNameModule>, Immutable, Serializable, Identifier {
+@NonNullByDefault
+public final class QNameModule implements Comparable<QNameModule>, Immutable, Serializable, Identifier, WritableObject {
     private static final Interner<QNameModule> INTERNER = Interners.newWeakInterner();
     private static final long serialVersionUID = 3L;
 
-    private final @NonNull URI namespace;
+    private final URI namespace;
+    private final @Nullable Revision revision;
 
-    //Nullable
-    private final Revision revision;
+    private transient int hash = 0;
 
-    private transient int hash;
-
-    private QNameModule(final @NonNull URI namespace, final Revision revision) {
+    private QNameModule(final URI namespace, final @Nullable Revision revision) {
         this.namespace = requireNonNull(namespace);
         this.revision = revision;
     }
@@ -55,7 +59,7 @@ public final class QNameModule implements Comparable<QNameModule>, Immutable, Se
      * @return A new, potentially shared, QNameModule instance
      */
     public static QNameModule create(final URI namespace, final Optional<Revision> revision) {
-        return new QNameModule(namespace, revision.orElse(null));
+        return new QNameModule(namespace, revision.isPresent() ? revision.get() : null);
     }
 
     /**
@@ -64,6 +68,7 @@ public final class QNameModule implements Comparable<QNameModule>, Immutable, Se
      * @param namespace Module namespace
      * @return A new, potentially shared, QNameModule instance
      */
+    @SuppressFBWarnings("NP_NULL_PARAM_DEREF_NONVIRTUAL")
     public static QNameModule create(final URI namespace) {
         return new QNameModule(namespace, null);
     }
@@ -79,6 +84,20 @@ public final class QNameModule implements Comparable<QNameModule>, Immutable, Se
         return new QNameModule(namespace, revision);
     }
 
+    /**
+     * Read a QNameModule from a DataInput. The format is expected to match the output format
+     * of {@link #writeTo(DataOutput)}.
+     *
+     * @param in DataInput to read
+     * @return A QNameModule instance
+     * @throws IOException if I/O error occurs
+     */
+    public static QNameModule readFrom(final DataInput in) throws IOException {
+        final String namespace = in.readUTF();
+        final String revision = in.readUTF();
+        return new QNameModule(URI.create(namespace), revision.isEmpty() ? null : Revision.of(revision));
+    }
+
     /**
      * Returns the namespace of the module which is specified as argument of
      * YANG Module <b><font color="#00FF00">namespace</font></b> keyword.
@@ -96,7 +115,8 @@ public final class QNameModule implements Comparable<QNameModule>, Immutable, Se
      *         YANG Module <b><font color="#339900">revison</font></b> keyword
      */
     public Optional<Revision> getRevision() {
-        return Optional.ofNullable(revision);
+        final Revision rev = revision;
+        return rev == null ? Optional.empty() : Optional.of(rev);
     }
 
     @Override
@@ -109,6 +129,23 @@ public final class QNameModule implements Comparable<QNameModule>, Immutable, Se
         return Revision.compare(revision, o.revision);
     }
 
+    /**
+     * Returns a QNameModule with the same namespace, but with no revision. If this QNameModule does not have
+     * a revision, this object is returned.
+     *
+     * @return a QNameModule with the same namespace, but with no revision.
+     */
+    @SuppressFBWarnings("NP_NULL_PARAM_DEREF_NONVIRTUAL")
+    public QNameModule withoutRevision() {
+        return revision == null ? this : new QNameModule(namespace, null);
+    }
+
+    @Override
+    public void writeTo(final DataOutput out) throws IOException {
+        out.writeUTF(namespace.toString());
+        out.writeUTF(revision == null ? "" : revision.toString());
+    }
+
     @Override
     public int hashCode() {
         if (hash == 0) {
@@ -118,7 +155,7 @@ public final class QNameModule implements Comparable<QNameModule>, Immutable, Se
     }
 
     @Override
-    public boolean equals(final Object obj) {
+    public boolean equals(final @Nullable Object obj) {
         if (this == obj) {
             return true;
         }