Page Speed Optimization Libraries
1.2.24.1
|
00001 /* 00002 * Copyright 2010 Google Inc. 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http:///www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00018 00019 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_DRIVER_FACTORY_H_ 00020 #define NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_DRIVER_FACTORY_H_ 00021 00022 #include <set> 00023 #include <vector> 00024 00025 #include "net/instaweb/util/public/basictypes.h" 00026 #include "net/instaweb/util/public/function.h" 00027 #include "net/instaweb/util/public/null_statistics.h" 00028 #include "net/instaweb/util/public/scoped_ptr.h" 00029 #include "net/instaweb/util/public/string.h" 00030 #include "net/instaweb/util/public/string_util.h" 00031 00032 namespace net_instaweb { 00033 00034 class AbstractClientState; 00035 class AbstractMutex; 00036 class BlinkCriticalLineDataFinder; 00037 class CriticalImagesFinder; 00038 class FileSystem; 00039 class FilenameEncoder; 00040 class FlushEarlyInfoFinder; 00041 class FuriousMatcher; 00042 class Hasher; 00043 class MessageHandler; 00044 class NamedLockManager; 00045 class PropertyCache; 00046 class QueuedWorkerPool; 00047 class ServerContext; 00048 class RewriteDriver; 00049 class RewriteOptions; 00050 class RewriteStats; 00051 class Scheduler; 00052 class StaticJavascriptManager; 00053 class Statistics; 00054 class ThreadSystem; 00055 class Timer; 00056 class UrlAsyncFetcher; 00057 class UrlFetcher; 00058 class UrlNamer; 00059 class UsageDataReporter; 00060 class UserAgentMatcher; 00061 00066 class RewriteDriverFactory { 00067 public: 00069 template<class T> class Deleter; 00070 00071 enum WorkerPoolName { 00072 kHtmlWorkers, 00073 kRewriteWorkers, 00074 kLowPriorityRewriteWorkers, 00076 kNumWorkerPools 00077 }; 00078 00080 explicit RewriteDriverFactory(ThreadSystem* thread_system); 00081 00083 RewriteDriverFactory(); 00084 00089 void InitializeDefaultOptions(); 00090 00091 virtual ~RewriteDriverFactory(); 00092 00097 void set_html_parse_message_handler(MessageHandler* message_handler); 00098 void set_message_handler(MessageHandler* message_handler); 00099 void set_file_system(FileSystem* file_system); 00100 void set_hasher(Hasher* hasher); 00101 void set_filename_encoder(FilenameEncoder* filename_encoder); 00102 void set_url_namer(UrlNamer* url_namer); 00103 void set_timer(Timer* timer); 00104 void set_usage_data_reporter(UsageDataReporter* reporter); 00105 00116 void set_slurp_directory(const StringPiece& directory); 00117 void set_slurp_read_only(bool read_only); 00118 void set_slurp_print_urls(bool read_only); 00119 00122 void set_force_caching(bool u) { force_caching_ = u; } 00123 00135 void set_base_url_fetcher(UrlFetcher* url_fetcher); 00136 void set_base_url_async_fetcher(UrlAsyncFetcher* url_fetcher); 00137 00138 bool set_filename_prefix(StringPiece p); 00139 00141 bool slurping_enabled() const { return !slurp_directory_.empty(); } 00142 00143 MessageHandler* html_parse_message_handler(); 00144 MessageHandler* message_handler(); 00145 FileSystem* file_system(); 00148 Hasher* hasher(); 00149 FilenameEncoder* filename_encoder() { return filename_encoder_.get(); } 00150 UrlNamer* url_namer(); 00151 UserAgentMatcher* user_agent_matcher(); 00152 StaticJavascriptManager* static_javascript_manager(); 00153 RewriteOptions* default_options() { return default_options_.get(); } 00154 00157 Timer* timer(); 00158 NamedLockManager* lock_manager(); 00159 QueuedWorkerPool* WorkerPool(WorkerPoolName pool); 00160 Scheduler* scheduler(); 00161 UsageDataReporter* usage_data_reporter(); 00162 00167 virtual UrlFetcher* ComputeUrlFetcher(); 00168 virtual UrlAsyncFetcher* ComputeUrlAsyncFetcher(); 00169 00174 ServerContext* CreateServerContext(); 00175 00179 void InitServerContext(ServerContext* server_context); 00180 00185 virtual void SetupCaches(ServerContext* server_context) = 0; 00186 00190 virtual void AddPlatformSpecificRewritePasses(RewriteDriver* driver); 00191 00198 virtual void AddPlatformSpecificDecodingPasses(RewriteDriver* driver); 00199 00203 virtual void ApplyPlatformSpecificConfiguration(RewriteDriver* driver); 00204 00205 ThreadSystem* thread_system() { return thread_system_.get(); } 00206 00209 const StringSet& created_directories() const { 00210 return created_directories_; 00211 } 00212 00213 bool async_rewrites() { return true; } 00214 00219 RewriteStats* rewrite_stats(); 00220 00223 Statistics* statistics() { return statistics_; } 00224 00227 static void InitStats(Statistics* statistics); 00228 00230 static void Initialize(); 00231 static void Terminate(); 00232 00234 void SetStatistics(Statistics* stats); 00235 00239 virtual void ShutDown(); 00240 00242 void AddCreatedDirectory(const GoogleString& dir); 00243 00248 virtual RewriteOptions* NewRewriteOptions(); 00249 00253 virtual RewriteOptions* NewRewriteOptionsForQuery(); 00254 00256 const GoogleString& version_string() const { return version_string_; } 00257 void set_version_string(const StringPiece& version_string) { 00258 version_string.CopyToString(&version_string_); 00259 } 00260 00264 void defer_cleanup(Function* f) { deferred_cleanups_.push_back(f); } 00265 00267 virtual bool IsDebugClient(const GoogleString& ip) const { 00268 return false; 00269 } 00270 00274 virtual AbstractClientState* NewClientState(); 00275 00278 virtual FuriousMatcher* NewFuriousMatcher(); 00279 00280 protected: 00281 bool FetchersComputed() const; 00282 virtual void StopCacheActivity(); 00283 StringPiece filename_prefix(); 00284 00288 bool TerminateServerContext(ServerContext* rm); 00289 00293 virtual UrlFetcher* DefaultUrlFetcher() = 0; 00294 virtual UrlAsyncFetcher* DefaultAsyncUrlFetcher() = 0; 00295 virtual MessageHandler* DefaultHtmlParseMessageHandler() = 0; 00296 virtual MessageHandler* DefaultMessageHandler() = 0; 00297 virtual FileSystem* DefaultFileSystem() = 0; 00298 virtual Timer* DefaultTimer() = 0; 00299 00300 virtual Hasher* NewHasher() = 0; 00301 00302 virtual CriticalImagesFinder* DefaultCriticalImagesFinder(); 00303 00305 virtual BlinkCriticalLineDataFinder* DefaultBlinkCriticalLineDataFinder( 00306 PropertyCache* cache); 00307 00309 virtual FlushEarlyInfoFinder* DefaultFlushEarlyInfoFinder(); 00310 00313 virtual NamedLockManager* DefaultLockManager(); 00314 00317 virtual UrlNamer* DefaultUrlNamer(); 00318 00319 virtual UserAgentMatcher* DefaultUserAgentMatcher(); 00320 virtual UsageDataReporter* DefaultUsageDataReporter(); 00321 00325 virtual QueuedWorkerPool* CreateWorkerPool(WorkerPoolName name); 00326 00333 virtual int LowPriorityLoadSheddingThreshold() const; 00334 00337 virtual Scheduler* CreateScheduler(); 00338 00340 virtual void FetcherSetupHooks(); 00341 00345 virtual StringPiece LockFilePrefix(); 00346 00348 virtual void InitStaticJavascriptManager( 00349 StaticJavascriptManager* static_js_manager) {} 00350 00351 private: 00355 StaticJavascriptManager* DefaultStaticJavascriptManager(); 00356 00357 void SetupSlurpDirectories(); 00358 void Init(); 00359 00360 scoped_ptr<MessageHandler> html_parse_message_handler_; 00361 scoped_ptr<MessageHandler> message_handler_; 00362 scoped_ptr<FileSystem> file_system_; 00363 UrlFetcher* url_fetcher_; 00364 UrlAsyncFetcher* url_async_fetcher_; 00365 scoped_ptr<UrlFetcher> base_url_fetcher_; 00366 scoped_ptr<UrlAsyncFetcher> base_url_async_fetcher_; 00367 scoped_ptr<Hasher> hasher_; 00368 scoped_ptr<FilenameEncoder> filename_encoder_; 00369 scoped_ptr<UrlNamer> url_namer_; 00370 scoped_ptr<UserAgentMatcher> user_agent_matcher_; 00371 scoped_ptr<StaticJavascriptManager> static_javascript_manager_; 00372 scoped_ptr<Timer> timer_; 00373 scoped_ptr<Scheduler> scheduler_; 00374 scoped_ptr<UsageDataReporter> usage_data_reporter_; 00375 00376 GoogleString filename_prefix_; 00377 GoogleString slurp_directory_; 00378 bool force_caching_; 00379 bool slurp_read_only_; 00380 bool slurp_print_urls_; 00381 00383 typedef std::set<ServerContext*> ServerContextSet; 00384 ServerContextSet server_contexts_; 00385 scoped_ptr<AbstractMutex> server_context_mutex_; 00386 00389 scoped_ptr<RewriteOptions> default_options_; 00390 00392 scoped_ptr<NamedLockManager> lock_manager_; 00393 00394 scoped_ptr<ThreadSystem> thread_system_; 00395 00398 NullStatistics null_statistics_; 00399 Statistics* statistics_; 00400 00401 StringSet created_directories_; 00402 00403 std::vector<QueuedWorkerPool*> worker_pools_; 00404 00407 scoped_ptr<RewriteStats> rewrite_stats_; 00408 00411 std::vector<Function*> deferred_cleanups_; 00412 00415 GoogleString version_string_; 00416 00418 GoogleString hostname_; 00419 00420 DISALLOW_COPY_AND_ASSIGN(RewriteDriverFactory); 00421 }; 00422 00425 template<class T> class RewriteDriverFactory::Deleter : public Function { 00426 public: 00427 explicit Deleter(T* obj) : obj_(obj) {} 00428 virtual void Run() { delete obj_; } 00429 private: 00430 T* obj_; 00431 DISALLOW_COPY_AND_ASSIGN(Deleter); 00432 }; 00433 00434 } 00435 00436 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_DRIVER_FACTORY_H_