private void addCustomObjectTypeAndInstance(UaFolderNode rootFolder) {
    logger.info("dhanasekar @ExampleNamespac.j getNodeContext()={}",getNodeContext());
    // Define a new ObjectType called "MyObjectType".
    UaObjectTypeNode objectTypeNode = UaObjectTypeNode.builder(getNodeContext())
        .setNodeId(newNodeId("ObjectTypes/MyObjectType"))
        .setBrowseName(newQualifiedName("MyObjectType"))
        .setDisplayName(LocalizedText.english("MyObjectType"))
        .setIsAbstract(false)
        .build();
    logger.info("dhanasekar @ExampleNamespac.j newQualifiedName()={}",newQualifiedName("Foo"));
    // "Foo" and "Bar" are members. These nodes are what are called "instance declarations" by the spec.
    UaVariableNode foo = UaVariableNode.builder(getNodeContext())
        .setNodeId(newNodeId("ObjectTypes/MyObjectType.Foo"))
        .setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
        .setBrowseName(newQualifiedName("Foo"))
        .setDisplayName(LocalizedText.english("Foo"))
        .setDataType(Identifiers.Int16)
        .setTypeDefinition(Identifiers.BaseDataVariableType)
        .build();
    //dhanasekar object intentiated of Reference
    foo.addReference(new Reference(
        foo.getNodeId(),
        Identifiers.HasModellingRule,
        Identifiers.ModellingRule_Mandatory.expanded(),
        true
    ));
    //method
    foo.setValue(new DataValue(new Variant(0)));
    objectTypeNode.addComponent(foo);
    UaVariableNode bar = UaVariableNode.builder(getNodeContext())
        .setNodeId(newNodeId("ObjectTypes/MyObjectType.Bar"))
        .setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
        .setBrowseName(newQualifiedName("Bar"))
        .setDisplayName(LocalizedText.english("Bar"))
        .setDataType(Identifiers.String)
        .setTypeDefinition(Identifiers.BaseDataVariableType)
        .build();
    bar.addReference(new Reference(
        bar.getNodeId(),
        Identifiers.HasModellingRule,
        Identifiers.ModellingRule_Mandatory.expanded(),
        true
    ));
    bar.setValue(new DataValue(new Variant("bar")));
    objectTypeNode.addComponent(bar);
    // dhanasekar -- Starting
    // Adding code for flip
    UaVariableNode flip = UaVariableNode.builder(getNodeContext())
            .setNodeId(newNodeId(12345))
            .setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
            .setBrowseName(newQualifiedName("Flip"))
            .setDisplayName(LocalizedText.english("Flip"))
            .setDataType(Identifiers.Int32)
            .setTypeDefinition(Identifiers.BaseDataVariableType)
            .build();
    logger.info("dhanasekar @ExampleNamespac.j flip.getNodeId()={}",flip.getNodeId());
    flip.addReference(new Reference(
            flip.getNodeId(),
            Identifiers.HasModellingRule,
            Identifiers.ModellingRule_Mandatory.expanded(),
            true
    ));
    flip.setValue(new DataValue(new Variant(0)));
    objectTypeNode.addComponent(flip);
    // Adding code for flop
    UaVariableNode flop = UaVariableNode.builder(getNodeContext())
            .setNodeId(newNodeId("ObjectTypes/MyObjectType.Flop"))
            .setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
            .setBrowseName(newQualifiedName("Flop"))
            .setDisplayName(LocalizedText.english("Flop"))
            .setDataType(Identifiers.Boolean)
            .setTypeDefinition(Identifiers.BaseDataVariableType)
            .build();
    flop.addReference(new Reference(
            flop.getNodeId(),
            Identifiers.HasModellingRule,
            Identifiers.ModellingRule_Mandatory.expanded(),
            true
    ));
    flop.setValue(new DataValue(new Variant(0)));
    objectTypeNode.addComponent(flop);
    // dhanasekar -- Ending
    // Tell the ObjectTypeManager about our new type.
    // This let's us use NodeFactory to instantiate instances of the type.
    getServer().getObjectTypeManager().registerObjectType(
        objectTypeNode.getNodeId(),
        UaObjectNode.class,
        UaObjectNode::new
    );
    // Add the inverse SubtypeOf relationship.
    objectTypeNode.addReference(new Reference(
        objectTypeNode.getNodeId(),
        Identifiers.HasSubtype,
        Identifiers.BaseObjectType.expanded(),
        false
    ));
    // Add type definition and declarations to address space.
    getNodeManager().addNode(objectTypeNode);
    getNodeManager().addNode(foo);
    getNodeManager().addNode(bar);
    //dhanasekar
    getNodeManager().addNode(flip);
    getNodeManager().addNode(flop);
    //dhanasekar
    // Use NodeFactory to create instance of MyObjectType called "MyObject".
    // NodeFactory takes care of recursively instantiating MyObject member nodes
    // as well as adding all nodes to the address space.
    try {
        UaObjectNode myObject = (UaObjectNode) getNodeFactory().createNode(
            newNodeId("HelloWorld/MyObject"),
            objectTypeNode.getNodeId(),
            false
        );
        myObject.setBrowseName(newQualifiedName("MyObject"));
        myObject.setDisplayName(LocalizedText.english("MyObject"));
        // Add forward and inverse references from the root folder.
        rootFolder.addOrganizes(myObject);
        myObject.addReference(new Reference(
            myObject.getNodeId(),
            Identifiers.Organizes,
            rootFolder.getNodeId().expanded(),
            false
        ));
    } catch (UaException e) {
        logger.error("Error creating MyObjectType instance: {}", e.getMessage(), e);
    }
}