Page Speed Optimization Libraries  1.2.24.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 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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines