blob: ca21b087f9548b74ef81ac20f851b3047aca497c [file] [log] [blame]
Adam Lesinskicc5609d2016-04-05 12:41:07 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef AAPT_XML_XMLPATTERN_H
18#define AAPT_XML_XMLPATTERN_H
19
20#include "Diagnostics.h"
21#include "xml/XmlDom.h"
22
23#include <android-base/macros.h>
24#include <functional>
25#include <map>
26#include <string>
27#include <vector>
28
29namespace aapt {
30namespace xml {
31
32enum class XmlActionExecutorPolicy {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070033 /**
34 * Actions on run if elements are matched, errors occur only when actions
35 * return false.
36 */
37 None,
Adam Lesinskicc5609d2016-04-05 12:41:07 -070038
Adam Lesinskicacb28f2016-10-19 12:18:14 -070039 /**
40 * The actions defined must match and run. If an element is found that does
41 * not match
42 * an action, an error occurs.
43 */
44 Whitelist,
Adam Lesinskicc5609d2016-04-05 12:41:07 -070045};
46
47/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070048 * Contains the actions to perform at this XML node. This is a recursive data
49 * structure that
Adam Lesinskicc5609d2016-04-05 12:41:07 -070050 * holds XmlNodeActions for child XML nodes.
51 */
52class XmlNodeAction {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070053 public:
54 using ActionFuncWithDiag =
55 std::function<bool(Element*, SourcePathDiagnostics*)>;
56 using ActionFunc = std::function<bool(Element*)>;
Adam Lesinskicc5609d2016-04-05 12:41:07 -070057
Adam Lesinskicacb28f2016-10-19 12:18:14 -070058 /**
59 * Find or create a child XmlNodeAction that will be performed for the child
60 * element
61 * with the name `name`.
62 */
63 XmlNodeAction& operator[](const std::string& name) { return mMap[name]; }
Adam Lesinskicc5609d2016-04-05 12:41:07 -070064
Adam Lesinskicacb28f2016-10-19 12:18:14 -070065 /**
66 * Add an action to be performed at this XmlNodeAction.
67 */
68 void action(ActionFunc f);
69 void action(ActionFuncWithDiag);
Adam Lesinskicc5609d2016-04-05 12:41:07 -070070
Adam Lesinskicacb28f2016-10-19 12:18:14 -070071 private:
72 friend class XmlActionExecutor;
Adam Lesinskicc5609d2016-04-05 12:41:07 -070073
Adam Lesinskicacb28f2016-10-19 12:18:14 -070074 bool execute(XmlActionExecutorPolicy policy, SourcePathDiagnostics* diag,
75 Element* el) const;
Adam Lesinskicc5609d2016-04-05 12:41:07 -070076
Adam Lesinskicacb28f2016-10-19 12:18:14 -070077 std::map<std::string, XmlNodeAction> mMap;
78 std::vector<ActionFuncWithDiag> mActions;
Adam Lesinskicc5609d2016-04-05 12:41:07 -070079};
80
81/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070082 * Allows the definition of actions to execute at specific XML elements defined
83 * by their
Adam Lesinskicc5609d2016-04-05 12:41:07 -070084 * hierarchy.
85 */
86class XmlActionExecutor {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070087 public:
88 XmlActionExecutor() = default;
Adam Lesinskicc5609d2016-04-05 12:41:07 -070089
Adam Lesinskicacb28f2016-10-19 12:18:14 -070090 /**
91 * Find or create a root XmlNodeAction that will be performed for the root XML
92 * element
93 * with the name `name`.
94 */
95 XmlNodeAction& operator[](const std::string& name) { return mMap[name]; }
Adam Lesinskicc5609d2016-04-05 12:41:07 -070096
Adam Lesinskicacb28f2016-10-19 12:18:14 -070097 /**
98 * Execute the defined actions for this XmlResource.
99 * Returns true if all actions return true, otherwise returns false.
100 */
101 bool execute(XmlActionExecutorPolicy policy, IDiagnostics* diag,
102 XmlResource* doc) const;
Adam Lesinskicc5609d2016-04-05 12:41:07 -0700103
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700104 private:
105 std::map<std::string, XmlNodeAction> mMap;
Adam Lesinskicc5609d2016-04-05 12:41:07 -0700106
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700107 DISALLOW_COPY_AND_ASSIGN(XmlActionExecutor);
Adam Lesinskicc5609d2016-04-05 12:41:07 -0700108};
109
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700110} // namespace xml
111} // namespace aapt
Adam Lesinskicc5609d2016-04-05 12:41:07 -0700112
113#endif /* AAPT_XML_XMLPATTERN_H */