15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from api_data_source import APIDataSource
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from api_list_data_source import APIListDataSource
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from compiled_file_system import CompiledFileSystem
80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from content_providers import ContentProviders
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from document_renderer import DocumentRenderer
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from empty_dir_file_system import EmptyDirFileSystem
110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from environment import IsDevServer
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from gcs_file_system_provider import CloudStorageFileSystemProvider
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)from github_file_system_provider import GithubFileSystemProvider
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)from host_file_system_iterator import HostFileSystemIterator
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from host_file_system_provider import HostFileSystemProvider
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from object_store_creator import ObjectStoreCreator
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom platform_bundle import PlatformBundle
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from samples_data_source import SamplesDataSource
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from table_of_contents_renderer import TableOfContentsRenderer
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from template_renderer import TemplateRenderer
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfrom test_branch_utility import TestBranchUtility
22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)from test_object_store import TestObjectStore
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServerInstance(object):
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self,
28b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)               object_store_creator,
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               compiled_fs_factory,
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               branch_utility,
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               host_file_system_provider,
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)               github_file_system_provider,
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               gcs_file_system_provider,
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               base_path='/'):
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    '''
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    |object_store_creator|
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        The ObjectStoreCreator used to create almost all caches.
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    |compiled_fs_factory|
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        Factory used to create CompiledFileSystems, a higher-level cache type
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        than ObjectStores. This can usually be derived from just
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        |object_store_creator| but under special circumstances a different
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        implementation needs to be passed in.
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    |branch_utility|
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        Has knowledge of Chrome branches, channels, and versions.
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    |host_file_system_provider|
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        Creates FileSystem instances which host the server at alternative
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        revisions.
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    |github_file_system_provider|
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        Creates FileSystem instances backed by GitHub.
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    |base_path|
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        The path which all HTML is generated relative to. Usually this is /
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        but some servlets need to override this.
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    '''
54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    self.object_store_creator = object_store_creator
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self.compiled_fs_factory = compiled_fs_factory
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self.host_file_system_provider = host_file_system_provider
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    host_fs_at_master = host_file_system_provider.GetMaster()
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    self.github_file_system_provider = github_file_system_provider
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.gcs_file_system_provider = gcs_file_system_provider
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    assert base_path.startswith('/') and base_path.endswith('/')
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self.base_path = base_path
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    self.host_file_system_iterator = HostFileSystemIterator(
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        host_file_system_provider,
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        branch_utility)
70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.platform_bundle = PlatformBundle(
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        branch_utility,
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self.compiled_fs_factory,
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        host_fs_at_master,
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self.host_file_system_iterator,
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        self.object_store_creator,
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        self.base_path)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    self.content_providers = ContentProviders(
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        object_store_creator,
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        self.compiled_fs_factory,
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        host_fs_at_master,
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        self.github_file_system_provider,
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        self.gcs_file_system_provider)
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    # TODO(kalman): Move all the remaining DataSources into DataSourceRegistry,
870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    # then factor out the DataSource creation into a factory method, so that
880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    # the entire ServerInstance doesn't need to be passed in here.
890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    self.template_renderer = TemplateRenderer(self)
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    # TODO(kalman): It may be better for |document_renderer| to construct a
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    # TemplateDataSource itself rather than depending on template_renderer, but
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    # for that the above todo should be addressed.
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.document_renderer = DocumentRenderer(
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        TableOfContentsRenderer(host_fs_at_master,
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                compiled_fs_factory,
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                self.template_renderer),
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self.platform_bundle)
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  @staticmethod
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def ForTest(file_system=None, file_system_provider=None, base_path='/'):
102a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    object_store_creator = ObjectStoreCreator.ForTest()
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if file_system is None and file_system_provider is None:
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      raise ValueError('Either |file_system| or |file_system_provider| '
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       'must be specified')
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if file_system and file_system_provider:
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      raise ValueError('Only one of |file_system| and |file_system_provider| '
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       'can be specified')
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if file_system_provider is None:
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      file_system_provider = HostFileSystemProvider.ForTest(
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          file_system,
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          object_store_creator)
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return ServerInstance(object_store_creator,
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          CompiledFileSystem.Factory(object_store_creator),
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          TestBranchUtility.CreateWithCannedData(),
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                          file_system_provider,
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                          GithubFileSystemProvider.ForEmpty(),
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          CloudStorageFileSystemProvider(object_store_creator),
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          base_path=base_path)
120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  @staticmethod
122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  def ForLocal():
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    object_store_creator = ObjectStoreCreator(start_empty=False,
124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                              store_type=TestObjectStore)
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    host_file_system_provider = HostFileSystemProvider.ForLocal(
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        object_store_creator)
127b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return ServerInstance(
128b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        object_store_creator,
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        CompiledFileSystem.Factory(object_store_creator),
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        TestBranchUtility.CreateWithCannedData(),
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        host_file_system_provider,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GithubFileSystemProvider.ForEmpty(),
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CloudStorageFileSystemProvider(object_store_creator))
134