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