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

Side by Side Diff: pkg/appengine/lib/src/server/context_registry.dart

Issue 804973002: Add appengine/gcloud/mustache dependencies. (Closed) Base URL: git@github.com:dart-lang/pub-dartlang-dart.git@master
Patch Set: Added AUTHORS/LICENSE/PATENTS files Created 6 years 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
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library appengine.context_registry;
6
7 import 'dart:async';
8
9 import 'package:memcache/memcache.dart' as memcache;
10 import 'package:memcache/src/memcache_impl.dart' as memcache_impl;
11 import 'package:gcloud/db.dart' as db;
12 import 'package:gcloud/storage.dart' as storage;
13
14 import 'http_wrapper.dart';
15 import 'assets.dart';
16
17 import '../../appengine.dart';
18 import '../appengine_context.dart';
19 import '../protobuf_api/rpc/rpc_service.dart';
20 import '../api_impl/logging_impl.dart' as logging_impl;
21 import '../api_impl/modules_impl.dart' as modules_impl;
22 import '../api_impl/raw_memcache_impl.dart' as raw_memcache_impl;
23 import '../api_impl/remote_api_impl.dart' as remote_api_impl;
24 import '../api_impl/raw_datastore_v3_impl.dart' as raw_datastore_v3_impl;
25 import '../api_impl/users_impl.dart' as users_impl;
26
27 class ContextRegistry {
28 static const HTTP_HEADER_APPENGINE_TICKET = 'x-appengine-api-ticket';
29 static const HTTP_HEADER_DEVAPPSERVER_REQUEST_ID =
30 'x-appengine-dev-request-id';
31
32 final RPCService _rpcService;
33 final storage.Storage _storage;
34 final AppengineContext _appengineContext;
35 final Map<AppengineHttpRequest, ClientContext> _request2context = {};
36 db.ModelDB _modelDB;
37
38 ContextRegistry(this._rpcService, this._storage, this._appengineContext) {
39 // TODO: We should provide an API to allow users providing us with either a
40 // different [ModelDB] object or specify a list of libraries to scan for
41 // models.
42 _modelDB = new db.ModelDBImpl();
43 }
44
45 ClientContext add(AppengineHttpRequest request) {
46 var ticket = request.headers.value(HTTP_HEADER_APPENGINE_TICKET);
47 if (ticket == null) {
48 ticket = request.headers.value(HTTP_HEADER_DEVAPPSERVER_REQUEST_ID);
49 if (ticket == null) {
50 ticket = 'invalid-ticket';
51 }
52 }
53 var services = _getServices(ticket, request);
54 var assets = new AssetsImpl(request, _appengineContext);
55 var context =
56 new _ClientContextImpl(
57 services, assets, _appengineContext.isDevelopmentEnvironment);
58 _request2context[request] = context;
59
60 request.response.registerHook(
61 () => services.logging.flush().catchError((_) {}));
62
63 return context;
64 }
65
66 ClientContext lookup(AppengineHttpRequest request) {
67 return _request2context[request];
68 }
69
70 Future remove(AppengineHttpRequest request) {
71 _request2context.remove(request);
72 return new Future.value();
73 }
74
75 Services newBackgroundServices()
76 => _getServices(_appengineContext.backgroundTicket, null);
77
78 Services _getServices(String ticket, AppengineHttpRequest request) {
79 var raw_memcache =
80 new raw_memcache_impl.RawMemcacheRpcImpl(_rpcService, ticket);
81 var serviceMap = {
82 // Create a new logging instance for every request, but use the background
83 // ticket, so we can flush logs at the end of the request.
84 'logging': new logging_impl.LoggingRpcImpl(_rpcService, ticket),
85 'raw_memcache': raw_memcache,
86 'raw_datastore_v3' : new raw_datastore_v3_impl.DatastoreV3RpcImpl(
87 _rpcService, _appengineContext, ticket),
88 'remote_api' : new remote_api_impl.RemoteApiImpl(
89 _rpcService, _appengineContext, ticket),
90 'modules' : new modules_impl.ModulesRpcImpl(
91 _rpcService, _appengineContext, ticket),
92 };
93 if (request != null) {
94 serviceMap['users'] =
95 new users_impl.UserRpcImpl(_rpcService, ticket, request);
96 }
97 serviceMap['memcache'] =
98 new memcache_impl.MemCacheImpl(serviceMap['raw_memcache']);
99 serviceMap['db'] =
100 new db.DatastoreDB(serviceMap['raw_datastore_v3'], modelDB: _modelDB);
101 serviceMap['storage'] = _storage;
102 return new _ServicesImpl(serviceMap);
103 }
104 }
105
106 class _ClientContextImpl implements ClientContext {
107 final Services services;
108 final Assets assets;
109 final bool _isDevelopmentEnvironment;
110
111 _ClientContextImpl(
112 this.services, this.assets, this._isDevelopmentEnvironment);
113
114 bool get isDevelopmentEnvironment => _isDevelopmentEnvironment;
115 bool get isProductionEnvironment => !_isDevelopmentEnvironment;
116 }
117
118 class _ServicesImpl extends Services {
119 // TODO:
120 // - consider removing the map
121 // - consider building the services on demand
122 final Map<String, dynamic> _serviceMap;
123
124 _ServicesImpl(this._serviceMap);
125
126 db.DatastoreDB get db => _serviceMap['db'];
127
128 storage.Storage get storage => _serviceMap['storage'];
129
130 Logging get logging => _serviceMap['logging'];
131
132 memcache.Memcache get memcache => _serviceMap['memcache'];
133
134 ModulesService get modules => _serviceMap['modules'];
135
136 RemoteApi get remoteApi => _serviceMap['remote_api'];
137
138 UserService get users => _serviceMap['users'];
139 }
OLDNEW
« no previous file with comments | « pkg/appengine/lib/src/server/assets.dart ('k') | pkg/appengine/lib/src/server/http_wrapper.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698