From 45ef57fef0b7a0951ac3ed4b0a249225071fcd2c Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 26 Jul 2021 22:08:47 +0200 Subject: [PATCH 1/1] Remove DocumentedException.ErrorTag We have an openly-extensible ErrorTag concept in yang-common. Remove the hard-coded enum we have in DocumentedException. JIRA: NETCONF-793 Change-Id: Ic4e1bebff549c5fd09a78995b8e76e37905241ef Signed-off-by: Robert Varga --- .../mdsal/connector/TransactionProvider.java | 2 +- .../ops/AbstractConfigOperation.java | 9 +- .../mdsal/connector/ops/AbstractEdit.java | 4 +- .../mdsal/connector/ops/CopyConfig.java | 4 +- .../mdsal/connector/ops/DiscardChanges.java | 4 +- .../mdsal/connector/ops/EditConfig.java | 2 +- .../netconf/mdsal/connector/ops/Lock.java | 3 +- .../mdsal/connector/ops/RuntimeRpc.java | 4 +- .../netconf/mdsal/connector/ops/Unlock.java | 3 +- .../netconf/mdsal/connector/ops/Validate.java | 2 +- .../mdsal/connector/ops/get/AbstractGet.java | 2 +- .../ops/get/FilterContentValidator.java | 5 +- .../netconf/mdsal/connector/ops/get/Get.java | 2 +- .../mdsal/connector/ops/get/GetConfig.java | 2 +- .../mdsal/connector/ops/CopyConfigTest.java | 2 +- .../ops/NetconfMDSalMappingTest.java | 2 +- .../mdsal/connector/ops/RuntimeRpcTest.java | 2 +- .../mdsal/connector/ops/ValidateTest.java | 9 +- .../netconf/mdsal/monitoring/GetSchema.java | 8 +- .../netconf/api/DocumentedException.java | 94 ++++++++----------- .../api/NetconfDocumentedException.java | 1 + .../api/xml/MissingNameSpaceException.java | 1 + .../api/xml/UnexpectedElementException.java | 1 + .../api/xml/UnexpectedNamespaceException.java | 5 + .../netconf/api/xml/XmlElement.java | 31 +++--- .../opendaylight/netconf/api/xml/XmlUtil.java | 2 +- .../api/NetconfDocumentedExceptionTest.java | 8 +- .../netconf/api/xml/XmlElementTest.java | 4 +- .../impl/NetconfServerSessionListener.java | 5 +- .../operations/DefaultCloseSession.java | 6 +- .../mapping/operations/DefaultStartExi.java | 2 +- .../impl/osgi/NetconfOperationRouterImpl.java | 37 ++++++-- .../util/DeserializerExceptionHandler.java | 3 +- .../osgi/NetconfOperationRouterImplTest.java | 3 +- .../impl/utils/NetconfTopologyUtils.java | 3 +- .../impl/netconf/ProxyNetconfServiceTest.java | 3 +- .../tx/ProxyReadWriteTransactionTest.java | 3 +- .../mapping/AbstractLastNetconfOperation.java | 3 +- .../listener/NetconfDeviceCommunicator.java | 3 +- .../netconf/sal/tx/AbstractWriteTx.java | 14 +-- .../util/NetconfMessageTransformUtil.java | 9 +- .../test/tool/customrpc/SettableRpc.java | 3 +- .../netconf/test/tool/monitoring/Get.java | 8 +- .../test/tool/rpchandler/SettableRpc.java | 3 +- .../NetconfRestconfTransaction.java | 12 +-- .../rfc8040/rests/utils/FutureCallbackTx.java | 9 +- .../utils/DeleteDataTransactionUtilTest.java | 8 +- .../utils/PatchDataTransactionUtilTest.java | 4 +- 48 files changed, 194 insertions(+), 165 deletions(-) diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/TransactionProvider.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/TransactionProvider.java index 345a5e5287..ecf344a93c 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/TransactionProvider.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/TransactionProvider.java @@ -18,8 +18,8 @@ import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/AbstractConfigOperation.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/AbstractConfigOperation.java index 81899f208d..321a7a0d6f 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/AbstractConfigOperation.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/AbstractConfigOperation.java @@ -24,6 +24,7 @@ import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -62,7 +63,7 @@ abstract class AbstractConfigOperation extends AbstractSingletonNetconfOperation final Optional urlElement = parent.getOnlyChildElementOptionally(URL_KEY); if (urlElement.isEmpty()) { throw new DocumentedException("Invalid RPC, neither not element is present", - ErrorType.PROTOCOL, DocumentedException.ErrorTag.MISSING_ELEMENT, ErrorSeverity.ERROR); + ErrorType.PROTOCOL, ErrorTag.MISSING_ELEMENT, ErrorSeverity.ERROR); } final Document document = getDocumentFromUrl(urlElement.get().getTextContent()); @@ -84,13 +85,13 @@ abstract class AbstractConfigOperation extends AbstractSingletonNetconfOperation return XmlUtil.readXmlToDocument(input); } catch (MalformedURLException e) { throw new DocumentedException(url + " URL is invalid or unsupported", e, - ErrorType.APPLICATION, DocumentedException.ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); } catch (IOException e) { throw new DocumentedException("Could not open URL " + url, e, - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); } catch (SAXException e) { throw new DocumentedException("Could not parse XML at" + url, e, - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); } } diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/AbstractEdit.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/AbstractEdit.java index c64eec08ee..41ac93f9fd 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/AbstractEdit.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/AbstractEdit.java @@ -15,11 +15,11 @@ import java.util.Optional; import javax.xml.stream.XMLStreamException; import javax.xml.transform.dom.DOMSource; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.NetconfDocumentedException; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.XMLNamespace; @@ -62,7 +62,7 @@ abstract class AbstractEdit extends AbstractConfigOperation { xmlParser.traverse(new DOMSource(element.getDomElement())); } catch (final XMLStreamException | URISyntaxException | IOException | SAXException ex) { throw new NetconfDocumentedException("Error parsing input: " + ex.getMessage(), ex, ErrorType.PROTOCOL, - ErrorTag.MALFORMED_MESSAGE, ErrorSeverity.ERROR); + DocumentedException.MALFORMED_MESSAGE, ErrorSeverity.ERROR); } } diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/CopyConfig.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/CopyConfig.java index 2989e27aec..9ba2a1499b 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/CopyConfig.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/CopyConfig.java @@ -26,13 +26,13 @@ import javax.xml.transform.dom.DOMResult; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.netconf.mdsal.connector.TransactionProvider; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; @@ -119,7 +119,7 @@ public final class CopyConfig extends AbstractEdit { final Optional sourceElement = parent.getOnlyChildElementOptionally(SOURCE_KEY); if (sourceElement.isEmpty()) { throw new DocumentedException(" element is missing", - ErrorType.PROTOCOL, DocumentedException.ErrorTag.MISSING_ELEMENT, ErrorSeverity.ERROR); + ErrorType.PROTOCOL, ErrorTag.MISSING_ELEMENT, ErrorSeverity.ERROR); } return sourceElement.get(); diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/DiscardChanges.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/DiscardChanges.java index bb3f97a585..eed436c38e 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/DiscardChanges.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/DiscardChanges.java @@ -10,12 +10,12 @@ package org.opendaylight.netconf.mdsal.connector.ops; import java.util.HashMap; import java.util.Map; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.mdsal.connector.TransactionProvider; import org.opendaylight.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +42,7 @@ public class DiscardChanges extends AbstractSingletonNetconfOperation { } catch (final IllegalStateException e) { LOG.warn("Abort failed ", e); final Map errorInfo = new HashMap<>(); - errorInfo.put(ErrorTag.OPERATION_FAILED.name(), + errorInfo.put(ErrorTag.OPERATION_FAILED.elementBody(), "Operation failed. Use 'get-config' or 'edit-config' before triggering " + OPERATION_NAME + " operation"); throw new DocumentedException(e.getMessage(), e, ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/EditConfig.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/EditConfig.java index bc568e77e1..66020c8dad 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/EditConfig.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/EditConfig.java @@ -15,13 +15,13 @@ import java.util.concurrent.ExecutionException; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.ModifyAction; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.netconf.mdsal.connector.TransactionProvider; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Lock.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Lock.java index ffbb548d17..ab9076e2a4 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Lock.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Lock.java @@ -12,6 +12,7 @@ import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,7 +44,7 @@ public class Lock extends AbstractSingletonNetconfOperation { } throw new DocumentedException("Unable to lock " + targetDatastore + " datastore", - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_NOT_SUPPORTED, ErrorSeverity.ERROR); } static Datastore extractTargetParameter(final XmlElement operationElement) throws DocumentedException { diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpc.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpc.java index efc34d0a15..8159382c36 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpc.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpc.java @@ -21,7 +21,6 @@ import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.dom.api.DOMRpcResult; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.NetconfDocumentedException; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; @@ -31,6 +30,7 @@ import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.XMLNamespace; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; @@ -260,7 +260,7 @@ public class RuntimeRpc extends AbstractSingletonNetconfOperation { xmlParser.traverse(new DOMSource(element.getDomElement())); } catch (final XMLStreamException | URISyntaxException | IOException | SAXException ex) { throw new NetconfDocumentedException("Error parsing input: " + ex.getMessage(), ex, ErrorType.PROTOCOL, - ErrorTag.MALFORMED_MESSAGE, ErrorSeverity.ERROR); + DocumentedException.MALFORMED_MESSAGE, ErrorSeverity.ERROR); } return (ContainerNode) resultHolder.getResult(); diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Unlock.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Unlock.java index b3fe4a56c9..4fd8f22fee 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Unlock.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Unlock.java @@ -12,6 +12,7 @@ import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +41,7 @@ public class Unlock extends AbstractSingletonNetconfOperation { } throw new DocumentedException("Unable to unlock " + targetDatastore + " datastore", - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_NOT_SUPPORTED, ErrorSeverity.ERROR); } @Override diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Validate.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Validate.java index a8229f10f5..c9620176aa 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Validate.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/Validate.java @@ -9,11 +9,11 @@ package org.opendaylight.netconf.mdsal.connector.ops; import com.google.common.collect.ImmutableMap; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.mdsal.connector.TransactionProvider; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java index e4fd8d6ad4..1366fc4e7c 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java @@ -16,13 +16,13 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.dom.DOMResult; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.netconf.mdsal.connector.ops.Datastore; import org.opendaylight.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/FilterContentValidator.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/FilterContentValidator.java index 0be3023f9f..27c0c71064 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/FilterContentValidator.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/FilterContentValidator.java @@ -25,6 +25,7 @@ import org.opendaylight.netconf.api.xml.MissingNameSpaceException; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.XMLNamespace; @@ -84,7 +85,7 @@ public class FilterContentValidator { } catch (final ValidationException e) { LOG.debug("Filter content isn't valid", e); throw new DocumentedException("Validation failed. Cause: " + e.getMessage(), e, - ErrorType.APPLICATION, DocumentedException.ErrorTag.UNKNOWN_NAMESPACE, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.UNKNOWN_NAMESPACE, ErrorSeverity.ERROR); } } @@ -107,7 +108,7 @@ public class FilterContentValidator { } throw new DocumentedException("Unable to find node with namespace: " + nameSpace + " in schema context: " + schemaContext.getCurrentContext(), - ErrorType.APPLICATION, DocumentedException.ErrorTag.UNKNOWN_NAMESPACE, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.UNKNOWN_NAMESPACE, ErrorSeverity.ERROR); } /** diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/Get.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/Get.java index 438af75491..8c28dc8fd6 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/Get.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/Get.java @@ -12,13 +12,13 @@ import java.util.concurrent.ExecutionException; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.netconf.mdsal.connector.TransactionProvider; import org.opendaylight.netconf.mdsal.connector.ops.Datastore; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/GetConfig.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/GetConfig.java index dbca36746e..7de5b223bc 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/GetConfig.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/GetConfig.java @@ -13,13 +13,13 @@ import java.util.concurrent.ExecutionException; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.netconf.mdsal.connector.TransactionProvider; import org.opendaylight.netconf.mdsal.connector.ops.Datastore; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; diff --git a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/CopyConfigTest.java b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/CopyConfigTest.java index a9c951d7bc..1044a8773c 100644 --- a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/CopyConfigTest.java +++ b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/CopyConfigTest.java @@ -18,10 +18,10 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.util.test.XmlFileLoader; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.w3c.dom.Document; import org.xml.sax.SAXException; diff --git a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/NetconfMDSalMappingTest.java b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/NetconfMDSalMappingTest.java index 619f009fa2..d111a5d8a0 100644 --- a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/NetconfMDSalMappingTest.java +++ b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/NetconfMDSalMappingTest.java @@ -14,7 +14,6 @@ import static org.junit.Assert.assertTrue; import java.net.URI; import org.junit.Test; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; @@ -22,6 +21,7 @@ import org.opendaylight.netconf.mdsal.connector.TransactionProvider; import org.opendaylight.netconf.mdsal.connector.ops.get.GetConfig; import org.opendaylight.netconf.util.test.XmlFileLoader; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; diff --git a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpcTest.java b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpcTest.java index 85d6d02962..79142fda2a 100644 --- a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpcTest.java +++ b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpcTest.java @@ -41,7 +41,6 @@ import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMSchemaService; import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.mapping.api.HandlingPriority; import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; @@ -50,6 +49,7 @@ import org.opendaylight.netconf.util.test.XmlFileLoader; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.NoOpListenerRegistration; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.XMLNamespace; diff --git a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/ValidateTest.java b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/ValidateTest.java index 37a7ba8175..891254bef1 100644 --- a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/ValidateTest.java +++ b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/ValidateTest.java @@ -33,6 +33,7 @@ import org.opendaylight.netconf.mdsal.connector.DOMDataTransactionValidator.Vali import org.opendaylight.netconf.mdsal.connector.TransactionProvider; import org.opendaylight.yangtools.util.concurrent.FluentFutures; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.w3c.dom.Document; @@ -62,7 +63,7 @@ public class ValidateTest { final DocumentedException e = assertThrows(DocumentedException.class, () -> validate("messages/mapping/validate/validate.xml")); assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity()); - assertEquals(DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag()); + assertEquals(ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag()); assertEquals(ErrorType.PROTOCOL, e.getErrorType()); } @@ -72,7 +73,7 @@ public class ValidateTest { final DocumentedException e = assertThrows(DocumentedException.class, () -> validate("messages/mapping/validate/validate_no_source.xml")); assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity()); - assertEquals(DocumentedException.ErrorTag.MISSING_ELEMENT, e.getErrorTag()); + assertEquals(ErrorTag.MISSING_ELEMENT, e.getErrorTag()); assertEquals(ErrorType.PROTOCOL, e.getErrorType()); } @@ -82,7 +83,7 @@ public class ValidateTest { final DocumentedException e = assertThrows(DocumentedException.class, () -> validate("messages/mapping/validate/validate_running.xml")); assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity()); - assertEquals(DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag()); + assertEquals(ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag()); assertEquals(ErrorType.PROTOCOL, e.getErrorType()); } @@ -108,7 +109,7 @@ public class ValidateTest { final DocumentedException e = assertThrows(DocumentedException.class, () -> validate("messages/mapping/validate/validate.xml", transactionProvider)); assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity()); - assertEquals(DocumentedException.ErrorTag.OPERATION_FAILED, e.getErrorTag()); + assertEquals(ErrorTag.OPERATION_FAILED, e.getErrorTag()); assertEquals(ErrorType.APPLICATION, e.getErrorType()); } diff --git a/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/GetSchema.java b/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/GetSchema.java index dfabde4eec..2152d184f6 100644 --- a/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/GetSchema.java +++ b/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/GetSchema.java @@ -17,6 +17,7 @@ import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,10 +59,11 @@ public final class GetSchema extends AbstractSingletonNetconfOperation { schema = cap.getSchemaForCapability(entry.identifier, entry.version); } catch (final IllegalStateException e) { final Map errorInfo = new HashMap<>(); - errorInfo.put(DocumentedException.ErrorTag.OPERATION_FAILED.toString(), e.getMessage()); - LOG.warn("Rpc error: {}", DocumentedException.ErrorTag.OPERATION_FAILED, e); + // FIXME: so we have an e.getMessage() ??? In which namespace? Why? + errorInfo.put(ErrorTag.OPERATION_FAILED.elementBody(), e.getMessage()); + LOG.warn("Rpc error: {}", ErrorTag.OPERATION_FAILED, e); throw new DocumentedException(e.getMessage(), e, ErrorType.APPLICATION, - DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR, errorInfo); + ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR, errorInfo); } final Element getSchemaResult; diff --git a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/DocumentedException.java b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/DocumentedException.java index 669218d5d0..4007d0aa9f 100644 --- a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/DocumentedException.java +++ b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/DocumentedException.java @@ -10,12 +10,14 @@ package org.opendaylight.netconf.api; import static org.opendaylight.netconf.api.xml.XmlNetconfConstants.RPC_REPLY_KEY; import static org.opendaylight.netconf.api.xml.XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,6 +29,7 @@ import org.w3c.dom.NodeList; * Checked exception to communicate an error that needs to be sent to the * netconf client. */ +// FIXME: NETCONF-793: implement YangNetconfErrorAware public class DocumentedException extends Exception { public static final String RPC_ERROR = "rpc-error"; @@ -38,10 +41,12 @@ public class DocumentedException extends Exception { public static final String ERROR_MESSAGE = "error-message"; public static final String ERROR_INFO = "error-info"; - private static final long serialVersionUID = 1L; + // FIXME: This is an RFC6241 definition, remove it once we have yangtools-7.0.5 + @Deprecated(forRemoval = true) + public static final ErrorTag MALFORMED_MESSAGE = new ErrorTag("malformed-message"); + private static final long serialVersionUID = 1L; private static final Logger LOG = LoggerFactory.getLogger(DocumentedException.class); - private static final DocumentBuilderFactory BUILDER_FACTORY; static { @@ -61,49 +66,8 @@ public class DocumentedException extends Exception { BUILDER_FACTORY.setIgnoringComments(true); } - public enum ErrorTag { - ACCESS_DENIED("access-denied"), - BAD_ATTRIBUTE("bad-attribute"), - BAD_ELEMENT("bad-element"), - DATA_EXISTS("data-exists"), - DATA_MISSING("data-missing"), - IN_USE("in-use"), - INVALID_VALUE("invalid-value"), - LOCK_DENIED("lock-denied"), - MALFORMED_MESSAGE("malformed-message"), - MISSING_ATTRIBUTE("missing-attribute"), - MISSING_ELEMENT("missing-element"), - OPERATION_FAILED("operation-failed"), - OPERATION_NOT_SUPPORTED("operation-not-supported"), - RESOURCE_DENIED("resource-denied"), - ROLLBCK_FAILED("rollback-failed"), - TOO_BIG("too-big"), - UNKNOWN_ATTRIBUTE("unknown-attribute"), - UNKNOWN_ELEMENT("unknown-element"), - UNKNOWN_NAMESPACE("unknown-namespace"); - - private final String tagValue; - - ErrorTag(final String tagValue) { - this.tagValue = tagValue; - } - - public String getTagValue() { - return this.tagValue; - } - - public static ErrorTag from(final String text) { - for (ErrorTag e : values()) { - if (e.getTagValue().equals(text)) { - return e; - } - } - - return OPERATION_FAILED; - } - } - private final ErrorType errorType; + @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "FIXME: should not be necessary with yangtools-7.0.5") private final ErrorTag errorTag; private final ErrorSeverity errorSeverity; private final Map errorInfo; @@ -141,14 +105,16 @@ public class DocumentedException extends Exception { this.errorType = errorType; this.errorTag = errorTag; this.errorSeverity = errorSeverity; + // FIXME: this contract (based on what fromXMLDocument does) is quite wrong. It ignores the XML realities of + // what constitutes a tag and especially tag value when faced with encoding XML-namespaced entities -- + // such as 'identity' arguments -- represented as QNames. this.errorInfo = errorInfo; } - public static DocumentedException wrap(final E exception) throws DocumentedException { - final Map errorInfo = new HashMap<>(); - errorInfo.put(ErrorTag.OPERATION_FAILED.name(), "Exception thrown"); + public static DocumentedException wrap(final Exception exception) throws DocumentedException { throw new DocumentedException(exception.getMessage(), exception, ErrorType.APPLICATION, - ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR, errorInfo); + ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR, + Map.of(ErrorTag.OPERATION_FAILED.elementBody(), "Exception thrown")); } public static DocumentedException fromXMLDocument(final Document fromDoc) { @@ -162,9 +128,10 @@ public class DocumentedException extends Exception { Node rpcReply = fromDoc.getDocumentElement(); - // FIXME: BUG? - we only handle one rpc-error. For now, shove extra errorMessages - // found in multiple rpc-error in the errorInfo Map to at least let them propagate - // back to caller. + // FIXME: we only handle one rpc-error. For now, shove extra errorMessages found in multiple rpc-error in the + // errorInfo Map to at least let them propagate back to caller. + // this will be solved through migration to YangNetconfErrorAware, as that allows reporting multipl + // error events int rpcErrorCount = 0; NodeList replyChildren = rpcReply.getChildNodes(); @@ -182,7 +149,7 @@ public class DocumentedException extends Exception { // FIXME: this should be a hard error errorType = type != null ? type : ErrorType.APPLICATION; } else if (ERROR_TAG.equals(rpcErrorChild.getLocalName())) { - errorTag = ErrorTag.from(rpcErrorChild.getTextContent()); + errorTag = new ErrorTag(rpcErrorChild.getTextContent()); } else if (ERROR_SEVERITY.equals(rpcErrorChild.getLocalName())) { final ErrorSeverity sev = ErrorSeverity.forElementBody(rpcErrorChild.getTextContent()); // FIXME: this should be a hard error @@ -213,6 +180,22 @@ public class DocumentedException extends Exception { for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { + // FIXME: Holy namespace ignorance, Batman! + // + // So this is just not enough to decode things in the general sense. getTextContenxt() may easily be a + // qualified QName, such as an identity name or an instance-identifier. What the entire 'infoMap' needs + // to contain is each child's XML context, so that the string literal can be interpreted as needed. + // + // yang.common.YangNamespaceContext represents the minimal API surface that needs to be exposed. That + // effectively means: + // + // final class ElementValue implements YangNamespaceContext { + // public final String elementContenxt(); + // } + // + // Map infoMap; + // + // except... what do we use for revision? infoMap.put(child.getNodeName(), child.getTextContent()); } } @@ -220,6 +203,7 @@ public class DocumentedException extends Exception { return infoMap; } + // FIXME: NETCONF-793: remove all of these in favor of YangNetconfErrorAware public ErrorType getErrorType() { return this.errorType; } @@ -236,6 +220,8 @@ public class DocumentedException extends Exception { return this.errorInfo; } + // FIXME: this really should be an spi/util method (or even netconf-util-w3c-dom?) as this certainly is not the + // primary interface we want to expose -- it is inherently mutable and its API is a pure nightmare. public Document toXMLDocument() { Document doc = null; try { @@ -248,7 +234,7 @@ public class DocumentedException extends Exception { rpcReply.appendChild(rpcError); rpcError.appendChild(createTextNode(doc, ERROR_TYPE, getErrorType().elementBody())); - rpcError.appendChild(createTextNode(doc, ERROR_TAG, getErrorTag().getTagValue())); + rpcError.appendChild(createTextNode(doc, ERROR_TAG, getErrorTag().elementBody())); rpcError.appendChild(createTextNode(doc, ERROR_SEVERITY, getErrorSeverity().elementBody())); rpcError.appendChild(createTextNode(doc, ERROR_MESSAGE, getLocalizedMessage())); @@ -275,7 +261,7 @@ public class DocumentedException extends Exception { return doc; } - private Node createTextNode(final Document doc, final String tag, final String textContent) { + private static Node createTextNode(final Document doc, final String tag, final String textContent) { Node node = doc.createElementNS(URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, tag); node.setTextContent(textContent); return node; diff --git a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/NetconfDocumentedException.java b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/NetconfDocumentedException.java index d13a5e1e97..ed623cd7f1 100644 --- a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/NetconfDocumentedException.java +++ b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/NetconfDocumentedException.java @@ -10,6 +10,7 @@ package org.opendaylight.netconf.api; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Map; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.w3c.dom.Document; diff --git a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/MissingNameSpaceException.java b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/MissingNameSpaceException.java index 092e9c5946..6908d07c46 100644 --- a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/MissingNameSpaceException.java +++ b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/MissingNameSpaceException.java @@ -10,6 +10,7 @@ package org.opendaylight.netconf.api.xml; import java.util.Map; import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; public class MissingNameSpaceException extends DocumentedException { diff --git a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/UnexpectedElementException.java b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/UnexpectedElementException.java index 148fb10984..95a036d8a2 100644 --- a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/UnexpectedElementException.java +++ b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/UnexpectedElementException.java @@ -10,6 +10,7 @@ package org.opendaylight.netconf.api.xml; import java.util.Map; import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; public class UnexpectedElementException extends DocumentedException { diff --git a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/UnexpectedNamespaceException.java b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/UnexpectedNamespaceException.java index f727704a67..825f1ad8e6 100644 --- a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/UnexpectedNamespaceException.java +++ b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/UnexpectedNamespaceException.java @@ -10,11 +10,16 @@ package org.opendaylight.netconf.api.xml; import java.util.Map; import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; public class UnexpectedNamespaceException extends DocumentedException { private static final long serialVersionUID = 1L; + public UnexpectedNamespaceException(final String format, final Object... args) { + this(String.format(format, args), ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); + } + public UnexpectedNamespaceException(final String message, final ErrorType errorType, final ErrorTag errorTag, final ErrorSeverity errorSeverity) { this(message, errorType, errorTag, errorSeverity, Map.of()); diff --git a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlElement.java b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlElement.java index d65f4de0ae..c4346ee7e1 100644 --- a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlElement.java +++ b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlElement.java @@ -21,6 +21,7 @@ import java.util.Optional; import javax.xml.XMLConstants; import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,7 +88,7 @@ public final class XmlElement { } else { if (!attribKey.startsWith(XMLConstants.XMLNS_ATTRIBUTE + ":")) { throw new DocumentedException("Attribute doesn't start with :", - ErrorType.APPLICATION, DocumentedException.ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); } prefix = attribKey.substring(XMLConstants.XMLNS_ATTRIBUTE.length() + 1); } @@ -108,9 +109,9 @@ public final class XmlElement { public void checkName(final String expectedName) throws UnexpectedElementException { if (!getName().equals(expectedName)) { - throw new UnexpectedElementException(String.format("Expected %s xml element but was %s", expectedName, - getName()), - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); + throw new UnexpectedElementException( + String.format("Expected %s xml element but was %s", expectedName, getName()), + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); } } @@ -119,7 +120,7 @@ public final class XmlElement { if (!getNamespaceAttribute().equals(expectedNamespace)) { throw new UnexpectedNamespaceException( String.format("Unexpected namespace %s should be %s", getNamespaceAttribute(), expectedNamespace), - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); } } @@ -128,7 +129,7 @@ public final class XmlElement { if (!getNamespace().equals(expectedNamespace)) { throw new UnexpectedNamespaceException( String.format("Unexpected namespace %s should be %s", getNamespace(), expectedNamespace), - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); } } @@ -289,7 +290,7 @@ public final class XmlElement { if (children.size() != 1) { throw new DocumentedException(String.format("One element %s:%s expected in %s but was %s", namespace, childName, toString(), children.size()), - ErrorType.APPLICATION, DocumentedException.ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); } return children.get(0); @@ -299,7 +300,7 @@ public final class XmlElement { List nameElements = getChildElements(childName); if (nameElements.size() != 1) { throw new DocumentedException("One element " + childName + " expected in " + toString(), - ErrorType.APPLICATION, DocumentedException.ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); } return nameElements.get(0); } @@ -307,9 +308,9 @@ public final class XmlElement { public XmlElement getOnlyChildElement() throws DocumentedException { List children = getChildElements(); if (children.size() != 1) { - throw new DocumentedException(String.format("One element expected in %s but was %s", toString(), - children.size()), - ErrorType.APPLICATION, DocumentedException.ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); + throw new DocumentedException( + String.format("One element expected in %s but was %s", toString(), children.size()), + ErrorType.APPLICATION, ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); } return children.get(0); } @@ -327,7 +328,7 @@ public final class XmlElement { } } throw new DocumentedException(getName() + " should contain text.", - ErrorType.APPLICATION, DocumentedException.ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); } public Optional getOnlyTextContentOptionally() { @@ -345,7 +346,7 @@ public final class XmlElement { String attribute = element.getAttribute(XMLConstants.XMLNS_ATTRIBUTE); if (attribute.isEmpty() || attribute.equals(DEFAULT_NAMESPACE_PREFIX)) { throw new MissingNameSpaceException(String.format("Element %s must specify namespace", toString()), - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); } return attribute; } @@ -371,7 +372,7 @@ public final class XmlElement { Optional namespaceURI = getNamespaceOptionally(); if (namespaceURI.isEmpty()) { throw new MissingNameSpaceException(String.format("No namespace defined for %s", this), - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); } return namespaceURI.get(); } @@ -438,7 +439,7 @@ public final class XmlElement { } if (!childElements.isEmpty()) { throw new DocumentedException(String.format("Unrecognised elements %s in %s", childElements, this), - ErrorType.APPLICATION, DocumentedException.ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.INVALID_VALUE, ErrorSeverity.ERROR); } } diff --git a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlUtil.java b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlUtil.java index 8454831317..aa3f5b434d 100644 --- a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlUtil.java +++ b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlUtil.java @@ -68,7 +68,7 @@ public final class XmlUtil { BUILDER_FACTORY = factory; } - private static final ThreadLocal DEFAULT_DOM_BUILDER = new ThreadLocal() { + private static final ThreadLocal DEFAULT_DOM_BUILDER = new ThreadLocal<>() { @Override protected DocumentBuilder initialValue() { try { diff --git a/netconf/netconf-api/src/test/java/org/opendaylight/netconf/api/NetconfDocumentedExceptionTest.java b/netconf/netconf-api/src/test/java/org/opendaylight/netconf/api/NetconfDocumentedExceptionTest.java index 87cf0686dd..f4261f0a7f 100644 --- a/netconf/netconf-api/src/test/java/org/opendaylight/netconf/api/NetconfDocumentedExceptionTest.java +++ b/netconf/netconf-api/src/test/java/org/opendaylight/netconf/api/NetconfDocumentedExceptionTest.java @@ -22,6 +22,7 @@ import org.junit.Before; import org.junit.Test; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.w3c.dom.Document; import org.w3c.dom.Node; @@ -62,7 +63,7 @@ public class NetconfDocumentedExceptionTest { public void testToAndFromXMLDocument() throws XPathExpressionException { final String errorMessage = "mock error message"; DocumentedException ex = new NetconfDocumentedException(errorMessage, null, ErrorType.PROTOCOL, - DocumentedException.ErrorTag.DATA_EXISTS, ErrorSeverity.WARNING, Map.of("foo", "bar")); + ErrorTag.DATA_EXISTS, ErrorSeverity.WARNING, Map.of("foo", "bar")); final Document doc = ex.toXMLDocument(); assertNotNull("Document is null", doc); @@ -81,8 +82,7 @@ public class NetconfDocumentedExceptionTest { final Node errorTagNode = getNode("netconf:error-tag", rpcErrorNode); assertNotNull("error-tag not found", errorTagNode); - assertEquals("error-tag", DocumentedException.ErrorTag.DATA_EXISTS.getTagValue(), - errorTagNode.getTextContent()); + assertEquals("error-tag", ErrorTag.DATA_EXISTS.elementBody(), errorTagNode.getTextContent()); final Node errorSeverityNode = getNode("netconf:error-severity", rpcErrorNode); assertNotNull("error-severity not found", errorSeverityNode); @@ -102,7 +102,7 @@ public class NetconfDocumentedExceptionTest { assertNotNull("NetconfDocumentedException is null", ex); assertEquals("getErrorSeverity", ErrorSeverity.WARNING, ex.getErrorSeverity()); - assertEquals("getErrorTag", DocumentedException.ErrorTag.DATA_EXISTS, ex.getErrorTag()); + assertEquals("getErrorTag", ErrorTag.DATA_EXISTS, ex.getErrorTag()); assertEquals("getErrorType", ErrorType.PROTOCOL, ex.getErrorType()); assertEquals("getLocalizedMessage", errorMessage, ex.getLocalizedMessage()); assertEquals("getErrorInfo", Map.of("foo", "bar"), ex.getErrorInfo()); diff --git a/netconf/netconf-api/src/test/java/org/opendaylight/netconf/api/xml/XmlElementTest.java b/netconf/netconf-api/src/test/java/org/opendaylight/netconf/api/xml/XmlElementTest.java index 04c73da365..478098eafe 100644 --- a/netconf/netconf-api/src/test/java/org/opendaylight/netconf/api/xml/XmlElementTest.java +++ b/netconf/netconf-api/src/test/java/org/opendaylight/netconf/api/xml/XmlElementTest.java @@ -121,6 +121,8 @@ public class XmlElementTest { final DocumentedException e = assertThrows(DocumentedException.class, () -> xmlElement.checkUnrecognisedElements(xmlElement.getOnlyChildElement("inner"))); - assertThat(e.getMessage(), both(containsString("innerNamespace")).and(containsString("innerNamespace"))); + assertThat(e.getMessage(), + // FIXME: this looks very suspect + both(containsString("innerNamespace")).and(containsString("innerNamespace"))); } } diff --git a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionListener.java b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionListener.java index 0d4a84c86f..c641d4158d 100644 --- a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionListener.java +++ b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionListener.java @@ -23,6 +23,7 @@ import org.opendaylight.netconf.notifications.NetconfNotification; import org.opendaylight.netconf.util.messages.SendErrorExceptionUtil; import org.opendaylight.netconf.util.messages.SubtreeFilter; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -138,7 +139,7 @@ public class NetconfServerSessionListener implements NetconfSessionListenerexception.toString()? That looks wrong on a few levels. + Map.of(ErrorSeverity.ERROR.elementBody(), e.getMessage())); } return document.createElement(XmlNetconfConstants.OK); } diff --git a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/mapping/operations/DefaultStartExi.java b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/mapping/operations/DefaultStartExi.java index 844250c097..65c2168ff6 100644 --- a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/mapping/operations/DefaultStartExi.java +++ b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/mapping/operations/DefaultStartExi.java @@ -8,7 +8,6 @@ package org.opendaylight.netconf.impl.mapping.operations; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; import org.opendaylight.netconf.api.NetconfMessage; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; @@ -17,6 +16,7 @@ import org.opendaylight.netconf.impl.NetconfServerSession; import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.netconf.util.mapping.AbstractSingletonNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/osgi/NetconfOperationRouterImpl.java b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/osgi/NetconfOperationRouterImpl.java index 7dd0c2ad6b..3aa1c71072 100644 --- a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/osgi/NetconfOperationRouterImpl.java +++ b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/osgi/NetconfOperationRouterImpl.java @@ -31,6 +31,7 @@ import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.netconf.mapping.api.NetconfOperationService; import org.opendaylight.netconf.mapping.api.SessionAwareNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,16 +70,31 @@ public class NetconfOperationRouterImpl implements NetconfOperationRouter { final String messageAsString = XmlUtil.toString(message); LOG.warn("Unable to handle rpc {} on session {}", messageAsString, session, e); - final DocumentedException.ErrorTag tag; - if (e instanceof IllegalArgumentException) { - tag = DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED; - } else { - tag = DocumentedException.ErrorTag.OPERATION_FAILED; - } + final ErrorTag tag = e instanceof IllegalArgumentException ? ErrorTag.OPERATION_NOT_SUPPORTED + : ErrorTag.OPERATION_FAILED; throw new DocumentedException( - String.format("Unable to handle rpc %s on session %s", messageAsString, session), - e, ErrorType.APPLICATION, tag, ErrorSeverity.ERROR, Map.of(tag.toString(), e.getMessage())); + String.format("Unable to handle rpc %s on session %s", messageAsString, session), e, + ErrorType.APPLICATION, tag, ErrorSeverity.ERROR, + // FIXME: i.e. in what namespace are we providing these tags? why is this not just: + // + // + // e.getMessage() + // + // + // for each place where we are mapping Exception.getMessage() ? We probably do not want to propagate + // stack traces out, but suppressed exceptions and causal list might be interesting: + // + // + // reported exception + // + // + // cause of reported exception + // + // + // cause of cause of reported exception + // + Map.of(tag.elementBody(), e.getMessage())); } catch (final RuntimeException e) { throw handleUnexpectedEx("sort", e); } @@ -98,8 +114,9 @@ public class NetconfOperationRouterImpl implements NetconfOperationRouter { private static DocumentedException handleUnexpectedEx(final String op, final Exception exception) { LOG.error("Unexpected exception during netconf operation {}", op, exception); return new DocumentedException("Unexpected error", - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR, - Map.of(ErrorSeverity.ERROR.toString(), exception.toString())); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR, + // FIXME: i.e. exception.toString()? That looks wrong on a few levels. + Map.of(ErrorSeverity.ERROR.elementBody(), exception.toString())); } private static Document executeOperationWithHighestPriority(final Document message, diff --git a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/util/DeserializerExceptionHandler.java b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/util/DeserializerExceptionHandler.java index 4981719373..55631ef0eb 100644 --- a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/util/DeserializerExceptionHandler.java +++ b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/util/DeserializerExceptionHandler.java @@ -19,7 +19,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class DeserializerExceptionHandler implements ChannelHandler { - private static final Logger LOG = LoggerFactory.getLogger(DeserializerExceptionHandler.class); @Override @@ -42,7 +41,7 @@ public final class DeserializerExceptionHandler implements ChannelHandler { final Map info = new HashMap<>(); info.put("cause", cause.getMessage()); final DocumentedException ex = new DocumentedException(cause.getMessage(), - ErrorType.RPC, DocumentedException.ErrorTag.MALFORMED_MESSAGE, ErrorSeverity.ERROR, info); + ErrorType.RPC, DocumentedException.MALFORMED_MESSAGE, ErrorSeverity.ERROR, info); SendErrorExceptionUtil.sendErrorMessage(ctx.channel(), ex); } diff --git a/netconf/netconf-impl/src/test/java/org/opendaylight/netconf/impl/osgi/NetconfOperationRouterImplTest.java b/netconf/netconf-impl/src/test/java/org/opendaylight/netconf/impl/osgi/NetconfOperationRouterImplTest.java index 5abcd7512b..b9b2f28e12 100644 --- a/netconf/netconf-impl/src/test/java/org/opendaylight/netconf/impl/osgi/NetconfOperationRouterImplTest.java +++ b/netconf/netconf-impl/src/test/java/org/opendaylight/netconf/impl/osgi/NetconfOperationRouterImplTest.java @@ -33,6 +33,7 @@ import org.opendaylight.netconf.mapping.api.HandlingPriority; import org.opendaylight.netconf.mapping.api.NetconfOperation; import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.netconf.mapping.api.NetconfOperationService; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.w3c.dom.Document; import org.xml.sax.SAXException; @@ -113,7 +114,7 @@ public class NetconfOperationRouterImplTest { public void testOnNetconfMessageFail() throws Exception { final DocumentedException ex = assertThrows(DocumentedException.class, () -> emptyOperationRouter.onNetconfMessage(TEST_RPC_DOC, null)); - assertEquals(DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, ex.getErrorTag()); + assertEquals(ErrorTag.OPERATION_NOT_SUPPORTED, ex.getErrorTag()); } @Test diff --git a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java index 56ee80fa73..6d44d74174 100644 --- a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java +++ b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java @@ -24,6 +24,7 @@ import org.opendaylight.yangtools.yang.binding.Identifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; public final class NetconfTopologyUtils { @@ -83,6 +84,6 @@ public final class NetconfTopologyUtils { public static DocumentedException createMasterIsDownException(final RemoteDeviceId id, final Exception cause) { return new DocumentedException(id + ":Master is down. Please try again.", cause, - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.WARNING); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.WARNING); } } diff --git a/netconf/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/netconf/ProxyNetconfServiceTest.java b/netconf/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/netconf/ProxyNetconfServiceTest.java index 877c9e2b4c..33fe1a5f47 100644 --- a/netconf/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/netconf/ProxyNetconfServiceTest.java +++ b/netconf/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/netconf/ProxyNetconfServiceTest.java @@ -47,6 +47,7 @@ import org.opendaylight.netconf.topology.singleton.messages.netconf.UnlockReques import org.opendaylight.netconf.topology.singleton.messages.rpc.InvokeRpcMessageReply; import org.opendaylight.netconf.topology.singleton.messages.transactions.EmptyReadResponse; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -303,7 +304,7 @@ public class ProxyNetconfServiceTest { assertTrue("Unexpected cause " + cause, cause instanceof DocumentedException); final DocumentedException de = (DocumentedException) cause; assertEquals(ErrorSeverity.WARNING, de.getErrorSeverity()); - assertEquals(DocumentedException.ErrorTag.OPERATION_FAILED, de.getErrorTag()); + assertEquals(ErrorTag.OPERATION_FAILED, de.getErrorTag()); assertEquals(ErrorType.APPLICATION, de.getErrorType()); } } \ No newline at end of file diff --git a/netconf/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/tx/ProxyReadWriteTransactionTest.java b/netconf/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/tx/ProxyReadWriteTransactionTest.java index 83f1dd9ae9..5f46010daa 100644 --- a/netconf/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/tx/ProxyReadWriteTransactionTest.java +++ b/netconf/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/tx/ProxyReadWriteTransactionTest.java @@ -44,6 +44,7 @@ import org.opendaylight.netconf.topology.singleton.messages.transactions.PutRequ import org.opendaylight.netconf.topology.singleton.messages.transactions.ReadRequest; import org.opendaylight.netconf.topology.singleton.messages.transactions.SubmitRequest; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -403,7 +404,7 @@ public class ProxyReadWriteTransactionTest { assertTrue("Unexpected cause " + cause, cause instanceof DocumentedException); final DocumentedException de = (DocumentedException) cause; assertEquals(ErrorSeverity.WARNING, de.getErrorSeverity()); - assertEquals(DocumentedException.ErrorTag.OPERATION_FAILED, de.getErrorTag()); + assertEquals(ErrorTag.OPERATION_FAILED, de.getErrorTag()); assertEquals(ErrorType.APPLICATION, de.getErrorType()); } } diff --git a/netconf/netconf-util/src/main/java/org/opendaylight/netconf/util/mapping/AbstractLastNetconfOperation.java b/netconf/netconf-util/src/main/java/org/opendaylight/netconf/util/mapping/AbstractLastNetconfOperation.java index 7595a86ea5..f4414fb295 100644 --- a/netconf/netconf-util/src/main/java/org/opendaylight/netconf/util/mapping/AbstractLastNetconfOperation.java +++ b/netconf/netconf-util/src/main/java/org/opendaylight/netconf/util/mapping/AbstractLastNetconfOperation.java @@ -17,7 +17,6 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; public abstract class AbstractLastNetconfOperation extends AbstractNetconfOperation { - protected AbstractLastNetconfOperation(final String netconfSessionIdForReporting) { super(netconfSessionIdForReporting); } @@ -28,7 +27,7 @@ public abstract class AbstractLastNetconfOperation extends AbstractNetconfOperat if (!subsequentOperation.isExecutionTermination()) { throw new DocumentedException(String.format( "No netconf operation expected to be subsequent to %s, but is %s", this, subsequentOperation), - ErrorType.APPLICATION, DocumentedException.ErrorTag.MALFORMED_MESSAGE, ErrorSeverity.ERROR); + ErrorType.APPLICATION, DocumentedException.MALFORMED_MESSAGE, ErrorSeverity.ERROR); } return handleWithNoSubsequentOperations(document, operationElement); diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java index de840e27d0..b6725d6231 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java @@ -38,6 +38,7 @@ import org.opendaylight.netconf.sal.connect.api.RemoteDeviceCommunicator; import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil; import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId; import org.opendaylight.yangtools.util.concurrent.FluentFutures; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; @@ -227,7 +228,7 @@ public class NetconfDeviceCommunicator private static RpcResult createErrorRpcResult(final RpcError.ErrorType errorType, final String message) { return RpcResultBuilder.failed() - .withError(errorType, NetconfDocumentedException.ErrorTag.OPERATION_FAILED.getTagValue(), message).build(); + .withError(errorType, ErrorTag.OPERATION_FAILED.elementBody(), message).build(); } @Override diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/tx/AbstractWriteTx.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/tx/AbstractWriteTx.java index 896485b70b..3e6201df86 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/tx/AbstractWriteTx.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/tx/AbstractWriteTx.java @@ -27,12 +27,12 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMRpcResult; -import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.netconf.api.ModifyAction; import org.opendaylight.netconf.api.NetconfDocumentedException; import org.opendaylight.netconf.sal.connect.netconf.util.NetconfBaseOps; import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; @@ -230,10 +230,9 @@ public abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction { final NetconfDocumentedException exception = new NetconfDocumentedException( id + ":RPC during tx returned an exception" + throwable.getMessage(), + // FIXME: add proper unmask/wrap to ExecutionException new Exception(throwable), - ErrorType.APPLICATION, - DocumentedException.ErrorTag.OPERATION_FAILED, - ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); transformed.setException(exception); } }, MoreExecutors.directExecutor()); @@ -264,11 +263,8 @@ public abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction { } } if (errorsEncouneterd) { - final NetconfDocumentedException exception = new NetconfDocumentedException(id - + ":RPC during tx failed. " + msgBuilder.toString(), - errType, - DocumentedException.ErrorTag.from(errorTag), - errSeverity); + final NetconfDocumentedException exception = new NetconfDocumentedException( + id + ":RPC during tx failed. " + msgBuilder, errType, new ErrorTag(errorTag), errSeverity); transformed.setException(exception); return; } diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfMessageTransformUtil.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfMessageTransformUtil.java index 865a2a62c7..6e4d1f8c2d 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfMessageTransformUtil.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfMessageTransformUtil.java @@ -52,6 +52,7 @@ import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata; import org.opendaylight.yangtools.rfc7952.data.util.ImmutableNormalizedMetadata; import org.opendaylight.yangtools.rfc7952.data.util.ImmutableNormalizedMetadata.Builder; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcError; @@ -289,7 +290,7 @@ public final class NetconfMessageTransformUtil { if (!inputMsgId.equals(outputMsgId)) { throw new NetconfDocumentedException("Response message contained unknown \"message-id\"", null, - ErrorType.PROTOCOL, NetconfDocumentedException.ErrorTag.BAD_ATTRIBUTE, ErrorSeverity.ERROR, + ErrorType.PROTOCOL, ErrorTag.BAD_ATTRIBUTE, ErrorSeverity.ERROR, ImmutableMap.of("actual-message-id", outputMsgId, "expected-message-id", inputMsgId)); } } @@ -312,10 +313,10 @@ public final class NetconfMessageTransformUtil { } return ex.getErrorSeverity() == ErrorSeverity.ERROR - ? RpcResultBuilder.newError(ex.getErrorType().toLegacy(), ex.getErrorTag().getTagValue(), + ? RpcResultBuilder.newError(ex.getErrorType().toLegacy(), ex.getErrorTag().elementBody(), ex.getLocalizedMessage(), null, infoBuilder.toString(), ex.getCause()) : RpcResultBuilder.newWarning( - ex.getErrorType().toLegacy(), ex.getErrorTag().getTagValue(), + ex.getErrorType().toLegacy(), ex.getErrorTag().elementBody(), ex.getLocalizedMessage(), null, infoBuilder.toString(), ex.getCause()); } @@ -543,7 +544,7 @@ public final class NetconfMessageTransformUtil { public static RpcResult toRpcResult(final FailedNetconfMessage message) { return RpcResultBuilder.failed() .withRpcError(toRpcError(new NetconfDocumentedException(message.getException().getMessage(), - ErrorType.APPLICATION, DocumentedException.ErrorTag.MALFORMED_MESSAGE, ErrorSeverity.ERROR))) + ErrorType.APPLICATION, DocumentedException.MALFORMED_MESSAGE, ErrorSeverity.ERROR))) .build(); } } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/customrpc/SettableRpc.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/customrpc/SettableRpc.java index 422cb573b1..54f9101d4e 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/customrpc/SettableRpc.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/customrpc/SettableRpc.java @@ -17,6 +17,7 @@ import org.opendaylight.netconf.mapping.api.HandlingPriority; import org.opendaylight.netconf.mapping.api.NetconfOperation; import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.w3c.dom.Document; @@ -52,7 +53,7 @@ class SettableRpc implements NetconfOperation { return document; } else if (subsequentOperation.isExecutionTermination()) { throw new DocumentedException("Mapping not found " + XmlUtil.toString(requestMessage), - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_NOT_SUPPORTED, ErrorSeverity.ERROR); } else { return subsequentOperation.execute(requestMessage); } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/Get.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/Get.java index 1af952b647..b47b9e7444 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/Get.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/Get.java @@ -16,6 +16,7 @@ import org.opendaylight.netconf.mapping.api.HandlingPriority; import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.netconf.util.mapping.AbstractNetconfOperation; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,7 +57,7 @@ public class Get extends AbstractNetconfOperation { throws DocumentedException { if (subsequentOperation.isExecutionTermination()) { throw new DocumentedException(String.format("Subsequent netconf operation expected by %s", this), - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR); } try { @@ -75,8 +76,9 @@ public class Get extends AbstractNetconfOperation { LOG.warn(errorMessage, e); throw new DocumentedException(errorMessage, e, - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR, - Map.of(ErrorSeverity.ERROR.toString(), e.getMessage())); + ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED, ErrorSeverity.ERROR, + // FIXME: i.e. e.getMessage() ? + Map.of(ErrorSeverity.ERROR.elementBody(), e.getMessage())); } } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/rpchandler/SettableRpc.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/rpchandler/SettableRpc.java index 9a1d499b39..d0097a3a70 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/rpchandler/SettableRpc.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/rpchandler/SettableRpc.java @@ -16,6 +16,7 @@ import org.opendaylight.netconf.mapping.api.HandlingPriority; import org.opendaylight.netconf.mapping.api.NetconfOperation; import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.w3c.dom.Document; @@ -51,7 +52,7 @@ class SettableRpc implements NetconfOperation { return document; } else if (subsequentOperation.isExecutionTermination()) { throw new DocumentedException("Mapping not found " + XmlUtil.toString(requestMessage), - ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, ErrorSeverity.ERROR); + ErrorType.APPLICATION, ErrorTag.OPERATION_NOT_SUPPORTED, ErrorSeverity.ERROR); } else { return subsequentOperation.execute(requestMessage); } diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfTransaction.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfTransaction.java index 635042114a..5c03c7c082 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfTransaction.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfTransaction.java @@ -31,10 +31,10 @@ import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; import org.opendaylight.mdsal.dom.api.DOMRpcResult; import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; -import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.netconf.api.NetconfDocumentedException; import org.opendaylight.netconf.dom.api.NetconfDataTreeService; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -213,7 +213,7 @@ final class NetconfRestconfTransaction extends RestconfTransaction { return operation.get(); } else { return Futures.immediateFailedFuture(new NetconfDocumentedException("Lock operation failed", - ErrorType.APPLICATION, DocumentedException.ErrorTag.LOCK_DENIED, ErrorSeverity.ERROR)); + ErrorType.APPLICATION, ErrorTag.LOCK_DENIED, ErrorSeverity.ERROR)); } }, MoreExecutors.directExecutor()); @@ -252,18 +252,18 @@ final class NetconfRestconfTransaction extends RestconfTransaction { ErrorType errType = ErrorType.APPLICATION; ErrorSeverity errSeverity = ErrorSeverity.ERROR; StringJoiner msgBuilder = new StringJoiner(" "); - String errorTag = "operation-failed"; + ErrorTag errorTag = ErrorTag.OPERATION_FAILED; for (final RpcError error : errors) { errType = error.getErrorType().toNetconf(); errSeverity = error.getSeverity().toNetconf(); msgBuilder.add(error.getMessage()); msgBuilder.add(error.getInfo()); - errorTag = error.getTag(); + errorTag = new ErrorTag(error.getTag()); } return new TransactionCommitFailedException("Netconf transaction commit failed", - new NetconfDocumentedException("RPC during tx failed. " + msgBuilder.toString(), errType, - DocumentedException.ErrorTag.from(errorTag), errSeverity)); + new NetconfDocumentedException("RPC during tx failed. " + msgBuilder.toString(), errType, errorTag, + errSeverity)); } private static void executeWithLogging(final Supplier> operation) { diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/FutureCallbackTx.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/FutureCallbackTx.java index f73e9f1713..07b1e1c332 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/FutureCallbackTx.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/FutureCallbackTx.java @@ -23,6 +23,7 @@ import org.opendaylight.netconf.api.NetconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfError; import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; @@ -105,13 +106,13 @@ final class FutureCallbackTx { final List causalChain = Throwables.getCausalChain(cause); for (Throwable error : causalChain) { if (error instanceof DocumentedException) { - final DocumentedException.ErrorTag errorTag = ((DocumentedException) error).getErrorTag(); - if (errorTag.equals(DocumentedException.ErrorTag.DATA_EXISTS)) { + final ErrorTag errorTag = ((DocumentedException) error).getErrorTag(); + if (errorTag.equals(ErrorTag.DATA_EXISTS)) { LOG.trace("Operation via Restconf was not executed because data at {} already exists", path); throw new RestconfDocumentedException(e, new RestconfError(ErrorType.PROTOCOL, RestconfError.ErrorTag.DATA_EXISTS, "Data already exists", path)); - } else if (errorTag.equals(DocumentedException.ErrorTag.DATA_MISSING)) { + } else if (errorTag.equals(ErrorTag.DATA_MISSING)) { LOG.trace("Operation via Restconf was not executed because data at {} does not exist", path); throw new RestconfDocumentedException(e, new RestconfError(ErrorType.PROTOCOL, @@ -122,7 +123,7 @@ final class FutureCallbackTx { throw new RestconfDocumentedException(error.getMessage(), ((NetconfDocumentedException) error).getErrorType(), RestconfError.ErrorTag.valueOfCaseInsensitive( - ((NetconfDocumentedException) error).getErrorTag().getTagValue()), e); + ((NetconfDocumentedException) error).getErrorTag().elementBody()), e); } } diff --git a/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/DeleteDataTransactionUtilTest.java b/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/DeleteDataTransactionUtilTest.java index 3186cc5111..419853552d 100644 --- a/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/DeleteDataTransactionUtilTest.java +++ b/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/DeleteDataTransactionUtilTest.java @@ -29,16 +29,16 @@ import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; -import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.netconf.api.NetconfDocumentedException; import org.opendaylight.netconf.dom.api.NetconfDataTreeService; import org.opendaylight.restconf.common.context.InstanceIdentifierContext; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; +import org.opendaylight.restconf.common.errors.RestconfError; import org.opendaylight.restconf.nb.rfc8040.rests.transactions.MdsalRestconfStrategy; import org.opendaylight.restconf.nb.rfc8040.rests.transactions.NetconfRestconfStrategy; import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -88,7 +88,7 @@ public class DeleteDataTransactionUtilTest { when(readWrite.exists(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.empty())) .thenReturn(immediateFalseFluentFuture()); final NetconfDocumentedException exception = new NetconfDocumentedException("id", - ErrorType.RPC, DocumentedException.ErrorTag.from("data-missing"), ErrorSeverity.ERROR); + ErrorType.RPC, ErrorTag.DATA_MISSING, ErrorSeverity.ERROR); final SettableFuture ret = SettableFuture.create(); ret.setException(new TransactionCommitFailedException( String.format("Commit of transaction %s failed", this), exception)); @@ -112,7 +112,7 @@ public class DeleteDataTransactionUtilTest { fail("Delete operation should fail due to missing data"); } catch (final RestconfDocumentedException e) { assertEquals(ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType()); - assertEquals(ErrorTag.DATA_MISSING, e.getErrors().get(0).getErrorTag()); + assertEquals(RestconfError.ErrorTag.DATA_MISSING, e.getErrors().get(0).getErrorTag()); } } } diff --git a/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PatchDataTransactionUtilTest.java b/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PatchDataTransactionUtilTest.java index f14edee6fb..03e6618953 100644 --- a/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PatchDataTransactionUtilTest.java +++ b/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PatchDataTransactionUtilTest.java @@ -37,7 +37,6 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMRpcResult; import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; -import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.netconf.api.NetconfDocumentedException; import org.opendaylight.netconf.dom.api.NetconfDataTreeService; import org.opendaylight.restconf.common.context.InstanceIdentifierContext; @@ -51,6 +50,7 @@ import org.opendaylight.restconf.nb.rfc8040.rests.transactions.MdsalRestconfStra import org.opendaylight.restconf.nb.rfc8040.rests.transactions.NetconfRestconfStrategy; import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy; import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -234,7 +234,7 @@ public class PatchDataTransactionUtilTest { doReturn(immediateFalseFluentFuture()).when(this.rwTransaction).exists(LogicalDatastoreType.CONFIGURATION, this.targetNodeForCreateAndDelete); final NetconfDocumentedException exception = new NetconfDocumentedException("id", - ErrorType.RPC, DocumentedException.ErrorTag.from("data-missing"), ErrorSeverity.ERROR); + ErrorType.RPC, ErrorTag.DATA_MISSING, ErrorSeverity.ERROR); final SettableFuture ret = SettableFuture.create(); ret.setException(new TransactionCommitFailedException( String.format("Commit of transaction %s failed", this), exception)); -- 2.36.6