Migrate yang-common to use JDT annotations 88/76688/5
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 5 Oct 2018 08:53:50 +0000 (10:53 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 5 Oct 2018 12:39:41 +0000 (14:39 +0200)
This removes run-time reliance on javax.annotation package.

JIRA: YANGTOOLS-907
Change-Id: I9fc87546af3c3a0ee194be68e5cf9278b18b836c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Empty.java
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QNameModule.java
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Revision.java
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/YangConstants.java
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/YangNames.java
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/YangVersion.java

index ee2e691c370919e00d2f09b7296d21e6bd8d80cf..af85eb0547316cd378c488b635d6fed56fc47b5d 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.common;
 
 import com.google.common.annotations.Beta;
 import java.io.Serializable;
+import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.concepts.Immutable;
 
 /**
@@ -17,6 +18,7 @@ import org.opendaylight.yangtools.concepts.Immutable;
  * @author Robert Varga
  */
 @Beta
+@NonNullByDefault
 public final class Empty implements Immutable, Serializable {
     private static final long serialVersionUID = 1L;
     private static final Empty INSTANCE = new Empty();
index 9a272c8f0ea6fc17e77aef86c2a38a030c403f44..5dc281ef90b3bb45d86324bf79bfe15eeb2b89ea 100644 (file)
@@ -23,7 +23,7 @@ import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.annotation.RegEx;
-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;
@@ -53,6 +53,7 @@ import org.opendaylight.yangtools.concepts.WritableObject;
  * affect equality and identity of two QNames and carry only information
  * which may be useful for serializers / deserializers.
  */
+@NonNullByDefault
 public final class QName implements Immutable, Serializable, Comparable<QName>, Identifier, WritableObject {
     private static final Interner<QName> INTERNER = Interners.newWeakInterner();
     private static final long serialVersionUID = 5398411242927766414L;
@@ -71,8 +72,8 @@ public final class QName implements Immutable, Serializable, Comparable<QName>,
 
     private static final char[] ILLEGAL_CHARACTERS = { '?', '(', ')', '&', ':' };
 
-    private final @NonNull QNameModule module;
-    private final @NonNull String localName;
+    private final QNameModule module;
+    private final String localName;
     private transient int hash = 0;
 
     private QName(final QNameModule module, final String localName) {
@@ -129,10 +130,8 @@ public final class QName implements Immutable, Serializable, Comparable<QName>,
     /**
      * Creates new QName.
      *
-     * @param qnameModule
-     *            Namespace and revision enclosed as a QNameModule
-     * @param localName
-     *            Local name part of QName. MUST NOT BE null.
+     * @param qnameModule Namespace and revision enclosed as a QNameModule
+     * @param localName Local name part of QName. MUST NOT BE null.
      * @return Instance of QName
      */
     public static QName create(final QNameModule qnameModule, final String localName) {
@@ -142,12 +141,9 @@ public final class QName implements Immutable, Serializable, Comparable<QName>,
     /**
      * Creates new QName.
      *
-     * @param namespace
-     *            Namespace of QName or null if namespace is undefined.
-     * @param revision
-     *            Revision of namespace or null if revision is unspecified.
-     * @param localName
-     *            Local name part of QName. MUST NOT BE null.
+     * @param namespace Namespace of QName or null if namespace is undefined.
+     * @param revision Revision of namespace or null if revision is unspecified.
+     * @param localName Local name part of QName. MUST NOT BE null.
      * @return Instance of QName
      */
     public static QName create(final URI namespace, final @Nullable Revision revision, final String localName) {
@@ -157,12 +153,9 @@ public final class QName implements Immutable, Serializable, Comparable<QName>,
     /**
      * Creates new QName.
      *
-     * @param namespace
-     *            Namespace of QName or null if namespace is undefined.
-     * @param revision
-     *            Revision of namespace.
-     * @param localName
-     *            Local name part of QName. MUST NOT BE null.
+     * @param namespace Namespace of QName or null if namespace is undefined.
+     * @param revision Revision of namespace.
+     * @param localName Local name part of QName. MUST NOT BE null.
      * @return Instance of QName
      */
     public static QName create(final URI namespace, final Optional<Revision> revision, final String localName) {
@@ -212,15 +205,11 @@ public final class QName implements Immutable, Serializable, Comparable<QName>,
     /**
      * Creates new QName.
      *
-     * @param namespace
-     *            Namespace of QName, MUST NOT BE Null.
-     * @param localName
-     *            Local name part of QName. MUST NOT BE null.
+     * @param namespace Namespace of QName, MUST NOT BE Null.
+     * @param localName Local name part of QName. MUST NOT BE null.
      * @return A new QName
-     * @throws NullPointerException
-     *             If any of parameters is null.
-     * @throws IllegalArgumentException
-     *             If <code>namespace</code> is not valid URI.
+     * @throws NullPointerException If any of parameters is null.
+     * @throws IllegalArgumentException If <code>namespace</code> is not valid URI.
      */
     public static QName create(final String namespace, final String localName) {
         return create(parseNamespace(namespace), localName);
@@ -229,15 +218,11 @@ public final class QName implements Immutable, Serializable, Comparable<QName>,
     /**
      * Creates new QName.
      *
-     * @param namespace
-     *            Namespace of QName, MUST NOT BE null.
-     * @param localName
-     *            Local name part of QName. MUST NOT BE null.
+     * @param namespace Namespace of QName, MUST NOT BE null.
+     * @param localName Local name part of QName. MUST NOT BE null.
      * @return A new QName
-     * @throws NullPointerException
-     *             If any of parameters is null.
-     * @throws IllegalArgumentException
-     *             If <code>namespace</code> is not valid URI.
+     * @throws NullPointerException If any of parameters is null.
+     * @throws IllegalArgumentException If <code>namespace</code> is not valid URI.
      */
     public static QName create(final URI namespace, final String localName) {
         return new QName(namespace, localName);
@@ -329,7 +314,7 @@ public final class QName implements Immutable, Serializable, Comparable<QName>,
      *
      */
     @Override
-    public boolean equals(final Object obj) {
+    public boolean equals(final @Nullable Object obj) {
         if (this == obj) {
             return true;
         }
@@ -370,13 +355,13 @@ public final class QName implements Immutable, Serializable, Comparable<QName>,
      * @param newModule New QNameModule to use
      * @return a QName with specified QNameModule and same local name as this one
      */
-    public QName withModule(@NonNull final QNameModule newModule) {
+    public QName withModule(final QNameModule newModule) {
         return new QName(newModule, localName);
     }
 
     /**
      * Returns a QName with the same namespace and local name, but with no revision. If this QName does not have
-     * a Revision, this object is retured.
+     * a Revision, this object is returned.
      *
      * @return a QName with the same namespace and local name, but with no revision.
      */
index 8b3db1cf824eaac4d3249768b47cd6d18f05f1c4..92526280b8d5103d69235fdac5b3e212536a39d8 100644 (file)
@@ -12,6 +12,7 @@ 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;
@@ -20,24 +21,23 @@ 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;
 
+@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;
-
-    //Nullable
-    private final Revision revision;
+    private final URI namespace;
+    private final @Nullable Revision revision;
 
     private transient int hash = 0;
 
-    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;
     }
@@ -59,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);
     }
 
     /**
@@ -68,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);
     }
@@ -114,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
@@ -133,6 +135,7 @@ public final class QNameModule implements Comparable<QNameModule>, Immutable, Se
      *
      * @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);
     }
@@ -152,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;
         }
index d0b4233400ce26d7a02e8b4091c5015bb7f9d0df..32c6f50e5da64ae6308be6fd8b3dd212a736cf0b 100644 (file)
@@ -18,9 +18,9 @@ import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.util.Optional;
 import java.util.regex.Pattern;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 import javax.annotation.RegEx;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 
 /**
  * Dedicated object identifying a YANG module revision.
@@ -53,9 +53,9 @@ public final class Revision implements Comparable<Revision>, Serializable {
 
     private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
-    private final String str;
+    private final @NonNull String str;
 
-    private Revision(final String str) {
+    private Revision(final @NonNull String str) {
         /*
          * According to RFC7950 (https://tools.ietf.org/html/rfc7950#section-7.1.9):
          *
@@ -78,7 +78,7 @@ public final class Revision implements Comparable<Revision>, Serializable {
      * @throws DateTimeParseException if the string format does not conform specification.
      * @throws NullPointerException if the string is null
      */
-    public static Revision of(@Nonnull final String str) {
+    public static @NonNull Revision of(final @NonNull String str) {
         return new Revision(str);
     }
 
@@ -89,7 +89,7 @@ public final class Revision implements Comparable<Revision>, Serializable {
      * @return An optional Revision instance.
      * @throws DateTimeParseException if the string format does not conform specification.
      */
-    public static Optional<Revision> ofNullable(@Nullable final String str) {
+    public static Optional<Revision> ofNullable(final @Nullable String str) {
         return str == null ? Optional.empty() : Optional.of(new Revision(str));
     }
 
@@ -102,7 +102,7 @@ public final class Revision implements Comparable<Revision>, Serializable {
      * @param second Second optional revision
      * @return Positive, zero, or negative integer.
      */
-    public static int compare(final Optional<Revision> first, final Optional<Revision> second) {
+    public static int compare(final @NonNull Optional<Revision> first, final @NonNull Optional<Revision> second) {
         if (first.isPresent()) {
             return second.isPresent() ? first.get().compareTo(second.get()) : 1;
         }
@@ -117,7 +117,7 @@ public final class Revision implements Comparable<Revision>, Serializable {
      * @param second Second revision
      * @return Positive, zero, or negative integer.
      */
-    public static int compare(@Nullable final Revision first, @Nullable final Revision second) {
+    public static int compare(final @Nullable Revision first, final @Nullable Revision second) {
         if (first != null) {
             return second != null ? first.compareTo(second) : 1;
         }
@@ -176,7 +176,7 @@ public final class Revision implements Comparable<Revision>, Serializable {
         }
 
         private Object readResolve() {
-            return Revision.of(str);
+            return Revision.of(requireNonNull(str));
         }
     }
 }
index eefd658750a134d094d07054357c56fa42c17da3..c4e82b5a195f0d6e5a85d243928712f5b8c3835b 100644 (file)
@@ -8,10 +8,12 @@
 package org.opendaylight.yangtools.yang.common;
 
 import java.net.URI;
+import org.eclipse.jdt.annotation.NonNullByDefault;
 
 /**
  * Constant definitions present in RFC documents related to the YANG language.
  */
+@NonNullByDefault
 public final class YangConstants {
     /**
      * YANG File Extension, as defined in https://tools.ietf.org/html/rfc6020#section-14.1.
@@ -99,6 +101,7 @@ public final class YangConstants {
      *
      * @param module Desired module
      * @return A QName representing action or RPC input.
+     * @throws NullPointerException if {@code module} is null
      */
     public static QName operationInputQName(final QNameModule module) {
         return DUMMY_OPERATION_INPUT.withModule(module);
@@ -110,6 +113,7 @@ public final class YangConstants {
      *
      * @param module Desired module
      * @return A QName representing action or RPC output.
+     * @throws NullPointerException if {@code module} is null
      */
     public static QName operationOutputQName(final QNameModule module) {
         return DUMMY_OPERATION_OUTPUT.withModule(module);
index 1e27ee33786b40b8fb513cc11caefe29ac388319..0830ef6dcecd5bd562e589cce3cd80b354a7542a 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.yangtools.yang.common;
 import com.google.common.annotations.Beta;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.Map.Entry;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 
 /**
  * Utility class for handling various naming conventions mentioned in YANG and related specifications.
@@ -17,6 +19,7 @@ import java.util.Map.Entry;
  * @author Robert Varga
  */
 @Beta
+@NonNullByDefault
 public final class YangNames {
     private YangNames() {
         throw new UnsupportedOperationException();
@@ -28,8 +31,9 @@ public final class YangNames {
      *
      * @param baseName file base name
      * @return A tuple containing the module name and parsed revision, if present.
+     * @throws NullPointerException if {@code baseName} is null
      */
-    public static Entry<String, String> parseFilename(final String baseName) {
+    public static Entry<String, @Nullable String> parseFilename(final String baseName) {
         final int zavinac = baseName.lastIndexOf('@');
         if (zavinac < 0) {
             return new SimpleEntry<>(baseName, null);
index f25e453d56ffe384435f0e82cdfea6771c3da82c..6ba5ceec16a81513011663d22dfa1be620d0671e 100644 (file)
@@ -14,7 +14,7 @@ import com.google.common.collect.Maps;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Optional;
-import javax.annotation.Nonnull;
+import org.eclipse.jdt.annotation.NonNullByDefault;
 
 /**
  * Enumeration of supported YANG versions.
@@ -22,6 +22,7 @@ import javax.annotation.Nonnull;
  * @author Robert Varga
  */
 @Beta
+@NonNullByDefault
 public enum YangVersion {
     /**
      * Version 1, as defined in RFC6020.
@@ -50,7 +51,7 @@ public enum YangVersion {
      * @return YANG version
      * @throws NullPointerException if the string is null
      */
-    public static Optional<YangVersion> parse(@Nonnull final String str) {
+    public static Optional<YangVersion> parse(final String str) {
         return Optional.ofNullable(YANG_VERSION_MAP.get(requireNonNull(str)));
     }
 
@@ -59,12 +60,12 @@ public enum YangVersion {
      *
      * @return Normative reference.
      */
-    @Nonnull public String getReference() {
+    public String getReference() {
         return reference;
     }
 
     @Override
-    @Nonnull public String toString() {
+    public String toString() {
         return str;
     }
 }