+ throw new IllegalArgumentException("Invalid input: " + input);
+ }
+
+ public static @NonNull QName create(final QName base, final String localName) {
+ return create(base.getModule(), localName);
+ }
+
+ /**
+ * Creates new QName.
+ *
+ * @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 @NonNull QName create(final QNameModule qnameModule, final String localName) {
+ return new QName(requireNonNull(qnameModule, "module may not be null"), checkLocalName(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.
+ * @return Instance of QName
+ */
+ public static @NonNull QName create(final URI namespace, final @Nullable Revision revision,
+ final String localName) {
+ return create(QNameModule.create(namespace, revision), 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.
+ * @return Instance of QName
+ */
+ public static @NonNull QName create(final URI namespace, final Optional<Revision> revision,
+ final String localName) {
+ return create(QNameModule.create(namespace, revision), 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.
+ * @return Instance of QName
+ */
+ public static @NonNull QName create(final String namespace, final String localName, final Revision revision) {
+ return create(QNameModule.create(parseNamespace(namespace), revision), localName);
+ }
+
+ /**
+ * Creates new QName.
+ *
+ * @param namespace Namespace of QName, MUST NOT BE Null.
+ * @param revision Revision of namespace / YANG module. MUST NOT BE null, MUST BE in format {@code YYYY-mm-dd}.
+ * @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} is not valid URI or {@code revision} does not conform
+ * to {@code YYYY-mm-dd}.
+ */
+ public static @NonNull QName create(final String namespace, final String revision, final String localName) {
+ return create(parseNamespace(namespace), Revision.of(revision), localName);
+ }
+
+ /**
+ * Creates new QName.
+ *
+ * @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} is not valid URI.
+ */
+ public static @NonNull 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.
+ * @return A new QName
+ * @throws NullPointerException If any of parameters is null.
+ * @throws IllegalArgumentException If <code>namespace</code> is not valid URI.
+ */
+ public static @NonNull QName create(final URI namespace, final String localName) {
+ return new QName(namespace, localName);
+ }
+
+ /**
+ * Read a QName from a DataInput. The format is expected to match the output format of {@link #writeTo(DataOutput)}.
+ *
+ * @param in DataInput to read
+ * @return A QName instance
+ * @throws IOException if I/O error occurs
+ */
+ public static QName readFrom(final DataInput in) throws IOException {
+ final QNameModule module = QNameModule.readFrom(in);
+ return new QName(module, checkLocalName(in.readUTF()));