blob: 5bf4bec6279b28a3a468f6b4bde72a18b6b23c1d [file] [log] [blame]
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# """Model objects for ukm.xml contents."""
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
import models
# Model definitions for ukm.xml content
_OBSOLETE_TYPE = models.TextNodeType('obsolete')
_OWNER_TYPE = models.TextNodeType('owner', single_line=True)
_SUMMARY_TYPE = models.TextNodeType('summary')
_LOWERCASE_NAME_FN = lambda n: n.attributes['name'].value.lower()
_ENUMERATION_TYPE = models.ObjectNodeType(
'enumeration',
attributes=[],
single_line=True)
_QUANTILES_TYPE = models.ObjectNodeType(
'quantiles',
attributes=[
('type', unicode),
],
single_line=True)
_INDEX_TYPE = models.ObjectNodeType(
'index',
attributes=[
('fields', unicode),
],
single_line=True)
_STATISTICS_TYPE = models.ObjectNodeType(
'statistics',
attributes=[],
children=[
models.ChildType('quantiles', _QUANTILES_TYPE, False),
models.ChildType('enumeration', _ENUMERATION_TYPE, False),
])
_HISTORY_TYPE = models.ObjectNodeType(
'history',
attributes=[],
children=[
models.ChildType('index', _INDEX_TYPE, False),
models.ChildType('statistics', _STATISTICS_TYPE, True),
])
_AGGREGATION_TYPE = models.ObjectNodeType(
'aggregation',
attributes=[],
children=[
models.ChildType('history', _HISTORY_TYPE, False),
])
_METRIC_TYPE = models.ObjectNodeType(
'metric',
attributes=[
('name', unicode),
('semantic_type', unicode),
],
children=[
models.ChildType('obsolete', _OBSOLETE_TYPE, False),
models.ChildType('owners', _OWNER_TYPE, True),
models.ChildType('summary', _SUMMARY_TYPE, False),
models.ChildType('aggregation', _AGGREGATION_TYPE, True),
])
_EVENT_TYPE = models.ObjectNodeType(
'event',
alphabetization=[('metric', _LOWERCASE_NAME_FN)],
attributes=[('name', unicode), ('singular', bool)],
extra_newlines=(1, 1, 1),
children=[
models.ChildType('obsolete', _OBSOLETE_TYPE, False),
models.ChildType('owners', _OWNER_TYPE, True),
models.ChildType('summary', _SUMMARY_TYPE, False),
models.ChildType('metrics', _METRIC_TYPE, True),
])
_UKM_CONFIGURATION_TYPE = models.ObjectNodeType(
'ukm-configuration',
extra_newlines=(2, 1, 1),
indent=False,
children=[
models.ChildType('events', _EVENT_TYPE, True),
])
UKM_XML_TYPE = models.DocumentType(_UKM_CONFIGURATION_TYPE)
def UpdateXML(original_xml):
"""Parses the original xml and return a pretty printed version.
Args:
original_xml: A string containing the original xml file contents.
Returns:
A pretty-printed xml string, or None if the config contains errors.
"""
config = UKM_XML_TYPE.Parse(original_xml)
return UKM_XML_TYPE.PrettyPrint(config)