BESKeys.cc

Go to the documentation of this file.
00001 // BESKeys.cc
00002 
00003 // This file is part of bes, A C++ back-end server implementation framework
00004 // for the OPeNDAP Data Access Protocol.
00005 
00006 // Copyright (c) 2004,2005 University Corporation for Atmospheric Research
00007 // Author: Patrick West <pwest@ucar.edu> and Jose Garcia <jgarcia@ucar.edu>
00008 //
00009 // This library is free software; you can redistribute it and/or
00010 // modify it under the terms of the GNU Lesser General Public
00011 // License as published by the Free Software Foundation; either
00012 // version 2.1 of the License, or (at your option) any later version.
00013 // 
00014 // This library is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017 // Lesser General Public License for more details.
00018 // 
00019 // You should have received a copy of the GNU Lesser General Public
00020 // License along with this library; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 //
00023 // You can contact University Corporation for Atmospheric Research at
00024 // 3080 Center Green Drive, Boulder, CO 80301
00025  
00026 // (c) COPYRIGHT University Corporation for Atmospheric Research 2004-2005
00027 // Please read the full copyright statement in the file COPYRIGHT_UCAR.
00028 //
00029 // Authors:
00030 //      pwest       Patrick West <pwest@ucar.edu>
00031 //      jgarcia     Jose Garcia <jgarcia@ucar.edu>
00032 
00033 #include "config.h"
00034 
00035 #ifdef __cplusplus
00036 extern "C" {
00037 #include <sys/types.h>
00038 #include "regex.h"
00039 }
00040 #endif
00041 
00042 #include <cstring>
00043 #include <iostream>
00044 
00045 #if HAVE_UNISTD_H
00046 #include <unistd.h>
00047 #endif
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123 
00124 
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 
00223 
00224 
00225 
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 
00253 
00254 
00255 
00256 
00257 
00258 
00259 
00260 
00261 
00262 
00263 
00264 
00265 
00266 
00267 
00268 
00269 
00270 
00271 
00272 
00273 
00274 
00275 
00276 
00277 
00278 
00279 
00280 
00281 
00282 
00283 
00284 
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 
00315 
00316 
00317 
00318 
00319 
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 
00328 
00329 
00330 
00331 
00332 
00333 
00334 
00335 
00336 
00337 
00338 
00339 
00340 
00341 
00342 
00343 
00344 
00345 
00346 
00347 
00348 
00349 
00350 
00351 
00352 
00353 
00354 
00355 
00356 
00357 
00358 
00359 
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 
00371 
00372 
00373 
00374 
00375 
00376 
00377 
00378 
00379 
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00387 
00388 
00389 
00390 
00391 
00392 
00393 
00394 
00395 
00396 
00397 
00398 
00399 
00400 
00401 
00402 
00403 
00404 
00405 
00406 
00407 
00408 
00409 
00410 
00411 
00412 
00413 
00414 
00415 
00416 
00417 
00418 
00419 
00420 
00421 
00422 
00423 
00424 
00425 
00426 
00427 
00428 
00429 
00430 
00431 
00432 
00433 
00434 
00435 
00436 
00437 
00438 
00439 
00440 
00441 
00442 
00443 
00444 
00445 
00446 
00447 
00448 
00449 
00450 
00451 
00452 
00453 
00454 
00455 
00456 
00457 
00458 
00459 
00460 
00461 
00462 
00463 
00464 
00465 
00466 
00467 
00468 
00469 
00470 
00471 
00472 
00473 
00474 
00475 
00476 
00477 
00478 
00479 
00480 
00481 
00482 
00483 
00484 
00485 
00486 
00487 
00488 
00489 
00490 
00491 
00492 
00493 
00494 
00495 
00496 
00497 
00498 
00499 
00500 
00501 
00502 
00503 
00504 
00505 
00506 
00507 
00508 
00509 
00510 
00511 
00512 
00513 
00514 
00515 
00516 
00517 
00518 
00519 
00520 
00521 
00522 
00523 
00524 
00525 
00526 
00527 
00528 
00529 
00530 
00531 
00532 
00533 
00534 
00535 
00536 
00537 
00538 
00539 
00540 
00541 
00542 
00543 
00544 
00545 
00546 
00547 
00548 
00549 
00550 
00551 
00552 
00553 
00554 
00555 
00556 
00557 
00558 
00559 
00560 
00561 
00562 
00563 
00564 
00565 
00566 
00567 
00568 
00569 
00570 
00571 
00572 
00573 
00574 
00575 
00576 
00577 
00578 
00579 
00580 
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 
00590 
00591 
00592 
00593 
00594 
00595 
00596 
00597 
00598 
00599 
00600 
00601 
00602 
00603 
00604 
00605 
00606 
00607 
00608 
00609 
00610 
00611 
00612 
00613 
00614 
00615 
00616 
00617 
00618 
00619 
00620 
00621 
00622 
00623 
00624 
00625 
00626 
00627 
00628 
00629 
00630 
00631 
00632 
00633 
00634 
00635 
00636 
00637 
00638 
00639 
00640 
00641 
00642 
00643 
00644 
00645 
00646 
00647 
00648 
00649 
00650 
00651 
00652 
00653 
00654 
00655 
00656 
00657 
00658 
00659 
00660 
00661 
00662 
00663 
00664 
00665 
00666 
00667 
00668 
00669 
00670 
00671 
00672 
00673 
00674 
00675 
00676 
00677 
00678 
00679 
00680 
00681 
00682 
00683 
00684 
00685 
00686 
00687 
00688 
00689 
00690 
00691 
00692 
00693 
00694 
00695 
00696 
00697 
00698 
00699 
00700 
00701 
00702 
00703 
00704 
00705 
00706 
00707 
00708 
00709 
00710 
00711 
00712 
00713 
00714 
00715 
00716 
00717 
00718 
00719 
00720 
00721 
00722 
00723 
00724 
00725 
00726 
00727 
00728 
00729 
00730 
00731 
00732 
00733 
00734 
00735 
00736 
00737 
00738 
00739 
00740 
00741 
00742 
00743 
00744 
00745 
00746 
00747 
00748 
00749 
00750 
00751 
00752 
00753 
00754 
00755 
00756 
00757 
00758 
00759 
00760 
00761 
00762 
00763 
00764 
00765 
00766 
00767 
00768 
00769 
00770 
00771 
00772 
00773 
00774 
00775 
00776 
00777 
00778 
00779 
00780 
00781 
00782 
00783 
00784 
00785 
00786 
00787 
00788 
00789 
00790 
00791 
00792 
00793 
00794 
00795 
00796 
00797 
00798 
00799 
00800 
00801 
00802 
00803 
00804 
00805 
00806 
00807 
00808 
00809 
00810 
00811 
00812 
00813 
00814 
00815 
00816 
00817 
00818 
00819 
00820 
00821 
00822 
00823 
00824 
00825 
00826 
00827 
00828 
00829 
00830 
00831 
00832 
00833 
00834 
00835 
00836 
00837 
00838 
00839 
00840 
00841 
00842 
00843 
00844 
00845 
00846 
00847 
00848 
00849 
00850 
00851 
00852 
00853 
00854 
00855 
00856 
00857 
00858 
00859 
00860 
00861 
00862 
00863 
00864 
00865 
00866 
00867 
00868 
00869 
00870 
00871 
00872 
00873 
00874 
00875 
00876 
00877 
00878 
00879 
00880 
00881 
00882 
00883 
00884 
00885 
00886 
00887 
00888 
00889 
00890 
00891 
00892 
00893 
00894 
00895 
00896 
00897 
00898 
00899 
00900 
00901 
00902 
00903 
00904 
00905 
00906 
00907 
00908 
00909 
00910 
00911 
00912 
00913 
00914 
00915 
00916 
00917 
00918 
00919 
00920 
00921 
00922 
00923 
00924 
00925 
00926 
00927 
00928 
00929 
00930 
00931 
00932 
00933 
00934 
00935 
00936 
00937 
00938 
00939 
00940 
00941 
00942 
00943 
00944 
00945 
00946 
00947 
00948 
00949 
00950 
00951 
00952 
00953 
00954 
00955 
00956 
00957 
00958 
00959 
00960 
00961 
00962 
00963 
00964 
00965 
00966 
00967 
00968 
00969 
00970 
00971 
00972 
00973 
00974 
00975 
00976 
00977 
00978 
00979 
00980 
00981 
00982 
00983 
00984 
00985 
00986 
00987 
00988 
00989 
00990 
00991 
00992 
00993 
00994 
00995 
00996 
00997 
00998 
00999 
01000 
01001 
01002 
01003 
01004 
01005 
01006 
01007 
01008 
01009 
01010 
01011 
01012 
01013 
01014 
01015 
01016 
01017 
01018 
01019 
01020 
01021 
01022 
01023 
01024 
01025 
01026 
01027 
01028 
01029 
01030 
01031 
01032 
01033 
01034 
01035 
01036 
01037 
01038 
01039 
01040 
01041 
01042 
01043 
01044 
01045 
01046 
01047 
01048 
01049 
01050 
01051 
01052 
01053 
01054 
01055 
01056 
01057 
01058 
01059 
01060 
01061 
01062 
01063 
01064 
01065 
01066 
01067 
01068 
01069 
01070 
01071 
01072 
01073 
01074 
01075 
01076 
01077 
01078 
01079 
01080 
01081 
01082 
01083 
01084 
01085 
01086 
01087 
01088 
01089 
01090 
01091 
01092 
01093 
01094 
01095 
01096 
01097 
01098 
01099 
01100 
01101 
01102 
01103 
01104 
01105 
01106 
01107 
01108 
01109 
01110 
01111 
01112 
01113 
01114 
01115 
01116 
01117 
01118 
01119 
01120 
01121 
01122 
01123 
01124 
01125 
01126 
01127 
01128 
01129 
01130 
01131 
01132 
01133 
01134 
01135 
01136 
01137 
01138 
01139 
01140 
01141 
01142 
01143 
01144 
01145 
01146 
01147 
01148 
01149 
01150 
01151 
01152 
01153 
01154 
01155 
01156 
01157 
01158 
01159 
01160 
01161 
01162 
01163 
01164 
01165 
01166 
01167 
01168 
01169 
01170 
01171 
01172 
01173 
01174 
01175 
01176 
01177 
01178 
01179 
01180 
01181 
01182 
01183 
01184 
01185 
01186 
01187 
01188 
01189 
01190 
01191 
01192 
01193 
01194 
01195 
01196 
01197 
01198 
01199 
01200 
01201 
01202 
01203 
01204 
01205 
01206 
01207 
01208 
01209 
01210 
01211 
01212 
01213 
01214 
01215 
01216 
01217 
01218 
01219 
01220 
01221 
01222 
01223 
01224 
01225 
01226 
01227 
01228 
01229 
01230 
01231 
01232 
01233 
01234 
01235 
01236 
01237 
01238 
01239 
01240 
01241 
01242 
01243 
01244 
01245 
01246 
01247 
01248 
01249 
01250 
01251 
01252 
01253 
01254 
01255 
01256 
01257 
01258 
01259 
01260 
01261 
01262 
01263 
01264 
01265 
01266 
01267 
01268 
01269 
01270 
01271 
01272 
01273 
01274 
01275 
01276 
01277 
01278 
01279 
01280 
01281 
01282 
01283 
01284 
01285 
01286 
01287 
01288 
01289 
01290 
01291 
01292 
01293 
01294 
01295 
01296 
01297 
01298 
01299 
01300 
01301 
01302 
01303 
01304 
01305 
01306 
01307 
01308 
01309 
01310 
01311 
01312 
01313 
01314 
01315 
01316 
01317 
01318 
01319 
01320 
01321 
01322 
01323 
01324 
01325 
01326 
01327 
01328 
01329 
01330 
01331 
01332 
01333 
01334 
01335 
01336 
01337 
01338 
01339 
01340 
01341 
01342 
01343 
01344 
01345 
01346 
01347 
01348 
01349 
01350 
01351 
01352 
01353 
01354 
01355 
01356 
01357 using std::endl ;
01358 using std::cout ;
01359 
01360 #include "BESKeys.h"
01361 #include "BESInternalFatalError.h"
01362 
01379 BESKeys::BESKeys( const string &keys_file_name )
01380     : _keys_file( 0 ),
01381       _keys_file_name( keys_file_name ),
01382       _the_keys( 0 )
01383 {
01384     _keys_file = new ifstream( _keys_file_name.c_str() ) ;
01385     if( !(*_keys_file) )
01386     {
01387         char path[500] ;
01388         getcwd( path, sizeof( path ) ) ;
01389         string s = string("BES: fatal, can not open initialization file ")
01390                    + _keys_file_name + "\n"
01391                    + "The current working directory is " + path + "\n" ;
01392         throw BESInternalFatalError( s, __FILE__, __LINE__ ) ;
01393     }
01394 
01395     _the_keys = new map<string,string>;
01396     try
01397     {
01398         load_keys();
01399     }
01400     catch(BESInternalFatalError &)
01401     {
01402         clean();
01403         throw;
01404     }
01405     catch(...)
01406     {
01407         clean() ;
01408         string s = (string)"Undefined exception while trying to load keys "
01409                    + "from bes configuration file " + _keys_file_name ;
01410         throw BESInternalFatalError( s, __FILE__, __LINE__ ) ;
01411     }
01412 }
01413 
01416 BESKeys::~BESKeys()
01417 {
01418     clean() ;
01419 }
01420 
01421 void
01422 BESKeys::clean()
01423 {
01424     if( _keys_file )
01425     {
01426         _keys_file->close() ;
01427         delete _keys_file ;
01428     }
01429     if( _the_keys )
01430     {
01431         delete _the_keys ;
01432     }
01433 }
01434 
01435 inline void
01436 BESKeys::load_keys()
01437 {
01438     char buffer[255];
01439     string key,value;
01440     while(!(*_keys_file).eof())
01441     {
01442         if((*_keys_file).getline(buffer,255))
01443         {
01444             if( break_pair( buffer, key, value ) )
01445             {
01446                 (*_the_keys)[key]=value;
01447             }
01448         }
01449     }
01450 }
01451 
01452 inline bool
01453 BESKeys::break_pair(const char* b, string& key, string &value)
01454 {
01455     if((b[0]!='#') && (!only_blanks(b)))//Ignore comments a lines with only spaces
01456     {
01457         register size_t l=strlen(b);
01458         if(l>1)
01459         {
01460             register int how_many_equals=0;
01461             int pos=0;
01462             for (register size_t j=0;j<l;j++)
01463             {
01464                 if(b[j] == '=')
01465                 {
01466                     how_many_equals++;
01467                     pos=j;
01468                 }
01469             }
01470 
01471             if(how_many_equals!=1)
01472             {
01473                 char howmany[256] ;
01474                 sprintf( howmany, "%d", how_many_equals ) ;
01475                 string s = string( "BES: invalid entry " ) + b
01476                            + "; there are " + howmany
01477                            + " = characters.\n";
01478                 throw BESInternalFatalError( s, __FILE__, __LINE__ );
01479             }
01480             else
01481             {
01482                 string s=b;
01483                 key=s.substr(0,pos);
01484                 removeLeadingAndTrailingBlanks( key ) ;
01485                 value=s.substr(pos+1,s.size());
01486                 removeLeadingAndTrailingBlanks( value ) ;
01487 
01488                 return true;
01489             }
01490         }
01491 
01492         return false;
01493     }
01494 
01495     return false;
01496 }
01497 
01498 void
01499 BESKeys::removeLeadingAndTrailingBlanks( string &key )
01500 {
01501     if( !key.empty() )
01502     {
01503         string::size_type first = key.find_first_not_of( "      " ) ;
01504         string::size_type last = key.find_last_not_of( "        " ) ;
01505         if( first == string::npos ) first = 0 ;
01506         if( last == string::npos ) last = key.length() ;
01507         string::size_type num = last - first + 1 ;
01508         key = key.substr( first, num ) ;
01509     }
01510 }
01511 
01512 bool
01513 BESKeys::only_blanks(const char *line)
01514 {
01515     int val;
01516     regex_t rx;
01517     string expr = "[^[:space:]]" ;
01518     val = regcomp( &rx, expr.c_str(), REG_ICASE ) ;
01519 
01520     if( val != 0 )
01521     {
01522         string s = (string)"Regular expression " + expr
01523                    + " did not compile correctly" ;
01524         throw BESInternalFatalError( s, __FILE__, __LINE__ ) ;
01525     }
01526     val = regexec( &rx, line, 0, 0, REG_NOTBOL ) ;
01527     if( val == 0 )
01528     {
01529         regfree( &rx ) ;
01530         return false ;
01531     }
01532     else
01533     {
01534         if( val == REG_NOMATCH )
01535         {
01536             regfree( &rx ) ;
01537             return true ;
01538         }
01539         else if( val == REG_ESPACE )
01540         {
01541             string s = "Execution of regular expression out of space" ;
01542             throw BESInternalFatalError( s, __FILE__, __LINE__ ) ;
01543         }
01544         else
01545         {
01546             string s = "Execution of regular expression has unknown problem" ;
01547             throw BESInternalFatalError( s, __FILE__, __LINE__ ) ;
01548         }
01549     }
01550 }
01551 
01566 string
01567 BESKeys::set_key( const string &key, const string &val )
01568 {
01569     map< string, string >::iterator i ;
01570     i = _the_keys->find( key ) ;
01571     if( i == _the_keys->end() )
01572     {
01573         (*_the_keys)[key] = val ;
01574         return val ;
01575     }
01576     (*i).second = val ;
01577     return val ;
01578 }
01579 
01592 string
01593 BESKeys::set_key( const string &pair )
01594 {
01595     string key ;
01596     string val ;
01597     break_pair( pair.c_str(), key, val ) ;
01598     return set_key( key, val ) ;
01599 }
01600 
01612 string
01613 BESKeys::get_key( const string& s, bool &found ) 
01614 {
01615     map<string,string>::iterator i;
01616     i=_the_keys->find(s);
01617     if(i!=_the_keys->end())
01618     {
01619         found = true ;
01620         return (*i).second;
01621     }
01622     else
01623     {
01624         found = false ;
01625         return "";
01626     }
01627 }
01628 
01635 void
01636 BESKeys::dump( ostream &strm ) const
01637 {
01638     strm << BESIndent::LMarg << "BESKeys::dump - ("
01639                              << (void *)this << ")" << endl ;
01640     BESIndent::Indent() ;
01641     strm << BESIndent::LMarg << "key file:" << _keys_file_name << endl ;
01642     if( _keys_file && *_keys_file )
01643     {
01644         strm << BESIndent::LMarg << "key file is valid" << endl ;
01645     }
01646     else
01647     {
01648         strm << BESIndent::LMarg << "key file is NOT valid" << endl ;
01649     }
01650     if( _the_keys && _the_keys->size() )
01651     {
01652         strm << BESIndent::LMarg << "    keys:" << endl ;
01653         BESIndent::Indent() ;
01654         Keys_citer i = _the_keys->begin() ;
01655         Keys_citer ie = _the_keys->end() ;
01656         for( ; i != ie; i++ )
01657         {
01658             strm << BESIndent::LMarg << (*i).first << ": "
01659                                      << (*i).second << endl ;
01660         }
01661         BESIndent::UnIndent() ;
01662     }
01663     else
01664     {
01665         strm << BESIndent::LMarg << "keys: none" << endl ;
01666     }
01667     BESIndent::UnIndent() ;
01668 }
01669 

Generated on Tue Mar 4 23:13:35 2008 for OPeNDAP Back End Server (BES) by  doxygen 1.5.1