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