[ODTN]add NETCONF driver for Infinera and OPENCONFIG handler

Handler can easily create List<CharSequence> of OPENCONFIG by managing
ModelObject and Annotation together.
Handler also gives an alias to ModelObject of the same name in another
package(eg DefaultConfig), making it easier to handle within the same
class.

Change-Id: Ie4481f4020954518dc4c3c6deaced6d9e348c885
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigAssignmentHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigAssignmentHandler.java
new file mode 100755
index 0000000..c608038
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigAssignmentHandler.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanassignmenttop.logicalchannelassignments.DefaultAssignment;
+
+import org.onosproject.yang.model.KeyLeaf;
+
+/**
+ * Utility class to deal with OPENCONFIG Assignment ModelObject & Annotation.
+ */
+public final class OpenConfigAssignmentHandler
+        extends OpenConfigObjectHandler<DefaultAssignment> {
+
+    private static final String OPENCONFIG_NAME = "assignment";
+    private static final String KEY_LEAF_NAME = "index";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigAssignmentHandler Constructor.
+     *
+     * @param keyValue String of target OPENCONFIG's key
+     * @param parent OpenConfigLogicalChannelAssignmentsHandler of
+     *               parent OPENCONFIG(logical-channel-assignments)
+     */
+    public OpenConfigAssignmentHandler(String keyValue,
+                                       OpenConfigLogicalChannelAssignmentsHandler parent) {
+        modelObject = new DefaultAssignment();
+        modelObject.index(keyValue);
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE,
+                      new KeyLeaf(KEY_LEAF_NAME, NAME_SPACE, keyValue),
+                      parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addAssignment(this);
+    }
+
+    /**
+     * Add Config to modelObject of target OPENCONFIG.
+     *
+     * @param config OpenConfigConfigOfAssignmentHandler having Config to be set for modelObject
+     * @return OpenConfigAssignmentHandler of target OPENCONFIG
+     */
+    public OpenConfigAssignmentHandler addConfig(OpenConfigConfigOfAssignmentHandler config) {
+        modelObject.config(config.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigChannelHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigChannelHandler.java
new file mode 100755
index 0000000..3ab6d8e
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigChannelHandler.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanneltop.logicalchannels.DefaultChannel;
+
+import org.onosproject.yang.model.KeyLeaf;
+
+/**
+ * Utility class to deal with OPENCONFIG Channel ModelObject & Annotation.
+ */
+public final class OpenConfigChannelHandler
+        extends OpenConfigObjectHandler<DefaultChannel> {
+
+    private static final String OPENCONFIG_NAME = "channel";
+    private static final String KEY_LEAF_NAME = "index";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigChannelHandler Constructor.
+     *
+     * @param keyValue String of target OPENCONFIG's key
+     * @param parent OpenConfigLogicalChannelsHandler of parent OPENCONFIG(logical-channels)
+     */
+    public OpenConfigChannelHandler(String keyValue, OpenConfigLogicalChannelsHandler parent) {
+        modelObject = new DefaultChannel();
+        modelObject.index(keyValue);
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE,
+                      new KeyLeaf(KEY_LEAF_NAME, NAME_SPACE, keyValue),
+                      parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addChannel(this);
+    }
+
+    /**
+     * Add Config to modelObject of target OPENCONFIG.
+     *
+     * @param config OpenConfigConfigOfChannelHandler having Config to be set for modelObject
+     * @return OpenConfigChannelHandler of target OPENCONFIG
+     */
+    public OpenConfigChannelHandler addConfig(OpenConfigConfigOfChannelHandler config) {
+        modelObject.config(config.getModelObject());
+        return this;
+    }
+
+    /**
+     * Add LogicalChannelAssignments to modelObject of target OPENCONFIG.
+     *
+     * @param logicalChannelAssignments OpenConfigLogicalChannelAssignmentsHandler having
+     *                                  LogicalChannelAssignments to be set for modelObject
+     * @return OpenConfigChannelHandler of target OPENCONFIG
+     */
+    public OpenConfigChannelHandler addLogicalChannelAssignments(
+           OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments) {
+        modelObject.logicalChannelAssignments(logicalChannelAssignments.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentHandler.java
new file mode 100755
index 0000000..4cb2b18
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentHandler.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20161222.openconfigplatform.platformcomponenttop.components.DefaultComponent;
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20170708.openconfigplatformtransceiver.components.component.DefaultAugmentedOcPlatformComponent;
+
+import org.onosproject.yang.model.KeyLeaf;
+
+/**
+ * Utility class to deal with OPENCONFIG Componet ModelObject & Annotation.
+ */
+public final class OpenConfigComponentHandler
+        extends OpenConfigObjectHandler<DefaultComponent> {
+
+    private static final String OPENCONFIG_NAME = "component";
+    private static final String KEY_LEAF_NAME = "name";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform";
+
+    private DefaultAugmentedOcPlatformComponent augmentedOcPlatformComponent;
+
+    /**
+     * OpenConfigComponentHandler Constructor.
+     *
+     * @param keyValue String of target OPENCONFIG's key
+     * @param parent OpenConfigComponentsHandler of parent OPENCONFIG(components)
+     */
+    public OpenConfigComponentHandler(String keyValue, OpenConfigComponentsHandler parent) {
+        modelObject = new DefaultComponent();
+        modelObject.name(keyValue);
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE,
+                      new KeyLeaf(KEY_LEAF_NAME, NAME_SPACE, keyValue),
+                      parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+        augmentedOcPlatformComponent = new DefaultAugmentedOcPlatformComponent();
+
+        parent.addComponent(this);
+    }
+
+    /**
+     * Add Transceiver to modelObject of target OPENCONFIG.
+     *
+     * @param transceiver OpenConfigTransceiverHandler having Transceiver to be set for modelObject
+     * @return OpenConfigComponentHandler of target OPENCONFIG
+     */
+    public OpenConfigComponentHandler addTransceiver(OpenConfigTransceiverHandler transceiver) {
+        augmentedOcPlatformComponent.transceiver(transceiver.getModelObject());
+        modelObject.addAugmentation(augmentedOcPlatformComponent);
+        return this;
+    }
+
+    /**
+     * Add Config to modelObject of target OPENCONFIG.
+     *
+     * @param config OpenConfigConfigOfComponentHandler having Config to be set for modelObject
+     * @return OpenConfigComponentHandler of target OPENCONFIG
+     */
+    public OpenConfigComponentHandler addConfig(OpenConfigConfigOfComponentHandler config) {
+        modelObject.config(config.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentsHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentsHandler.java
new file mode 100755
index 0000000..1dc568c
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentsHandler.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20161222.openconfigplatform.platformcomponenttop.DefaultComponents;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.stream.Collectors;
+import com.google.common.collect.ImmutableList;
+
+import static org.onosproject.odtn.utils.YangToolUtil.toCharSequence;
+import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData;
+import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
+import static org.onosproject.odtn.utils.YangToolUtil.toResourceData;
+import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream;
+
+/**
+ * Utility class to deal with OPENCONFIG Componets ModelObject & Annotation.
+ */
+public final class OpenConfigComponentsHandler
+        extends OpenConfigObjectHandler<DefaultComponents> {
+
+    private static final String OPENCONFIG_NAME = "components";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform";
+
+    /**
+     * OpenConfigComponentsHandler Constructor.
+     */
+    public OpenConfigComponentsHandler() {
+        modelObject = new DefaultComponents();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, null);
+        annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+    }
+
+    /**
+     * Add Component to modelObject of target OPENCONFIG.
+     *
+     * @param component OpenConfigComponentHandler having Component to be set for modelObject
+     * @return OpenConfigComponentsHandler of target OPENCONFIG
+     */
+    public OpenConfigComponentsHandler addComponent(OpenConfigComponentHandler component) {
+        modelObject.addToComponent(component.getModelObject());
+        return this;
+    }
+
+    /**
+     * Get List<CharSequence> of target OPENCONFIG.
+     *
+     * @return List<CharSequence> of target OPENCONFIG
+     */
+    public List<CharSequence> getListCharSequence() {
+        return ImmutableList.of(toDataNode((ModelObject) getModelObject())).stream()
+                            .map(node -> toCharSequence(toXmlCompositeStream(
+                                         toCompositeData(toResourceData(
+                                                         ResourceId.builder().build(), node),
+                                         annotatedNodeInfos))))
+                            .collect(Collectors.toList());
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfAssignmentHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfAssignmentHandler.java
new file mode 100755
index 0000000..7c7ade2
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfAssignmentHandler.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanassignmentconfig.AssignmentTypeEnum;
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanassignmenttop.logicalchannelassignments.assignment.DefaultConfig;
+
+import java.math.BigDecimal;
+
+/**
+ * Utility class to deal with OPENCONFIG Assignment/Config ModelObject & Annotation.
+ */
+public final class OpenConfigConfigOfAssignmentHandler
+        extends OpenConfigObjectHandler<DefaultConfig> {
+
+    private static final String OPENCONFIG_NAME = "config";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigConfigOfAssignmentHandler Constructor.
+     *
+     * @param parent OpenConfigAssignmentHandler of parent OPENCONFIG(assignment)
+     */
+    public OpenConfigConfigOfAssignmentHandler(OpenConfigAssignmentHandler parent) {
+        modelObject = new DefaultConfig();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addConfig(this);
+    }
+
+    /**
+     * Add child OPENCONFIG(assignment-type).
+     *
+     * @param assignmentType AssignmentTypeEnum to be set for modelObject
+     * @return OpenConfigConfigOfAssignmentHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfAssignmentHandler addAssignmentType(
+                                               AssignmentTypeEnum assignmentType) {
+        modelObject.assignmentType(assignmentType);
+        return this;
+    }
+
+    /**
+     * Add child OPENCONFIG(logical-channel).
+     *
+     * @param logicalChannel String to be set for modelObject
+     * @return OpenConfigConfigOfAssignmentHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfAssignmentHandler addLogicalChannel(String logicalChannel) {
+        modelObject.logicalChannel(logicalChannel);
+        return this;
+    }
+
+    /**
+     * Add child OPENCONFIG(allocation).
+     *
+     * @param allocation BigDecimal to be set for modelObject
+     * @return OpenConfigConfigOfAssignmentHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfAssignmentHandler addAllocation(BigDecimal allocation) {
+        modelObject.allocation(allocation);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfChannelHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfChannelHandler.java
new file mode 100755
index 0000000..f422121
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfChannelHandler.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanneltop.logicalchannels.channel.DefaultConfig;
+
+/**
+ * Utility class to deal with OPENCONFIG Channel/Config ModelObject & Annotation.
+ */
+public final class OpenConfigConfigOfChannelHandler
+        extends OpenConfigObjectHandler<DefaultConfig> {
+
+    private static final String OPENCONFIG_NAME = "config";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigConfigOfAssignmentHandler Constructor.
+     *
+     * @param parent OpenConfigChannelHandler of parent OPENCONFIG(channel)
+     */
+    public OpenConfigConfigOfChannelHandler(OpenConfigChannelHandler parent) {
+        modelObject = new DefaultConfig();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addConfig(this);
+    }
+
+    /**
+     * Add child OPENCONFIG(index).
+     *
+     * @param index String to be set for modelObject
+     * @return OpenConfigConfigOfChannelHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfChannelHandler addIndex(String index) {
+        modelObject.index(index);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfComponentHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfComponentHandler.java
new file mode 100755
index 0000000..09eb63e
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfComponentHandler.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20161222.openconfigplatform.platformcomponenttop.components.component.DefaultConfig;
+
+/**
+ * Utility class to deal with OPENCONFIG Componet/Config ModelObject & Annotation.
+ */
+public final class OpenConfigConfigOfComponentHandler
+        extends OpenConfigObjectHandler<DefaultConfig> {
+
+    private static final String OPENCONFIG_NAME = "config";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform";
+
+    /**
+     * OpenConfigConfigOfComponentHandler Constructor.
+     *
+     * @param parent OpenConfigTransceiverHandler of parent OPENCONFIG(component)
+     */
+    public OpenConfigConfigOfComponentHandler(OpenConfigComponentHandler parent) {
+        modelObject = new DefaultConfig();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addConfig(this);
+    }
+
+    /**
+     * Add name to modelObject of target OPENCONFIG.
+     *
+     * @param name String to be set for modelObject
+     * @return OpenConfigConfigOfComponentHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfComponentHandler addName(String name) {
+        modelObject.name(name);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfTransceiverHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfTransceiverHandler.java
new file mode 100755
index 0000000..8a271fd
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfTransceiverHandler.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20170708.openconfigplatformtransceiver.porttransceivertop.transceiver.DefaultConfig;
+
+/**
+ * Utility class to deal with OPENCONFIG Transceiver/Config ModelObject & Annotation.
+ */
+public final class OpenConfigConfigOfTransceiverHandler
+        extends OpenConfigObjectHandler<DefaultConfig> {
+
+    private static final String OPENCONFIG_NAME = "config";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform/transceiver";
+
+    /**
+     * OpenConfigConfigOfTransceiverHandler Constructor.
+     *
+     * @param parent OpenConfigTransceiverHandler of parent OPENCONFIG(tranceiver)
+     */
+    public OpenConfigConfigOfTransceiverHandler(OpenConfigTransceiverHandler parent) {
+        modelObject = new DefaultConfig();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addConfig(this);
+    }
+
+    /**
+     * Add enabled to modelObject of target OPENCONFIG.
+     *
+     * @param enabled boolean to be set for modelObject
+     * @return OpenConfigConfigOfTransceiverHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfTransceiverHandler addEnabled(boolean enabled) {
+        modelObject.enabled(enabled);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelAssignmentsHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelAssignmentsHandler.java
new file mode 100755
index 0000000..5432b8f
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelAssignmentsHandler.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanassignmenttop.DefaultLogicalChannelAssignments;
+
+/**
+ * Utility class to deal with OPENCONFIG LogicalChannelAssignments ModelObject & Annotation.
+ */
+public final class OpenConfigLogicalChannelAssignmentsHandler
+        extends OpenConfigObjectHandler<DefaultLogicalChannelAssignments> {
+
+    private static final String OPENCONFIG_NAME = "logical-channel-assignments";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigLogicalChannelAssignmentsHandler Constructor.
+     *
+     * @param parent OpenConfigChannelHandler of parent OPENCONFIG(channel)
+     */
+    public OpenConfigLogicalChannelAssignmentsHandler(OpenConfigChannelHandler parent) {
+        modelObject = new DefaultLogicalChannelAssignments();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addLogicalChannelAssignments(this);
+    }
+
+    /**
+     * Add Assignment to modelObject of target OPENCONFIG.
+     *
+     * @param assignment OpenConfigAssignmentHandler having Assignment to be set for modelObject
+     * @return OpenConfigLogicalChannelAssignmentsHandler of target OPENCONFIG
+     */
+    public OpenConfigLogicalChannelAssignmentsHandler addAssignment(
+                                                      OpenConfigAssignmentHandler assignment) {
+        modelObject.addToAssignment(assignment.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelsHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelsHandler.java
new file mode 100755
index 0000000..7e3eb32
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelsHandler.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanneltop.DefaultLogicalChannels;
+
+/**
+ * Utility class to deal with OPENCONFIG LogicalChannels ModelObject & Annotation.
+ */
+public final class OpenConfigLogicalChannelsHandler
+        extends OpenConfigObjectHandler<DefaultLogicalChannels> {
+
+    private static final String OPENCONFIG_NAME = "logical-channels";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigLogicalChannelsHandler Constructor.
+     *
+     * @param parent OpenConfigTerminalDeviceHandler of parent OPENCONFIG(terminal-device)
+     */
+    public OpenConfigLogicalChannelsHandler(OpenConfigTerminalDeviceHandler parent) {
+        modelObject = new DefaultLogicalChannels();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addLogicalChannels(this);
+    }
+
+    /**
+     * Add Channel to modelObject of target OPENCONFIG.
+     *
+     * @param channel OpenConfigChannelHandler having Channel to be set for modelObject
+     * @return OpenConfigLogicalChannelsHandler of target OPENCONFIG
+     */
+    public OpenConfigLogicalChannelsHandler addChannel(OpenConfigChannelHandler channel) {
+        modelObject.addToChannel(channel.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigObjectHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigObjectHandler.java
new file mode 100644
index 0000000..16958b6
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigObjectHandler.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.model.KeyLeaf;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import org.onosproject.yang.runtime.Annotation;
+import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
+import org.onosproject.yang.runtime.DefaultAnnotation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.List;
+
+/**
+ * Utility abstract class to deal with OPENCONFIG ModelObject & Annotation.
+ *
+ * @param <O> modelOject to be dealt with
+ */
+public abstract class OpenConfigObjectHandler<O extends ModelObject> {
+    protected final Logger log = LoggerFactory.getLogger(getClass());
+    protected O modelObject;
+    protected ResourceId resourceId;
+    protected List<AnnotatedNodeInfo> annotatedNodeInfos;
+
+    /**
+     * Get modelObject instance.
+     *
+     * @return ModelObject of target OPENCONFIG
+     */
+    public O getModelObject() {
+        return modelObject;
+    }
+
+    /**
+     * Get resourceId instance.
+     *
+     * @return ResourceId of target OPENCONFIG
+     */
+    public ResourceId getResourceId() {
+        return resourceId;
+    }
+
+    /**
+     * Set resourceId instance.
+     *
+     * @param openconfigName String of target OPENCONFIG name
+     * @param openconfigNameSpace String of target OPENCONFIG namespace
+     * @param keyLeaf KeyLeaf of target OPENCONFIG
+     * @param pBuilder ResourceId.Builder of parent OPENCONFIG
+     */
+    protected void setResourceId(String openconfigName, String openconfigNameSpace,
+                                        KeyLeaf keyLeaf, ResourceId.Builder pBuilder) {
+        ResourceId.Builder ridBuilder = ResourceId.builder();
+        if (pBuilder != null) {
+            ridBuilder = pBuilder.addBranchPointSchema(openconfigName, openconfigNameSpace);
+        } else {
+            ridBuilder = ridBuilder.addBranchPointSchema(openconfigName,
+                                                         openconfigNameSpace);
+        }
+
+        if (keyLeaf != null) {
+            ridBuilder = ridBuilder.addKeyLeaf(
+                             keyLeaf.leafSchema().name(),
+                             keyLeaf.leafSchema().namespace(),
+                             keyLeaf.leafValue());
+        }
+
+        resourceId = ridBuilder.build();
+    }
+
+    /**
+     * Get ridBuilder instance.
+     *
+     * @return ResourceId.Builder of target OPENCONFIG
+     */
+    public ResourceId.Builder getResourceIdBuilder() {
+        try {
+            return resourceId.copyBuilder();
+        } catch (CloneNotSupportedException e) {
+            log.error("Exception thrown", e);
+            return null;
+        }
+    }
+
+    /**
+     * Add Annotation for annotaedNodeinfos.
+     *
+     * @param key String of Annotation's key
+     * @param value String of Annotation's value
+     */
+    public void addAnnotation(String key, String value) {
+        AnnotatedNodeInfo.Builder builder = DefaultAnnotatedNodeInfo.builder();
+
+        AnnotatedNodeInfo preAnnotate = annotatedNodeInfos.stream()
+                                        .filter(annotatedNodeInfo -> annotatedNodeInfo.resourceId()
+                                                                     .equals(resourceId))
+                                        .findFirst()
+                                        .orElse(null);
+
+        if (preAnnotate != null) {
+             annotatedNodeInfos.remove(preAnnotate);
+             for (Annotation annotation : preAnnotate.annotations()) {
+                  builder.addAnnotation(annotation);
+             }
+        }
+
+        annotatedNodeInfos.add(builder.addAnnotation(new DefaultAnnotation(key, value))
+                                      .resourceId(resourceId)
+                                      .build());
+    }
+
+    /**
+     * Get annotatedNodeInfos instance.
+     *
+     * @return List<AnnotatedNodeInfo> of all OPENCONFIG
+     */
+    public List<AnnotatedNodeInfo> getAnnotatedNodeInfoList() {
+        return annotatedNodeInfos;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTerminalDeviceHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTerminalDeviceHandler.java
new file mode 100755
index 0000000..728a596
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTerminalDeviceHandler.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminaldevicetop.DefaultTerminalDevice;
+
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.stream.Collectors;
+import com.google.common.collect.ImmutableList;
+
+import static org.onosproject.odtn.utils.YangToolUtil.toCharSequence;
+import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData;
+import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
+import static org.onosproject.odtn.utils.YangToolUtil.toResourceData;
+import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream;
+
+/**
+ * Utility class to deal with OPENCONFIG TerminalDevice ModelObject & Annotation.
+ */
+public final class OpenConfigTerminalDeviceHandler
+        extends OpenConfigObjectHandler<DefaultTerminalDevice> {
+
+    private static final String OPENCONFIG_NAME = "terminal-device";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigTerminalDeviceHandler Constructor.
+     */
+    public OpenConfigTerminalDeviceHandler() {
+        modelObject = new DefaultTerminalDevice();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, null);
+        annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+    }
+
+    /**
+     * Add LogicalChannels to modelObject of target OPENCONFIG.
+     *
+     * @param logicalChannels OpenConfigLogicalChannelsHandler having LogicalChannels to be set for
+     *                        modelObject
+     * @return OpenConfigTerminalDeviceHandler of target OPENCONFIG
+     */
+    public OpenConfigTerminalDeviceHandler addLogicalChannels(
+                                           OpenConfigLogicalChannelsHandler logicalChannels) {
+        modelObject.logicalChannels(logicalChannels.getModelObject());
+        return this;
+    }
+
+    /**
+     * Get List<CharSequence> of target OPENCONFIG.
+     *
+     * @return List<CharSequence> of target OPENCONFIG
+     */
+    public List<CharSequence> getListCharSequence() {
+        return ImmutableList.of(toDataNode((ModelObject) getModelObject())).stream()
+                            .map(node -> toCharSequence(toXmlCompositeStream(
+                                         toCompositeData(toResourceData(
+                                                         ResourceId.builder().build(), node),
+                                         annotatedNodeInfos))))
+                            .collect(Collectors.toList());
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTransceiverHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTransceiverHandler.java
new file mode 100755
index 0000000..562cb25
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTransceiverHandler.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20170708.openconfigplatformtransceiver.porttransceivertop.DefaultTransceiver;
+
+/**
+ * Utility class to deal with OPENCONFIG Transceiver ModelObject & Annotation.
+ */
+public final class OpenConfigTransceiverHandler
+        extends OpenConfigObjectHandler<DefaultTransceiver> {
+
+    private static final String OPENCONFIG_NAME = "transceiver";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform/transceiver";
+
+    /**
+     * OpenConfigTransceiverHandler Constructor.
+     *
+     * @param parent OpenConfigComponentHandler of parent OPENCONFIG(component)
+     */
+    public OpenConfigTransceiverHandler(OpenConfigComponentHandler parent) {
+        modelObject = new DefaultTransceiver();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addTransceiver(this);
+    }
+
+    /**
+     * Add Config to modelObject of target OPENCONFIG.
+     *
+     * @param config OpenConfigConfigOfTransceiverHandler having Config to be set for modelObject
+     * @return OpenConfigTransceiverHandler of target OPENCONFIG
+     */
+    public OpenConfigTransceiverHandler addConfig(OpenConfigConfigOfTransceiverHandler config) {
+        modelObject.config(config.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/Transceiver.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/Transceiver.java
old mode 100644
new mode 100755
index 66ca6cd..17220e0
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/Transceiver.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/Transceiver.java
@@ -15,8 +15,6 @@
  */
 package org.onosproject.odtn.utils.openconfig;
 
-import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
-
 import java.util.List;
 
 import org.onosproject.yang.gen.v1.openconfigplatform.rev20161222.openconfigplatform.platformcomponenttop.DefaultComponents;
@@ -32,6 +30,8 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
 
+import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
+
 /**
  * Utility methods dealing with OpenConfig transceiver.
  * <p>
@@ -40,27 +40,6 @@
 @Beta
 public abstract class Transceiver {
 
-    public static List<DataNode> enable(String componentName, boolean enable) {
-
-        DefaultComponents components = new DefaultComponents();
-
-        Component component = PlainPlatform.componentWithName(componentName);
-        components.addToComponent(component);
-
-        // augmented 'component' shim
-        DefaultAugmentedOcPlatformComponent tcomponent = new DefaultAugmentedOcPlatformComponent();
-
-        DefaultTransceiver transceiver = new DefaultTransceiver();
-
-        Config configt = new DefaultConfig();
-        configt.enabled(enable); // phase 1.0 flag
-        transceiver.config(configt);
-        tcomponent.transceiver(transceiver);
-        component.addAugmentation(tcomponent);
-
-        return ImmutableList.of(toDataNode(components));
-    }
-
     public static List<DataNode> preconf(String componentName) {
         DefaultComponents components = new DefaultComponents();