Redesigned gcm_input with polymorphic message filter classes.
authorarjen <arjen>
Thu, 18 Dec 2003 09:54:21 +0000 (09:54 +0000)
committerarjen <arjen>
Thu, 18 Dec 2003 09:54:21 +0000 (09:54 +0000)
doc/classes-gcm_input.obj
doc/classes-message_filter.obj [new file with mode: 0644]
doc/design.xml
doc/gcm_input-dataflow.obj
doc/makefile

index 2d19f5a..490df46 100644 (file)
@@ -1,7 +1,7 @@
 %TGIF 4.1.41-QPL
-state(0,37,100.000,0,0,0,4,1,0,1,1,0,0,0,1,1,0,'Helvetica',0,69120,0,0,0,10,0,0,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0).
+state(0,37,100.000,0,0,0,4,1,0,1,1,0,0,0,0,1,0,'Helvetica',0,69120,0,0,0,10,0,0,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0).
 %
-% @(#)$Header: /src/cvsroot/gnucomo/doc/classes-gcm_input.obj,v 1.2 2003-08-11 16:57:42 arjen Exp $
+% @(#)$Header: /src/cvsroot/gnucomo/doc/classes-gcm_input.obj,v 1.3 2003-12-18 09:54:21 arjen Exp $
 % %W%
 %
 unit("1 pixel/pixel").
@@ -19,9 +19,9 @@ script_frac("0.6").
 fg_bg_colors('black','White').
 dont_reencode("FFDingbests:ZapfDingbats").
 page(1,"",1,'').
-box('black','',96,72,680,576,0,2,1,209,0,0,0,0,0,'2',0,[
+box('black','',96,72,960,764,0,2,1,209,0,0,0,0,0,'2',0,[
 ]).
-text('black',388,534,1,1,1,218,23,211,18,5,0,0,0,0,2,218,23,0,0,"",0,0,0,0,552,'',[
+text('black',576,718,1,1,1,218,23,211,18,5,0,0,0,0,2,218,23,0,0,"",0,0,0,0,736,'',[
 minilines(218,23,0,0,1,0,0,[
 mini_line(218,18,5,0,0,0,[
 str_block(0,218,18,5,0,-1,0,0,0,[
@@ -30,9 +30,9 @@ str_seg('black','Helvetica-Bold',1,103680,218,18,5,0,-1,0,0,0,0,0,
 ])
 ])]).
 group([
-box('cyan','',352,436,480,500,1,1,1,848,0,0,0,0,0,'1',0,[
+box('cyan','',356,80,484,144,1,1,1,848,0,0,0,0,0,'1',0,[
 ]),
-text('black',416,448,1,1,1,71,15,849,12,3,0,0,0,0,2,71,15,0,0,"",0,0,0,0,460,'',[
+text('black',420,92,1,1,1,71,15,849,12,3,0,0,0,0,2,71,15,0,0,"",0,0,0,0,104,'',[
 minilines(71,15,0,0,1,0,0,[
 mini_line(71,12,3,0,0,0,[
 str_block(0,71,12,3,0,-1,0,0,0,[
@@ -40,15 +40,15 @@ str_seg('black','Helvetica-Bold',1,69120,71,12,3,0,-1,0,0,0,0,0,
        "PgDatabase")])
 ])
 ])]),
-box('black','',352,436,480,500,0,1,1,867,0,0,0,0,0,'1',0,[
+box('black','',356,80,484,144,0,1,1,867,0,0,0,0,0,'1',0,[
 ])
 ],
 880,0,0,[
 ]).
 group([
-box('black','',124,100,252,164,0,1,1,882,0,0,0,0,0,'1',0,[
+box('black','',116,268,244,332,0,1,1,882,0,0,0,0,0,'1',0,[
 ]),
-text('black',188,112,1,1,1,96,15,883,12,3,0,0,0,0,2,96,15,0,0,"",0,0,0,0,124,'',[
+text('black',180,280,1,1,1,96,15,883,12,3,0,0,0,0,2,96,15,0,0,"",0,0,0,0,292,'',[
 minilines(96,15,0,0,1,0,0,[
 mini_line(96,12,3,0,0,0,[
 str_block(0,96,12,3,0,0,0,0,0,[
@@ -60,9 +60,9 @@ str_seg('black','Helvetica-Bold',1,69120,96,12,3,0,0,0,0,0,0,0,
 881,0,0,[
 ]).
 group([
-box('cyan','',124,252,252,316,1,1,1,888,0,0,0,0,0,'1',0,[
+box('cyan','',120,160,248,224,1,1,1,888,0,0,0,0,0,'1',0,[
 ]),
-text('black',188,264,1,1,1,45,15,889,12,3,0,0,0,0,2,45,15,0,0,"",0,0,0,0,276,'',[
+text('black',184,172,1,1,1,45,15,889,12,3,0,0,0,0,2,45,15,0,0,"",0,0,0,0,184,'',[
 minilines(45,15,0,0,1,0,0,[
 mini_line(45,12,3,0,0,0,[
 str_block(0,45,12,3,0,-1,0,0,0,[
@@ -70,15 +70,15 @@ str_seg('black','Helvetica-Bold',1,69120,45,12,3,0,-1,0,0,0,0,0,
        "istream")])
 ])
 ])]),
-box('black','',124,252,252,316,0,1,1,890,0,0,0,0,0,'1',0,[
+box('black','',120,160,248,224,0,1,1,890,0,0,0,0,0,'1',0,[
 ])
 ],
 887,0,0,[
 ]).
 group([
-box('black','',520,304,648,368,0,1,1,896,0,0,0,0,0,'1',0,[
+box('black','',524,176,652,240,0,1,1,896,0,0,0,0,0,'1',0,[
 ]),
-text('black',584,316,1,1,1,96,15,897,12,3,0,0,0,0,2,96,15,0,0,"",0,0,0,0,328,'',[
+text('black',588,188,1,1,1,96,15,897,12,3,0,0,0,0,2,96,15,0,0,"",0,0,0,0,200,'',[
 minilines(96,15,0,0,1,0,0,[
 mini_line(96,12,3,0,0,0,[
 str_block(0,96,12,3,0,-1,0,0,0,[
@@ -90,99 +90,48 @@ str_seg('black','Helvetica-Bold',1,69120,96,12,3,0,-1,0,0,0,0,0,
 895,0,0,[
 ]).
 poly('black','',2,[
-       416,388,416,436],0,1,1,914,0,0,0,0,0,0,0,'1',0,0,
+       420,144,420,156],0,1,1,914,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
-group([
-group([
-polygon('black','',5,[
-       416,368,412,378,416,388,420,378,416,368],0,1,1,0,813,0,0,0,0,0,'1',0,
-    "00",[
-]),
-box('black','',412,372,420,384,0,1,0,814,0,0,0,0,0,'1',0,[
-attr("", "auto_center_attr", 0, 1, 0,
-text('black',416,371,1,1,1,144,23,815,18,5,0,0,0,0,2,144,23,0,0,"",0,0,0,0,389,'',[
-minilines(144,23,0,0,1,0,0,[
-mini_line(144,18,5,0,0,0,[
-str_block(0,144,18,5,0,0,0,0,0,[
-str_seg('black','Helvetica-Bold',1,103680,144,18,5,0,0,0,0,0,0,0,
-       "auto_center_attr")])
-])
-])])),
-attr("label=", "", 1, 0, 0,
-text('black',416,366,1,1,1,0,23,816,18,5,0,0,0,0,2,0,23,0,0,"",0,0,0,0,384,'',[
-minilines(0,23,0,0,1,0,0,[
-mini_line(0,18,5,0,0,0,[
-str_block(0,0,18,5,0,0,0,0,0,[
-str_seg('black','Helvetica-Bold',1,103680,0,18,5,0,0,0,0,0,0,0,
-       "")])
-])
-])]))
-])
-],
-817,0,0,[
-]),
-group([
-box('black','',352,304,480,368,0,1,1,824,0,0,0,0,0,'1',0,[
-]),
-text('black',416,316,1,1,1,114,15,825,12,3,0,0,0,0,2,114,15,0,0,"",0,0,0,0,328,'',[
-minilines(114,15,0,0,1,0,0,[
-mini_line(114,12,3,0,0,0,[
-str_block(0,114,12,3,0,-1,0,0,0,[
-str_seg('black','Helvetica-Bold',1,69120,114,12,3,0,-1,0,0,0,0,0,
-       "gnucomo_database")])
-])
-])])
-],
-823,0,0,[
-])
-],
-937,0,0,[
-]).
 poly('black','',2,[
-       340,128,252,128],0,1,1,948,0,0,0,0,0,0,0,'1',0,0,
+       332,296,244,296],0,1,1,948,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 poly('black','',2,[
-       184,164,184,252],0,1,1,970,0,0,0,0,0,0,0,'1',0,0,
+       180,224,180,268],0,1,1,970,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 poly('black','',2,[
-       416,232,416,304],0,1,1,971,0,0,0,0,0,0,0,'1',0,0,
+       416,240,416,272],0,1,1,971,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 poly('black','',2,[
-       480,332,520,332],0,1,1,972,0,0,0,0,0,0,0,'1',0,0,
+       484,204,524,204],0,1,1,972,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
-group([
-group([
-box('black','',360,104,488,232,0,1,1,89,0,0,0,0,0,'1',0,[
-]),
-text('black',424,116,1,1,1,92,15,90,12,3,0,0,0,0,2,92,15,0,0,"",0,0,0,0,128,'',[
+box('black','',352,272,480,424,0,1,1,89,0,0,0,0,0,'1',0,[
+]).
+text('black',416,284,1,1,1,92,15,90,12,3,0,0,0,0,2,92,15,0,0,"",0,0,0,0,296,'',[
 minilines(92,15,0,0,1,0,0,[
 mini_line(92,12,3,0,0,0,[
 str_block(0,92,12,3,0,-1,0,0,0,[
 str_seg('black','Helvetica-Bold',1,69120,92,12,3,0,-1,0,0,0,0,0,
        "client_message")])
 ])
-])])
-],
-913,0,0,[
-]),
+])]).
 group([
 polygon('black','',5,[
-       350,124,340,128,350,132,360,128,350,124],0,1,1,0,960,0,0,0,0,0,'1',0,
+       342,292,332,296,342,300,352,296,342,292],0,1,1,0,960,0,0,0,0,0,'1',0,
     "00",[
 ]),
-box('black','',342,126,358,130,0,1,0,961,0,0,0,0,0,'1',0,[
+box('black','',334,294,350,298,0,1,0,961,0,0,0,0,0,'1',0,[
 attr("", "auto_center_attr", 0, 1, 0,
-text('black',350,125,1,1,1,100,15,962,12,3,0,0,0,0,2,100,15,0,0,"",0,0,0,0,137,'',[
+text('black',342,293,1,1,1,100,15,962,12,3,0,0,0,0,2,100,15,0,0,"",0,0,0,0,305,'',[
 minilines(100,15,0,0,1,0,0,[
 mini_line(100,12,3,0,0,0,[
 str_block(0,100,12,3,0,0,0,0,0,[
@@ -191,7 +140,7 @@ str_seg('black','Helvetica-Bold',1,69120,100,12,3,0,0,0,0,0,0,0,
 ])
 ])])),
 attr("label=", "", 1, 0, 0,
-text('black',350,120,1,1,1,0,15,963,12,3,0,0,0,0,2,0,15,0,0,"",0,0,0,0,132,'',[
+text('black',342,288,1,1,1,0,15,963,12,3,0,0,0,0,2,0,15,0,0,"",0,0,0,0,300,'',[
 minilines(0,15,0,0,1,0,0,[
 mini_line(0,12,3,0,0,0,[
 str_block(0,0,12,3,0,0,0,0,0,[
@@ -202,72 +151,166 @@ str_seg('black','Helvetica-Bold',1,69120,0,12,3,0,0,0,0,0,0,0,
 ])
 ],
 964,0,0,[
-]),
+]).
 poly('black','',2,[
-       360,136,488,136],0,1,1,974,0,0,0,0,0,0,0,'1',0,0,
+       352,304,480,304],0,1,1,974,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
-]),
-text('black',364,136,1,0,1,53,15,975,12,3,0,0,0,0,2,53,15,0,0,"",0,0,0,0,148,'',[
+]).
+text('black',356,304,1,0,1,53,15,975,12,3,0,0,0,0,2,53,15,0,0,"",0,0,0,0,316,'',[
 minilines(53,15,0,0,0,0,0,[
 mini_line(53,12,3,0,0,0,[
 str_block(0,53,12,3,0,-1,0,0,0,[
 str_seg('black','Helvetica',0,69120,53,12,3,0,-1,0,0,0,0,0,
        "hostname")])
 ])
-])]),
-text('black',364,148,1,0,1,64,15,977,12,3,0,0,0,0,2,64,15,0,0,"",0,0,0,0,160,'',[
+])]).
+text('black',356,316,1,0,1,64,15,977,12,3,0,0,0,0,2,64,15,0,0,"",0,0,0,0,328,'',[
 minilines(64,15,0,0,0,0,0,[
 mini_line(64,12,3,0,0,0,[
 str_block(0,64,12,3,0,-1,0,0,0,[
 str_seg('black','Helvetica',0,69120,64,12,3,0,-1,0,0,0,0,0,
        "arrival_time")])
 ])
-])]),
-text('black',364,184,1,0,1,50,15,979,12,3,0,0,0,0,2,50,15,0,0,"",0,0,0,0,196,'',[
+])]).
+text('black',356,384,1,0,1,50,15,979,12,3,0,0,0,0,2,50,15,0,0,"",0,0,0,0,396,'',[
 minilines(50,15,0,0,0,0,0,[
 mini_line(50,12,3,0,0,0,[
 str_block(0,50,12,3,0,-1,0,0,0,[
 str_seg('black','Helvetica',0,69120,50,12,3,0,-1,0,0,0,0,0,
        "classify()")])
 ])
-])]),
-text('black',364,200,1,0,1,36,15,981,12,3,0,0,0,0,2,36,15,0,0,"",0,0,0,0,212,'',[
+])]).
+text('black',356,400,1,0,1,36,15,981,12,3,0,0,0,0,2,36,15,0,0,"",0,0,0,0,412,'',[
 minilines(36,15,0,0,0,0,0,[
 mini_line(36,12,3,0,0,0,[
 str_block(0,36,12,3,0,-1,0,0,0,[
 str_seg('black','Helvetica',0,69120,36,12,3,0,-1,0,0,0,0,0,
        "enter()")])
 ])
-])]),
+])]).
 poly('black','',2,[
-       360,184,488,184],0,1,1,983,0,0,0,0,0,0,0,'1',0,0,
+       352,384,480,384],0,1,1,983,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
-]),
-text('black',320,108,1,0,1,27,15,984,12,3,0,0,0,0,2,27,15,0,0,"",0,0,0,0,120,'',[
+]).
+text('black',312,276,1,0,1,27,15,984,12,3,0,0,0,0,2,27,15,0,0,"",0,0,0,0,288,'',[
 minilines(27,15,0,0,0,0,0,[
 mini_line(27,12,3,0,0,0,[
 str_block(0,27,12,3,0,0,0,0,0,[
 str_seg('black','Helvetica',0,69120,27,12,3,0,0,0,0,0,0,0,
        "input")])
 ])
-])]),
-text('black',364,160,1,0,1,41,15,986,12,3,0,0,0,0,2,41,15,0,0,"",0,0,0,0,172,'',[
+])]).
+text('black',356,328,1,0,1,41,15,986,12,3,0,0,0,0,2,41,15,0,0,"",0,0,0,0,340,'',[
 minilines(41,15,0,0,0,0,0,[
 mini_line(41,12,3,0,0,0,[
 str_block(0,41,12,3,0,-1,0,0,0,[
 str_seg('black','Helvetica',0,69120,41,12,3,0,-1,0,0,0,0,0,
        "service")])
 ])
+])]).
+poly('black','',2,[
+       480,312,552,312],0,1,1,1066,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]).
+oval('black','',548,308,556,316,1,1,1,1067,0,0,0,0,0,'1',0,[
+]).
+group([
+group([
+polygon('black','',5,[
+       420,156,416,166,420,176,424,166,420,156],0,1,1,0,813,0,0,0,0,0,'1',0,
+    "00",[
+]),
+box('black','',416,160,424,172,0,1,0,814,0,0,0,0,0,'1',0,[
+attr("", "auto_center_attr", 0, 1, 0,
+text('black',420,159,1,1,1,144,23,815,18,5,0,0,0,0,2,144,23,0,0,"",0,0,0,0,177,'',[
+minilines(144,23,0,0,1,0,0,[
+mini_line(144,18,5,0,0,0,[
+str_block(0,144,18,5,0,0,0,0,0,[
+str_seg('black','Helvetica-Bold',1,103680,144,18,5,0,0,0,0,0,0,0,
+       "auto_center_attr")])
+])
+])])),
+attr("label=", "", 1, 0, 0,
+text('black',420,154,1,1,1,0,23,816,18,5,0,0,0,0,2,0,23,0,0,"",0,0,0,0,172,'',[
+minilines(0,23,0,0,1,0,0,[
+mini_line(0,18,5,0,0,0,[
+str_block(0,0,18,5,0,0,0,0,0,[
+str_seg('black','Helvetica-Bold',1,103680,0,18,5,0,0,0,0,0,0,0,
+       "")])
+])
+])]))
+])
+],
+817,0,0,[
+]),
+group([
+box('black','',356,176,484,240,0,1,1,824,0,0,0,0,0,'1',0,[
+]),
+text('black',420,188,1,1,1,114,15,825,12,3,0,0,0,0,2,114,15,0,0,"",0,0,0,0,200,'',[
+minilines(114,15,0,0,1,0,0,[
+mini_line(114,12,3,0,0,0,[
+str_block(0,114,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica-Bold',1,69120,114,12,3,0,-1,0,0,0,0,0,
+       "gnucomo_database")])
+])
+])])
+],
+823,0,0,[
+])
+],
+1516,0,0,[
+]).
+group([
+group([
+box('black','',464,448,592,576,0,1,1,1009,0,0,0,0,0,'1',0,[
+]),
+text('black',528,460,1,1,1,88,15,1010,12,3,0,0,0,0,2,88,15,0,0,"",0,0,0,0,472,'',[
+minilines(88,15,0,0,1,0,0,[
+mini_line(88,12,3,0,0,0,[
+str_block(0,88,12,3,0,0,0,0,0,[
+str_seg('black','Helvetica-Bold',1,69120,88,12,3,0,0,0,0,0,0,0,
+       "message_filter")])
+])
 ])])
 ],
-1006,0,0,[
+1008,0,0,[
+]),
+poly('black','',2,[
+       464,480,592,480],0,1,1,1016,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]),
+text('black',468,528,1,0,1,93,15,1019,12,3,0,0,0,0,2,93,15,0,0,"",0,0,0,0,540,'',[
+minilines(93,15,0,0,0,0,0,[
+mini_line(93,12,3,0,0,0,[
+str_block(0,93,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,93,12,3,0,-1,0,0,0,0,0,
+       "construct_XML()")])
+])
+])]),
+text('black',468,544,1,0,1,8,15,1020,12,3,0,0,0,0,2,8,15,0,0,"",0,0,0,0,556,'',[
+minilines(8,15,0,0,0,0,0,[
+mini_line(8,12,3,0,0,0,[
+str_block(0,8,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,8,12,3,0,-1,0,0,0,0,0,
+       "()")])
+])
+])]),
+poly('black','',2,[
+       464,528,592,528],0,1,1,1021,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+])
+],
+1527,0,0,[
 ]).
 group([
-box('black','',540,104,668,232,0,1,1,1009,0,0,0,0,0,'1',0,[
+box('black','',664,448,792,576,0,1,1,1534,0,0,0,0,0,'1',0,[
 ]),
-text('black',604,116,1,1,1,67,15,1010,12,3,0,0,0,0,2,67,15,0,0,"",0,0,0,0,128,'',[
+text('black',728,460,1,1,1,67,15,1535,12,3,0,0,0,0,2,67,15,0,0,"",0,0,0,0,472,'',[
 minilines(67,15,0,0,1,0,0,[
 mini_line(67,12,3,0,0,0,[
 str_block(0,67,12,3,0,0,0,0,0,[
@@ -276,14 +319,14 @@ str_seg('black','Helvetica-Bold',1,69120,67,12,3,0,0,0,0,0,0,0,
 ])
 ])])
 ],
-1008,0,0,[
+1533,0,0,[
 ]).
 poly('black','',2,[
-       540,136,668,136],0,1,1,1016,0,0,0,0,0,0,0,'1',0,0,
+       664,480,792,480],0,1,1,1536,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
-text('black',544,184,1,0,1,61,15,1019,12,3,0,0,0,0,2,61,15,0,0,"",0,0,0,0,196,'',[
+text('black',668,532,1,0,1,61,15,1537,12,3,0,0,0,0,2,61,15,0,0,"",0,0,0,0,544,'',[
 minilines(61,15,0,0,0,0,0,[
 mini_line(61,12,3,0,0,0,[
 str_block(0,61,12,3,0,-1,0,0,0,[
@@ -291,7 +334,7 @@ str_seg('black','Helvetica',0,69120,61,12,3,0,-1,0,0,0,0,0,
        "cook_this()")])
 ])
 ])]).
-text('black',544,200,1,0,1,61,15,1020,12,3,0,0,0,0,2,61,15,0,0,"",0,0,0,0,212,'',[
+text('black',668,548,1,0,1,61,15,1538,12,3,0,0,0,0,2,61,15,0,0,"",0,0,0,0,560,'',[
 minilines(61,15,0,0,0,0,0,[
 mini_line(61,12,3,0,0,0,[
 str_block(0,61,12,3,0,-1,0,0,0,[
@@ -300,14 +343,72 @@ str_seg('black','Helvetica',0,69120,61,12,3,0,-1,0,0,0,0,0,
 ])
 ])]).
 poly('black','',2,[
-       540,184,668,184],0,1,1,1021,0,0,0,0,0,0,0,'1',0,0,
+       664,508,792,508],0,1,1,1539,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
+box('black','',556,300,684,376,0,1,1,1557,0,0,0,0,0,'1',0,[
+]).
+text('black',620,308,1,1,1,35,15,1558,12,3,0,0,0,0,2,35,15,0,0,"",0,0,0,0,320,'',[
+minilines(35,15,0,0,1,0,0,[
+mini_line(35,12,3,0,0,0,[
+str_block(0,35,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica-Bold',1,69120,35,12,3,0,-1,0,0,0,0,0,
+       "xform")])
+])
+])]).
 poly('black','',2,[
-       488,144,540,144],0,1,1,1066,0,0,0,0,0,0,0,'1',0,0,
+       556,328,684,328],0,1,1,1563,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
-oval('black','',532,140,540,148,1,1,1,1067,0,0,0,0,0,'1',0,[
+text('black',564,328,1,0,1,62,15,1569,12,3,0,0,0,0,2,62,15,0,0,"",0,0,0,0,340,'',[
+minilines(62,15,0,0,0,0,0,[
+mini_line(62,12,3,0,0,0,[
+str_block(0,62,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,62,12,3,0,-1,0,0,0,0,0,
+       "uncertainty")])
+])
+])]).
+poly('black','',4,[
+       612,376,612,412,528,412,528,448],0,1,1,1571,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
+poly('black','',4,[
+       624,376,624,412,728,412,728,448],0,1,1,1572,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]).
+text('black',496,284,1,0,1,40,15,1593,12,3,0,0,0,0,2,40,15,0,0,"",0,0,0,0,296,'',[
+minilines(40,15,0,0,0,0,0,[
+mini_line(40,12,3,0,0,0,[
+str_block(0,40,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,40,12,3,0,-1,0,0,0,0,0,
+       "kitchen")])
+])
+])]).
+text('black',668,516,1,0,1,87,15,1600,12,3,0,0,0,0,2,87,15,0,0,"",0,0,0,0,528,'',[
+minilines(87,15,0,0,0,0,0,[
+mini_line(87,12,3,0,0,0,[
+str_block(0,87,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,87,12,3,0,-1,0,0,0,0,0,
+       "check_pattern()")])
+])
+])]).
+text('black',360,344,1,0,1,50,15,1626,12,3,0,0,0,0,2,50,15,0,0,"",0,0,0,0,356,'',[
+minilines(50,15,0,0,0,0,0,[
+mini_line(50,12,3,0,0,0,[
+str_block(0,50,12,3,0,0,0,0,0,[
+str_seg('black','Helvetica',0,69120,50,12,3,0,0,0,0,0,0,0,
+       "xmlBuffer")])
+])
+])]).
+text('black',360,364,1,0,1,43,15,1628,12,3,0,0,0,0,2,43,15,0,0,"",0,0,0,0,376,'',[
+minilines(43,15,0,0,0,0,0,[
+mini_line(43,12,3,0,0,0,[
+str_block(0,43,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,43,12,3,0,-1,0,0,0,0,0,
+       "xmlDom")])
+])
+])]).
diff --git a/doc/classes-message_filter.obj b/doc/classes-message_filter.obj
new file mode 100644 (file)
index 0000000..2699682
--- /dev/null
@@ -0,0 +1,210 @@
+%TGIF 4.1.41-QPL
+state(0,37,100.000,0,0,0,4,1,0,1,1,0,0,0,0,1,0,'Helvetica',0,69120,0,0,0,10,0,0,1,1,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0).
+%
+% @(#)$Header: /src/cvsroot/gnucomo/doc/classes-message_filter.obj,v 1.1 2003-12-18 09:54:21 arjen Exp $
+% %W%
+%
+unit("1 pixel/pixel").
+color_info(11,65535,0,[
+       "black", 0, 0, 0, 0, 0, 0, 1,
+       "red", 65535, 0, 0, 65535, 0, 0, 1,
+       "green", 0, 65535, 0, 0, 65535, 0, 1,
+       "blue", 0, 0, 65535, 0, 0, 65535, 1,
+       "magenta", 65535, 0, 65535, 65535, 0, 65535, 1,
+       "cyan", 0, 65535, 65535, 0, 65535, 65535, 1,
+       "white", 65535, 65535, 65535, 65535, 65535, 65535, 1,
+       "yellow", 65535, 65535, 0, 65535, 65535, 0, 1,
+       "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1,
+       "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1,
+       "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1
+]).
+script_frac("0.6").
+fg_bg_colors('black','White').
+dont_reencode("FFDingbests:ZapfDingbats").
+page(1,"",1,'').
+box('black','',96,72,960,764,0,2,1,209,0,0,0,0,0,'2',0,[
+]).
+text('black',576,718,1,1,1,256,23,211,18,5,0,0,0,0,2,256,23,0,0,"",0,0,0,0,736,'',[
+minilines(256,23,0,0,1,0,0,[
+mini_line(256,18,5,0,0,0,[
+str_block(0,256,18,5,0,-1,0,0,0,[
+str_seg('black','Helvetica-Bold',1,103680,256,18,5,0,-1,0,0,0,0,0,
+       "message_filter class diagram")])
+])
+])]).
+group([
+group([
+box('black','',384,100,512,228,0,1,1,1009,0,0,0,0,0,'1',0,[
+]),
+text('black',448,112,1,1,1,88,15,1010,12,3,0,0,0,0,2,88,15,0,0,"",0,0,0,0,124,'',[
+minilines(88,15,0,0,1,0,0,[
+mini_line(88,12,3,0,0,0,[
+str_block(0,88,12,3,0,0,0,0,0,[
+str_seg('black','Helvetica-Bold',1,69120,88,12,3,0,0,0,0,0,0,0,
+       "message_filter")])
+])
+])])
+],
+1008,0,0,[
+]),
+poly('black','',2,[
+       384,132,512,132],0,1,1,1016,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]),
+text('black',388,180,1,0,1,93,15,1019,12,3,0,0,0,0,2,93,15,0,0,"",0,0,0,0,192,'',[
+minilines(93,15,0,0,0,0,0,[
+mini_line(93,12,3,0,0,0,[
+str_block(0,93,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,93,12,3,0,-1,0,0,0,0,0,
+       "construct_XML()")])
+])
+])]),
+text('black',388,196,1,0,1,111,15,1020,12,3,0,0,0,0,2,111,15,0,0,"",0,0,0,0,208,'',[
+minilines(111,15,0,0,0,0,0,[
+mini_line(111,12,3,0,0,0,[
+str_block(0,111,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,111,12,3,0,-1,0,0,0,0,0,
+       "set_message_type()")])
+])
+])]),
+poly('black','',2,[
+       384,180,512,180],0,1,1,1021,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+])
+],
+1527,0,0,[
+]).
+polygon('black','',4,[
+       448,244,428,264,468,264,448,244],0,1,1,0,1859,0,0,0,0,0,'1',0,
+    "0",[
+]).
+poly('black','',2,[
+       448,228,448,248],0,1,1,1927,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]).
+poly('black','',3,[
+       448,264,296,264,296,304],0,1,1,1928,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]).
+poly('black','',3,[
+       448,264,504,264,504,304],0,1,1,1929,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]).
+poly('black','',3,[
+       448,264,732,264,732,308],0,1,1,1964,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]).
+group([
+group([
+box('black','',228,304,356,432,0,1,1,1862,0,0,0,0,0,'1',0,[
+]),
+text('black',292,316,1,1,1,52,15,1863,12,3,0,0,0,0,2,52,15,0,0,"",0,0,0,0,328,'',[
+minilines(52,15,0,0,1,0,0,[
+mini_line(52,12,3,0,0,0,[
+str_block(0,52,12,3,0,0,0,0,0,[
+str_seg('black','Helvetica-Bold',1,69120,52,12,3,0,0,0,0,0,0,0,
+       "log_filter")])
+])
+])])
+],
+1861,0,0,[
+]),
+poly('black','',2,[
+       228,336,356,336],0,1,1,1864,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]),
+text('black',232,384,1,0,1,93,15,1865,12,3,0,0,0,0,2,93,15,0,0,"",0,0,0,0,396,'',[
+minilines(93,15,0,0,0,0,0,[
+mini_line(93,12,3,0,0,0,[
+str_block(0,93,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,93,12,3,0,-1,0,0,0,0,0,
+       "construct_XML()")])
+])
+])]),
+poly('black','',2,[
+       228,384,356,384],0,1,1,1867,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+])
+],
+2009,0,0,[
+]).
+group([
+group([
+box('black','',440,304,568,432,0,1,1,1878,0,0,0,0,0,'1',0,[
+]),
+text('black',504,316,1,1,1,58,15,1879,12,3,0,0,0,0,2,58,15,0,0,"",0,0,0,0,328,'',[
+minilines(58,15,0,0,1,0,0,[
+mini_line(58,12,3,0,0,0,[
+str_block(0,58,12,3,0,0,0,0,0,[
+str_seg('black','Helvetica-Bold',1,69120,58,12,3,0,0,0,0,0,0,0,
+       "rpm_filter")])
+])
+])])
+],
+1877,0,0,[
+]),
+poly('black','',2,[
+       440,336,568,336],0,1,1,1880,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]),
+text('black',444,384,1,0,1,93,15,1881,12,3,0,0,0,0,2,93,15,0,0,"",0,0,0,0,396,'',[
+minilines(93,15,0,0,0,0,0,[
+mini_line(93,12,3,0,0,0,[
+str_block(0,93,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,93,12,3,0,-1,0,0,0,0,0,
+       "construct_XML()")])
+])
+])]),
+poly('black','',2,[
+       440,384,568,384],0,1,1,1883,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+])
+],
+2016,0,0,[
+]).
+group([
+group([
+box('black','',672,308,800,436,0,1,1,1886,0,0,0,0,0,'1',0,[
+]),
+text('black',736,320,1,1,1,47,15,1887,12,3,0,0,0,0,2,47,15,0,0,"",0,0,0,0,332,'',[
+minilines(47,15,0,0,1,0,0,[
+mini_line(47,12,3,0,0,0,[
+str_block(0,47,12,3,0,0,0,0,0,[
+str_seg('black','Helvetica-Bold',1,69120,47,12,3,0,0,0,0,0,0,0,
+       "df_filter")])
+])
+])])
+],
+1885,0,0,[
+]),
+poly('black','',2,[
+       672,340,800,340],0,1,1,1888,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]),
+text('black',676,388,1,0,1,93,15,1889,12,3,0,0,0,0,2,93,15,0,0,"",0,0,0,0,400,'',[
+minilines(93,15,0,0,0,0,0,[
+mini_line(93,12,3,0,0,0,[
+str_block(0,93,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,93,12,3,0,-1,0,0,0,0,0,
+       "construct_XML()")])
+])
+])]),
+poly('black','',2,[
+       672,388,800,388],0,1,1,1891,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+])
+],
+2023,0,0,[
+]).
index d73154d..47cbb25 100644 (file)
@@ -6,7 +6,7 @@
 <!--
       XML documentation system
       Original author :  Arjen Baart - arjen@andromeda.nl
-      Version         : $Revision: 1.5 $
+      Version         : $Revision: 1.6 $
 
       This document is prepared for XMLDoc. Transform to HTML,
       LaTeX, Postscript or plain text with XMLDoc utilities and
@@ -21,9 +21,9 @@
    <author>Arjen Baart <code>&lt;arjen@andromeda.nl&gt;</code></author>
    <author>Brenno de Winter<code>&lt;brenno@dewinter.com&gt;</code></author>
    <author>Peter Roozemaal<code>&lt;mathfox@xs4all.nl&gt;</code></author>
-   <date>August 06, 2003</date>
+   <date>November 26, 2003</date>
    <docinfo>
-      <infoitem label="Version">0.5</infoitem>
+      <infoitem label="Version">0.6</infoitem>
       <infoitem label="Organization">Andromeda Technology &amp; Automation</infoitem>
       <infoitem label="Organization">De Winter Information Solutions</infoitem>
    </docinfo>
@@ -57,14 +57,14 @@ data flow diagram below:
 </para>
 
 <para>
-At the left of the diagram, information is aquired from the monitored system.
+At the left of the diagram, information is acquired from the monitored system.
 Several agents can be used to obtain information from this system, in
 active or passive ways.
 A passive agent uses information which is available on the system anyway,
 such as log files or other lists.
 An active agent, requests explicit data from the monitored system.
 One example of a passive agent is <emph>logrunner</emph>, a program which
-monitores system log files and sends regular updates to the <strong>gnucomo</strong>
+monitors system log files and sends regular updates to the <strong>gnucomo</strong>
 server.
 The agents on the monitored system send the data to some kind of transportation channel.
 This can be any form of transport, such as Email, SOAP, plain file copying or
@@ -120,7 +120,7 @@ Quite often, the test database will need to be destroyed and recreated.
 To enable testing of <strong>gnucomo</strong> applications, all programs
 need to access either the test database or the production database.
 To accommodate this, each application needs an option to override the
-default name of the configuration file (gnucomo.conf).
+default name of the <ref to='configuration'>configuration</ref> file (gnucomo.conf).
 </para>
 
 <para>
@@ -176,7 +176,7 @@ Both are derived from a <emph>database_entity</emph>, as show below:
 
 <para>
 Constructors of classes derived from <emph>database_entity</emph> come in
-two variaties: with or without database interaction.
+two varieties: with or without database interaction.
 Constructors that do not interact with the database have only one argument:
 a reference to the <emph>gnucomo_database</emph> object which handles
 the low-level interaction with the database server.
@@ -196,7 +196,7 @@ All these constructors do is establish the connection to the database
 server and fill in the defaults for the fields in the tuple.
 A destructor will put the actual tuple into the database if any
 information in the object has changed.
-This mey be by sending an INSERT if the object is completely fresh
+This may be by sending an INSERT if the object is completely fresh
 or an UPDATE if an already existing tuple was changed.
 The state information about the freshness of an object is a property
 common to all database entities and is therefore maintained in
@@ -205,7 +205,7 @@ the <emph>database_entity</emph> class.
 <para>
 Constructors that do interact with the database accept additional
 arguments after the initial <emph>gnucomo_database</emph> reference.
-These extra arguments are used to retreive a tuple from the database.
+These extra arguments are used to retrieve a tuple from the database.
 Examples of such constructors are:
 <verbatim>
 
@@ -237,7 +237,7 @@ A destructor will then save the tuple to the database.
 </section>
 
 <section>
-<heading>Configuration</heading>
+<heading><label name='configuration'/>Configuration</heading>
 
 <para>
 Configuration parameters are stored in a XML formatted configuration file.
@@ -408,13 +408,13 @@ to the database.
 </para>
 
 <para>
-   <picture src='gcm_input-dataflow.png' eps='gcm_input-dataflow'/>
+   <picture src='gcm_input-dataflow.png' eps='gcm_input-dataflow' scale='0.6'/>
 </para>
 
 <para>
 Internally, <emph>gcm_input</emph> handles <ref to='XML_input'>XML input</ref>
 and each input item must have its data fields split into appropriate XML elements.
-when data is offered in some other form, this data must be filtered
+When data is offered in some other form, this data must be filtered
 and transformed into XML before <emph>gcm_input</emph> can handle it.
 Two levels of transformation are possible.
 At the highest level, the whole message is transformed into an XML
@@ -425,18 +425,42 @@ At the lowest level, each line of the message's data can be transformed
 into a <code>&lt;cooked&gt; &lt;log&gt;</code> element.
 Two classes of replaceable filter objects take care of these transformations.
 Depending on the content of the message and/or command line options to
-<emph>gcm_input</emph>, and appropriate filter object is inserted into
+<emph>gcm_input</emph>, an appropriate filter object is inserted into
 the data stream.
 </para>
 
 <para>
+The <ref to='message_filter'><emph>message_filter</emph></ref> transforms
+the raw input data into an XML document.
+The XML document is processed by the XML parser and stored into the database
+or saved into a spool area for later processing.
+The latter happens, for example, when the database is unavailable.
+The task of the <emph>message_filter</emph> object is to create the &lt;header&gt;
+elements and the &lt;data&gt; element containing either a &lt;log&gt; or
+a &lt;parameters&gt; element, along with all their child elements.
+To do this, a <emph>message_filter</emph> object must work closely
+together with a <emph>line_cooker</emph> object.
+</para>
+<para>
+There are two major classes of <emph>message_filter</emph> objects:
+one to create a &lt;log&gt; element and one to create a &lt;parameters&gt;
+element.
+Either one of these must be capable to create a &lt;header&gt; element which
+is filled with information from command line arguments or an email header
+in the input stream.
+The base <emph>message_filter</emph> is not much more than a short circuit,
+which merely copies the input stream into the internal XML buffer.
+This is used when the input is already in XML format.
+</para>
+
+<para>
 The <ref to='line_cooker'><emph>line_cooker</emph></ref>
 operates on a node in the DOM tree which is
 supposed to be a &lt;raw&gt; &lt;log&gt; element that contains one line
 from a log file.
 The <emph>line_cooker</emph> transforms a <emph>raw</emph> log line into
 its constituent parts that make up en &lt;cooked&gt; element.
-Since each type of logfile uses a different layout and syntax,
+Since each type of log file uses a different layout and syntax,
 different line cookers can be used, depending on the type of log.
 This type is indicated by the &lt;messagetype&gt; element in the header
 part of the message.
@@ -449,7 +473,7 @@ for most methods, while derived classes provide the actual cooking.
 </para>
 
 <para>
-Ouput created by <emph>gcm_input</emph> for logging and debugging purposes
+Output created by <emph>gcm_input</emph> for logging and debugging purposes
 can be sent to one of several destinations:
 <itemize>
 <item>standard error.</item>
@@ -478,8 +502,8 @@ The body of the message may contain all sorts of information, such as:
 <item>Something else...</item>
 </itemize>
 
-Basically, <strong>gcm_input</strong> acceepts two kinds of input: Log lines
-and parameter reprots.
+Basically, <strong>gcm_input</strong> accepts two kinds of input: Log lines
+and parameter reports.
 The message is analyzed to obtain information about what the message entails
 and where it came from.
 The message classification embodies the way in which a message must be
@@ -506,18 +530,44 @@ Classifying a message may be performed with an algorithm as shown in
 the following pseudo code:
 
 <verbatim>
-while certainty &lt; &epsilon; AND not at end
+uncertainty = 1.0
+
+while uncertainty &gt; &epsilon; AND not at end
 
    Scan for a marker
 
-   Adjust certainty
+   if a marker matches
+
+      uncertainty = uncertainty * P    //  P &lt; 1.0
 </verbatim>
 
-Initially, a message is not classified and the certainty is 0.0.
-Some lines point toward a certain class of message but do not absolutely determine
-the class of a message. Other pieces of text are typical for a certain message class.
+With <emph>uncertainty</emph> of course being the opposite of the certainty.
+It expresses how unsure we are about the content of the message, as a
+number between 0.0 and 1.0.
+In fact, it is the probability that the message is not what we think it is.
+Initially, a message is not classified and the uncertainty is 1.0.
+Some lines point toward a certain type of message but do not absolutely determine
+the type of a message. Other pieces of text are typical for a certain message type.
+Such pieces of text, called <emph>markers</emph> are discovered in a message,
+possibly by using regular expression matches.
 Examples of markers that determine the classification of a client message
 are discussed below.
+</para>
+
+<para>
+To determine the message type, <strong>classify()</strong> uses the collection
+of <ref to='line_cooker'><emph>line_cooker</emph></ref> objects and maintains
+the uncertainty associated with each <emph>line_cooker</emph> object.
+A line of input from the message is tested using the <emph>line_cooker::check_pattern</emph>
+method for each <emph>line_cooker</emph>object.
+When a marker matches, we are a bit more sure about the content of the message
+and the uncertainty for that <emph>line_cooker</emph> object decreases by
+multiplying the uncertainty by <strong>P</strong>, a number between 0 and 1.
+This process continues line after line from the input message until the
+uncertainty for one of the <emph>line_cooker</emph> objects is sufficiently low
+(i.e. less than a preset threshold, &epsilon;).
+At the end, the <emph>line_cooker</emph> object with the lowest uncertainty
+is selected.
 
 <verbatim>
 From - Sat Sep 14 15:01:15 2002
@@ -579,7 +629,7 @@ within this namespace.
 <para>
 Within the <emph>&lt;message&gt;</emph> element there is a <emph>&lt;header&gt;</emph>
 and a <emph>&lt;data&gt;</emph> element.
-The <emph>&lt;data&gt;</emph> element may contain the logdata in an externally
+The <emph>&lt;data&gt;</emph> element may contain the log data in an externally
 specified format.
 The <emph>&lt;header&gt;</emph> element contains a number of elements (fields), some
 mandatory, some optional. The text of the element contains the value of
@@ -590,7 +640,7 @@ The following elements have been defined:
 <item>
 <emph>&lt;mesagetype&gt;</emph> mandatory
      <para>
-      The type (format) of the logdata in the data element. The message type
+      The type (format) of the log data in the data element. The message type
       determines the way in which raw log elements are parsed and split up
       into separate fields for insertion into the database.
       The message types gcm_input understands are:
@@ -607,7 +657,7 @@ The following elements have been defined:
             in default form.
       </item>
       </itemize>
-      There mnust also be a 'generic' system log in case all elements are
+      There must also be a 'generic' system log in case all elements are
       cooked already.
      </para>
 </item>
@@ -622,7 +672,7 @@ The following elements have been defined:
 <emph>&lt;service&gt;</emph> optional
      <para>
       The (default) value of the service running on the host that
-      generated the message data. For logfiles that don't contain the
+      generated the message data. For log files that don't contain the
       service name embedded in them.
      </para>
 </item>
@@ -630,7 +680,7 @@ The following elements have been defined:
 <emph>&lt;time&gt;</emph> optional
      <para>
       The best approximation to the time that the data was generated.
-      For (log)data that doesn't contain an embedded datestamp.
+      For (log)data that doesn't contain an embedded date stamp.
      </para>
 </item>
 </itemize>
@@ -653,7 +703,7 @@ with a filled-in header and an empty <emph>&lt;data&gt;</emph> element:
 
 <para>
 The <emph>data</emph> element can hold one of two possible child
-elemnts: <emph>&lt;log&gt;</emph> or <emph>&lt;parameters&gt;</emph>.
+elements: <emph>&lt;log&gt;</emph> or <emph>&lt;parameters&gt;</emph>.
 The <emph>&lt;log&gt;</emph> element may contain any number of lines from
 a system's log file, each line in a separate element.
 A single log line is the content of either a <emph>&lt;raw&gt;</emph> or
@@ -662,8 +712,8 @@ The <emph>&lt;raw&gt;</emph> element contains the log line "as is" and nothing m
 This is the easiest way to provide XML data for <strong>gcm_input</strong>.
 However, the log line itself must be in a form that <strong>gcm_input</strong>
 can understand.
-After all, <strong>gcm_input</strong> still needs to extract meaningfull information
-from that line, such as the timestamp and the service that created the log.
+After all, <strong>gcm_input</strong> still needs to extract meaningful information
+from that line, such as the time stamp and the service that created the log.
 The client can also choose to provide that information separately by encapsulating
 the log line in a <emph>&lt;cooked&gt;</emph> element.
 This element may have up to four child elements, two of which are mandatory:
@@ -683,7 +733,7 @@ This element may have up to four child elements, two of which are mandatory:
    <para>
    If the service that generated the log is not provided in the <emph>&lt;header&gt;</emph>
    the service must be stated for each log line separately.
-   Othewise, each log line is assumed to be generated by the same service.
+   Otherwise, each log line is assumed to be generated by the same service.
    </para>
 </item>
 <item><emph>&lt;raw&gt;</emph> mandatory.
@@ -758,7 +808,7 @@ The following example shows a possible parameter report from a "df -k":
 <para>
 The figure below shows the class diagram that is used for <strong>gcm_input</strong>:
    <para>
-   <picture src='classes-gcm_input.png' eps='classes-gcm_input'/>
+   <picture src='classes-gcm_input.png' eps='classes-gcm_input' scale='0.8'/>
    </para>
 
 The heart of the application is a <emph>client_message</emph> object.
@@ -766,7 +816,25 @@ This object reads the message through the
 <ref to='message_buffer'><emph>message_buffer</emph></ref> from some
 input stream (file, string, stdin or socket), classifies the message and
 enters information from the message into the database.
-It has a relationship with a <emph>gnucomo_database</emph> object which
+The <emph>client_message</emph> object holds a collection of <emph>message_filter</emph>
+and associated <emph>line_cooker</emph> objects.
+The association is maintained in a <emph>xform</emph> object.
+Note that several <emph>line_cooker</emph> can be associated with
+with a single <emph>message_filter</emph> object.
+For example, a system log or a web server log are processed in a similar
+manner, i.e. each line is transformed into a &lt;log&gt; element.
+The patterns of the individual lines, however are entirely different.
+During the classification of the input data, one combination of a
+<emph>message_filter</emph> and <emph>line_cooker</emph> is selected.
+The classification process works by calculating the uncertainty with which
+a <emph>line_cooker</emph> matches with the input data.
+The one with the least uncertainty is selected.
+</para>
+
+<subsubsection>
+<heading><label name='client_message'/>client_message</heading>
+<para>
+The <emph>client_message</emph> has a relationship with a <emph>gnucomo_database</emph> object which
 is an abstraction of the tables in the database.
 These are the methods for the <emph>client_message</emph> class:
 
@@ -776,9 +844,12 @@ These are the methods for the <emph>client_message</emph> class:
    Constructor.
    </para>
 </item>
-<item><code>void add_cooker(line_cooker *lc)</code>
+<item><code>void add_cooker(line_cooker *lc, message_filter *mf)</code>
   <para>
-  Add another <emph>line_cooker</emph> object to the collection.
+  Add another <emph>line_cooker</emph> object with the associated
+  <emph>message_filter</emph> object to the collection.
+  This initializes the uncertainty with which the <emph>line_cooker</emph>
+  is selected to 1.0.
   </para>
 </item>
 <item><code>double client_message::classify(String host, date arrival_d,
@@ -788,20 +859,77 @@ These are the methods for the <emph>client_message</emph> class:
   message could be determined.
   If the hostname, arrival time and service can not be extracted from the message,
   use the arguments as default.
-  This will try to select one of the <emph>line_cooker</emph> objects
+  This will examine the first few lines of the input data
+  to select one of the <emph>message_filter</emph> with
+  associated <emph>line_cooker</emph> objects
   from the collection built with the <emph>add_cooker</emph> method.
   </para>
 </item>
 <item><code>int enter()</code>
   <para>
-  Insert the message contents into the <emph>log</emph> table of the gnucomo
-  database.
+  Insert the message contents into the gnucomo database.
   Returns the number of records inserted.
+  The input data from the <emph>message_buffer</emph>
+  is first transformed into an XML document (a strstream object)
+  by invoking the <emph>message_filter</emph> and <emph>line_cooker</emph> objects.
+  The XML document in the internal buffer is then parsed into an
+  XML DOM tree, using the Gnome XML parser.
+  The XML document may also be validated against an XML Schema definition.
+  </para>
+  <para>
+  After extracting and checking the &lt;header&gt; elements,
+  the data nodes are extracted and inserted into the database,
+  possibly using a <emph>line_cooker</emph> object to cook raw
+  log elements.
+  If an error occurs in some stage of this process, the XML document
+  is dumped in a spool area for later processing.
   </para>
 </item>
 </itemize>
 
 </para>
+</subsubsection>
+
+<subsubsection>
+<heading><label name='message_filter'/>message_filter</heading>
+<para>
+A <emph>message_filter</emph> transforms the raw input data into an
+XML document suitable for further parsing and storage into the database.
+The base class, <emph>message_filter</emph> does nothing but copy the
+input stream into an internal XML buffer.
+An object of this class is used when the input is already in XML format.
+Classes derived from <emph>message_filter</emph> read the input line by line,
+possibly extracting information from an email header if available.
+<itemize>
+<item>
+   <code>message_filter::contruct_XML(message_buffer &amp;in, strstream &amp;xml)</code>
+   <para>
+   Simply copy the input stream into the internal XML buffer.
+   The base class function is used when the input is already in XML format.
+   Derived classes will override this function.
+   </para>
+</item>
+</itemize>
+</para>
+
+<para>
+Classes derived from <emph>message_filter</emph> transform various kinds
+of input into an XML document. The following diagram shows some examples:
+
+   <para>
+   <picture src='classes-message_filter.png' eps='classes-message_filter' scale='0.8'/>
+   </para>
+
+The two classes, derived directly from <emph>message_filter</emph> reflect
+that <strong>gcm_input</strong> can handle two kinds of input: The
+<emph>log_filter</emph> for log files
+and <emph>parameters_filter</emph> for parameter reports.
+Each of these types of input are transformed into entirely different XML
+documents and are stored quite differently into the database.
+Classes that are derived further down the hierarchy will handle more specific
+forms of input.
+</para>
+</subsubsection>
 
 <subsubsection>
 <heading><label name='line_cooker'/>line_cooker</heading>
@@ -833,7 +961,7 @@ log element, it takes the following steps to turn this into a
 </item>
 <item>
   Have the <emph>line_cooker</emph> parse the content and extract
-  the timestamp and optionally the hostname and service.
+  the time stamp and optionally the hostname and service.
 </item>
 <item>
   Insert new child elements into the cooked element.
@@ -845,7 +973,7 @@ and possibly storing into the database.
 
 <para>
 The <emph>line_cooker</emph> base class holds three protected members
-that must be filled with infomation by the derived classes:
+that must be filled with information by the derived classes:
 <itemize>
 <item><code>UTC ts</code> : the timestamp.</item>
 <item><code>String hn</code> : the hostname</item>
@@ -1009,16 +1137,16 @@ It handles the log-information delivered by <strong>gcm_input</strong>
 in the <emph>log</emph> table of the database.
 With the data further storage and classification can be done.
 Where <strong>gcm_input</strong> is a highly versatile application that is
-loaded and ended all the time the daemon is continously available monitoring
+loaded and ended all the time the daemon is continuously available monitoring
 the entire system. Basically the daemon monitors everything that happens
-in the database and excecutes continous checks and processes all the data.
+in the database and executes continuous checks and processes all the data.
 The two applications (gcm_input and gcm_daemon) together are the core of the central system. 
 The application has the following tasks:
 <itemize>
 <item>Processing data into other tables so that easy detection can take place</item>
 <item>Raising notifications based on the available input</item>
 <item>Maintain the status of notifications and changing priority when needed</item>
-<item>Priodically perform checks for alerts that are communicated through the notification-table</item>
+<item>Periodically perform checks for alerts that are communicated through the notification-table</item>
 <item>Perform updates on the database when a new version of the software is loaded</item>
 </itemize>
 </para>
@@ -1037,7 +1165,7 @@ the job by executing queries.
 </para>
 <para>
 Since the system is about detecting problems and issues we build the detection in
-such a way that queries on the database result in 'suspicious' logrecords.
+such a way that queries on the database result in 'suspicious' log records.
 So called 'innocent' records can be ignored. So if a query gives a result a
 problem is present, if there is no result there isn't a problem.
 As soon as we seek for common ground in the process of identifying problems
@@ -1048,7 +1176,7 @@ Furthermore there are two ways of determining if a problem is present:
 <itemize>
 <item>
 A single log-record or a group of log-records is within or outside the boundaries set.
-If it is outside the boundaries the logrecord(s) is/are a potential problem.
+If it is outside the boundaries the log record(s) is/are a potential problem.
 If there are more boundaries set all of these need to be applied.
 Based on fixed data results can be derived.
 </item>
@@ -1063,7 +1191,7 @@ If there are more queries to be executed the later queries can be executed on
 only the results. For that reason intermediate results have to be stored in a
 temporary table for later reuse.
 Saving a session in combination with the found log-records are sufficient.
-This is also true since logrecords are the basis of all derived presences in
+This is also true since log records are the basis of all derived presences in
 the numerous log_adv_xxx-tables and always have a reference to the log-table. 
 </para>
 <para>
@@ -1078,7 +1206,7 @@ This - of course - doesn't mean that a clear SQL-interface shouldn't be offered.
 </para>
 <para>
 Whenever something happens, that is less than standard a line will be written to the syslogd.
-This will enable users and developpers to trace exactly what happened.
+This will enable users and developers to trace exactly what happened.
 The gcm_daemon will also log startup and ending so that abrupt endings of the daemon will be detected.
 </para>
 </subsection>
index 2c9c2a1..3170277 100644 (file)
@@ -1,7 +1,7 @@
 %TGIF 4.1.41-QPL
-state(0,37,100.000,0,16,0,8,1,0,2,2,0,0,1,0,1,1,'Helvetica',0,69120,0,0,0,10,0,0,1,0,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0).
+state(0,37,100.000,0,16,0,8,1,0,2,2,0,0,0,0,1,1,'Helvetica',0,69120,0,0,0,10,0,0,1,0,0,16,0,0,1,1,1,1,1088,1408,1,0,2880,0).
 %
-% @(#)$Header: /src/cvsroot/gnucomo/doc/gcm_input-dataflow.obj,v 1.1 2003-08-11 16:57:42 arjen Exp $
+% @(#)$Header: /src/cvsroot/gnucomo/doc/gcm_input-dataflow.obj,v 1.2 2003-12-18 09:54:21 arjen Exp $
 % %W%
 %
 unit("1 pixel/pixel").
@@ -200,73 +200,49 @@ poly('black','',2,[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 group([
-oval('black','',664,312,760,408,0,1,1,1329,0,0,0,0,0,'1',0,[
-]),
-text('black',712,353,1,1,1,24,15,1330,12,3,0,0,0,0,2,24,15,0,0,"",0,0,0,0,365,'',[
-minilines(24,15,0,0,1,0,0,[
-mini_line(24,12,3,0,0,0,[
-str_block(0,24,12,3,0,0,0,0,0,[
-str_seg('black','Helvetica',0,69120,24,12,3,0,0,0,0,0,0,0,
-       "Raw")])
-])
-])])
-],
-1328,0,0,[
-]).
-group([
-oval('black','',544,312,640,408,0,1,1,1332,0,0,0,0,0,'1',0,[
+oval('black','',624,304,720,400,0,1,1,1332,0,0,0,0,0,'1',0,[
 ]),
-text('black',592,353,1,1,1,30,15,1333,12,3,0,0,0,0,2,30,15,0,0,"",0,0,0,0,365,'',[
-minilines(30,15,0,0,1,0,0,[
-mini_line(30,12,3,0,0,0,[
-str_block(0,30,12,3,0,-1,0,0,0,[
-str_seg('black','Helvetica',0,69120,30,12,3,0,-1,0,0,0,0,0,
-       "Email")])
+text('black',672,345,2,1,1,61,30,1333,12,3,0,0,0,0,2,61,30,0,0,"",0,0,0,0,357,'',[
+minilines(61,30,0,0,1,0,0,[
+mini_line(61,12,3,0,0,0,[
+str_block(0,61,12,3,0,-1,0,0,0,[
+str_seg('black','Helvetica',0,69120,61,12,3,0,-1,0,0,0,0,0,
+       "parameters")])
+]),
+mini_line(23,12,3,0,0,0,[
+str_block(0,23,12,3,0,0,0,0,0,[
+str_seg('black','Helvetica',0,69120,23,12,3,0,0,0,0,0,0,0,
+       "filter")])
 ])
 ])])
 ],
 1331,0,0,[
 ]).
 group([
-oval('black','',424,312,520,408,0,1,1,1335,0,0,0,0,0,'1',0,[
-]),
-text('black',472,353,2,1,1,34,30,1336,12,3,0,0,0,0,2,34,30,0,0,"",0,0,0,0,365,'',[
-minilines(34,30,0,0,1,0,0,[
-mini_line(27,12,3,0,0,0,[
-str_block(0,27,12,3,0,0,0,0,0,[
-str_seg('black','Helvetica',0,69120,27,12,3,0,0,0,0,0,0,0,
-       "short")])
+oval('black','',464,304,560,400,0,1,1,1335,0,0,0,0,0,'1',0,[
 ]),
-mini_line(34,12,3,0,0,0,[
-str_block(0,34,12,3,0,0,0,0,0,[
-str_seg('black','Helvetica',0,69120,34,12,3,0,0,0,0,0,0,0,
-       "circuit")])
+text('black',512,345,1,1,1,44,15,1336,12,3,0,0,0,0,2,44,15,0,0,"",0,0,0,0,357,'',[
+minilines(44,15,0,0,1,0,0,[
+mini_line(44,12,3,0,0,0,[
+str_block(0,44,12,3,0,0,0,0,0,[
+str_seg('black','Helvetica',0,69120,44,12,3,0,0,0,0,0,0,0,
+       "log filter")])
 ])
 ])])
 ],
 1334,0,0,[
 ]).
 polygon('black','',4,[
-       592,264,576,280,608,280,592,264],0,1,1,0,1350,0,0,0,0,0,'1',0,
+       592,248,576,264,608,264,592,248],0,1,1,0,1350,0,0,0,0,0,'1',0,
     "0",[
 ]).
 poly('black','',2,[
-       592,232,592,264],0,1,1,1351,0,0,0,0,0,0,0,'1',0,0,
+       592,232,592,248],0,1,1,1351,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 poly('black','',3,[
-       592,280,472,280,472,312],0,1,1,1352,0,0,0,0,0,0,0,'1',0,0,
-    "0","",[
-    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
-]).
-poly('black','',2,[
-       592,280,592,312],0,1,1,1353,0,0,0,0,0,0,0,'1',0,0,
-    "0","",[
-    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
-]).
-poly('black','',3,[
-       592,280,712,280,712,312],0,1,1,1357,0,0,0,0,0,0,0,'1',0,0,
+       592,264,512,264,512,304],0,1,1,1357,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
@@ -296,18 +272,18 @@ poly('black','',3,[
 ]).
 group([
 group([
-oval('black','',704,520,720,536,1,1,1,1387,0,0,0,0,0,'1',0,[
+oval('black','',704,536,720,552,1,1,1,1387,0,0,0,0,0,'1',0,[
 ]),
-box('black','',680,524,704,532,1,1,1,1388,0,0,0,0,0,'1',0,[
+box('black','',680,540,704,548,1,1,1,1388,0,0,0,0,0,'1',0,[
 ])
 ],
 1386,0,0,[
 ]),
 group([
-arc('black','',0,3,1,0,696,512,712,528,712,512,712,544,1,32,32,5760,-11520,1390,0,0,12,5,0,0,0,'3','12','5',0,[
+arc('black','',0,3,1,0,696,528,712,544,712,528,712,560,1,32,32,5760,-11520,1390,0,0,12,5,0,0,0,'3','12','5',0,[
 ]),
 poly('black','',2,[
-       728,528,744,528],0,1,1,1391,0,0,0,0,0,0,0,'1',0,0,
+       728,544,744,544],0,1,1,1391,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ])
@@ -318,7 +294,7 @@ poly('black','',2,[
 1385,0,0,[
 ]).
 poly('black','',3,[
-       824,488,824,528,736,528],1,1,1,1392,0,0,0,0,0,0,0,'1',0,0,
+       824,488,824,544,736,544],1,1,1,1392,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
@@ -338,7 +314,7 @@ str_seg('black','Helvetica',0,69120,83,12,3,0,-1,0,0,0,0,0,
        "XML_message")])
 ])
 ])]).
-text('black',784,508,1,1,1,30,15,1397,12,3,0,0,0,0,2,30,15,0,0,"",0,0,0,0,520,'',[
+text('black',784,524,1,1,1,30,15,1397,12,3,0,0,0,0,2,30,15,0,0,"",0,0,0,0,536,'',[
 minilines(30,15,0,0,1,0,0,[
 mini_line(30,12,3,0,0,0,[
 str_block(0,30,12,3,0,-1,0,0,0,[
@@ -347,9 +323,9 @@ str_seg('black','Helvetica',0,69120,30,12,3,0,-1,0,0,0,0,0,
 ])
 ])]).
 group([
-oval('black','',544,480,640,576,0,1,1,1400,0,0,0,0,0,'1',0,[
+oval('black','',544,496,640,592,0,1,1,1400,0,0,0,0,0,'1',0,[
 ]),
-text('black',592,521,1,1,1,62,15,1401,12,3,0,0,0,0,2,62,15,0,0,"",0,0,0,0,533,'',[
+text('black',592,537,1,1,1,62,15,1401,12,3,0,0,0,0,2,62,15,0,0,"",0,0,0,0,549,'',[
 minilines(62,15,0,0,1,0,0,[
 mini_line(62,12,3,0,0,0,[
 str_block(0,62,12,3,0,0,0,0,0,[
@@ -361,14 +337,14 @@ str_seg('black','Helvetica',0,69120,62,12,3,0,0,0,0,0,0,0,
 1399,0,0,[
 ]).
 poly('black','',2,[
-       680,528,640,528],1,1,1,1405,0,0,0,0,0,0,0,'1',0,0,
+       680,544,640,544],1,1,1,1405,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 group([
-oval('black','',664,656,760,752,0,1,1,1407,0,0,0,0,0,'1',0,[
+oval('black','',664,672,760,768,0,1,1,1407,0,0,0,0,0,'1',0,[
 ]),
-text('black',712,697,1,1,1,64,15,1408,12,3,0,0,0,0,2,64,15,0,0,"",0,0,0,0,709,'',[
+text('black',712,713,1,1,1,64,15,1408,12,3,0,0,0,0,2,64,15,0,0,"",0,0,0,0,725,'',[
 minilines(64,15,0,0,1,0,0,[
 mini_line(64,12,3,0,0,0,[
 str_block(0,64,12,3,0,-1,0,0,0,[
@@ -380,9 +356,9 @@ str_seg('black','Helvetica',0,69120,64,12,3,0,-1,0,0,0,0,0,
 1406,0,0,[
 ]).
 group([
-oval('black','',544,656,640,752,0,1,1,1410,0,0,0,0,0,'1',0,[
+oval('black','',544,672,640,768,0,1,1,1410,0,0,0,0,0,'1',0,[
 ]),
-text('black',592,697,1,1,1,36,15,1411,12,3,0,0,0,0,2,36,15,0,0,"",0,0,0,0,709,'',[
+text('black',592,713,1,1,1,36,15,1411,12,3,0,0,0,0,2,36,15,0,0,"",0,0,0,0,725,'',[
 minilines(36,15,0,0,1,0,0,[
 mini_line(36,12,3,0,0,0,[
 str_block(0,36,12,3,0,-1,0,0,0,[
@@ -394,9 +370,9 @@ str_seg('black','Helvetica',0,69120,36,12,3,0,-1,0,0,0,0,0,
 1409,0,0,[
 ]).
 group([
-oval('black','',424,656,520,752,0,1,1,1413,0,0,0,0,0,'1',0,[
+oval('black','',424,672,520,768,0,1,1,1413,0,0,0,0,0,'1',0,[
 ]),
-text('black',472,697,1,1,1,50,15,1414,12,3,0,0,0,0,2,50,15,0,0,"",0,0,0,0,709,'',[
+text('black',472,713,1,1,1,50,15,1414,12,3,0,0,0,0,2,50,15,0,0,"",0,0,0,0,725,'',[
 minilines(50,15,0,0,1,0,0,[
 mini_line(50,12,3,0,0,0,[
 str_block(0,50,12,3,0,-1,0,0,0,[
@@ -408,43 +384,43 @@ str_seg('black','Helvetica',0,69120,50,12,3,0,-1,0,0,0,0,0,
 1412,0,0,[
 ]).
 polygon('black','',4,[
-       592,608,576,624,608,624,592,608],0,1,1,0,1415,0,0,0,0,0,'1',0,
+       592,624,576,640,608,640,592,624],0,1,1,0,1415,0,0,0,0,0,'1',0,
     "0",[
 ]).
 poly('black','',3,[
-       592,624,472,624,472,656],0,1,1,1416,0,0,0,0,0,0,0,'1',0,0,
+       592,640,472,640,472,672],0,1,1,1416,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 poly('black','',2,[
-       592,624,592,656],0,1,1,1417,0,0,0,0,0,0,0,'1',0,0,
+       592,640,592,672],0,1,1,1417,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 poly('black','',3,[
-       592,624,712,624,712,656],0,1,1,1418,0,0,0,0,0,0,0,'1',0,0,
+       592,640,712,640,712,672],0,1,1,1418,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 poly('black','',2,[
-       592,576,592,608],0,1,1,1419,0,0,0,0,0,0,0,'1',0,0,
+       592,592,592,624],0,1,1,1419,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 group([
 group([
-oval('black','',432,520,448,536,1,1,1,1433,0,0,0,0,0,'1',0,[
+oval('black','',432,536,448,552,1,1,1,1433,0,0,0,0,0,'1',0,[
 ]),
-box('black','',448,524,472,532,1,1,1,1434,0,0,0,0,0,'1',0,[
+box('black','',448,540,472,548,1,1,1,1434,0,0,0,0,0,'1',0,[
 ])
 ],
 1432,0,0,[
 ]),
 group([
-arc('black','',0,3,1,0,424,512,440,528,440,512,440,544,0,32,32,5760,11520,1436,0,0,12,5,0,0,0,'3','12','5',0,[
+arc('black','',0,3,1,0,424,528,440,544,440,528,440,560,0,32,32,5760,11520,1436,0,0,12,5,0,0,0,'3','12','5',0,[
 ]),
 poly('black','',2,[
-       424,528,408,528],0,1,1,1437,0,0,0,0,0,0,0,'1',0,0,
+       424,544,408,544],0,1,1,1437,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ])
@@ -455,9 +431,9 @@ poly('black','',2,[
 1431,0,0,[
 ]).
 group([
-oval('black','',232,480,328,576,0,1,1,1439,0,0,0,0,0,'1',0,[
+oval('black','',232,496,328,592,0,1,1,1439,0,0,0,0,0,'1',0,[
 ]),
-text('black',280,521,2,1,1,51,30,1440,12,3,0,0,0,0,2,51,30,0,0,"",0,0,0,0,533,'',[
+text('black',280,537,2,1,1,51,30,1440,12,3,0,0,0,0,2,51,30,0,0,"",0,0,0,0,549,'',[
 minilines(51,30,0,0,1,0,0,[
 mini_line(51,12,3,0,0,0,[
 str_block(0,51,12,3,0,-1,0,0,0,[
@@ -474,19 +450,19 @@ str_seg('black','Helvetica',0,69120,28,12,3,0,-1,0,0,0,0,0,
 1438,0,0,[
 ]).
 poly('black','',2,[
-       544,528,472,528],1,1,1,1444,0,0,0,0,0,0,0,'1',0,0,
+       544,544,472,544],1,1,1,1444,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 poly('black','',2,[
-       408,528,328,528],1,1,1,1445,0,0,0,0,0,0,0,'1',0,0,
+       408,544,328,544],1,1,1,1445,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
 group([
-box('black','',112,656,208,712,0,1,1,1450,0,0,0,0,0,'1',0,[
+box('black','',112,672,208,728,0,1,1,1450,0,0,0,0,0,'1',0,[
 ]),
-text('black',160,668,1,1,1,67,15,1451,12,3,0,0,0,0,2,67,15,0,0,"",0,0,0,0,680,'',[
+text('black',160,684,1,1,1,67,15,1451,12,3,0,0,0,0,2,67,15,0,0,"",0,0,0,0,696,'',[
 minilines(67,15,0,0,1,0,0,[
 mini_line(67,12,3,0,0,0,[
 str_block(0,67,12,3,0,-1,0,0,0,[
@@ -498,11 +474,11 @@ str_seg('black','Helvetica',0,69120,67,12,3,0,-1,0,0,0,0,0,
 1449,0,0,[
 ]).
 poly('black','',3,[
-       232,528,160,528,160,656],1,1,1,1452,0,0,0,0,0,0,0,'1',0,0,
+       232,544,160,544,160,672],1,1,1,1452,0,0,0,0,0,0,0,'1',0,0,
     "0","",[
     0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
 ]).
-text('black',376,508,1,1,1,75,15,1459,12,3,0,0,0,0,2,75,15,0,0,"",0,0,0,0,520,'',[
+text('black',376,524,1,1,1,75,15,1459,12,3,0,0,0,0,2,75,15,0,0,"",0,0,0,0,536,'',[
 minilines(75,15,0,0,1,0,0,[
 mini_line(75,12,3,0,0,0,[
 str_block(0,75,12,3,0,-1,0,0,0,[
@@ -510,3 +486,8 @@ str_seg('black','Helvetica',0,69120,75,12,3,0,-1,0,0,0,0,0,
        "cooked DOM")])
 ])
 ])]).
+poly('black','',3,[
+       592,264,672,264,672,304],0,1,1,1486,0,0,0,0,0,0,0,'1',0,0,
+    "0","",[
+    0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
+]).
index 9c4bf83..b78eb5f 100644 (file)
@@ -14,14 +14,16 @@ IMAGES= dataflow.png architecture.png erd-action.png erd-anu.png erd-log.png \
         erd-objprior.png erd-objservice.png erd-objsysusr.png erd-objusr.png \
         erd-prior.png erd-service.png erd-status.png erd-toi.png \
         erd-unplog.png erd-usr.png erd.png \
-        class-database_entity.png classes-gcm_input.png gcm_input-dataflow.png
+        class-database_entity.png classes-gcm_input.png gcm_input-dataflow.png \
+        classes-message_filter.png
 
 PICTURES= dataflow.eps architecture.eps erd-action.eps erd-anu.eps erd-log.eps \
           erd-lognotif.eps erd-notif.eps erd-object.eps erd-objissue.eps \
           erd-objprior.eps erd-objservice.eps erd-objsysusr.eps erd-objusr.eps \
           erd-prior.eps erd-service.eps erd-status.eps erd-toi.eps \
           erd-unplog.eps erd-usr.eps erd.eps \
-          class-database_entity.eps classes-gcm_input.eps gcm_input-dataflow.eps
+          class-database_entity.eps classes-gcm_input.eps gcm_input-dataflow.eps \
+        classes-message_filter.eps
 
 html: manifest.html design.html