Home | History | Annotate | Download | only in json_schema_compiler
      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 sys
      7 
      8 import idl_schema
      9 import json_schema
     10 from model import Model
     11 
     12 class SchemaLoader(object):
     13   '''Resolves a type name into the namespace the type belongs to.
     14 
     15   Properties:
     16   - |display_path| path to the directory with the API header files, intended for
     17   use with the Model.
     18   - |real_path| path to the directory with the API header files, used for file
     19   access.
     20   '''
     21   def __init__(self, display_path, real_path):
     22     self._display_path = display_path
     23     self._real_path = real_path
     24 
     25   def ResolveType(self, full_name, default_namespace):
     26     name_parts = full_name.rsplit('.', 1)
     27     if len(name_parts) == 1:
     28       if full_name not in default_namespace.types:
     29         return None
     30       return default_namespace
     31     namespace_name, type_name = name_parts
     32     real_name = None
     33     for ext in ['json', 'idl']:
     34       filename = '%s.%s' % (namespace_name, ext)
     35       filepath = os.path.join(self._real_path, filename);
     36       if os.path.exists(filepath):
     37         real_name = filename
     38         break
     39     if real_name is None:
     40       return None
     41     namespace = Model().AddNamespace(
     42         self.LoadSchema(real_name)[0],
     43         os.path.join(self._display_path, real_name))
     44     if type_name not in namespace.types:
     45       return None
     46     return namespace
     47 
     48   def LoadSchema(self, schema):
     49     '''Load a schema definition. The schema parameter must be a file name
     50     without any path component - the file is loaded from the path defined by
     51     the real_path argument passed to the constructor.'''
     52     schema_filename, schema_extension = os.path.splitext(schema)
     53 
     54     schema_path = os.path.join(self._real_path, schema);
     55     if schema_extension == '.json':
     56       api_defs = json_schema.Load(schema_path)
     57     elif schema_extension == '.idl':
     58       api_defs = idl_schema.Load(schema_path)
     59     else:
     60       sys.exit('Did not recognize file extension %s for schema %s' %
     61                (schema_extension, schema))
     62 
     63     return api_defs
     64