Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Side by Side Diff: chrome/common/extensions/docs/server2/server_instance.py

Issue 15009006: Docserver: refactor Servlet, ObjectStore, and ServerInstance architecture to (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cduvall, redirect fix Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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())
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698