Page Speed Optimization Libraries  1.3.25.1
net/instaweb/rewriter/public/rewrite_driver_factory.h
Go to the documentation of this file.
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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines