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_data_source import APIDataSource
6from api_list_data_source import APIListDataSource
7from compiled_file_system import CompiledFileSystem
8from content_providers import ContentProviders
9from document_renderer import DocumentRenderer
10from empty_dir_file_system import EmptyDirFileSystem
11from environment import IsDevServer
12from gcs_file_system_provider import CloudStorageFileSystemProvider
13from github_file_system_provider import GithubFileSystemProvider
14from host_file_system_iterator import HostFileSystemIterator
15from host_file_system_provider import HostFileSystemProvider
16from object_store_creator import ObjectStoreCreator
17from platform_bundle import PlatformBundle
18from samples_data_source import SamplesDataSource
19from table_of_contents_renderer import TableOfContentsRenderer
20from template_renderer import TemplateRenderer
21from test_branch_utility import TestBranchUtility
22from test_object_store import TestObjectStore
23
24
25class ServerInstance(object):
26
27  def __init__(self,
28               object_store_creator,
29               compiled_fs_factory,
30               branch_utility,
31               host_file_system_provider,
32               github_file_system_provider,
33               gcs_file_system_provider,
34               base_path='/'):
35    '''
36    |object_store_creator|
37        The ObjectStoreCreator used to create almost all caches.
38    |compiled_fs_factory|
39        Factory used to create CompiledFileSystems, a higher-level cache type
40        than ObjectStores. This can usually be derived from just
41        |object_store_creator| but under special circumstances a different
42        implementation needs to be passed in.
43    |branch_utility|
44        Has knowledge of Chrome branches, channels, and versions.
45    |host_file_system_provider|
46        Creates FileSystem instances which host the server at alternative
47        revisions.
48    |github_file_system_provider|
49        Creates FileSystem instances backed by GitHub.
50    |base_path|
51        The path which all HTML is generated relative to. Usually this is /
52        but some servlets need to override this.
53    '''
54    self.object_store_creator = object_store_creator
55
56    self.compiled_fs_factory = compiled_fs_factory
57
58    self.host_file_system_provider = host_file_system_provider
59    host_fs_at_master = host_file_system_provider.GetMaster()
60
61    self.github_file_system_provider = github_file_system_provider
62    self.gcs_file_system_provider = gcs_file_system_provider
63
64    assert base_path.startswith('/') and base_path.endswith('/')
65    self.base_path = base_path
66
67    self.host_file_system_iterator = HostFileSystemIterator(
68        host_file_system_provider,
69        branch_utility)
70
71    self.platform_bundle = PlatformBundle(
72        branch_utility,
73        self.compiled_fs_factory,
74        host_fs_at_master,
75        self.host_file_system_iterator,
76        self.object_store_creator,
77        self.base_path)
78
79    self.content_providers = ContentProviders(
80        object_store_creator,
81        self.compiled_fs_factory,
82        host_fs_at_master,
83        self.github_file_system_provider,
84        self.gcs_file_system_provider)
85
86    # TODO(kalman): Move all the remaining DataSources into DataSourceRegistry,
87    # then factor out the DataSource creation into a factory method, so that
88    # the entire ServerInstance doesn't need to be passed in here.
89    self.template_renderer = TemplateRenderer(self)
90
91    # TODO(kalman): It may be better for |document_renderer| to construct a
92    # TemplateDataSource itself rather than depending on template_renderer, but
93    # for that the above todo should be addressed.
94    self.document_renderer = DocumentRenderer(
95        TableOfContentsRenderer(host_fs_at_master,
96                                compiled_fs_factory,
97                                self.template_renderer),
98        self.platform_bundle)
99
100  @staticmethod
101  def ForTest(file_system=None, file_system_provider=None, base_path='/'):
102    object_store_creator = ObjectStoreCreator.ForTest()
103    if file_system is None and file_system_provider is None:
104      raise ValueError('Either |file_system| or |file_system_provider| '
105                       'must be specified')
106    if file_system and file_system_provider:
107      raise ValueError('Only one of |file_system| and |file_system_provider| '
108                       'can be specified')
109    if file_system_provider is None:
110      file_system_provider = HostFileSystemProvider.ForTest(
111          file_system,
112          object_store_creator)
113    return ServerInstance(object_store_creator,
114                          CompiledFileSystem.Factory(object_store_creator),
115                          TestBranchUtility.CreateWithCannedData(),
116                          file_system_provider,
117                          GithubFileSystemProvider.ForEmpty(),
118                          CloudStorageFileSystemProvider(object_store_creator),
119                          base_path=base_path)
120
121  @staticmethod
122  def ForLocal():
123    object_store_creator = ObjectStoreCreator(start_empty=False,
124                                              store_type=TestObjectStore)
125    host_file_system_provider = HostFileSystemProvider.ForLocal(
126        object_store_creator)
127    return ServerInstance(
128        object_store_creator,
129        CompiledFileSystem.Factory(object_store_creator),
130        TestBranchUtility.CreateWithCannedData(),
131        host_file_system_provider,
132        GithubFileSystemProvider.ForEmpty(),
133        CloudStorageFileSystemProvider(object_store_creator))
134