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