1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 import os 6 import re 7 import sys 8 9 import idl_schema 10 import json_schema 11 from model import Model, UnixName 12 13 class SchemaLoader(object): 14 '''Resolves a type name into the namespace the type belongs to. 15 16 Properties: 17 - |display_path| path to the directory with the API header files, intended for 18 use with the Model. 19 - |real_path| path to the directory with the API header files, used for file 20 access. 21 ''' 22 def __init__(self, display_path, real_path): 23 self._display_path = display_path 24 self._real_path = real_path 25 26 def ResolveType(self, full_name, default_namespace): 27 name_parts = full_name.rsplit('.', 1) 28 if len(name_parts) == 1: 29 if full_name not in default_namespace.types: 30 return None 31 return default_namespace 32 namespace_name, type_name = name_parts 33 real_name = None 34 # Try to find the file defining the namespace. Eg. for 35 # nameSpace.sub_name_space.Type' the following heuristics looks for: 36 # 1. name_space_sub_name_space.json, 37 # 2. name_space_sub_name_space.idl. 38 for ext in ['json', 'idl']: 39 basename = UnixName(namespace_name) 40 filename = '%s.%s' % (basename, ext) 41 filepath = os.path.join(self._real_path, filename); 42 if os.path.exists(filepath): 43 real_name = filename 44 break 45 if real_name is None: 46 return None 47 namespace = Model().AddNamespace( 48 self.LoadSchema(real_name)[0], 49 os.path.join(self._display_path, real_name)) 50 if type_name not in namespace.types: 51 return None 52 return namespace 53 54 def LoadSchema(self, schema): 55 '''Load a schema definition. The schema parameter must be a file name 56 without any path component - the file is loaded from the path defined by 57 the real_path argument passed to the constructor.''' 58 schema_filename, schema_extension = os.path.splitext(schema) 59 60 schema_path = os.path.join(self._real_path, schema); 61 if schema_extension == '.json': 62 api_defs = json_schema.Load(schema_path) 63 elif schema_extension == '.idl': 64 api_defs = idl_schema.Load(schema_path) 65 else: 66 sys.exit('Did not recognize file extension %s for schema %s' % 67 (schema_extension, schema)) 68 69 return api_defs 70