- add sources.
[platform/framework/web/crosswalk.git] / src / tools / json_schema_compiler / schema_loader.py
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     if len(api_defs) != 1:
63       sys.exit('File %s has multiple schemas. Files are only allowed to contain'
64                'a single schema.' % schema)
65
66     return api_defs