Added ModeXMLValidator class and apply it
authorJinWang An <jinwang.an@samsung.com>
Thu, 18 Apr 2019 04:39:26 +0000 (13:39 +0900)
committerYoungjae Shin <yj99.shin@samsung.com>
Wed, 18 Mar 2020 08:53:41 +0000 (17:53 +0900)
example/tizen_mode.xsd
supervisor/ModeManager.cpp
supervisor/ModeParser.h
supervisor/ModeXMLParser.cpp
supervisor/ModeXMLParser.h
test/CMakeLists.txt
test/modes_test_parser.cpp

index 2143415..de90e07 100644 (file)
@@ -3,7 +3,7 @@
        <xs:element name="tizen">
                <xs:complexType>
                        <xs:sequence>
-                               <xs:element maxOccurs="1" ref="o:mode"/>
+                               <xs:element maxOccurs="1" minOccurs="1" ref="o:mode"/>
                        </xs:sequence>
                        <xs:attribute name="version" use="required" type="o:versionT"/>
                </xs:complexType>
index 9c18853..9a79a43 100644 (file)
@@ -69,7 +69,6 @@ int ModeManager::applyMode(const string &modeName)
        catch (ModesEx &e) {
                ERR("parser Fail(%s)", e.what());
        }
-
        return MODES_ERROR_NONE;
 }
 
@@ -91,11 +90,12 @@ void ModeManager::makeModeMap(const string &dirPath)
 
                try {
                        ModeParser *parser = getParser(filePath);
+                       parser->validateMode();
                        addModeName(parser, filePath);
                        delete parser;
                }
                catch (ModesEx &e) {
-                       ERR("parser Fail(%s)", e.what());
+                       ERR("parser(%s) Fail(%s)", filePath.c_str(), e.what());
                }
                catch (std::invalid_argument &e) {
                        ERR("parser Fail(%s)", e.what());
index ee149b0..313b1c0 100644 (file)
@@ -26,6 +26,7 @@ public:
 
        virtual Mode getMode() = 0;
        virtual std::string getModeName() = 0;
+       virtual void validateMode() = 0;
 protected:
        ModeParser() {}
 };
index 077b403..5c5b63d 100644 (file)
@@ -15,8 +15,9 @@
  */
 #include "ModeXMLParser.h"
 
-#include <libxml/tree.h>
 #include <string>
+#include <libxml/tree.h>
+#include <libxml/xmlschemas.h>
 #include "mdss.h"
 #include "Mode.h"
 #include "ModesEx.h"
@@ -24,6 +25,7 @@
 MODES_NAMESPACE_USE;
 
 const xmlChar* const ModeXMLParser::MODE_TAG_TIZEN = (xmlChar*)"tizen";
+const xmlChar* const ModeXMLParser::MODE_TAG_TIZEN_MODES = (xmlChar*)"tizen_modes";
 const xmlChar* const ModeXMLParser::MODE_TAG_XMLNS = (xmlChar*)"xmlns";
 const xmlChar* const ModeXMLParser::MODE_TAG_VERSION = (xmlChar*)"version";
 const xmlChar* const ModeXMLParser::MODE_TAG_MODE = (xmlChar*)"mode";
@@ -33,6 +35,9 @@ const xmlChar* const ModeXMLParser::MODE_TAG_TRANSPARENT = (xmlChar*)"Transparen
 const xmlChar* const ModeXMLParser::MODE_TAG_ACHIEVE = (xmlChar*)"Achieve";
 const xmlChar* const ModeXMLParser::MODE_TAG_CHANGEABLE = (xmlChar*)"Changeable";
 
+// TODO: Add routine to choose xsd file automatically from xml fileinfo.
+const char* const ModeXMLParser::MODE_XSD_PATH = "./tizen_mode.xsd";
+
 ModeXMLParser::ModeXMLParser(const std::string &path)
 {
        doc = xmlParseFile(path.c_str());
@@ -112,7 +117,7 @@ void ModeXMLParser::parseAction(xmlNodePtr node, Mode &modedesc)
        }
 
        DBG("Action<%s> : value=%s, Changeable=%s, Achieve=%s", action.getName().c_str(),
-               action.getValue().c_str(), action.getChangeable().c_str(), action.getAchieve().c_str());
+                       action.getValue().c_str(), action.getChangeable().c_str(), action.getAchieve().c_str());
 
        modedesc.addAction(action);
 }
