1/*
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 <functional>
21#include <map>
22#include <string>
23#include <vector>
24
25#include "android-base/macros.h"
26
27#include "Diagnostics.h"
28#include "xml/XmlDom.h"
29
30namespace aapt {
31namespace xml {
32
33enum class XmlActionExecutorPolicy {
34  // Actions are run if elements are matched, errors occur only when actions return false.
35  kNone,
36
37  // The actions defined must match and run. If an element is found that does
38  // not match an action, an error occurs.
39  // Note: namespaced elements are always ignored.
40  kWhitelist,
41};
42
43/**
44 * Contains the actions to perform at this XML node. This is a recursive data
45 * structure that
46 * holds XmlNodeActions for child XML nodes.
47 */
48class XmlNodeAction {
49 public:
50  using ActionFuncWithDiag = std::function<bool(Element*, SourcePathDiagnostics*)>;
51  using ActionFunc = std::function<bool(Element*)>;
52
53  /**
54   * Find or create a child XmlNodeAction that will be performed for the child
55   * element with the name `name`.
56   */
57  XmlNodeAction& operator[](const std::string& name) { return map_[name]; }
58
59  /**
60   * Add an action to be performed at this XmlNodeAction.
61   */
62  void Action(ActionFunc f);
63  void Action(ActionFuncWithDiag);
64
65 private:
66  friend class XmlActionExecutor;
67
68  bool Execute(XmlActionExecutorPolicy policy, SourcePathDiagnostics* diag, Element* el) const;
69
70  std::map<std::string, XmlNodeAction> map_;
71  std::vector<ActionFuncWithDiag> actions_;
72};
73
74/**
75 * Allows the definition of actions to execute at specific XML elements defined
76 * by their
77 * hierarchy.
78 */
79class XmlActionExecutor {
80 public:
81  XmlActionExecutor() = default;
82
83  /**
84   * Find or create a root XmlNodeAction that will be performed for the root XML
85   * element with the name `name`.
86   */
87  XmlNodeAction& operator[](const std::string& name) { return map_[name]; }
88
89  /**
90   * Execute the defined actions for this XmlResource.
91   * Returns true if all actions return true, otherwise returns false.
92   */
93  bool Execute(XmlActionExecutorPolicy policy, IDiagnostics* diag, XmlResource* doc) const;
94
95 private:
96  std::map<std::string, XmlNodeAction> map_;
97
98  DISALLOW_COPY_AND_ASSIGN(XmlActionExecutor);
99};
100
101}  // namespace xml
102}  // namespace aapt
103
104#endif /* AAPT_XML_XMLPATTERN_H */
105