Home | History | Annotate | Download | only in server2
      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 
      5 from api_categorizer import APICategorizer
      6 from api_data_source import APIDataSource
      7 from api_list_data_source import APIListDataSource
      8 from api_models import APIModels
      9 from availability_finder import AvailabilityFinder
     10 from compiled_file_system import CompiledFileSystem
     11 from content_providers import ContentProviders
     12 from document_renderer import DocumentRenderer
     13 from empty_dir_file_system import EmptyDirFileSystem
     14 from environment import IsDevServer
     15 from features_bundle import FeaturesBundle
     16 from gcs_file_system_provider import CloudStorageFileSystemProvider
     17 from github_file_system_provider import GithubFileSystemProvider
     18 from host_file_system_iterator import HostFileSystemIterator
     19 from host_file_system_provider import HostFileSystemProvider
     20 from object_store_creator import ObjectStoreCreator
     21 from reference_resolver import ReferenceResolver
     22 from samples_data_source import SamplesDataSource
     23 from table_of_contents_renderer import TableOfContentsRenderer
     24 from template_renderer import TemplateRenderer
     25 from test_branch_utility import TestBranchUtility
     26 from test_object_store import TestObjectStore
     27 
     28 
     29 class 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.ref_resolver = ReferenceResolver(
     97         self.api_models,
     98         self.object_store_creator.Create(ReferenceResolver))
     99 
    100     # Note: samples are super slow in the dev server because it doesn't support
    101     # async fetch, so disable them.
    102     if IsDevServer():
    103       extension_samples_fs = EmptyDirFileSystem()
    104       app_samples_fs = EmptyDirFileSystem()
    105     else:
    106       extension_samples_fs = host_fs_at_trunk
    107       # TODO(kalman): Re-enable the apps samples, see http://crbug.com/344097.
    108       app_samples_fs = EmptyDirFileSystem()
    109       #app_samples_fs = github_file_system_provider.Create(
    110       #    'GoogleChrome', 'chrome-app-samples')
    111     self.samples_data_source_factory = SamplesDataSource.Factory(
    112         extension_samples_fs,
    113         app_samples_fs,
    114         CompiledFileSystem.Factory(object_store_creator),
    115         self.ref_resolver,
    116         base_path)
    117 
    118     self.content_providers = ContentProviders(
    119         object_store_creator,
    120         self.compiled_fs_factory,
    121         host_fs_at_trunk,
    122         self.github_file_system_provider,
    123         self.gcs_file_system_provider)
    124 
    125     # TODO(kalman): Move all the remaining DataSources into DataSourceRegistry,
    126     # then factor out the DataSource creation into a factory method, so that
    127     # the entire ServerInstance doesn't need to be passed in here.
    128     self.template_renderer = TemplateRenderer(self)
    129 
    130     # TODO(kalman): It may be better for |document_renderer| to construct a
    131     # TemplateDataSource itself rather than depending on template_renderer, but
    132     # for that the above todo should be addressed.
    133     self.document_renderer = DocumentRenderer(
    134         TableOfContentsRenderer(host_fs_at_trunk,
    135                                 compiled_fs_factory,
    136                                 self.template_renderer),
    137         self.ref_resolver)
    138 
    139   @staticmethod
    140   def ForTest(file_system=None, file_system_provider=None, base_path='/'):
    141     object_store_creator = ObjectStoreCreator.ForTest()
    142     if file_system is None and file_system_provider is None:
    143       raise ValueError('Either |file_system| or |file_system_provider| '
    144                        'must be specified')
    145     if file_system and file_system_provider:
    146       raise ValueError('Only one of |file_system| and |file_system_provider| '
    147                        'can be specified')
    148     if file_system_provider is None:
    149       file_system_provider = HostFileSystemProvider.ForTest(
    150           file_system,
    151           object_store_creator)
    152     return ServerInstance(object_store_creator,
    153                           CompiledFileSystem.Factory(object_store_creator),
    154                           TestBranchUtility.CreateWithCannedData(),
    155                           file_system_provider,
    156                           GithubFileSystemProvider.ForEmpty(),
    157                           CloudStorageFileSystemProvider(object_store_creator),
    158                           base_path=base_path)
    159 
    160   @staticmethod
    161   def ForLocal():
    162     object_store_creator = ObjectStoreCreator(start_empty=False,
    163                                               store_type=TestObjectStore)
    164     host_file_system_provider = HostFileSystemProvider.ForLocal(
    165         object_store_creator)
    166     return ServerInstance(
    167         object_store_creator,
    168         CompiledFileSystem.Factory(object_store_creator),
    169         TestBranchUtility.CreateWithCannedData(),
    170         host_file_system_provider,
    171         GithubFileSystemProvider.ForEmpty(),
    172         CloudStorageFileSystemProvider(object_store_creator))
    173