Rework BaseScheams
[netconf.git] / plugins / netconf-client-mdsal / src / main / java / org / opendaylight / netconf / client / mdsal / SchemalessNetconfDevice.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.netconf.client.mdsal;
9
10 import static java.util.Objects.requireNonNull;
11
12 import org.opendaylight.netconf.api.messages.NetconfMessage;
13 import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemaProvider;
14 import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences;
15 import org.opendaylight.netconf.client.mdsal.api.RemoteDevice;
16 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceHandler;
17 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
18 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices;
19 import org.opendaylight.netconf.client.mdsal.impl.BaseRpcSchemalessTransformer;
20 import org.opendaylight.netconf.client.mdsal.impl.MessageCounter;
21 import org.opendaylight.netconf.client.mdsal.impl.SchemalessMessageTransformer;
22 import org.opendaylight.netconf.client.mdsal.spi.SchemalessNetconfDeviceRpc;
23
24 public class SchemalessNetconfDevice implements RemoteDevice<NetconfDeviceCommunicator> {
25     private final BaseNetconfSchemaProvider baseSchemas;
26     private final RemoteDeviceId id;
27     private final RemoteDeviceHandler salFacade;
28
29     private SchemalessMessageTransformer messageTransformer;
30
31     public SchemalessNetconfDevice(final BaseNetconfSchemaProvider baseSchemas, final RemoteDeviceId id,
32             final RemoteDeviceHandler salFacade) {
33         this.baseSchemas = requireNonNull(baseSchemas);
34         this.id = requireNonNull(id);
35         this.salFacade = requireNonNull(salFacade);
36     }
37
38     @Override
39     public void onRemoteSessionUp(final NetconfSessionPreferences remoteSessionCapabilities,
40             final NetconfDeviceCommunicator netconfDeviceCommunicator) {
41         final var baseSchema = baseSchemas.baseSchemaForCapabilities(remoteSessionCapabilities);
42         final var mountContext = baseSchema.mountPointContext();
43
44         final var counter = new MessageCounter();
45         final var rpcTransformer = new BaseRpcSchemalessTransformer(baseSchema, counter);
46         messageTransformer = new SchemalessMessageTransformer(counter);
47
48         salFacade.onDeviceConnected(
49             // FIXME: or bound from base schema rather?
50             new NetconfDeviceSchema(NetconfDeviceCapabilities.empty(), mountContext), remoteSessionCapabilities,
51             new RemoteDeviceServices(
52                 new SchemalessNetconfDeviceRpc(id, netconfDeviceCommunicator, rpcTransformer, messageTransformer),
53                 null));
54     }
55
56     @Override
57     public void onRemoteSessionDown() {
58         salFacade.onDeviceDisconnected();
59         messageTransformer = null;
60     }
61
62     @Override
63     public void onNotification(final NetconfMessage notification) {
64         salFacade.onNotification(messageTransformer.toNotification(notification));
65     }
66 }