[ONOS-4879][ONOS-5024][ONOS-5025]TE Topology NBI

The APP introduces IETF TE Topology YANG models as RESTCONF NBI,
and it works as an adapter for data conversion between
YMS(YANG generated JAVA classes) and TE Topology Core subsystem.

The APP implements the following interfaces:
IetfNetworkService Interface
IetfTopologyService Interface
IetfNetworkTopologyService Interface

Change-Id: I761ff684bde4b64ca42bb1b0d5b1ddfb8a2377fd
diff --git a/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java b/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java
new file mode 100644
index 0000000..799f4ed
--- /dev/null
+++ b/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.tenbi.topology.impl;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.event.AbstractListenerManager;
+import org.onosproject.tetopology.management.api.TeTopologyService;
+import org.onosproject.teyang.api.OperationType;
+import org.onosproject.teyang.utils.topology.NetworkConverter;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetworkOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetworkService;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworksState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.IetfNetworkTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .IetfNetworkTopologyOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .IetfNetworkTopologyService;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.IetfTeTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.IetfTeTopologyOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+               .IetfTeTopologyService;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+               .ietftetopology.IetfTeTopologyEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+               .ietftetopology.IetfTeTopologyEventListener;
+import org.onosproject.yms.ymsm.YmsService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The IETF TE Topology NBI Manager implementation.
+ */
+@Component(immediate = true)
+@Service
+public class TeTopologyNbiManager
+    extends  AbstractListenerManager<IetfTeTopologyEvent, IetfTeTopologyEventListener>
+    implements IetfNetworkService, IetfNetworkTopologyService, IetfTeTopologyService {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TeTopologyService teTopologyService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected YmsService ymsService;
+
+    @Activate
+    protected void activate() {
+        // Register 3 services with YMS.
+        ymsService.registerService(this, IetfNetworkService.class, null);
+        ymsService.registerService(this, IetfNetworkTopologyService.class, null);
+        ymsService.registerService(this, IetfTeTopologyService.class, null);
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        // Unregister 3 services.
+        ymsService.unRegisterService(this, IetfNetworkService.class);
+        ymsService.unRegisterService(this, IetfNetworkTopologyService.class);
+        ymsService.unRegisterService(this, IetfTeTopologyService.class);
+
+        log.info("Stopped");
+    }
+
+    @Override
+    public IetfNetwork getIetfNetwork(IetfNetworkOpParam ietfNetwork) {
+        log.info("getIetfNetwork: input {}", ietfNetwork);
+
+        checkNotNull(ietfNetwork, "getIetfNetwork: ietfNetwork cannot be null");
+
+        // Get the entire data tree from TE Subsystem core.
+        org.onosproject.tetopology.management.api.Networks teNetworks = teTopologyService.getNetworks();
+
+        // Convert the TE Subsystem core data into YANG Objects.
+        Networks networks = NetworkConverter.teSubsystem2YangNetworks(teNetworks, OperationType.QUERY);
+        NetworksState networkStates = NetworkConverter.teSubsystem2YangNetworkStates(teNetworks, OperationType.QUERY);
+
+        IetfNetworkOpParam.IetfNetworkBuilder builder =  new IetfNetworkOpParam.IetfNetworkBuilder();
+        IetfNetwork newNetwork = builder.networks(networks)
+                                        .networksState(networkStates)
+                                        .onosYangNodeOperationType(IetfNetworkOpParam.OnosYangNodeOperationType.NONE)
+                                        .build();
+
+        // processSubtreeFiltering() filters the entire data tree based on the
+        // user's query and returns the filtered data.
+        return ietfNetwork.processSubtreeFiltering(newNetwork, false);
+    }
+
+    @Override
+    public void setIetfNetwork(IetfNetworkOpParam ietfNetwork) {
+        // In H release, topology is discovered from south, no NBI Set is supported.
+    }
+
+    @Override
+    public IetfTeTopology getIetfTeTopology(IetfTeTopologyOpParam ietfTeTopology) {
+        // unused method.
+        return ietfTeTopology;
+    }
+
+    @Override
+    public void setIetfTeTopology(IetfTeTopologyOpParam ietfTeTopology) {
+        // unused methods.
+    }
+
+    @Override
+    public IetfTeTopology getAugmentedIetfTeTopologyTeLinkEvent(IetfTeTopologyOpParam ietfTeTopology) {
+        // unused methods.
+        return ietfTeTopology;
+    }
+
+    @Override
+    public void setAugmentedIetfTeTopologyTeLinkEvent(IetfTeTopologyOpParam augmentedIetfTeTopologyTeLinkEvent) {
+        // unused methods.
+    }
+
+    @Override
+    public IetfNetworkTopology getIetfNetworkTopology(IetfNetworkTopologyOpParam ietfNetworkTopology) {
+        // unused methods.
+       return ietfNetworkTopology;
+    }
+
+    @Override
+    public void setIetfNetworkTopology(IetfNetworkTopologyOpParam ietfNetworkTopology) {
+        // unused methods.
+    }
+
+    @Override
+    public IetfNetwork getAugmentedIetfNetworkNetworks(IetfNetworkOpParam ietfNetwork) {
+        // unused methods.
+        return ietfNetwork;
+    }
+
+    @Override
+    public void setAugmentedIetfNetworkNetworks(IetfNetworkOpParam augmentedIetfNetworkNetworks) {
+        // unused methods.
+    }
+
+}