Add TAPI object resolver and DCS-dependent data provider ( to update cache )

- refactor TapiInstanceBuilder and add some util method
- add skeleton code for tapi-common get RPCs

Change-Id: I548623ad29f9b72b425713720c5081d790b42bd2
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
index fa4a903..dc4fd10 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
@@ -16,11 +16,26 @@
 
 package org.onosproject.odtn.utils.tapi;
 
+import java.util.List;
+import org.onlab.util.XmlString;
+import org.onosproject.config.DynamicConfigService;
 import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelConverter;
 import org.onosproject.yang.model.ModelObject;
 import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.ResourceData;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+import static org.onosproject.odtn.utils.YangToolUtil.toCharSequence;
+import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData;
+import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream;
+
+import org.onosproject.yang.model.ResourceId;
+import org.slf4j.Logger;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Utility builder class for TAPI modelobject creation with DCS.
@@ -33,29 +48,80 @@
 
     public static final String ODTN_PORT_TYPE = "odtn-port-type";
 
+    private final Logger log = getLogger(getClass());
+
+    private ModelConverter modelConverter;
+    private DynamicConfigService dcs;
+
     /**
      * Generate DCS modelObjectData.
-     * @return ModelObjectData to be built
+     *
+     * @return ModelObjectId of build target
      */
-    public abstract ModelObjectData build();
+    public abstract ModelObjectId getModelObjectId();
 
     /**
      * Get modelObject instance.
+     *
+     * @param <T> build target class
      * @return ModelObject of build target
      */
-    public abstract ModelObject getModelObject();
+    public abstract <T extends ModelObject> T getModelObject();
 
     /**
      * Get modelObject uuid.
+     *
      * @return Uuid of build target
      */
     public abstract Uuid getUuid();
 
+    /**
+     * Get modelObjectData instance.
+     *
+     * @return ModelObjectData of build target
+     */
+    public ModelObjectData getModelObjectData() {
+        ModelObject obj = getModelObject();
+        ModelObjectId objId = getModelObjectId();
 
-    ModelObjectData getModelObjectData(ModelObject obj, ModelObjectId objId) {
         return DefaultModelObjectData.builder()
                 .addModelObject(obj)
                 .identifier(objId)
                 .build();
     }
+
+    /**
+     * Add built modelObject to Dcs store.
+     */
+    public void build() {
+        dcs = getService(DynamicConfigService.class);
+        modelConverter = getService(ModelConverter.class);
+        addModelObjectDataToDcs(getModelObjectData());
+    }
+
+    private void addModelObjectDataToDcs(ModelObjectData input) {
+
+        ResourceData rnode = modelConverter.createDataNode(input);
+
+        // for debug
+        CharSequence strNode = toCharSequence(toXmlCompositeStream(toCompositeData(rnode)));
+        log.info("XML:\n{}", XmlString.prettifyXml(strNode));
+
+        addResourceDataToDcs(rnode);
+    }
+
+    private void addResourceDataToDcs(ResourceData input) {
+        addResourceDataToDcs(input, input.resourceId());
+    }
+
+    private void addResourceDataToDcs(ResourceData input, ResourceId rid) {
+        if (input == null || input.dataNodes() == null) {
+            return;
+        }
+        List<DataNode> dataNodes = input.dataNodes();
+        for (DataNode node : dataNodes) {
+            dcs.createNode(rid, node);
+        }
+    }
+
 }