Exemplo n.º 1
0
static void _parseFile(const char* fileName, Boolean hideEmptyTags)
{
    // cout << "Parsing: " << fileName << endl;

    Buffer text;
    FileSystem::loadFileToMemory(text, fileName);

    XmlParser parser((char*)text.getData(), 0, hideEmptyTags);

    XmlEntry entry;

    // Get initial comment and ignore
    parser.next(entry, true);
    // get next comment, check for file Description
    parser.next(entry, true);
    if (!String::equal(entry.text, "Test XML file") )
    {
        throw CIMException(CIM_ERR_FAILED, "Comment Error");
    }
    PEGASUS_ASSERT (parser.getLine () == 2);
    PEGASUS_ASSERT (parser.getStackSize () == 0);
    // Put the Comment back...
    parser.putBack (entry);
    PEGASUS_ASSERT (parser.getLine () == 2);
    PEGASUS_ASSERT (parser.getStackSize () == 0);
    while (parser.next(entry))
    {
        if (verbose)
        {
            entry.print();
        }
    }
    PEGASUS_ASSERT (parser.next (entry, true) == false);
}
Exemplo n.º 2
0
static void testWhitespaceHandling()
{
    char text[] = "<tag attr=\"\r\nvalue  +  \">\r\nvalue  +  </tag>";
    XmlParser parser(text);
    XmlEntry entry;

    // Make sure attribute value has whitespace normalized.

    parser.next(entry);
    const char* attrValue;
    PEGASUS_TEST_ASSERT(entry.getAttributeValue("attr", attrValue));
    PEGASUS_TEST_ASSERT(strcmp(attrValue, "value +") == 0);

    // Make sure element value has leading and trailing whitespace trimmed,
    // but internal whitespace is not compressed.

    parser.next(entry);
    PEGASUS_TEST_ASSERT(entry.type == XmlEntry::CONTENT);
    PEGASUS_TEST_ASSERT(strcmp(entry.text, "value  +") == 0);
}
Exemplo n.º 3
0
static void _parseFile(const char* fileName)
{
    // cout << "Parsing: " << fileName << endl;

    Array<char> text;
    FileSystem::loadFileToMemory(text, fileName);
    text.append('\0');

    XmlParser parser((char*)text.getData());

    try
    {
	XmlEntry entry;

	while (parser.next(entry))
	  if (verbose) entry.print();
    }
    catch (Exception& e)
    {
	cout << fileName << ": " << e.getMessage() << endl;
    }
}
Exemplo n.º 4
0
Boolean ProcessCimElement(CIMRepository& repository, XmlParser& parser)
{
    XmlEntry entry;

    if (!parser.next(entry) || entry.type != XmlEntry::XML_DECLARATION)
    {
	throw(parser.getLine(), "expected XML declaration");
    }

    if (!XmlReader::testStartTag(parser, entry, "CIM"))
	return false;

    String cimVersion;

    if (!entry.getAttributeValue("CIMVERSION", cimVersion))
    {
	throw XmlValidationError(parser.getLine(), 
	    "missing CIM.CIMVERSION attribute");
    }

    String dtdVersion;

    if (!entry.getAttributeValue("DTDVERSION", dtdVersion))
    {
	throw XmlValidationError(parser.getLine(), 
	    "missing CIM.DTDVERSION attribute");
    }

    if (!ProcessDeclarationElement(repository, parser))
    {
	throw XmlValidationError(parser.getLine(), 
	    "Expected DECLARATION element");
    }

    XmlReader::expectEndTag(parser, "CIM");

    return true;
}
Exemplo n.º 5
0
void testNamespaceSupport(Boolean hideEmptyTags)
{
    XmlNamespace testNamespaces[] =
    {
        {
            "ns0",
            "urn:0",
            0,
            0
        },
        {
            "ns1",
            "urn:1",
            1,
            0
        },
        {
            "ns2",
            "urn:2",
            2,
            0
        },
        { 0, 0, 0, 0 }    // Terminator
    };

    XmlEntry entry;
    const XmlAttribute* attr;

    // Test namespace scoping
    {
        char xmlContent[] =
            "<a:tag xmlns:a=\"urn:0\" xmlns:b=\"urn:1\">"
            " <b:tag xmlns=\"urn:2\" ignore=\"false\" a:attr=\"true\">"
            "  <tag/>"
            " </b:tag>"
            " <tag xmlns=\"urn:0\" xml:lang=\"en-US\">"
            "  Data"
            " </tag>"
            " <d:tag xmlns:d=\"urn:x\"/>"
            " <b:tag xmlns:b=\"urn:1\"/>"
            "</a:tag>";
        XmlParser p(xmlContent, testNamespaces, hideEmptyTags);

        // <a:tag xmlns:a=\"urn:0\" xmlns:b=\"urn:1\">
        PEGASUS_ASSERT(p.next(entry));
        PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG);
        PEGASUS_ASSERT(!strcmp(entry.text, "a:tag"));
        PEGASUS_ASSERT(entry.nsType == 0);
        PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
        PEGASUS_ASSERT(p.getNamespace(0) != 0);
        PEGASUS_ASSERT(p.getNamespace(1) != 0);
        PEGASUS_ASSERT(p.getNamespace(2) == 0);

        // <b:tag xmlns=\"urn:2\" ignore=\"false\" a:attr=\"true\">
        PEGASUS_ASSERT(p.next(entry));
        PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG);
        PEGASUS_ASSERT(!strcmp(entry.text, "b:tag"));
        PEGASUS_ASSERT(entry.nsType == 1);
        PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
        PEGASUS_ASSERT(p.getNamespace(2) != 0);
        attr = entry.findAttribute(0, "attr");
        PEGASUS_ASSERT(attr != 0);
        PEGASUS_ASSERT(attr->nsType == 0);
        PEGASUS_ASSERT(strcmp(attr->name, "a:attr") == 0);
        PEGASUS_ASSERT(strcmp(attr->localName, "attr") == 0);
        PEGASUS_ASSERT(strcmp(attr->value, "true") == 0);
        PEGASUS_ASSERT(entry.findAttribute(1, "attr") == 0);
        attr = entry.findAttribute(2, "ignore");
        PEGASUS_ASSERT(attr != 0);
        PEGASUS_ASSERT(attr->nsType == 2);
        PEGASUS_ASSERT(strcmp(attr->name, "ignore") == 0);
        PEGASUS_ASSERT(strcmp(attr->localName, "ignore") == 0);
        PEGASUS_ASSERT(strcmp(attr->value, "false") == 0);

        // <tag>
        PEGASUS_ASSERT(p.next(entry));

        if (hideEmptyTags)
            PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG);
        else
            PEGASUS_ASSERT(entry.type == XmlEntry::EMPTY_TAG);

        PEGASUS_ASSERT(!strcmp(entry.text, "tag"));
        PEGASUS_ASSERT(entry.nsType == 2);
        PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));

        if (hideEmptyTags)
        {
            // </tag>
            PEGASUS_ASSERT(p.next(entry));
            PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG);
            PEGASUS_ASSERT(!strcmp(entry.text, "tag"));
            PEGASUS_ASSERT(entry.nsType == 2);
            PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
        }

        // </b:tag>
        PEGASUS_ASSERT(p.next(entry));
        PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG);
        PEGASUS_ASSERT(!strcmp(entry.text, "b:tag"));
        PEGASUS_ASSERT(entry.nsType == 1);
        PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
        PEGASUS_ASSERT(p.getNamespace(0) != 0);
        PEGASUS_ASSERT(p.getNamespace(1) != 0);
        PEGASUS_ASSERT(p.getNamespace(2) != 0);

        // <tag xmlns=\"urn:0\" xml:lang=\"en-US\">
        PEGASUS_ASSERT(p.next(entry));
        PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG);
        PEGASUS_ASSERT(!strcmp(entry.text, "tag"));
        PEGASUS_ASSERT(entry.nsType == 0);
        PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
        PEGASUS_ASSERT(p.getNamespace(0) != 0);
        PEGASUS_ASSERT(p.getNamespace(1) != 0);
        PEGASUS_ASSERT(p.getNamespace(2) == 0);
        attr = entry.findAttribute("xml:lang");
        PEGASUS_ASSERT(attr != 0);
        PEGASUS_ASSERT(attr->nsType == -1);
        PEGASUS_ASSERT(strcmp(attr->name, "xml:lang") == 0);
        PEGASUS_ASSERT(strcmp(attr->localName, "lang") == 0);
        PEGASUS_ASSERT(strcmp(attr->value, "en-US") == 0);

        // Data
        PEGASUS_ASSERT(p.next(entry));
        PEGASUS_ASSERT(entry.type == XmlEntry::CONTENT);
        PEGASUS_ASSERT(!strcmp(entry.text, "Data"));

        // </tag>
        PEGASUS_ASSERT(p.next(entry));
        PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG);
        PEGASUS_ASSERT(!strcmp(entry.text, "tag"));
        PEGASUS_ASSERT(entry.nsType == 0);
        PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));

        // <d:tag xmlns:d=\"urn:x\">
        PEGASUS_ASSERT(p.next(entry));

        if (hideEmptyTags)
            PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG);
        else
            PEGASUS_ASSERT(entry.type == XmlEntry::EMPTY_TAG);

        PEGASUS_ASSERT(!strcmp(entry.text, "d:tag"));
        PEGASUS_ASSERT(entry.nsType == -2);
        PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
        PEGASUS_ASSERT(p.getNamespace(-2) != 0);

        if (hideEmptyTags)
        {
            // </d:tag>
            PEGASUS_ASSERT(p.next(entry));
            PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG);
            PEGASUS_ASSERT(!strcmp(entry.text, "d:tag"));
            PEGASUS_ASSERT(entry.nsType == -2);
            PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
            PEGASUS_ASSERT(p.getNamespace(-2) != 0);
        }

        // <b:tag xmlns:b=\"urn:1\">
        PEGASUS_ASSERT(p.next(entry));

        if (hideEmptyTags)
            PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG);
        else
            PEGASUS_ASSERT(entry.type == XmlEntry::EMPTY_TAG);

        PEGASUS_ASSERT(!strcmp(entry.text, "b:tag"));
        PEGASUS_ASSERT(entry.nsType == 1);
        PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
        PEGASUS_ASSERT(p.getNamespace(-2) == 0);
        PEGASUS_ASSERT(p.getNamespace(0) != 0);
        PEGASUS_ASSERT(p.getNamespace(1) != 0);
        PEGASUS_ASSERT(p.getNamespace(2) == 0);

        if (hideEmptyTags)
        {
            // </b:tag xmlns:b=\"urn:1\">
            PEGASUS_ASSERT(p.next(entry));
            PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG);
            PEGASUS_ASSERT(!strcmp(entry.text, "b:tag"));
            PEGASUS_ASSERT(entry.nsType == 1);
            PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
            PEGASUS_ASSERT(p.getNamespace(-2) == 0);
            PEGASUS_ASSERT(p.getNamespace(0) != 0);
            PEGASUS_ASSERT(p.getNamespace(1) != 0);
            PEGASUS_ASSERT(p.getNamespace(2) == 0);
        }

        // </a:tag>
        PEGASUS_ASSERT(p.next(entry));
        PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG);
        PEGASUS_ASSERT(!strcmp(entry.text, "a:tag"));
        PEGASUS_ASSERT(entry.nsType == 0);
        PEGASUS_ASSERT(!strcmp(entry.localName, "tag"));
        PEGASUS_ASSERT(p.getNamespace(0) != 0);
        PEGASUS_ASSERT(p.getNamespace(1) != 0);
    }

    // Test undeclared namespace
    {
        char xmlContent[] = "<a:tag xmlns:b=\"urn:1\"/>";
        XmlParser p(xmlContent, testNamespaces, hideEmptyTags);
        ASSERT_XML_EXCEPTION(p.next(entry));
    }

    // Test invalid QNames
    {
        char xmlContent[] = "<.a:tag xmlns:a=\"urn:0\"/>";
        XmlParser p(xmlContent, testNamespaces, hideEmptyTags);
        ASSERT_XML_EXCEPTION(p.next(entry));
    }

    {
        char xmlContent[] = "<a&:tag xmlns:a=\"urn:0\"/>";
        XmlParser p(xmlContent, testNamespaces, hideEmptyTags);
        ASSERT_XML_EXCEPTION(p.next(entry));
    }

    {
        char xmlContent[] = "<a:.tag xmlns:a=\"urn:0\"/>";
        XmlParser p(xmlContent, testNamespaces, hideEmptyTags);
        ASSERT_XML_EXCEPTION(p.next(entry));
    }

    {
        char xmlContent[] = "<a:ta:g xmlns:a=\"urn:0\"/>";
        XmlParser p(xmlContent, testNamespaces, hideEmptyTags);
        ASSERT_XML_EXCEPTION(p.next(entry));
    }

    {
        char xmlContent[] = "<a:ta";
        XmlParser p(xmlContent, testNamespaces, hideEmptyTags);
        ASSERT_XML_EXCEPTION(p.next(entry));
    }
}