1# Copyright 2014 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 5from api_categorizer import APICategorizer 6from api_models import APIModels 7from availability_finder import AvailabilityFinder 8from empty_dir_file_system import EmptyDirFileSystem 9from environment import IsDevServer 10from features_bundle import FeaturesBundle 11from future import All 12from platform_util import GetPlatforms, PlatformToExtensionType 13from reference_resolver import ReferenceResolver 14from samples_model import SamplesModel 15from future import Future 16from schema_processor import SchemaProcessorFactory 17 18 19class _PlatformData(object): 20 def __init__(self): 21 self.features_bundle = None 22 self.api_models = None 23 self.reference_resolver = None 24 self.availability_finder = None 25 self.api_categorizer = None 26 self.samples_model = None 27 28 29class PlatformBundle(object): 30 '''Creates various objects for different platforms 31 ''' 32 def __init__(self, 33 branch_utility, 34 compiled_fs_factory, 35 host_fs_at_master, 36 host_file_system_iterator, 37 object_store_creator, 38 base_path): 39 self._branch_utility = branch_utility 40 self._compiled_fs_factory = compiled_fs_factory 41 self._host_fs_at_master = host_fs_at_master 42 self._host_file_system_iterator = host_file_system_iterator 43 self._object_store_creator = object_store_creator 44 self._base_path = base_path 45 self._platform_data = dict((p, _PlatformData()) for p in GetPlatforms()) 46 47 def GetSamplesModel(self, platform): 48 if self._platform_data[platform].samples_model is None: 49 # Note: samples are super slow in the dev server because it doesn't 50 # support async fetch, so disable them. 51 if IsDevServer(): 52 extension_samples_fs = EmptyDirFileSystem() 53 app_samples_fs = EmptyDirFileSystem() 54 else: 55 extension_samples_fs = self._host_fs_at_master 56 # TODO(kalman): Re-enable the apps samples, see http://crbug.com/344097. 57 app_samples_fs = EmptyDirFileSystem() 58 #app_samples_fs = github_file_system_provider.Create( 59 # 'GoogleChrome', 'chrome-app-samples') 60 self._platform_data[platform].samples_model = SamplesModel( 61 extension_samples_fs, 62 app_samples_fs, 63 self._compiled_fs_factory, 64 self.GetReferenceResolver(platform), 65 self._base_path, 66 platform) 67 return self._platform_data[platform].samples_model 68 69 def GetFeaturesBundle(self, platform): 70 if self._platform_data[platform].features_bundle is None: 71 self._platform_data[platform].features_bundle = FeaturesBundle( 72 self._host_fs_at_master, 73 self._compiled_fs_factory, 74 self._object_store_creator, 75 platform) 76 return self._platform_data[platform].features_bundle 77 78 def GetAPIModels(self, platform): 79 if self._platform_data[platform].api_models is None: 80 # TODO(danielj41): Filter APIModels data here rather than passing the 81 # platform. 82 self._platform_data[platform].api_models = APIModels( 83 self.GetFeaturesBundle(platform), 84 self._compiled_fs_factory, 85 self._host_fs_at_master, 86 self._object_store_creator, 87 platform, 88 SchemaProcessorFactory( 89 Future(callback=lambda: self.GetReferenceResolver(platform)), 90 Future(callback=lambda: self.GetAPIModels(platform)), 91 Future(callback=lambda: self.GetFeaturesBundle(platform)), 92 self._compiled_fs_factory, 93 self._host_fs_at_master)) 94 return self._platform_data[platform].api_models 95 96 def GetReferenceResolver(self, platform): 97 if self._platform_data[platform].reference_resolver is None: 98 self._platform_data[platform].reference_resolver = ReferenceResolver( 99 self.GetAPIModels(platform), 100 self._object_store_creator.Create(ReferenceResolver, 101 category=platform)) 102 return self._platform_data[platform].reference_resolver 103 104 def GetAvailabilityFinder(self, platform): 105 if self._platform_data[platform].availability_finder is None: 106 self._platform_data[platform].availability_finder = AvailabilityFinder( 107 self._branch_utility, 108 self._compiled_fs_factory, 109 self._host_file_system_iterator, 110 self._host_fs_at_master, 111 self._object_store_creator, 112 platform, 113 SchemaProcessorFactory( 114 Future(callback=lambda: self.GetReferenceResolver(platform)), 115 Future(callback=lambda: self.GetAPIModels(platform)), 116 Future(callback=lambda: self.GetFeaturesBundle(platform)), 117 self._compiled_fs_factory, 118 self._host_fs_at_master)) 119 return self._platform_data[platform].availability_finder 120 121 def GetAPICategorizer(self, platform): 122 if self._platform_data[platform].api_categorizer is None: 123 self._platform_data[platform].api_categorizer = APICategorizer( 124 self._host_fs_at_master, 125 self._compiled_fs_factory, 126 platform) 127 return self._platform_data[platform].api_categorizer 128 129 def GetRefreshPaths(self): 130 return [platform for platform in self._platform_data.keys()] 131 132 def Refresh(self, platform): 133 return self.GetAPIModels(platform).Refresh() 134 135 def GetIdentity(self): 136 return self._host_fs_at_master.GetIdentity() 137