1cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski/*
2cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * Copyright (C) 2016 The Android Open Source Project
3cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski *
4cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * you may not use this file except in compliance with the License.
6cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * You may obtain a copy of the License at
7cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski *
8cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski *
10cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * See the License for the specific language governing permissions and
14cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * limitations under the License.
15cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski */
16cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
17cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#ifndef AAPT_XML_XMLPATTERN_H
18cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#define AAPT_XML_XMLPATTERN_H
19cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
20cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#include "Diagnostics.h"
21cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#include "xml/XmlDom.h"
22cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
23cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#include <android-base/macros.h>
24cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#include <functional>
25cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#include <map>
26cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#include <string>
27cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#include <vector>
28cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
29cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskinamespace aapt {
30cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskinamespace xml {
31cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
32cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskienum class XmlActionExecutorPolicy {
33cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    /**
34cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * Actions on run if elements are matched, errors occur only when actions return false.
35cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     */
36cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    None,
37cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
38cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    /**
39cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * The actions defined must match and run. If an element is found that does not match
40cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * an action, an error occurs.
41cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     */
42cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    Whitelist,
43cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski};
44cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
45cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski/**
46cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * Contains the actions to perform at this XML node. This is a recursive data structure that
47cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * holds XmlNodeActions for child XML nodes.
48cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski */
49cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskiclass XmlNodeAction {
50cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskipublic:
51cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    using ActionFuncWithDiag = std::function<bool(Element*, SourcePathDiagnostics*)>;
52cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    using ActionFunc = std::function<bool(Element*)>;
53cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
54cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    /**
55cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * Find or create a child XmlNodeAction that will be performed for the child element
56cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * with the name `name`.
57cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     */
58cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    XmlNodeAction& operator[](const std::u16string& name) {
59cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        return mMap[name];
60cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    }
61cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
62cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    /**
63cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * Add an action to be performed at this XmlNodeAction.
64cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     */
65cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    void action(ActionFunc f);
66cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    void action(ActionFuncWithDiag);
67cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
68cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskiprivate:
69cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    friend class XmlActionExecutor;
70cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
71cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    bool execute(XmlActionExecutorPolicy policy, SourcePathDiagnostics* diag, Element* el) const;
72cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
73cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    std::map<std::u16string, XmlNodeAction> mMap;
74cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    std::vector<ActionFuncWithDiag> mActions;
75cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski};
76cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
77cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski/**
78cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * Allows the definition of actions to execute at specific XML elements defined by their
79cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * hierarchy.
80cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski */
81cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskiclass XmlActionExecutor {
82cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskipublic:
83cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    XmlActionExecutor() = default;
84cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
85cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    /**
86cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * Find or create a root XmlNodeAction that will be performed for the root XML element
87cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * with the name `name`.
88cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     */
89cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    XmlNodeAction& operator[](const std::u16string& name) {
90cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        return mMap[name];
91cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    }
92cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
93cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    /**
94cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * Execute the defined actions for this XmlResource.
95cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     * Returns true if all actions return true, otherwise returns false.
96cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski     */
97cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    bool execute(XmlActionExecutorPolicy policy, IDiagnostics* diag, XmlResource* doc) const;
98cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
99cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskiprivate:
100cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    std::map<std::u16string, XmlNodeAction> mMap;
101cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
102cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    DISALLOW_COPY_AND_ASSIGN(XmlActionExecutor);
103cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski};
104cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
105cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski} // namespace xml
106cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski} // namespace aapt
107cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
108cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#endif /* AAPT_XML_XMLPATTERN_H */
109