This removes run-time reliance on javax.annotation package.
JIRA: YANGTOOLS-907
Change-Id: I9fc87546af3c3a0ee194be68e5cf9278b18b836c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
import com.google.common.annotations.Beta;
import java.io.Serializable;
+import org.eclipse.jdt.annotation.NonNullByDefault;
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();
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;
* 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;
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) {
/**
* 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) {
/**
* 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) {
/**
* 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) {
/**
* 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);
/**
* 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);
*
*/
@Override
- public boolean equals(final Object obj) {
+ public boolean equals(final @Nullable Object obj) {
if (this == obj) {
return true;
}
* @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.
*/
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.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;
}
* @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);
}
/**
* @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);
}
* 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
*
* @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 boolean equals(final Object obj) {
+ public boolean equals(final @Nullable Object obj) {
if (this == obj) {
return true;
}
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.
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):
*
* @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);
}
* @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));
}
* @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;
}
* @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;
}
}
private Object readResolve() {
- return Revision.of(str);
+ return Revision.of(requireNonNull(str));
}
}
}
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.
*
* @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);
*
* @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);
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.
* @author Robert Varga
*/
@Beta
+@NonNullByDefault
public final class YangNames {
private YangNames() {
throw new UnsupportedOperationException();
*
* @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);
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.
* @author Robert Varga
*/
@Beta
+@NonNullByDefault
public enum YangVersion {
/**
* Version 1, as defined in RFC6020.
* @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)));
}
*
* @return Normative reference.
*/
- @Nonnull public String getReference() {
+ public String getReference() {
return reference;
}
@Override
- @Nonnull public String toString() {
+ public String toString() {
return str;
}
}