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 from api_categorizer import APICategorizer 6 from api_data_source import APIDataSource 7 from api_list_data_source import APIListDataSource 8 from api_models import APIModels 9 from availability_finder import AvailabilityFinder 10 from compiled_file_system import CompiledFileSystem 11 from content_providers import ContentProviders 12 from document_renderer import DocumentRenderer 13 from empty_dir_file_system import EmptyDirFileSystem 14 from environment import IsDevServer 15 from features_bundle import FeaturesBundle 16 from gcs_file_system_provider import CloudStorageFileSystemProvider 17 from github_file_system_provider import GithubFileSystemProvider 18 from host_file_system_iterator import HostFileSystemIterator 19 from host_file_system_provider import HostFileSystemProvider 20 from object_store_creator import ObjectStoreCreator 21 from reference_resolver import ReferenceResolver 22 from samples_data_source import SamplesDataSource 23 from table_of_contents_renderer import TableOfContentsRenderer 24 from template_renderer import TemplateRenderer 25 from test_branch_utility import TestBranchUtility 26 from test_object_store import TestObjectStore 27 28 29 class 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.ref_resolver = ReferenceResolver( 97 self.api_models, 98 self.object_store_creator.Create(ReferenceResolver)) 99 100 # Note: samples are super slow in the dev server because it doesn't support 101 # async fetch, so disable them. 102 if IsDevServer(): 103 extension_samples_fs = EmptyDirFileSystem() 104 app_samples_fs = EmptyDirFileSystem() 105 else: 106 extension_samples_fs = host_fs_at_trunk 107 # TODO(kalman): Re-enable the apps samples, see http://crbug.com/344097. 108 app_samples_fs = EmptyDirFileSystem() 109 #app_samples_fs = github_file_system_provider.Create( 110 # 'GoogleChrome', 'chrome-app-samples') 111 self.samples_data_source_factory = SamplesDataSource.Factory( 112 extension_samples_fs, 113 app_samples_fs, 114 CompiledFileSystem.Factory(object_store_creator), 115 self.ref_resolver, 116 base_path) 117 118 self.content_providers = ContentProviders( 119 object_store_creator, 120 self.compiled_fs_factory, 121 host_fs_at_trunk, 122 self.github_file_system_provider, 123 self.gcs_file_system_provider) 124 125 # TODO(kalman): Move all the remaining DataSources into DataSourceRegistry, 126 # then factor out the DataSource creation into a factory method, so that 127 # the entire ServerInstance doesn't need to be passed in here. 128 self.template_renderer = TemplateRenderer(self) 129 130 # TODO(kalman): It may be better for |document_renderer| to construct a 131 # TemplateDataSource itself rather than depending on template_renderer, but 132 # for that the above todo should be addressed. 133 self.document_renderer = DocumentRenderer( 134 TableOfContentsRenderer(host_fs_at_trunk, 135 compiled_fs_factory, 136 self.template_renderer), 137 self.ref_resolver) 138 139 @staticmethod 140 def ForTest(file_system=None, file_system_provider=None, base_path='/'): 141 object_store_creator = ObjectStoreCreator.ForTest() 142 if file_system is None and file_system_provider is None: 143 raise ValueError('Either |file_system| or |file_system_provider| ' 144 'must be specified') 145 if file_system and file_system_provider: 146 raise ValueError('Only one of |file_system| and |file_system_provider| ' 147 'can be specified') 148 if file_system_provider is None: 149 file_system_provider = HostFileSystemProvider.ForTest( 150 file_system, 151 object_store_creator) 152 return ServerInstance(object_store_creator, 153 CompiledFileSystem.Factory(object_store_creator), 154 TestBranchUtility.CreateWithCannedData(), 155 file_system_provider, 156 GithubFileSystemProvider.ForEmpty(), 157 CloudStorageFileSystemProvider(object_store_creator), 158 base_path=base_path) 159 160 @staticmethod 161 def ForLocal(): 162 object_store_creator = ObjectStoreCreator(start_empty=False, 163 store_type=TestObjectStore) 164 host_file_system_provider = HostFileSystemProvider.ForLocal( 165 object_store_creator) 166 return ServerInstance( 167 object_store_creator, 168 CompiledFileSystem.Factory(object_store_creator), 169 TestBranchUtility.CreateWithCannedData(), 170 host_file_system_provider, 171 GithubFileSystemProvider.ForEmpty(), 172 CloudStorageFileSystemProvider(object_store_creator)) 173