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