server_instance.py revision effb81e5f8246d0db0270817048dc992db66e9fb
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 5from api_categorizer import APICategorizer 6from api_data_source import APIDataSource 7from api_list_data_source import APIListDataSource 8from api_models import APIModels 9from availability_finder import AvailabilityFinder 10from compiled_file_system import CompiledFileSystem 11from content_providers import ContentProviders 12from document_renderer import DocumentRenderer 13from empty_dir_file_system import EmptyDirFileSystem 14from environment import IsDevServer 15from features_bundle import FeaturesBundle 16from gcs_file_system_provider import CloudStorageFileSystemProvider 17from github_file_system_provider import GithubFileSystemProvider 18from host_file_system_iterator import HostFileSystemIterator 19from host_file_system_provider import HostFileSystemProvider 20from object_store_creator import ObjectStoreCreator 21from reference_resolver import ReferenceResolver 22from samples_data_source import SamplesDataSource 23from table_of_contents_renderer import TableOfContentsRenderer 24from template_renderer import TemplateRenderer 25from test_branch_utility import TestBranchUtility 26from test_object_store import TestObjectStore 27 28 29class ServerInstance(object): 30 31 def __init__(self, 32 object_store_creator, 33 compiled_fs_factory, 34 branch_utility, 35 host_file_system_provider, 36 github_file_system_provider, 37 gcs_file_system_provider, 38 base_path='/'): 39 ''' 40 |object_store_creator| 41 The ObjectStoreCreator used to create almost all caches. 42 |compiled_fs_factory| 43 Factory used to create CompiledFileSystems, a higher-level cache type 44 than ObjectStores. This can usually be derived from just 45 |object_store_creator| but under special circumstances a different 46 implementation needs to be passed in. 47 |branch_utility| 48 Has knowledge of Chrome branches, channels, and versions. 49 |host_file_system_provider| 50 Creates FileSystem instances which host the server at alternative 51 revisions. 52 |github_file_system_provider| 53 Creates FileSystem instances backed by GitHub. 54 |base_path| 55 The path which all HTML is generated relative to. Usually this is / 56 but some servlets need to override this. 57 ''' 58 self.object_store_creator = object_store_creator 59 60 self.compiled_fs_factory = compiled_fs_factory 61 62 self.host_file_system_provider = host_file_system_provider 63 host_fs_at_trunk = host_file_system_provider.GetTrunk() 64 65 self.github_file_system_provider = github_file_system_provider 66 self.gcs_file_system_provider = gcs_file_system_provider 67 68 assert base_path.startswith('/') and base_path.endswith('/') 69 self.base_path = base_path 70 71 self.host_file_system_iterator = HostFileSystemIterator( 72 host_file_system_provider, 73 branch_utility) 74 75 self.features_bundle = FeaturesBundle( 76 host_fs_at_trunk, 77 self.compiled_fs_factory, 78 self.object_store_creator) 79 80 self.api_models = APIModels( 81 self.features_bundle, 82 self.compiled_fs_factory, 83 host_fs_at_trunk) 84 85 self.availability_finder = AvailabilityFinder( 86 branch_utility, 87 compiled_fs_factory, 88 self.host_file_system_iterator, 89 host_fs_at_trunk, 90 object_store_creator) 91 92 self.api_categorizer = APICategorizer( 93 host_fs_at_trunk, 94 compiled_fs_factory) 95 96 self.api_data_source_factory = APIDataSource.Factory( 97 self.compiled_fs_factory, 98 host_fs_at_trunk, 99 self.availability_finder, 100 self.api_models, 101 self.features_bundle, 102 self.object_store_creator) 103 104 self.ref_resolver = ReferenceResolver( 105 self.api_data_source_factory.Create(None), 106 self.api_models, 107 self.object_store_creator.Create(ReferenceResolver)) 108 109 # Note: samples are super slow in the dev server because it doesn't support 110 # async fetch, so disable them. 111 if IsDevServer(): 112 extension_samples_fs = EmptyDirFileSystem() 113 app_samples_fs = EmptyDirFileSystem() 114 else: 115 extension_samples_fs = host_fs_at_trunk 116 # TODO(kalman): Re-enable the apps samples, see http://crbug.com/344097. 117 app_samples_fs = EmptyDirFileSystem() 118 #app_samples_fs = github_file_system_provider.Create( 119 # 'GoogleChrome', 'chrome-app-samples') 120 self.samples_data_source_factory = SamplesDataSource.Factory( 121 extension_samples_fs, 122 app_samples_fs, 123 CompiledFileSystem.Factory(object_store_creator), 124 self.ref_resolver, 125 base_path) 126 127 self.api_data_source_factory.SetSamplesDataSourceFactory( 128 self.samples_data_source_factory) 129 130 self.content_providers = ContentProviders( 131 object_store_creator, 132 self.compiled_fs_factory, 133 host_fs_at_trunk, 134 self.github_file_system_provider, 135 self.gcs_file_system_provider) 136 137 # TODO(kalman): Move all the remaining DataSources into DataSourceRegistry, 138 # then factor out the DataSource creation into a factory method, so that 139 # the entire ServerInstance doesn't need to be passed in here. 140 self.template_renderer = TemplateRenderer(self) 141 142 # TODO(kalman): It may be better for |document_renderer| to construct a 143 # TemplateDataSource itself rather than depending on template_renderer, but 144 # for that the above todo should be addressed. 145 self.document_renderer = DocumentRenderer( 146 TableOfContentsRenderer(host_fs_at_trunk, 147 compiled_fs_factory, 148 self.template_renderer), 149 self.ref_resolver) 150 151 @staticmethod 152 def ForTest(file_system=None, file_system_provider=None, base_path='/'): 153 object_store_creator = ObjectStoreCreator.ForTest() 154 if file_system is None and file_system_provider is None: 155 raise ValueError('Either |file_system| or |file_system_provider| ' 156 'must be specified') 157 if file_system and file_system_provider: 158 raise ValueError('Only one of |file_system| and |file_system_provider| ' 159 'can be specified') 160 if file_system_provider is None: 161 file_system_provider = HostFileSystemProvider.ForTest( 162 file_system, 163 object_store_creator) 164 return ServerInstance(object_store_creator, 165 CompiledFileSystem.Factory(object_store_creator), 166 TestBranchUtility.CreateWithCannedData(), 167 file_system_provider, 168 GithubFileSystemProvider.ForEmpty(), 169 CloudStorageFileSystemProvider(object_store_creator), 170 base_path=base_path) 171 172 @staticmethod 173 def ForLocal(): 174 object_store_creator = ObjectStoreCreator(start_empty=False, 175 store_type=TestObjectStore) 176 host_file_system_provider = HostFileSystemProvider.ForLocal( 177 object_store_creator) 178 return ServerInstance( 179 object_store_creator, 180 CompiledFileSystem.Factory(object_store_creator), 181 TestBranchUtility.CreateWithCannedData(), 182 host_file_system_provider, 183 GithubFileSystemProvider.ForEmpty(), 184 CloudStorageFileSystemProvider(object_store_creator)) 185