server_instance.py revision f2477e01787aa58f445919b809d89e252beef54f
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 github_file_system_provider import GithubFileSystemProvider 17from host_file_system_provider import HostFileSystemProvider 18from host_file_system_iterator import HostFileSystemIterator 19from intro_data_source import IntroDataSource 20from object_store_creator import ObjectStoreCreator 21from path_canonicalizer import PathCanonicalizer 22from reference_resolver import ReferenceResolver 23from samples_data_source import SamplesDataSource 24from table_of_contents_renderer import TableOfContentsRenderer 25from template_renderer import TemplateRenderer 26from test_branch_utility import TestBranchUtility 27from test_object_store import TestObjectStore 28 29 30class ServerInstance(object): 31 32 def __init__(self, 33 object_store_creator, 34 compiled_fs_factory, 35 branch_utility, 36 host_file_system_provider, 37 github_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 67 assert base_path.startswith('/') and base_path.endswith('/') 68 self.base_path = base_path 69 70 self.document_renderer = DocumentRenderer(TableOfContentsRenderer( 71 host_fs_at_trunk, 72 compiled_fs_factory)) 73 74 self.host_file_system_iterator = HostFileSystemIterator( 75 host_file_system_provider, 76 branch_utility) 77 78 self.features_bundle = FeaturesBundle( 79 host_fs_at_trunk, 80 self.compiled_fs_factory, 81 self.object_store_creator) 82 83 self.api_models = APIModels( 84 self.features_bundle, 85 self.compiled_fs_factory, 86 host_fs_at_trunk) 87 88 self.availability_finder = AvailabilityFinder( 89 branch_utility, 90 compiled_fs_factory, 91 self.host_file_system_iterator, 92 host_fs_at_trunk, 93 object_store_creator) 94 95 self.api_categorizer = APICategorizer( 96 host_fs_at_trunk, 97 compiled_fs_factory) 98 99 self.api_data_source_factory = APIDataSource.Factory( 100 self.compiled_fs_factory, 101 host_fs_at_trunk, 102 self.availability_finder, 103 self.api_models, 104 self.object_store_creator) 105 106 self.api_list_data_source_factory = APIListDataSource.Factory( 107 self.compiled_fs_factory, 108 host_fs_at_trunk, 109 self.features_bundle, 110 self.object_store_creator, 111 self.api_models, 112 self.availability_finder, 113 self.api_categorizer) 114 115 self.ref_resolver_factory = ReferenceResolver.Factory( 116 self.api_data_source_factory, 117 self.api_models, 118 object_store_creator) 119 120 self.api_data_source_factory.SetReferenceResolverFactory( 121 self.ref_resolver_factory) 122 123 # Note: samples are super slow in the dev server because it doesn't support 124 # async fetch, so disable them. 125 if IsDevServer(): 126 extension_samples_fs = EmptyDirFileSystem() 127 app_samples_fs = EmptyDirFileSystem() 128 else: 129 extension_samples_fs = host_fs_at_trunk 130 app_samples_fs = github_file_system_provider.Create( 131 'GoogleChrome', 'chrome-app-samples') 132 self.samples_data_source_factory = SamplesDataSource.Factory( 133 extension_samples_fs, 134 app_samples_fs, 135 CompiledFileSystem.Factory(object_store_creator), 136 self.ref_resolver_factory, 137 base_path) 138 139 self.api_data_source_factory.SetSamplesDataSourceFactory( 140 self.samples_data_source_factory) 141 142 self.path_canonicalizer = PathCanonicalizer( 143 self.compiled_fs_factory, 144 host_fs_at_trunk) 145 146 self.content_providers = ContentProviders( 147 self.compiled_fs_factory, 148 host_fs_at_trunk, 149 self.github_file_system_provider) 150 151 # TODO(kalman): Move all the remaining DataSources into DataSourceRegistry, 152 # then factor out the DataSource creation into a factory method, so that 153 # the entire ServerInstance doesn't need to be passed in here. 154 self.template_renderer = TemplateRenderer(self) 155 156 @staticmethod 157 def ForTest(file_system=None, file_system_provider=None, base_path='/'): 158 object_store_creator = ObjectStoreCreator.ForTest() 159 if file_system is None and file_system_provider is None: 160 raise ValueError('Either |file_system| or |file_system_provider| ' 161 'must be specified') 162 if file_system and file_system_provider: 163 raise ValueError('Only one of |file_system| and |file_system_provider| ' 164 'can be specified') 165 if file_system_provider is None: 166 file_system_provider = HostFileSystemProvider.ForTest( 167 file_system, 168 object_store_creator) 169 return ServerInstance(object_store_creator, 170 CompiledFileSystem.Factory(object_store_creator), 171 TestBranchUtility.CreateWithCannedData(), 172 file_system_provider, 173 GithubFileSystemProvider.ForEmpty(), 174 base_path=base_path) 175 176 @staticmethod 177 def ForLocal(): 178 object_store_creator = ObjectStoreCreator(start_empty=False, 179 store_type=TestObjectStore) 180 host_file_system_provider = HostFileSystemProvider.ForLocal( 181 object_store_creator) 182 return ServerInstance( 183 object_store_creator, 184 CompiledFileSystem.Factory(object_store_creator), 185 TestBranchUtility.CreateWithCannedData(), 186 host_file_system_provider, 187 GithubFileSystemProvider.ForEmpty()) 188