00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00022
00023 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_RESOURCE_COMBINER_H_
00024 #define NET_INSTAWEB_REWRITER_PUBLIC_RESOURCE_COMBINER_H_
00025
00026 #include "net/instaweb/rewriter/public/resource.h"
00027 #include "net/instaweb/rewriter/public/resource_manager.h"
00028 #include "net/instaweb/rewriter/public/url_partnership.h"
00029 #include "net/instaweb/util/public/basictypes.h"
00030 #include "net/instaweb/util/public/gtest_prod.h"
00031 #include "net/instaweb/util/public/string.h"
00032 #include "net/instaweb/util/public/string_util.h"
00033
00034 namespace net_instaweb {
00035
00036 struct ContentType;
00037 class MessageHandler;
00038 class OutputResource;
00039 class RewriteDriver;
00040 class RewriteFilter;
00041 class Writer;
00042
00044 struct TimedBool {
00047 int64 expiration_ms;
00048 bool value;
00049 };
00050
00057 class ResourceCombiner {
00058 public:
00067 static const int kUrlSlack = 100;
00068
00070 ResourceCombiner(RewriteDriver* rewrite_driver,
00071 const StringPiece& extension,
00072 RewriteFilter* filter);
00073
00074 virtual ~ResourceCombiner();
00075
00079 void Reset();
00080
00083 GoogleString UrlSafeId() const;
00084
00086 int num_urls() const { return partnership_.num_urls(); }
00087
00088 const ResourceVector& resources() const { return resources_; }
00089
00091 GoogleString ResolvedBase() const { return partnership_.ResolvedBase(); }
00092
00094 TimedBool AddResourceNoFetch(const ResourcePtr& resource,
00095 MessageHandler* handler);
00096
00097 protected:
00101 virtual void RemoveLastResource();
00102
00107 OutputResourcePtr Combine(MessageHandler* handler);
00108
00111 virtual bool WriteCombination(const ResourceVector& combine_resources,
00112 const OutputResourcePtr& combination,
00113 MessageHandler* handler);
00114
00119 virtual bool WritePiece(int index, const Resource* input,
00120 OutputResource* combination, Writer* writer,
00121 MessageHandler* handler);
00122
00125 virtual void Clear();
00126
00127 ResourceManager* const resource_manager_;
00128 RewriteDriver* const rewrite_driver_;
00129
00130 private:
00131 friend class AggregateCombiner;
00132
00134 virtual const ContentType* CombinationContentType() = 0;
00135
00137 void UpdateResolvedBase();
00138
00140 void ComputeLeafSize();
00141
00144 void AccumulateLeafSize(const StringPiece& url);
00145
00148 bool UrlTooBig();
00149
00154 virtual bool ResourceCombinable(Resource* resource,
00155 MessageHandler* handler);
00156
00157 UrlPartnership partnership_;
00158 ResourceVector resources_;
00159 StringVector multipart_encoder_urls_;
00160 int prev_num_components_;
00161 int accumulated_leaf_size_;
00162 GoogleString resolved_base_;
00163 const int url_overhead_;
00164 RewriteFilter* filter_;
00165
00166 FRIEND_TEST(ResourceCombinerTest, TestRemove);
00167 FRIEND_TEST(ResourceCombinerTest, TestRemoveFrom3);
00168 FRIEND_TEST(ResourceCombinerTest, TestRebaseRemove);
00169 FRIEND_TEST(ResourceCombinerTest, TestRebaseRemoveAdd);
00170
00171 DISALLOW_COPY_AND_ASSIGN(ResourceCombiner);
00172 };
00173
00174 }
00175
00176 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_RESOURCE_COMBINER_H_