00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <iostream>
00019 #include <string>
00020 #include <algorithm>
00021 #include <iterator>
00022 #include <cstdlib>
00023 #include <sstream>
00024
00025 #include <cgicc/Cgicc.h>
00026
00027 #include "psfa/DbReadDriverMySql.hpp"
00028 #include "psfa/Config.hpp"
00029 #include "psfa/Helper.hpp"
00030
00031 #include "Demo-Template.hpp"
00032
00033
00034 void
00035 setUpPsfa()
00036 {
00037 using psfa::sVec;
00038 using psfa::Config;
00039 using psfahelper::pathIsReadable;
00040
00041 sVec psfaConfigs;
00042 psfaConfigs.reserve( 3 );
00043 const char* env = getenv("PSFA_CONFIG");
00044 if ( env ) {
00045 psfaConfigs.push_back( env );
00046 delete env;
00047 }
00048 env = std::getenv("HOME");
00049 if ( env ) {
00050 std::string h( env );
00051 h += "/.psfa/psfa_conf.xml";
00052 psfaConfigs.push_back( h );
00053 delete env;
00054 }
00055 psfaConfigs.push_back( "/etc/psfa_conf.xml" );
00056
00057 Config* conf = Config::getConfig();
00058 sVec::iterator i;
00059 sVec::iterator iEnd = psfaConfigs.end();
00060 for( i = psfaConfigs.begin(); i != iEnd; ++i ) {
00061 if( pathIsReadable( *i ) ) {
00062 conf->parseConfig( *i );
00063 }
00064 }
00065 return;
00066 }
00067
00068
00069
00070 void
00071 getOptions( psfa::sVec& vec, std::string& options, std::string def )
00072 {
00073 std::ostringstream opts;
00074
00075 opts << "<option value=\""
00076 << def
00077 << "\">"
00078 << def
00079 << "</option>\n";
00080 psfa::sVec::iterator i;
00081 psfa::sVec::iterator iEnd = vec.end();
00082 for( i = vec.begin(); i != iEnd; ++i ) {
00083 opts << "<option value=\""
00084 << *i
00085 << "\">"
00086 << *i
00087 << "</option>\n";
00088 }
00089 options = opts.str();
00090 return;
00091 }
00092
00093
00094 void
00095 printVec( psfa::sVec& vec, std::ostringstream& stream )
00096 {
00097 using psfa::sVec;
00098
00099 stream << "<table>\n";
00100 sVec::iterator i;
00101 sVec::iterator iEnd = vec.end();
00102 for( i = vec.begin(); i != iEnd; ++i ) {
00103 stream << "<tr><td>"
00104 << *i
00105 << "</td></tr>\n";
00106 }
00107 stream << "</table>\n";
00108 }
00109
00110
00111
00112 int main(int, char ** )
00113 {
00114 using std::cout;
00115 using std::endl;
00116 using std::string;
00117 using std::ostringstream;
00118 using std::vector;
00119 using psfa::DbReadDriver;
00120 using psfa::DbReadDriverMySql;
00121 using psfa::SearchData;
00122 using psfa::sVec;
00123 using psfa::Config;
00124 using psfa::IndexData_SP;
00125 using psfahelper::pathIsReadable;
00126 using psfahelper::splitString;
00127 using cgicc::Cgicc;
00128 using cgicc::CgiEnvironment;
00129 using cgicc::FormEntry;
00130 using cgicc::form_iterator;
00131
00132 setUpPsfa();
00133 DbReadDriver *read = new DbReadDriverMySql;
00134
00135 sVec pools;
00136 sVec result;
00137 string options("");
00138 string tmp;
00139 string::size_type tplPos;
00140
00141 read->getPools( pools );
00142 psfa::sVec::iterator p;
00143 psfa::sVec::iterator pEnd = pools.end();
00144 for( p = pools.begin(); p != pEnd; ++p ) {
00145 read->getSearchTags( *p, result );
00146 getOptions( result, options, "Such-Tags" );
00147 tmp = "PSFA--option_" + *p + "_search";
00148 tplPos = searchForm.find( tmp );
00149 if( tplPos < string::npos ) {
00150 searchForm.replace( tplPos, tmp.size(), options );
00151 }
00152 options = "";
00153 result.clear();
00154
00155 read->getKontextTags( *p, result );
00156 getOptions( result, options, "Kontext-Tags" );
00157 tmp = "PSFA--option_" + *p + "_kontext";
00158 tplPos = searchForm.find( tmp );
00159 if( tplPos < string::npos ) {
00160 searchForm.replace( tplPos, tmp.size(), options );
00161 }
00162 options = "";
00163 result.clear();
00164
00165 read->getUnits( *p, result );
00166 getOptions( result, options, "Einheiten" );
00167 tmp = "PSFA--option_" + *p + "_unit";
00168 tplPos = searchForm.find( tmp );
00169 if( tplPos < string::npos ) {
00170 searchForm.replace( tplPos, tmp.size(), options );
00171 }
00172 options = "";
00173 result.clear();
00174
00175 read->getFiles( *p, result );
00176 getOptions( result, options, "Dateien" );
00177 tmp = "PSFA--option_" + *p + "_file";
00178 tplPos = searchForm.find( tmp );
00179 if( tplPos < string::npos ) {
00180 searchForm.replace( tplPos, tmp.size(), options );
00181 }
00182 options = "";
00183 result.clear();
00184
00185 read->getUniqueContent( *p, result );
00186 getOptions( result, options, "Inhalte" );
00187 tmp = "PSFA--option_" + *p + "_content";
00188 tplPos = searchForm.find( tmp );
00189 if( tplPos < string::npos ) {
00190 searchForm.replace( tplPos, tmp.size(), options );
00191 }
00192 options = "";
00193 result.clear();
00194 }
00195
00196 string pool("");
00197 string action("");
00198
00199 Cgicc cgi;
00200 const vector< FormEntry > vFormEntries = cgi.getElements();
00201 vector< FormEntry >::const_iterator f;
00202 vector< FormEntry >::const_iterator fEnd = vFormEntries.end();
00203 for ( f = vFormEntries.begin(); f != fEnd; ++f ) {
00204 sVec formSubmit;
00205 splitString( f->getName(), formSubmit, "_" );
00206 if( formSubmit[0] == "submit" ) {
00207 pool = formSubmit[1];
00208 action = formSubmit[2];
00209 }
00210 }
00211
00212 int resCount = 0;
00213 ostringstream resCountStream;
00214 ostringstream resStream;
00215
00216 if( action == "showPools" ) {
00217 printVec( pools, resStream );
00218 resCount = pools.size();
00219 }
00220 else if( action == "tag" ) {
00221 read->getSearchTags( pool, result );
00222 printVec( result, resStream );
00223 resCount = result.size();
00224 }
00225 else if( action == "kontext" ) {
00226 read->getKontextTags( pool, result );
00227 printVec( result, resStream );
00228 resCount = result.size();
00229 }
00230 else if( action == "unit" ) {
00231 read->getUnits( pool, result );
00232 printVec( result, resStream );
00233 resCount = result.size();
00234 }
00235 else if( action == "file" ) {
00236 read->getFiles( pool, result );
00237 printVec( result, resStream );
00238 resCount = result.size();
00239 }
00240 else if( action == "content" ) {
00241 read->getUniqueContent( pool, result );
00242 printVec( result, resStream );
00243 resCount = result.size();
00244 }
00245 else if( action == "entry" ) {
00246 SearchData search;
00247 tmp = "check_" + pool + "_att";
00248 if( cgi.queryCheckbox( tmp ) ) {
00249 search.incAtts = true;
00250 }
00251 tmp = "check_" + pool + "_pos";
00252 if( cgi.queryCheckbox( tmp ) ) {
00253 search.incPosData = true;
00254 }
00255
00256 tmp = "select_" + pool + "_search";
00257 form_iterator fV = cgi[tmp];
00258 if( fV->getValue() != "Such-Tags" ) {
00259 search.searchTag = fV->getValue();
00260 }
00261 tmp = "select_" + pool + "_kontext";
00262 fV = cgi.getElement(tmp);
00263 if( fV->getValue() != "Kontext-Tags" ) {
00264 search.kontextTag = fV->getValue();
00265 }
00266 tmp = "select_" + pool + "_unit";
00267 fV = cgi.getElement(tmp);
00268 if( fV->getValue() != "Einheiten" ) {
00269 search.unit = fV->getValue();
00270 }
00271 tmp = "select_" + pool + "_content";
00272 fV = cgi.getElement(tmp);
00273 if( fV->getValue() != "Inhalte" ) {
00274 search.content = fV->getValue();
00275 }
00276
00277 typedef std::vector< IndexData_SP > iVec;
00278 iVec entries;
00279 IndexData_SP data;
00280
00281 resCount = read->getEntries( pool, search, entries );
00282 resStream << "<table>\n";
00283 iVec::iterator i;
00284 iVec::iterator iEnd = entries.end();
00285 for( i = entries.begin(); i != iEnd; ++i ) {
00286 data = *i;
00287 resStream << "<tr><td> </td><td> </td></tr>\n"
00288 << "<tr>\n"
00289 << "<td>Such-Tag</td>"
00290 << "<td>"
00291 << data->tag
00292 << "</td>"
00293 << "</tr>\n";
00294 if( search.incAtts ) {
00295 if( !data->attributes.empty() ) {
00296 resStream << "<tr>\n"
00297 << "<td>Attribute</td>"
00298 << "<td>\n"
00299 << "<table>\n"
00300 << "<tr><td>Name</td><td>Wert</td></tr>";
00301 psfa::AttMap::iterator a;
00302 psfa::AttMap::iterator aEnd = data->attributes.end();
00303 for( a = data->attributes.begin(); a != aEnd; ++a ) {
00304 resStream << "<tr><td>"
00305 << a->first
00306 << "</td><td>"
00307 << a->second
00308 << "</td></tr>";
00309 }
00310 resStream << "</table>\n"
00311 << "</td>\n"
00312 << "</tr>\n";
00313 }
00314 }
00315 resStream << "<tr>\n"
00316 << "<td>Inhalt</td>"
00317 << "<td>"
00318 << data->content
00319 << "</td>"
00320 << "</tr>\n"
00321 << "<tr>\n"
00322 << "<td>Kontext</td>"
00323 << "<td>"
00324 << data->kontext
00325 << "</td>"
00326 << "</tr>\n"
00327 << "<tr>\n"
00328 << "<td>Einheit</td>"
00329 << "<td>"
00330 << data->unit
00331 << "</td>"
00332 << "</tr>\n"
00333 << "<tr>\n"
00334 << "<td>Datei</td>"
00335 << "<td>"
00336 << data->file
00337 << "</td>"
00338 << "</tr>\n";
00339 if( search.incPosData ) {
00340 resStream << "<tr>\n"
00341 << "<td>Start-Zeile</td>"
00342 << "<td>"
00343 << data->lineStart
00344 << "</td>"
00345 << "</tr>\n"
00346 << "<tr>\n"
00347 << "<td>Start-Kolumne</td>"
00348 << "<td>"
00349 << data->columnStart
00350 << "</td>"
00351 << "</tr>\n"
00352 << "<tr>\n"
00353 << "<td>Stop-Zeile</td>"
00354 << "<td>"
00355 << data->lineStop
00356 << "</td>"
00357 << "</tr>\n"
00358 << "<tr>\n"
00359 << "<td>Stop-Kolumne</td>"
00360 << "<td>"
00361 << data->columnStop
00362 << "</td>"
00363 << "</tr>\n"
00364 << "<tr>\n"
00365 << "<td>Start-Position</td>"
00366 << "<td>"
00367 << data->posStart
00368 << "</td>"
00369 << "</tr>\n"
00370 << "<tr>\n"
00371 << "<td>Stop-Position</td>"
00372 << "<td>"
00373 << data->posEnd
00374 << "</td>"
00375 << "</tr>\n";
00376 }
00377 }
00378 resStream << "</table>\n";
00379 }
00380
00381 resCountStream << resCount;
00382 tmp = "PSFA--count";
00383 tplPos = searchForm.find( tmp );
00384 if( tplPos < string::npos ) {
00385 searchForm.replace( tplPos, tmp.size(), resCountStream.str() );
00386 }
00387
00388 tmp = "PSFA--result";
00389 tplPos = searchForm.find( tmp );
00390 if( tplPos < string::npos ) {
00391 searchForm.replace( tplPos, tmp.size(), resStream.str() );
00392 }
00393
00394 cout << "Content-Type: text/html" << endl
00395 << endl
00396 << searchForm
00397 << endl;
00398
00399 delete read;
00400 return 0;
00401 }
00402
00403