Page Speed Optimization Libraries
1.3.25.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 CriticalCssFinder; 00038 class CriticalImagesFinder; 00039 class FileSystem; 00040 class FilenameEncoder; 00041 class FlushEarlyInfoFinder; 00042 class FuriousMatcher; 00043 class Hasher; 00044 class MessageHandler; 00045 class NamedLockManager; 00046 class PropertyCache; 00047 class QueuedWorkerPool; 00048 class ServerContext; 00049 class RewriteDriver; 00050 class RewriteOptions; 00051 class RewriteStats; 00052 class Scheduler; 00053 class StaticAssetManager; 00054 class Statistics; 00055 class ThreadSystem; 00056 class Timer; 00057 class UrlAsyncFetcher; 00058 class UrlFetcher; 00059 class UrlNamer; 00060 class UsageDataReporter; 00061 class UserAgentMatcher; 00062 00067 class RewriteDriverFactory { 00068 public: 00070 template<class T> class Deleter; 00071 00072 enum WorkerPoolCategory { 00073 kHtmlWorkers, 00074 kRewriteWorkers, 00075 kLowPriorityRewriteWorkers, 00077 kNumWorkerPools 00078 }; 00079 00081 explicit RewriteDriverFactory(ThreadSystem* thread_system); 00082 00084 RewriteDriverFactory(); 00085 00090 void InitializeDefaultOptions(); 00091 00092 virtual ~RewriteDriverFactory(); 00093 00098 void set_html_parse_message_handler(MessageHandler* message_handler); 00099 void set_message_handler(MessageHandler* message_handler); 00100 void set_file_system(FileSystem* file_system); 00101 void set_hasher(Hasher* hasher); 00102 void set_filename_encoder(FilenameEncoder* filename_encoder); 00103 void set_url_namer(UrlNamer* url_namer); 00104 void set_timer(Timer* timer); 00105 void set_usage_data_reporter(UsageDataReporter* reporter); 00106 00117 void set_slurp_directory(const StringPiece& directory); 00118 void set_slurp_read_only(bool read_only); 00119 void set_slurp_print_urls(bool read_only); 00120 00123 void set_force_caching(bool u) { force_caching_ = u; } 00124 00136 void set_base_url_fetcher(UrlFetcher* url_fetcher); 00137 void set_base_url_async_fetcher(UrlAsyncFetcher* url_fetcher); 00138 00139 bool set_filename_prefix(StringPiece p); 00140 00142 bool slurping_enabled() const { return !slurp_directory_.empty(); } 00143 00144 MessageHandler* html_parse_message_handler(); 00145 MessageHandler* message_handler(); 00146 FileSystem* file_system(); 00149 Hasher* hasher(); 00150 FilenameEncoder* filename_encoder() { return filename_encoder_.get(); } 00151 UrlNamer* url_namer(); 00152 UserAgentMatcher* user_agent_matcher(); 00153 StaticAssetManager* static_asset_manager(); 00154 RewriteOptions* default_options() { return default_options_.get(); } 00155 00158 Timer* timer(); 00159 NamedLockManager* lock_manager(); 00160 QueuedWorkerPool* WorkerPool(WorkerPoolCategory pool); 00161 Scheduler* scheduler(); 00162 UsageDataReporter* usage_data_reporter(); 00163 00168 virtual UrlFetcher* ComputeUrlFetcher(); 00169 virtual UrlAsyncFetcher* ComputeUrlAsyncFetcher(); 00170 00177 ServerContext* CreateServerContext(); 00178 00182 void InitServerContext(ServerContext* server_context); 00183 00188 virtual void SetupCaches(ServerContext* server_context) = 0; 00189 00193 virtual void AddPlatformSpecificRewritePasses(RewriteDriver* driver); 00194 00201 virtual void AddPlatformSpecificDecodingPasses(RewriteDriver* driver); 00202 00206 virtual void ApplyPlatformSpecificConfiguration(RewriteDriver* driver); 00207 00208 ThreadSystem* thread_system() { return thread_system_.get(); } 00209 00212 const StringSet& created_directories() const { 00213 return created_directories_; 00214 } 00215 00216 bool async_rewrites() { return true; } 00217 00222 RewriteStats* rewrite_stats(); 00223 00226 Statistics* statistics() { return statistics_; } 00227 00230 static void InitStats(Statistics* statistics); 00231 00233 static void Initialize(); 00234 static void Terminate(); 00235 00237 void SetStatistics(Statistics* stats); 00238 00242 virtual void ShutDown(); 00243 00245 void AddCreatedDirectory(const GoogleString& dir); 00246 00251 virtual RewriteOptions* NewRewriteOptions(); 00252 00256 virtual RewriteOptions* NewRewriteOptionsForQuery(); 00257 00259 const GoogleString& version_string() const { return version_string_; } 00260 void set_version_string(const StringPiece& version_string) { 00261 version_string.CopyToString(&version_string_); 00262 } 00263 00267 void defer_cleanup(Function* f) { deferred_cleanups_.push_back(f); } 00268 00270 virtual bool IsDebugClient(const GoogleString& ip) const { 00271 return false; 00272 } 00273 00277 virtual AbstractClientState* NewClientState(); 00278 00281 virtual FuriousMatcher* NewFuriousMatcher(); 00282 00283 protected: 00284 bool FetchersComputed() const; 00285 virtual void StopCacheActivity(); 00286 StringPiece filename_prefix(); 00287 00291 bool TerminateServerContext(ServerContext* rm); 00292 00296 virtual UrlFetcher* DefaultUrlFetcher() = 0; 00297 virtual UrlAsyncFetcher* DefaultAsyncUrlFetcher() = 0; 00298 virtual MessageHandler* DefaultHtmlParseMessageHandler() = 0; 00299 virtual MessageHandler* DefaultMessageHandler() = 0; 00300 virtual FileSystem* DefaultFileSystem() = 0; 00301 virtual Timer* DefaultTimer() = 0; 00302 00303 virtual Hasher* NewHasher() = 0; 00304 00309 virtual ServerContext* NewServerContext(); 00310 00311 virtual CriticalCssFinder* DefaultCriticalCssFinder(); 00312 virtual CriticalImagesFinder* DefaultCriticalImagesFinder(); 00313 00315 virtual BlinkCriticalLineDataFinder* DefaultBlinkCriticalLineDataFinder( 00316 PropertyCache* cache); 00317 00319 virtual FlushEarlyInfoFinder* DefaultFlushEarlyInfoFinder(); 00320 00323 virtual NamedLockManager* DefaultLockManager(); 00324 00327 virtual UrlNamer* DefaultUrlNamer(); 00328 00329 virtual UserAgentMatcher* DefaultUserAgentMatcher(); 00330 virtual UsageDataReporter* DefaultUsageDataReporter(); 00331 00335 virtual QueuedWorkerPool* CreateWorkerPool(WorkerPoolCategory pool, 00336 StringPiece name); 00337 00344 virtual int LowPriorityLoadSheddingThreshold() const; 00345 00348 virtual Scheduler* CreateScheduler(); 00349 00351 virtual void FetcherSetupHooks(); 00352 00356 virtual StringPiece LockFilePrefix(); 00357 00359 virtual void InitStaticAssetManager( 00360 StaticAssetManager* static_asset_manager) {} 00361 00362 private: 00366 StaticAssetManager* DefaultStaticAssetManager(); 00367 00368 void SetupSlurpDirectories(); 00369 void Init(); 00370 00371 scoped_ptr<MessageHandler> html_parse_message_handler_; 00372 scoped_ptr<MessageHandler> message_handler_; 00373 scoped_ptr<FileSystem> file_system_; 00374 UrlFetcher* url_fetcher_; 00375 UrlAsyncFetcher* url_async_fetcher_; 00376 scoped_ptr<UrlFetcher> base_url_fetcher_; 00377 scoped_ptr<UrlAsyncFetcher> base_url_async_fetcher_; 00378 scoped_ptr<Hasher> hasher_; 00379 scoped_ptr<FilenameEncoder> filename_encoder_; 00380 scoped_ptr<UrlNamer> url_namer_; 00381 scoped_ptr<UserAgentMatcher> user_agent_matcher_; 00382 scoped_ptr<StaticAssetManager> static_asset_manager_; 00383 scoped_ptr<Timer> timer_; 00384 scoped_ptr<Scheduler> scheduler_; 00385 scoped_ptr<UsageDataReporter> usage_data_reporter_; 00386 00387 GoogleString filename_prefix_; 00388 GoogleString slurp_directory_; 00389 bool force_caching_; 00390 bool slurp_read_only_; 00391 bool slurp_print_urls_; 00392 00394 typedef std::set<ServerContext*> ServerContextSet; 00395 ServerContextSet server_contexts_; 00396 scoped_ptr<AbstractMutex> server_context_mutex_; 00397 00400 scoped_ptr<RewriteOptions> default_options_; 00401 00403 scoped_ptr<NamedLockManager> lock_manager_; 00404 00405 scoped_ptr<ThreadSystem> thread_system_; 00406 00409 NullStatistics null_statistics_; 00410 Statistics* statistics_; 00411 00412 StringSet created_directories_; 00413 00414 std::vector<QueuedWorkerPool*> worker_pools_; 00415 00418 scoped_ptr<RewriteStats> rewrite_stats_; 00419 00422 std::vector<Function*> deferred_cleanups_; 00423 00426 GoogleString version_string_; 00427 00429 GoogleString hostname_; 00430 00431 DISALLOW_COPY_AND_ASSIGN(RewriteDriverFactory); 00432 }; 00433 00436 template<class T> class RewriteDriverFactory::Deleter : public Function { 00437 public: 00438 explicit Deleter(T* obj) : obj_(obj) {} 00439 virtual void Run() { delete obj_; } 00440 private: 00441 T* obj_; 00442 DISALLOW_COPY_AND_ASSIGN(Deleter); 00443 }; 00444 00445 } 00446 00447 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_DRIVER_FACTORY_H_