use of org.opendaylight.yangtools.yang.model.api.ActionDefinition in project lighty-netconf-simulator by PANTHEONtech.
the class ActionServiceDeviceProcessor method execute.
@Override
protected CompletableFuture<Response> execute(final Element requestXmlElement) {
final XmlElement fromDomElement = XmlElement.fromDomElement(requestXmlElement);
final Optional<ActionDefinition> actionDefinition = requireNonNull(findActionInElement(fromDomElement));
if (actionDefinition.isPresent() && actionDefinition.get().getQName().equals(Start.QNAME)) {
this.actionProcessor = new StartActionProcessor(new StartAction(), this.adapterContext.currentSerializer());
} else {
this.actionProcessor = new ResetActionProcessor(new ResetAction(), this.adapterContext.currentSerializer());
}
this.actionProcessor.init(getNetconfDeviceServices());
return this.actionProcessor.execute(requestXmlElement, actionDefinition.get());
}
use of org.opendaylight.yangtools.yang.model.api.ActionDefinition in project netconf by opendaylight.
the class JsonNormalizedNodeBodyWriter method writeNormalizedNode.
private static void writeNormalizedNode(final JsonWriter jsonWriter, final SchemaPath path, final InstanceIdentifierContext<SchemaNode> context, final NormalizedNode data, final DepthParam depth, final List<Set<QName>> fields) throws IOException {
final RestconfNormalizedNodeWriter nnWriter;
if (context.getSchemaNode() instanceof RpcDefinition) {
/*
* RpcDefinition is not supported as initial codec in JSONStreamWriter,
* so we need to emit initial output declaration..
*/
final RpcDefinition rpc = (RpcDefinition) context.getSchemaNode();
final SchemaPath rpcPath = SchemaPath.of(Absolute.of(rpc.getQName(), rpc.getOutput().getQName()));
nnWriter = createNormalizedNodeWriter(context, rpcPath, jsonWriter, depth, fields);
final Module module = context.getSchemaContext().findModule(data.getIdentifier().getNodeType().getModule()).get();
jsonWriter.name(module.getName() + ":output");
jsonWriter.beginObject();
writeChildren(nnWriter, (ContainerNode) data);
jsonWriter.endObject();
} else if (context.getSchemaNode() instanceof ActionDefinition) {
/*
* ActionDefinition is not supported as initial codec in JSONStreamWriter,
* so we need to emit initial output declaration..
*/
final ActionDefinition actDef = (ActionDefinition) context.getSchemaNode();
final List<QName> qNames = context.getInstanceIdentifier().getPathArguments().stream().filter(arg -> !(arg instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates)).filter(arg -> !(arg instanceof YangInstanceIdentifier.AugmentationIdentifier)).map(PathArgument::getNodeType).collect(Collectors.toList());
qNames.add(actDef.getQName());
qNames.add(actDef.getOutput().getQName());
final SchemaPath actPath = SchemaPath.of(Absolute.of(qNames));
nnWriter = createNormalizedNodeWriter(context, actPath, jsonWriter, depth, fields);
final Module module = context.getSchemaContext().findModule(data.getIdentifier().getNodeType().getModule()).get();
jsonWriter.name(module.getName() + ":output");
jsonWriter.beginObject();
writeChildren(nnWriter, (ContainerNode) data);
jsonWriter.endObject();
} else {
if (SchemaPath.ROOT.equals(path)) {
nnWriter = createNormalizedNodeWriter(context, path, jsonWriter, depth, fields);
} else {
nnWriter = createNormalizedNodeWriter(context, path.getParent(), jsonWriter, depth, fields);
}
if (data instanceof MapEntryNode) {
// Restconf allows returning one list item. We need to wrap it
// in map node in order to serialize it properly
nnWriter.write(ImmutableNodes.mapNodeBuilder(data.getIdentifier().getNodeType()).withChild((MapEntryNode) data).build());
} else {
nnWriter.write(data);
}
}
nnWriter.flush();
}
use of org.opendaylight.yangtools.yang.model.api.ActionDefinition in project netconf by opendaylight.
the class NetconfMessageTransformer method toActionResult.
@Override
public DOMActionResult toActionResult(final Absolute action, final NetconfMessage message) {
final ActionDefinition actionDefinition = actions.get(action);
Preconditions.checkArgument(actionDefinition != null, "Action does not exist: %s", action);
final ContainerNode normalizedNode = (ContainerNode) parseResult(message, actionDefinition);
if (normalizedNode == null) {
return new SimpleDOMActionResult(Collections.emptyList());
} else {
return new SimpleDOMActionResult(normalizedNode, Collections.emptyList());
}
}
use of org.opendaylight.yangtools.yang.model.api.ActionDefinition in project netconf by opendaylight.
the class NetconfMessageTransformer method toActionRequest.
@Override
public NetconfMessage toActionRequest(final Absolute action, final DOMDataTreeIdentifier domDataTreeIdentifier, final NormalizedNode payload) {
final ActionDefinition actionDef = actions.get(action);
Preconditions.checkArgument(actionDef != null, "Action does not exist: %s", action);
final InputSchemaNode inputDef = actionDef.getInput();
if (inputDef.getChildNodes().isEmpty()) {
return new NetconfMessage(NetconfMessageTransformUtil.prepareDomResultForActionRequest(contextTree, domDataTreeIdentifier, counter, actionDef.getQName()).getNode().getOwnerDocument());
}
Preconditions.checkNotNull(payload, "Transforming an action with input: %s, payload cannot be null", action);
Preconditions.checkArgument(payload instanceof ContainerNode, "Transforming an action with input: %s, payload has to be a container, but was: %s", action, payload);
final DOMResult result = NetconfMessageTransformUtil.prepareDomResultForActionRequest(contextTree, domDataTreeIdentifier, counter, actionDef.getQName());
try {
NetconfMessageTransformUtil.writeNormalizedOperationInput((ContainerNode) payload, result, action, mountContext.getEffectiveModelContext());
} catch (final XMLStreamException | IOException | IllegalStateException e) {
throw new IllegalStateException("Unable to serialize input of " + action, e);
}
return new NetconfMessage(result.getNode().getOwnerDocument());
}
use of org.opendaylight.yangtools.yang.model.api.ActionDefinition in project netconf by opendaylight.
the class ParserIdentifier method getPathSchema.
private static SchemaNode getPathSchema(final EffectiveModelContext schemaContext, final YangInstanceIdentifier urlPath) {
// First things first: an empty path means data invocation on SchemaContext
if (urlPath.isEmpty()) {
return schemaContext;
}
// Peel the last component and locate the parent data node, empty path resolves to SchemaContext
final DataSchemaContextNode<?> parent = DataSchemaContextTree.from(schemaContext).findChild(verifyNotNull(urlPath.getParent())).orElseThrow(// Parent data node is not present, this is not a valid location.
() -> new RestconfDocumentedException("Parent of " + urlPath + " not found", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE));
// Now try to resolve the last component as a data item...
final DataSchemaContextNode<?> data = parent.getChild(urlPath.getLastPathArgument());
if (data != null) {
return data.getDataSchemaNode();
}
// ... otherwise this has to be an operation invocation. RPCs cannot be defined anywhere but schema root,
// actions can reside everywhere else (and SchemaContext reports them empty)
final QName qname = urlPath.getLastPathArgument().getNodeType();
final DataSchemaNode parentSchema = parent.getDataSchemaNode();
if (parentSchema instanceof SchemaContext) {
for (final RpcDefinition rpc : ((SchemaContext) parentSchema).getOperations()) {
if (qname.equals(rpc.getQName())) {
return rpc;
}
}
}
if (parentSchema instanceof ActionNodeContainer) {
for (final ActionDefinition action : ((ActionNodeContainer) parentSchema).getActions()) {
if (qname.equals(action.getQName())) {
return action;
}
}
}
// is deemed invalid
throw new RestconfDocumentedException("Context for " + urlPath + " not found", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
}
Aggregations