# Copyright 2018 - 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.

"""Tool to combine SEPolicy mapping file.

Say, x, y, z are platform SEPolicy versions such that x > y > z. Then given two
mapping files from x to y (top) and y to z (bottom), it's possible to construct
a mapping file from x to z. We do the following to combine two maps.
1. Add all new types declarations from top to bottom.
2. Add all new typeattribute declarations from top to bottom.
3. Say, a new type "bar" in top is mapped like this "foo_V_v<-bar", then we map
"bar" to whatever "foo" is mapped to in the bottom map. We do this for all new
types in the top map.

More generally, we can correctly construct x->z from x->y' and y"->z as long as
y">y'.

This file contains the implementation of combining two mapping files.
"""
import argparse
import re
from mini_parser import MiniCilParser

def Combine(top, bottom):
    bottom.types.update(top.types)
    bottom.typeattributes.update(top.typeattributes)

    for top_ta in top.typeattributesets:
        top_type_set = top.typeattributesets[top_ta]
        if len(top_type_set) == 1:
            continue

        m = re.fullmatch(r"(\w+?)_\d+(_0)?", top_ta)
        # Typeattributes in V(.0).cil have _V(_0) suffix, but not in
        # V(.0).ignore.cil
        bottom_type = m.group(1) if m else top_ta

        # If type doesn't exist in bottom map, no need to maintain mappings to
        # that type.
        if bottom_type not in bottom.rTypeattributesets.keys():
            continue

        for bottom_ta in bottom.rTypeattributesets[bottom_type]:
            bottom.typeattributesets[bottom_ta].update(top_type_set)

    return bottom

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-t", "--top-map", dest="top_map",
                        required=True, help="top map file")
    parser.add_argument("-b", "--bottom-map", dest="bottom_map",
                        required=True, help="bottom map file")
    parser.add_argument("-o", "--output-file", dest="output_file",
                        required=True, help="output map file")
    args = parser.parse_args()

    top_map_cil = MiniCilParser(args.top_map)
    bottom_map_cil = MiniCilParser(args.bottom_map)
    result = Combine(top_map_cil, bottom_map_cil)

    with open(args.output_file, "w") as output:
        output.write(result.unparse())