@@ -169,3 +174,43 @@ std::string ModeXMLParser::getModeName()
 
        return modeName;
 }
+
+void ModeXMLParser::validateMode()
+{
+       xmlSchemaPtr xsdSchema;
+       xmlSchemaParserCtxtPtr ctxt;
+       xmlSchemaValidCtxtPtr cvtxt;
+
+       ctxt = xmlSchemaNewParserCtxt(MODE_XSD_PATH);
+       if (NULL == ctxt) {
+               ERR("xmlSchemaNewParserCtxt(%s) Fail", MODE_XSD_PATH);
+               throw ModesEx(ModesEx::INVALID_ARG);
+       }
+
+       xsdSchema = xmlSchemaParse(ctxt);
+       if (NULL == xsdSchema) {
+               ERR("xmlSchemaParse() Fail");
+               throw ModesEx(ModesEx::INVALID_ARG);
+       }
+
+       xmlSchemaFreeParserCtxt(ctxt);
+
+       cvtxt = xmlSchemaNewValidCtxt(xsdSchema);
+
+       if (NULL == cvtxt ) {
+               ERR("xmlSchemaNewValidCtxt() Fail");
+               throw ModesEx(ModesEx::INVALID_ARG);
+       }
+
+       if (0 != xmlSchemaValidateDoc(cvtxt, doc)) {
+               ERR("xmlSchemaValidateDoc() Fail");
+               throw ModesEx(ModesEx::INVALID_ARG);
+       }
+
+       xmlSchemaFreeValidCtxt(cvtxt);
+       xmlSchemaFree(xsdSchema);
+
+// TODO: call xmlSchemaCleanupTypes() when end of this deamon.
+
+       return;
+}
index e03c960..18b7d0b 100644 (file)
@@ -29,8 +29,10 @@ public:
 
        Mode getMode();
        std::string getModeName();
+       void validateMode();
 private:
        static const xmlChar* const MODE_TAG_TIZEN;
+       static const xmlChar* const MODE_TAG_TIZEN_MODES;
        static const xmlChar* const MODE_TAG_XMLNS;
        static const xmlChar* const MODE_TAG_VERSION;
        static const xmlChar* const MODE_TAG_MODE;
@@ -40,6 +42,8 @@ private:
        static const xmlChar* const MODE_TAG_ACHIEVE;
        static const xmlChar* const MODE_TAG_CHANGEABLE;
 
+       static const char* const MODE_XSD_PATH;
+
        void parseMode(xmlNodePtr node, Mode &modedesc);
        void parseAction(xmlNodePtr node, Mode &modedesc);
        void getDatafromNode(xmlNodePtr node, Mode &modedesc);
index f6036c9..255b1be 100644 (file)
@@ -39,11 +39,6 @@ INSTALL(TARGETS ${MODES_TEST_BASIC} DESTINATION ${BIN_INSTALL_DIR})
 #=======================================================================================#
 SET(MODES_CLIENT_TEST "modes-test-client")
 
-#FILE(GLOB MODES_CLIENT_TEST_SRCS  "${CMAKE_SOURCE_DIR}/common/*.c" "${CMAKE_SOURCE_DIR}/client/*.c"
-#    "${MODES_CLIENT_TEST}.c" )
-#SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/common/dbus.c
-#      PROPERTIES GENERATED TRUE)
-#SET(MODES_CLIENT_TEST_SRCS ${MODES_CLIENT_TEST_SRCS} ${CMAKE_SOURCE_DIR}/common/dbus.c)
 SET(MODES_CLIENT_TEST_SRCS "modes_client_test.c")
 
 ADD_DEFINITIONS("-DMODES_DBUS_INTERFACE=\"${DBUS_INTERFACE}\"")
index 887108e..efc16ca 100644 (file)
@@ -66,10 +66,11 @@ void TestParser::parserTest(const string &fileName)
        if (fileName.substr(pos + 1).compare("xml") == 0) {
                try {
                        ModeXMLParser modeparser(fileName);
+                       modeparser.validateMode();
                        parse(modeparser);
                }
                catch (ModesEx &e) {
-                       ERR("parser Fail(%s)", e.what());
+                       ERR("parser(%s) Fail(%s)", fileName.c_str(), e.what());
                }
        } else {
                ERR("Unknown type(%s)", fileName.c_str());