X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=restconf%2Frestconf-nb-bierman02%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Frestconf%2Fimpl%2FRestconfImpl.java;h=4dc8702f497c570d8530592ada6b9169f31fd141;hb=914a50cc793909ffa813e60f9ac6c73b0cfbb5bc;hp=090e861eef50587d3204f373a3e1b130fed985f8;hpb=1af3f672250584a51ad463174c520448bff73cdb;p=netconf.git diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/RestconfImpl.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/RestconfImpl.java index 090e861eef..4dc8702f49 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/RestconfImpl.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/RestconfImpl.java @@ -18,18 +18,17 @@ import com.google.common.base.Strings; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; import java.net.URI; -import java.text.ParseException; import java.time.Instant; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; +import java.util.AbstractMap.SimpleImmutableEntry; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -76,7 +75,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types. import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; +import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; @@ -117,7 +116,7 @@ import org.opendaylight.yangtools.yang.model.util.SimpleSchemaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class RestconfImpl implements RestconfService { +public final class RestconfImpl implements RestconfService { private static final RestconfImpl INSTANCE = new RestconfImpl(); @@ -148,19 +147,11 @@ public class RestconfImpl implements RestconfService { private static final String NETCONF_BASE_PAYLOAD_NAME = "data"; - private static final QName NETCONF_BASE_QNAME = QName.create(QNameModule.create(URI.create(NETCONF_BASE), null), + private static final QName NETCONF_BASE_QNAME = QName.create(QNameModule.create(URI.create(NETCONF_BASE)), NETCONF_BASE_PAYLOAD_NAME).intern(); - private static final QNameModule SAL_REMOTE_AUGMENT; - - static { - try { - SAL_REMOTE_AUGMENT = QNameModule.create(NAMESPACE_EVENT_SUBSCRIPTION_AUGMENT, - SimpleDateFormatUtil.getRevisionFormat().parse("2014-07-08")); - } catch (final ParseException e) { - throw new ExceptionInInitializerError(e); - } - } + private static final QNameModule SAL_REMOTE_AUGMENT = QNameModule.create(NAMESPACE_EVENT_SUBSCRIPTION_AUGMENT, + Revision.of("2014-07-08")); private static final AugmentationIdentifier SAL_REMOTE_AUG_IDENTIFIER = new AugmentationIdentifier(ImmutableSet.of( @@ -259,7 +250,7 @@ public class RestconfImpl implements RestconfService { @Override public NormalizedNodeContext getModule(final String identifier, final UriInfo uriInfo) { Preconditions.checkNotNull(identifier); - final QName moduleNameAndRevision = getModuleNameAndRevision(identifier); + final Entry nameRev = getModuleNameAndRevision(identifier); Module module = null; DOMMountPoint mountPoint = null; final SchemaContext schemaContext; @@ -267,16 +258,17 @@ public class RestconfImpl implements RestconfService { final InstanceIdentifierContext mountPointIdentifier = this.controllerContext.toMountPointIdentifier(identifier); mountPoint = mountPointIdentifier.getMountPoint(); - module = this.controllerContext.findModuleByNameAndRevision(mountPoint, moduleNameAndRevision); + module = this.controllerContext.findModuleByNameAndRevision(mountPoint, nameRev.getKey(), + nameRev.getValue()); schemaContext = mountPoint.getSchemaContext(); } else { - module = this.controllerContext.findModuleByNameAndRevision(moduleNameAndRevision); + module = this.controllerContext.findModuleByNameAndRevision(nameRev.getKey(), nameRev.getValue()); schemaContext = this.controllerContext.getGlobalSchema(); } if (module == null) { - final String errMsg = "Module with name '" + moduleNameAndRevision.getLocalName() + "' and revision '" - + moduleNameAndRevision.getRevision() + "' was not found."; + final String errMsg = "Module with name '" + nameRev.getKey() + "' and revision '" + + nameRev.getValue() + "' was not found."; LOG.debug(errMsg); throw new RestconfDocumentedException(errMsg, ErrorType.PROTOCOL, ErrorTag.UNKNOWN_ELEMENT); } @@ -407,7 +399,7 @@ public class RestconfImpl implements RestconfService { return restconfModule; } - private static QName getModuleNameAndRevision(final String identifier) { + private static Entry getModuleNameAndRevision(final String identifier) { final int mountIndex = identifier.indexOf(ControllerContext.MOUNT); String moduleNameAndRevision = ""; if (mountIndex >= 0) { @@ -416,9 +408,8 @@ public class RestconfImpl implements RestconfService { moduleNameAndRevision = identifier; } - final Splitter splitter = Splitter.on("/").omitEmptyStrings(); - final Iterable split = splitter.split(moduleNameAndRevision); - final List pathArgs = Lists.newArrayList(split); + final Splitter splitter = Splitter.on('/').omitEmptyStrings(); + final List pathArgs = splitter.splitToList(moduleNameAndRevision); if (pathArgs.size() < 2) { LOG.debug("URI has bad format. It should be \'moduleName/yyyy-MM-dd\' " + identifier); throw new RestconfDocumentedException( @@ -427,13 +418,11 @@ public class RestconfImpl implements RestconfService { } try { - final String moduleName = pathArgs.get(0); - final String revision = pathArgs.get(1); - return QName.create(null, SimpleDateFormatUtil.getRevisionFormat().parse(revision), moduleName); - } catch (final ParseException e) { + return new SimpleImmutableEntry<>(pathArgs.get(0), Revision.of(pathArgs.get(1))); + } catch (final DateTimeParseException e) { LOG.debug("URI has bad format. It should be \'moduleName/yyyy-MM-dd\' " + identifier); throw new RestconfDocumentedException("URI has bad format. It should be \'moduleName/yyyy-MM-dd\'", - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); + ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, e); } } @@ -524,7 +513,7 @@ public class RestconfImpl implements RestconfService { RpcDefinition rpc = null; if (mountPoint == null) { - rpc = this.controllerContext.getRpcDefinition(identifierDecoded, null); + rpc = this.controllerContext.getRpcDefinition(identifierDecoded); } else { rpc = findRpc(mountPoint.getSchemaContext(), identifierDecoded); } @@ -536,8 +525,8 @@ public class RestconfImpl implements RestconfService { if (!rpc.getInput().getChildNodes().isEmpty()) { LOG.debug("RPC " + rpc + " does not need input value."); - // FIXME : find a correct Error from specification - throw new IllegalStateException("RPC " + rpc + " does'n need input value!"); + throw new RestconfDocumentedException("RPC " + rpc + " does not take any input value.", + ErrorType.RPC, ErrorTag.INVALID_VALUE); } final CheckedFuture response; @@ -557,6 +546,7 @@ public class RestconfImpl implements RestconfService { result.getResult(), QueryParametersParser.parseWriterParameters(uriInfo)); } + @SuppressWarnings("checkstyle:avoidHidingCauseException") private static DOMRpcResult checkRpcResponse(final CheckedFuture response) { if (response == null) { return null; @@ -571,7 +561,7 @@ public class RestconfImpl implements RestconfService { } catch (final InterruptedException e) { final String errMsg = "The operation was interrupted while executing and did not complete."; LOG.debug("Rpc Interrupt - " + errMsg, e); - throw new RestconfDocumentedException(errMsg, ErrorType.RPC, ErrorTag.PARTIAL_OPERATION); + throw new RestconfDocumentedException(errMsg, ErrorType.RPC, ErrorTag.PARTIAL_OPERATION, e); } catch (final ExecutionException e) { LOG.debug("Execution RpcError: ", e); Throwable cause = e.getCause(); @@ -614,8 +604,9 @@ public class RestconfImpl implements RestconfService { invokeSalRemoteRpcSubscribeRPC(final NormalizedNodeContext payload) { final ContainerNode value = (ContainerNode) payload.getData(); final QName rpcQName = payload.getInstanceIdentifierContext().getSchemaNode().getQName(); - final Optional> path = value.getChild(new NodeIdentifier( - QName.create(payload.getInstanceIdentifierContext().getSchemaNode().getQName(), "path"))); + final java.util.Optional> path = value.getChild( + new NodeIdentifier(QName.create(payload.getInstanceIdentifierContext().getSchemaNode().getQName(), + "path"))); final Object pathValue = path.isPresent() ? path.get().getValue() : null; if (!(pathValue instanceof YangInstanceIdentifier)) { @@ -1071,8 +1062,8 @@ public class RestconfImpl implements RestconfService { final Optional searchedException = Iterables.tryFind(Throwables.getCausalChain(e), Predicates.instanceOf(ModifiedNodeDoesNotExistException.class)); if (searchedException.isPresent()) { - throw new RestconfDocumentedException("Data specified for delete doesn't exist.", ErrorType.APPLICATION, - ErrorTag.DATA_MISSING); + throw new RestconfDocumentedException("Data specified for delete doesn't exist.", + ErrorType.APPLICATION, ErrorTag.DATA_MISSING, e); } final String errMsg = "Error while deleting data"; @@ -1197,7 +1188,7 @@ public class RestconfImpl implements RestconfService { final QName qnameBase = QName.create("subscribe:to:notification", "2016-10-28", "notifi"); final SchemaContext schemaCtx = ControllerContext.getInstance().getGlobalSchema(); final DataSchemaNode location = ((ContainerSchemaNode) schemaCtx - .findModuleByNamespaceAndRevision(qnameBase.getNamespace(), qnameBase.getRevision()) + .findModule(qnameBase.getModule()).orElse(null) .getDataChildByName(qnameBase)).getDataChildByName(QName.create(qnameBase, "location")); final List path = new ArrayList<>(); path.add(NodeIdentifier.create(qnameBase)); @@ -1318,7 +1309,7 @@ public class RestconfImpl implements RestconfService { return this.broker.patchConfigurationDataWithinTransaction(context); } catch (final Exception e) { LOG.debug("Patch transaction failed", e); - throw new RestconfDocumentedException(e.getMessage()); + throw new RestconfDocumentedException(e.getMessage(), e); } } @@ -1333,7 +1324,7 @@ public class RestconfImpl implements RestconfService { return this.broker.patchConfigurationDataWithinTransaction(context); } catch (final Exception e) { LOG.debug("Patch transaction failed", e); - throw new RestconfDocumentedException(e.getMessage()); + throw new RestconfDocumentedException(e.getMessage(), e); } } @@ -1347,7 +1338,7 @@ public class RestconfImpl implements RestconfService { */ private static T parseEnumTypeParameter(final ContainerNode value, final Class classDescriptor, final String paramName) { - final Optional> optAugNode = value.getChild( + final java.util.Optional> optAugNode = value.getChild( SAL_REMOTE_AUG_IDENTIFIER); if (!optAugNode.isPresent()) { return null; @@ -1356,8 +1347,8 @@ public class RestconfImpl implements RestconfService { if (!(augNode instanceof AugmentationNode)) { return null; } - final Optional> enumNode = ((AugmentationNode) augNode).getChild( - new NodeIdentifier(QName.create(SAL_REMOTE_AUGMENT, paramName))); + final java.util.Optional> enumNode = ((AugmentationNode) augNode) + .getChild(new NodeIdentifier(QName.create(SAL_REMOTE_AUGMENT, paramName))); if (!enumNode.isPresent()) { return null; } @@ -1441,9 +1432,11 @@ public class RestconfImpl implements RestconfService { ControllerContext.findInstanceDataChildrenByName(listModuleSchemaNode, "revision"); final DataSchemaNode revisionSchemaNode = Iterables.getFirst(instanceDataChildrenByName, null); Preconditions.checkState(revisionSchemaNode instanceof LeafSchemaNode); - final String revision = module.getQNameModule().getFormattedRevision(); - moduleNodeValues - .withChild(Builders.leafBuilder((LeafSchemaNode) revisionSchemaNode).withValue(revision).build()); + final java.util.Optional revision = module.getQNameModule().getRevision(); + if (revision.isPresent()) { + moduleNodeValues.withChild(Builders.leafBuilder((LeafSchemaNode) revisionSchemaNode) + .withValue(revision.get().toString()).build()); + } instanceDataChildrenByName = ControllerContext.findInstanceDataChildrenByName(listModuleSchemaNode, "namespace");