1
2 /* Web Polygraph http://www.web-polygraph.org/
3 * Copyright 2003-2011 The Measurement Factory
4 * Licensed under the Apache License, Version 2.0 */
5
6 #include "pgl/pgl.h"
7
8 #include "xstd/String.h"
9 #include "pgl/PglRec.h"
10 #include "pgl/PglSizeSym.h"
11 #include "pgl/PglNumSym.h"
12 #include "pgl/PglIntSym.h"
13 #include "pgl/PglStringSym.h"
14 #include "pgl/PglArraySym.h"
15 #include "pgl/MimeSym.h"
16 #include "pgl/ObjLifeCycleSym.h"
17 #include "pgl/ContentSym.h"
18 #include "pgl/MimeHeaderSym.h"
19 #include "pgl/ClientBehaviorSym.h"
20
21
22 String ContentSym::TheType = "Content";
23
24 static String strContentArr = "Content[]";
25 static String strCachable = "cachable";
26 static String strChecksum = "checksum";
27 static String strChoice_space = "choice_space";
28 static String strClient_behavior = "client_behavior";
29 static String strGenerator = "generator";
30 static String strContent_db = "content_db";
31 static String strEmbedded_obj_cnt = "embedded_obj_cnt";
32 static String strInfect_prob = "infect_prob";
33 static String strInject_object = "inject_object";
34 static String strInject_db = "inject_db";
35 static String strInject_gap = "inject_gap";
36 static String strInt_distr = "int_distr";
37 static String strKind = "kind";
38 static String strMay_contain = "may_contain";
39 static String strMime = "mime";
40 static String strObj_life_cycle = "obj_life_cycle";
41 static String strUnique = "unique";
42 static String strSize = "size";
43 static String strSize_distr = "size_distr";
44 static String strContainerContents = "container_contents";
45 static String strStringArr = "string[]";
46 static String strEncodings = "encodings";
47 static String strMimeHeaders = "mime_headers";
48 static String strMimeHeaderArr = "MimeHeader[]";
49 static String strDocumentRoot = "document_root";
50
ContentSym()51 ContentSym::ContentSym(): RecSym(TheType, new PglRec) {
52 theRec->bAdd(StringSym::TheType, strKind, 0);
53 theRec->bAdd(MimeSym::TheType, strMime, new MimeSym);
54 theRec->bAdd(strSize_distr, strSize, 0);
55 theRec->bAdd(ObjLifeCycleSym::TheType, strObj_life_cycle, new ObjLifeCycleSym);
56 theRec->bAdd(NumSym::TheType, strCachable, 0);
57 theRec->bAdd(NumSym::TheType, strChecksum, 0);
58 theRec->bAdd(NumSym::TheType, strUnique, 0);
59 theRec->bAdd(strContentArr, strMay_contain, 0);
60 theRec->bAdd(strInt_distr, strEmbedded_obj_cnt, 0);
61 theRec->bAdd(IntSym::TheType, strChoice_space, 0);
62 theRec->bAdd(ClientBehaviorSym::TheType, strClient_behavior, new ClientBehaviorSym);
63 theRec->bAdd(StringSym::TheType, strGenerator, 0);
64 theRec->bAdd(StringSym::TheType, strContent_db, 0);
65 theRec->bAdd(StringSym::TheType, strInject_object, 0);
66 theRec->bAdd(StringSym::TheType, strInject_db, 0);
67 theRec->bAdd(NumSym::TheType, strInfect_prob, 0);
68 theRec->bAdd(strSize_distr, strInject_gap, 0);
69 theRec->bAdd(strStringArr, strEncodings, 0);
70 theRec->bAdd(strMimeHeaderArr, strMimeHeaders, 0);
71 theRec->bAdd(StringSym::TheType, strDocumentRoot, 0);
72 }
73
ContentSym(const String & aType,PglRec * aRec)74 ContentSym::ContentSym(const String &aType, PglRec *aRec): RecSym(aType, aRec) {
75 }
76
isA(const String & type) const77 bool ContentSym::isA(const String &type) const {
78 return RecSym::isA(type) || type == TheType;
79 }
80
dupe(const String & type) const81 SynSym *ContentSym::dupe(const String &type) const {
82 if (isA(type))
83 return new ContentSym(this->type(), theRec->clone());
84 return RecSym::dupe(type);
85 }
86
hasEmbed() const87 bool ContentSym::hasEmbed() const {
88 SynSymTblItem *conti = 0;
89 Assert(theRec->find(strMay_contain, conti));
90 return conti->sym() != 0;
91 }
92
kind() const93 String ContentSym::kind() const {
94 return getString(strKind);
95 }
96
mime() const97 MimeSym *ContentSym::mime() const {
98 SynSymTblItem *mi = 0;
99 Assert(theRec->find(strMime, mi));
100 Assert(mi->sym());
101 return &(MimeSym&)mi->sym()->cast(MimeSym::TheType);
102 }
103
size() const104 RndDistr *ContentSym::size() const {
105 return getDistr(strSize);
106 }
107
objLifeCycle() const108 ObjLifeCycleSym *ContentSym::objLifeCycle() const {
109 SynSymTblItem *olci = 0;
110 Assert(theRec->find(strObj_life_cycle, olci));
111 Assert(olci->sym());
112 return &(ObjLifeCycleSym&)olci->sym()->cast(ObjLifeCycleSym::TheType);
113 }
114
cachable(double & ratio) const115 bool ContentSym::cachable(double &ratio) const {
116 return getDouble(strCachable, ratio);
117 }
118
checksum(double & ratio) const119 bool ContentSym::checksum(double &ratio) const {
120 return getDouble(strChecksum, ratio);
121 }
122
unique(double & ratio) const123 bool ContentSym::unique(double &ratio) const {
124 return getDouble(strUnique, ratio);
125 }
126
contains(Array<ContentSym * > & ccfgs,RndDistr * & selector,Array<double> & cprobs) const127 bool ContentSym::contains(Array<ContentSym*> &ccfgs, RndDistr *&selector, Array<double> &cprobs) const {
128 SynSymTblItem *conti = 0;
129 Assert(theRec->find(strMay_contain, conti));
130 if (!conti->sym())
131 return false; // undefined
132
133 ArraySym &a = (ArraySym&)conti->sym()->cast(ArraySym::TheType);
134 selector = a.makeSelector(strContainerContents);
135 ccfgs.stretch(a.count());
136 cprobs.stretch(a.count());
137 a.copyProbs(cprobs);
138 for (int i = 0; i < a.count(); ++i) {
139 ContentSym *csym = &((ContentSym&)a[i]->cast(TheType));
140 ccfgs.append(csym);
141 }
142
143 return true;
144 }
145
embedCount() const146 RndDistr *ContentSym::embedCount() const {
147 return getDistr(strEmbedded_obj_cnt);
148 }
149
choiceSpace(int & space) const150 bool ContentSym::choiceSpace(int &space) const {
151 return getInt(strChoice_space, space);
152 }
153
clientBehavior() const154 ClientBehaviorSym *ContentSym::clientBehavior() const {
155 SynSymTblItem *mi = 0;
156 Assert(theRec->find(strClient_behavior, mi));
157 Assert(mi->sym());
158 return &(ClientBehaviorSym&)mi->sym()->cast(ClientBehaviorSym::TheType);
159 }
160
generator() const161 String ContentSym::generator() const {
162 return getString(strGenerator);
163 }
164
cdb() const165 String ContentSym::cdb() const {
166 return getString(strContent_db);
167 }
168
injectObject() const169 String ContentSym::injectObject() const {
170 return getString(strInject_object);
171 }
172
injectDb() const173 String ContentSym::injectDb() const {
174 return getString(strInject_db);
175 }
176
infectProb(double & prob) const177 bool ContentSym::infectProb(double &prob) const {
178 return getDouble(strInfect_prob, prob);
179 }
180
injectGap() const181 RndDistr *ContentSym::injectGap() const {
182 return getDistr(strInject_gap);
183 }
184
encodings(Array<String * > & codings) const185 bool ContentSym::encodings(Array<String*> &codings) const {
186 return getStrings(strEncodings, codings);
187 }
188
mimeHeaders() const189 const ArraySym *ContentSym::mimeHeaders() const {
190 return getArraySym(strMimeHeaders);
191 }
192
documentRoot() const193 String ContentSym::documentRoot() const {
194 return getString(strDocumentRoot);
195 }
196