/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * 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.
 */


#ifndef CTSAUDIO_MODELBUILDER_H
#define CTSAUDIO_MODELBUILDER_H

#include <utils/String8.h>
#include "TaskAll.h"

namespace tinyxml2 {
class XMLElement;
};

class GenericFactory;

/**
 * Class to parse Test description XML and generate test model with TestCase in top
 */

class ModelBuilder {
public:
    ModelBuilder();
    explicit ModelBuilder(GenericFactory* factory);
    virtual ~ModelBuilder();

    /**
     * parse given xml with test case or batch. When caseOnly is true, only test case can be in.
     */
    virtual TaskGeneric* parseTestDescriptionXml(const android::String8& xmlFileName,
            bool caseOnly = false);

    struct ChildInfo {
        TaskGeneric::TaskType type;
        bool mandatory; // whether the child is mandatory or not
    };

private:
    virtual bool parseAttributes(const tinyxml2::XMLElement& elem, TaskGeneric& task);
    virtual TaskGeneric* parseGeneric(const tinyxml2::XMLElement& elem, int tableIndex);
    virtual TaskCase* parseCase(const tinyxml2::XMLElement& root);
    virtual TaskBatch* parseBatch(const tinyxml2::XMLElement& root, const android::String8& xmlFileName);
    virtual TaskCase* parseInclude(const tinyxml2::XMLElement& elem, const android::String8& path);

    struct ParsingInfo {
        const char* name; // XML element name
        TaskGeneric::TaskType type;
        const ChildInfo* allowedChildren;
        int Nchildren;
    };
    // no table for batch, and ETaskInvalidLast is not in either (-2)
    static const int PARSING_TABLE_SIZE = TaskGeneric::ETaskInvalidLast - 2;
    static ParsingInfo mParsingTable[PARSING_TABLE_SIZE];

    GenericFactory* mFactory;

};


#endif // CTSAUDIO_MODELBUILDER_H