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