1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom api_categorizer import APICategorizer
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom api_models import APIModels
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom availability_finder import AvailabilityFinder
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from empty_dir_file_system import EmptyDirFileSystem
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from environment import IsDevServer
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom features_bundle import FeaturesBundle
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from future import All
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom platform_util import GetPlatforms, PlatformToExtensionType
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom reference_resolver import ReferenceResolver
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from samples_model import SamplesModel
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom future import Future
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom schema_processor import SchemaProcessorFactory
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass _PlatformData(object):
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def __init__(self):
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.features_bundle = None
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.api_models = None
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.reference_resolver = None
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.availability_finder = None
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.api_categorizer = None
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.samples_model = None
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass PlatformBundle(object):
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  '''Creates various objects for different platforms
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  '''
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def __init__(self,
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               branch_utility,
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               compiled_fs_factory,
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               host_fs_at_master,
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               host_file_system_iterator,
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)               object_store_creator,
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)               base_path):
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._branch_utility = branch_utility
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._compiled_fs_factory = compiled_fs_factory
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._host_fs_at_master = host_fs_at_master
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._host_file_system_iterator = host_file_system_iterator
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._object_store_creator = object_store_creator
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self._base_path = base_path
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._platform_data = dict((p, _PlatformData()) for p in GetPlatforms())
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def GetSamplesModel(self, platform):
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if self._platform_data[platform].samples_model is None:
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      # Note: samples are super slow in the dev server because it doesn't
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      # support async fetch, so disable them.
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if IsDevServer():
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        extension_samples_fs = EmptyDirFileSystem()
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        app_samples_fs = EmptyDirFileSystem()
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      else:
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        extension_samples_fs = self._host_fs_at_master
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # TODO(kalman): Re-enable the apps samples, see http://crbug.com/344097.
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        app_samples_fs = EmptyDirFileSystem()
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        #app_samples_fs = github_file_system_provider.Create(
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        #    'GoogleChrome', 'chrome-app-samples')
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      self._platform_data[platform].samples_model = SamplesModel(
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          extension_samples_fs,
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          app_samples_fs,
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          self._compiled_fs_factory,
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          self.GetReferenceResolver(platform),
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          self._base_path,
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          platform)
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return self._platform_data[platform].samples_model
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def GetFeaturesBundle(self, platform):
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if self._platform_data[platform].features_bundle is None:
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._platform_data[platform].features_bundle = FeaturesBundle(
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          self._host_fs_at_master,
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self._compiled_fs_factory,
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self._object_store_creator,
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          platform)
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return self._platform_data[platform].features_bundle
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def GetAPIModels(self, platform):
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if self._platform_data[platform].api_models is None:
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      # TODO(danielj41): Filter APIModels data here rather than passing the
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      # platform.
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._platform_data[platform].api_models = APIModels(
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self.GetFeaturesBundle(platform),
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self._compiled_fs_factory,
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          self._host_fs_at_master,
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          self._object_store_creator,
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          platform,
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          SchemaProcessorFactory(
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              Future(callback=lambda: self.GetReferenceResolver(platform)),
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              Future(callback=lambda: self.GetAPIModels(platform)),
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              Future(callback=lambda: self.GetFeaturesBundle(platform)),
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              self._compiled_fs_factory,
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              self._host_fs_at_master))
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return self._platform_data[platform].api_models
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def GetReferenceResolver(self, platform):
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if self._platform_data[platform].reference_resolver is None:
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._platform_data[platform].reference_resolver = ReferenceResolver(
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self.GetAPIModels(platform),
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self._object_store_creator.Create(ReferenceResolver,
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            category=platform))
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return self._platform_data[platform].reference_resolver
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def GetAvailabilityFinder(self, platform):
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if self._platform_data[platform].availability_finder is None:
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._platform_data[platform].availability_finder = AvailabilityFinder(
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self._branch_utility,
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self._compiled_fs_factory,
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self._host_file_system_iterator,
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          self._host_fs_at_master,
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self._object_store_creator,
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          platform,
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          SchemaProcessorFactory(
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              Future(callback=lambda: self.GetReferenceResolver(platform)),
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              Future(callback=lambda: self.GetAPIModels(platform)),
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              Future(callback=lambda: self.GetFeaturesBundle(platform)),
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              self._compiled_fs_factory,
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              self._host_fs_at_master))
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return self._platform_data[platform].availability_finder
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def GetAPICategorizer(self, platform):
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if self._platform_data[platform].api_categorizer is None:
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._platform_data[platform].api_categorizer = APICategorizer(
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          self._host_fs_at_master,
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          self._compiled_fs_factory,
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          platform)
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return self._platform_data[platform].api_categorizer
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def GetRefreshPaths(self):
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return [platform for platform in self._platform_data.keys()]
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def Refresh(self, platform):
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return self.GetAPIModels(platform).Refresh()
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def GetIdentity(self):
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return self._host_fs_at_master.GetIdentity()
137