OLD | NEW |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from fnmatch import fnmatch | 5 from fnmatch import fnmatch |
6 import logging | 6 import logging |
7 import mimetypes | 7 import mimetypes |
8 import traceback | 8 import traceback |
9 import os | 9 import os |
10 | 10 |
11 from api_data_source import APIDataSource | 11 from api_data_source import APIDataSource |
12 from api_list_data_source import APIListDataSource | 12 from api_list_data_source import APIListDataSource |
13 from appengine_blobstore import AppEngineBlobstore | |
14 from appengine_url_fetcher import AppEngineUrlFetcher | 13 from appengine_url_fetcher import AppEngineUrlFetcher |
15 from appengine_wrappers import GetAppVersion, IsDevServer | 14 from appengine_wrappers import GetAppVersion, IsDevServer |
16 from branch_utility import BranchUtility | 15 from branch_utility import BranchUtility |
17 from caching_file_system import CachingFileSystem | 16 from caching_file_system import CachingFileSystem |
18 from compiled_file_system import CompiledFileSystem | 17 from compiled_file_system import CompiledFileSystem |
19 from empty_dir_file_system import EmptyDirFileSystem | 18 from empty_dir_file_system import EmptyDirFileSystem |
20 from example_zipper import ExampleZipper | 19 from example_zipper import ExampleZipper |
21 from file_system import FileNotFoundError | 20 from file_system import FileNotFoundError |
22 from github_file_system import GithubFileSystem | 21 from github_file_system import GithubFileSystem |
23 from intro_data_source import IntroDataSource | 22 from intro_data_source import IntroDataSource |
24 from local_file_system import LocalFileSystem | 23 from local_file_system import LocalFileSystem |
25 from object_store_creator import ObjectStoreCreator | 24 from object_store_creator import ObjectStoreCreator |
26 from offline_file_system import OfflineFileSystem | 25 from offline_file_system import OfflineFileSystem |
27 from path_canonicalizer import PathCanonicalizer | 26 from path_canonicalizer import PathCanonicalizer |
28 from reference_resolver import ReferenceResolver | 27 from reference_resolver import ReferenceResolver |
29 from samples_data_source import SamplesDataSource | 28 from samples_data_source import SamplesDataSource |
30 from sidenav_data_source import SidenavDataSource | 29 from sidenav_data_source import SidenavDataSource |
31 from subversion_file_system import SubversionFileSystem | 30 from subversion_file_system import SubversionFileSystem |
32 import svn_constants | 31 import svn_constants |
33 from template_data_source import TemplateDataSource | 32 from template_data_source import TemplateDataSource |
34 from third_party.json_schema_compiler.memoize import memoize | 33 from test_object_store import TestObjectStore |
35 from third_party.json_schema_compiler.model import UnixName | 34 from third_party.json_schema_compiler.model import UnixName |
36 import url_constants | 35 import url_constants |
37 | 36 |
38 def _IsSamplesDisabled(): | |
39 return IsDevServer() | |
40 | |
41 class ServerInstance(object): | 37 class ServerInstance(object): |
42 # Lazily create so we don't create github file systems unnecessarily in | |
43 # tests. | |
44 branch_utility = None | |
45 github_file_system = None | |
46 | |
47 @staticmethod | |
48 @memoize | |
49 def GetOrCreateOffline(channel): | |
50 '''Gets/creates a local ServerInstance, meaning that only resources local to | |
51 the server - memcache, object store, etc, are queried. This amounts to not | |
52 setting up the subversion nor github file systems. | |
53 ''' | |
54 branch_utility = ServerInstance._GetOrCreateBranchUtility() | |
55 branch = branch_utility.GetBranchNumberForChannelName(channel) | |
56 object_store_creator_factory = ObjectStoreCreator.Factory(GetAppVersion(), | |
57 branch) | |
58 # No svn nor github file systems. Rely on the crons to fill the caches, and | |
59 # for the caches to exist. | |
60 return ServerInstance( | |
61 channel, | |
62 object_store_creator_factory, | |
63 CachingFileSystem(OfflineFileSystem(SubversionFileSystem), | |
64 object_store_creator_factory, | |
65 use_existing_values=True), | |
66 # TODO(kalman): convert GithubFileSystem to be wrappable in a | |
67 # CachingFileSystem so that it can be replaced with an | |
68 # OfflineFileSystem. Currently GFS doesn't set the child versions of | |
69 # stat requests so it doesn't. | |
70 ServerInstance._GetOrCreateGithubFileSystem()) | |
71 | |
72 @staticmethod | |
73 def CreateOnline(channel): | |
74 '''Creates/creates an online server instance, meaning that both local and | |
75 subversion/github resources are queried. | |
76 ''' | |
77 branch_utility = ServerInstance._GetOrCreateBranchUtility() | |
78 branch = branch_utility.GetBranchNumberForChannelName(channel) | |
79 | |
80 if branch == 'trunk': | |
81 svn_url = '/'.join((url_constants.SVN_TRUNK_URL, | |
82 'src', | |
83 svn_constants.EXTENSIONS_PATH)) | |
84 else: | |
85 svn_url = '/'.join((url_constants.SVN_BRANCH_URL, | |
86 branch, | |
87 'src', | |
88 svn_constants.EXTENSIONS_PATH)) | |
89 | |
90 viewvc_url = svn_url.replace(url_constants.SVN_URL, | |
91 url_constants.VIEWVC_URL) | |
92 | |
93 object_store_creator_factory = ObjectStoreCreator.Factory(GetAppVersion(), | |
94 branch) | |
95 | |
96 svn_file_system = CachingFileSystem( | |
97 SubversionFileSystem(AppEngineUrlFetcher(svn_url), | |
98 AppEngineUrlFetcher(viewvc_url)), | |
99 object_store_creator_factory) | |
100 | |
101 return ServerInstance(channel, | |
102 object_store_creator_factory, | |
103 svn_file_system, | |
104 ServerInstance._GetOrCreateGithubFileSystem()) | |
105 | |
106 @staticmethod | |
107 def CreateForTest(file_system): | |
108 return ServerInstance('test', | |
109 ObjectStoreCreator.TestFactory(), | |
110 file_system, | |
111 None) | |
112 | |
113 @staticmethod | |
114 def _GetOrCreateBranchUtility(): | |
115 if ServerInstance.branch_utility is None: | |
116 ServerInstance.branch_utility = BranchUtility( | |
117 url_constants.OMAHA_PROXY_URL, | |
118 AppEngineUrlFetcher()) | |
119 return ServerInstance.branch_utility | |
120 | |
121 @staticmethod | |
122 def _GetOrCreateGithubFileSystem(): | |
123 # Initialising github is pointless if samples are disabled, since it's only | |
124 # used for apps samples. | |
125 if ServerInstance.github_file_system is None: | |
126 if _IsSamplesDisabled(): | |
127 ServerInstance.github_file_system = EmptyDirFileSystem() | |
128 else: | |
129 ServerInstance.github_file_system = GithubFileSystem( | |
130 AppEngineUrlFetcher(url_constants.GITHUB_URL), | |
131 AppEngineBlobstore()) | |
132 return ServerInstance.github_file_system | |
133 | |
134 def __init__(self, | 38 def __init__(self, |
135 channel, | 39 channel, |
136 object_store_creator_factory, | 40 object_store_creator, |
137 svn_file_system, | 41 host_file_system, |
138 github_file_system): | 42 app_samples_file_system): |
139 self.svn_file_system = svn_file_system | 43 self.channel = channel |
140 | 44 |
141 self.github_file_system = github_file_system | 45 self.object_store_creator = object_store_creator |
142 | 46 |
143 self.compiled_fs_factory = CompiledFileSystem.Factory( | 47 self.host_file_system = host_file_system |
144 svn_file_system, | 48 |
145 object_store_creator_factory) | 49 self.app_samples_file_system = app_samples_file_system |
| 50 |
| 51 self.compiled_host_fs_factory = CompiledFileSystem.Factory( |
| 52 host_file_system, |
| 53 object_store_creator) |
146 | 54 |
147 self.api_list_data_source_factory = APIListDataSource.Factory( | 55 self.api_list_data_source_factory = APIListDataSource.Factory( |
148 self.compiled_fs_factory, | 56 self.compiled_host_fs_factory, |
149 svn_constants.API_PATH, | 57 svn_constants.API_PATH, |
150 svn_constants.PUBLIC_TEMPLATE_PATH) | 58 svn_constants.PUBLIC_TEMPLATE_PATH) |
151 | 59 |
152 self.api_data_source_factory = APIDataSource.Factory( | 60 self.api_data_source_factory = APIDataSource.Factory( |
153 self.compiled_fs_factory, | 61 self.compiled_host_fs_factory, |
154 svn_constants.API_PATH) | 62 svn_constants.API_PATH) |
155 | 63 |
156 self.ref_resolver_factory = ReferenceResolver.Factory( | 64 self.ref_resolver_factory = ReferenceResolver.Factory( |
157 self.api_data_source_factory, | 65 self.api_data_source_factory, |
158 self.api_list_data_source_factory, | 66 self.api_list_data_source_factory, |
159 object_store_creator_factory) | 67 object_store_creator) |
160 | 68 |
161 self.api_data_source_factory.SetReferenceResolverFactory( | 69 self.api_data_source_factory.SetReferenceResolverFactory( |
162 self.ref_resolver_factory) | 70 self.ref_resolver_factory) |
163 | 71 |
164 # Note: samples are super slow in the dev server because it doesn't support | 72 # Note: samples are super slow in the dev server because it doesn't support |
165 # async fetch, so disable them. If you actually want to test samples, then | 73 # async fetch, so disable them. |
166 # good luck, and modify _IsSamplesDisabled at the top. | 74 if IsDevServer(): |
167 if _IsSamplesDisabled(): | 75 extension_samples_fs = EmptyDirFileSystem() |
168 svn_fs_for_samples = EmptyDirFileSystem() | |
169 else: | 76 else: |
170 svn_fs_for_samples = self.svn_file_system | 77 extension_samples_fs = self.host_file_system |
171 self.samples_data_source_factory = SamplesDataSource.Factory( | 78 self.samples_data_source_factory = SamplesDataSource.Factory( |
172 channel, | 79 channel, |
173 svn_fs_for_samples, | 80 extension_samples_fs, |
174 self.github_file_system, | 81 CompiledFileSystem.Factory(extension_samples_fs, object_store_creator), |
| 82 self.app_samples_file_system, |
| 83 CompiledFileSystem.Factory(self.app_samples_file_system, |
| 84 object_store_creator), |
175 self.ref_resolver_factory, | 85 self.ref_resolver_factory, |
176 object_store_creator_factory, | |
177 svn_constants.EXAMPLES_PATH) | 86 svn_constants.EXAMPLES_PATH) |
178 | 87 |
179 self.api_data_source_factory.SetSamplesDataSourceFactory( | 88 self.api_data_source_factory.SetSamplesDataSourceFactory( |
180 self.samples_data_source_factory) | 89 self.samples_data_source_factory) |
181 | 90 |
182 self.intro_data_source_factory = IntroDataSource.Factory( | 91 self.intro_data_source_factory = IntroDataSource.Factory( |
183 self.compiled_fs_factory, | 92 self.compiled_host_fs_factory, |
184 self.ref_resolver_factory, | 93 self.ref_resolver_factory, |
185 [svn_constants.INTRO_PATH, svn_constants.ARTICLE_PATH]) | 94 [svn_constants.INTRO_PATH, svn_constants.ARTICLE_PATH]) |
186 | 95 |
187 self.sidenav_data_source_factory = SidenavDataSource.Factory( | 96 self.sidenav_data_source_factory = SidenavDataSource.Factory( |
188 self.compiled_fs_factory, | 97 self.compiled_host_fs_factory, |
189 svn_constants.JSON_PATH) | 98 svn_constants.JSON_PATH) |
190 | 99 |
191 self.template_data_source_factory = TemplateDataSource.Factory( | 100 self.template_data_source_factory = TemplateDataSource.Factory( |
192 channel, | 101 channel, |
193 self.api_data_source_factory, | 102 self.api_data_source_factory, |
194 self.api_list_data_source_factory, | 103 self.api_list_data_source_factory, |
195 self.intro_data_source_factory, | 104 self.intro_data_source_factory, |
196 self.samples_data_source_factory, | 105 self.samples_data_source_factory, |
197 self.sidenav_data_source_factory, | 106 self.sidenav_data_source_factory, |
198 self.compiled_fs_factory, | 107 self.compiled_host_fs_factory, |
199 self.ref_resolver_factory, | 108 self.ref_resolver_factory, |
200 svn_constants.PUBLIC_TEMPLATE_PATH, | 109 svn_constants.PUBLIC_TEMPLATE_PATH, |
201 svn_constants.PRIVATE_TEMPLATE_PATH) | 110 svn_constants.PRIVATE_TEMPLATE_PATH) |
202 | 111 |
203 self.example_zipper = ExampleZipper( | 112 self.example_zipper = ExampleZipper( |
204 self.compiled_fs_factory, | 113 self.compiled_host_fs_factory, |
205 svn_constants.DOCS_PATH) | 114 svn_constants.DOCS_PATH) |
206 | 115 |
207 self.path_canonicalizer = PathCanonicalizer( | 116 self.path_canonicalizer = PathCanonicalizer( |
208 channel, | 117 channel, |
209 self.compiled_fs_factory) | 118 self.compiled_host_fs_factory) |
210 | 119 |
211 self.content_cache = self.compiled_fs_factory.CreateIdentity(ServerInstance) | 120 self.content_cache = self.compiled_host_fs_factory.CreateIdentity( |
| 121 ServerInstance) |
| 122 |
| 123 @staticmethod |
| 124 def ForTest(file_system): |
| 125 return ServerInstance('test', |
| 126 ObjectStoreCreator.ForTest(), |
| 127 file_system, |
| 128 EmptyDirFileSystem()) |
| 129 |
| 130 @staticmethod |
| 131 def ForLocal(): |
| 132 channel = 'trunk' |
| 133 object_store_creator = ObjectStoreCreator(channel, |
| 134 start_empty=False, |
| 135 store_type=TestObjectStore) |
| 136 return ServerInstance( |
| 137 channel, |
| 138 object_store_creator, |
| 139 CachingFileSystem(LocalFileSystem.Create(), object_store_creator), |
| 140 EmptyDirFileSystem()) |
OLD | NEW |