requesthandler.h

Go to the documentation of this file.
00001 // OSB library ************************************************ -*- C++ -*-
00006 /*
00007   AUTHOR(S): Stephan Broennimann (vb)
00008 
00009   RCS information
00010    $Name: OSB_060808 $
00011    $Revision: 1.24 $
00012 
00013   License
00014    OSB rating and billing library for communication networks
00015    Copyright (C) 2004, 2005, 2006  OSB systems
00016 
00017    This file may be distributed and/or modify under the terms of the
00018    GNU General Public License (GPL) as published by the Free Software
00019    Foundation which is provided in the file LICENSE.GPL included in the
00020    packaging of this file.
00021 
00022    The file is distributed in the hope that it will be useful, but WITHOUT
00023    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00024    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
00025    for more details.
00026 
00027    Holders of a OSB Commercial License may use this file under the terms
00028    and conditions of this commercial license.
00029  */
00030 #ifndef _REQUESTHANDLER_H_
00031 #define _REQUESTHANDLER_H_
00032 
00033 // ************************************************************************
00034 // included header files
00035 // + standard includes
00036 #include <set>
00037 
00038 // + libraries
00039 
00040 // + local headers
00041 #include "osbid.h"
00042 #include "statusrequest.h"
00043 
00044 // + class declarations
00045 namespace OSB_DB {
00046     class Session;
00047 }
00048 
00049 namespace OSB_LIB {
00050     class AnCList;
00051     class Associate;
00052     class Contract;
00053     class OsbErrors;
00054     class PersProduct;
00055     class PersProductNode;
00056     class ProductNode;
00057 }
00058 
00059 namespace {
00060     struct LockList;                    // in requesthandler.cc only
00061 };
00062 
00063 // ************************************************************************
00064 // namespace extensions
00065 namespace OSB_LIB {
00066 
00067 // ************************************************************************
00068 // forward declarations
00069     struct RequestLinkInfo;
00070     struct RequestLinks;
00071 
00072 // ************************************************************************
00073 // type definitions
00074 
00075 // ************************************************************************
00076 // class definitions
00089     class RequestHandler {
00090     public:
00092         enum Result {
00094             resOk       = 0,
00096             resProcessed,
00103             resSkipped,
00105             resError
00106         };
00107 
00108         // defined below
00109         class Tracker;
00110 
00111     public:
00113         explicit RequestHandler(
00114             AnCList* ancList = 0
00115         );
00116 
00118         ~RequestHandler();
00119 
00120     private:
00122         RequestHandler(const RequestHandler&);
00124         RequestHandler& operator=(const RequestHandler&);
00125 
00126     public:
00128 
00129 
00145         Result process(
00146             const OSB_DB::Session& session,
00147                   StatusRequest&   request,
00148                   OsbErrors&       errors,
00149                   Tracker*         tracker = 0
00150         );
00151 
00160         bool delRequest(
00161             const OSB_DB::Session&   session,
00162             const Id<StatusRequest>& srqId
00163         );
00165 
00166     private:                            // 1st level support for process
00168         Result lockRequest(
00169             const OSB_DB::Session& session,
00170                   StatusRequest&   request
00171         );
00172 
00174         Result checkEntities(
00175             const StatusRequest& request,
00176                   OsbErrors&     errors
00177         );
00179         Result setPrefStatus(
00180             const OSB_DB::Session& session,
00181                   StatusRequest&   request,
00182                   OsbErrors&       errors,
00183                   Tracker*         tracker
00184         );
00185 
00187         Result changeStatus(
00188             const OSB_DB::Session& session,
00189                   StatusRequest&   request,
00190                   OsbErrors&       errors,
00191                   Tracker*         tracker
00192         );
00193 
00204         void finalizeRequest(
00205             const OSB_DB::Session& session,
00206             const Result           result,
00207                   StatusRequest&   request,
00208                   OsbErrors&       errors
00209         );
00210 
00211     private:                            // utils for 1st level functions
00213         Associate& lockAs(
00214             const OSB_DB::Session& session,
00215                   Id<Associate>    asId,
00216                   bool             lockParent
00217         );
00219         Contract& lockCo(
00220             const OSB_DB::Session& session,
00221                   Id<Contract>     coId,
00222                   bool             lockParent
00223         );
00225         PersProduct& lockPp(
00226             const OSB_DB::Session& session,
00227                   Id<PersProduct>  ppId,
00228                   bool             lockParent
00229         );
00230 
00232         Result setAsPrefStatus(
00233             const OSB_DB::Session& session,
00234                   Associate&       as,
00235                   StatusRequest&   request,
00236                   OsbErrors&       errors
00237         );
00239         Result setCoPrefStatus(
00240             const OSB_DB::Session& session,
00241                   Contract&        co,
00242                   StatusRequest&   request,
00243                   OsbErrors&       errors
00244         );
00246         Result setPpPrefStatus(
00247             const OSB_DB::Session& session,
00248                   PersProduct&     pp,
00249                   StatusRequest&   request,
00250                   OsbErrors&       errors
00251         );
00253         Result setPpnPrefStatus(
00254             const OSB_DB::Session& session,
00255                   PersProduct&     pp,
00256             const Id<ProductNode>& pnId,
00257                   StatusRequest&   request,
00258                   OsbErrors&       errors
00259         );
00260 
00262         bool changeAsStatus(
00263             const OSB_DB::Session& session,
00264                   Associate&       assoc,
00265                   StatusRequest&   request,
00266                   OsbErrors&       errors
00267         );
00268 
00270         bool changeCoStatus(
00271             const OSB_DB::Session& session,
00272                   Contract&        co,
00273                   StatusRequest&   request,
00274                   OsbErrors&       errors
00275         );
00276 
00278         bool changePpStatus(
00279             const OSB_DB::Session& session,
00280                   PersProduct&     pp,
00281                   StatusRequest&   request,
00282                   OsbErrors&       errors
00283         );
00284 
00286         bool changePpnStatus(
00287             const OSB_DB::Session& session,
00288                   PersProduct&     pp,
00289             const Id<ProductNode>& pnId,
00290                   StatusRequest&   request,
00291                   OsbErrors&       errors
00292         );
00293 
00294     private:
00296         AnCList* ancList_;
00298         bool ownAncList_;
00300         RequestLinks* rqLinks_;
00302         LockList* locks_;
00303     };                                  // class RequestHandler
00304 
00312     struct RequestHandler::Tracker {
00313     public:
00315         enum Stage {
00317             setPref,
00319             chngStatus,
00320         };
00321     public:
00323         Tracker();
00325         virtual ~Tracker();
00326     protected:
00328         Tracker(const Tracker& rhs);
00330         Tracker& operator=(const Tracker& rhs);
00331     public:
00339         virtual void entityStart(
00340             const Stage            stage,
00341             const StatusRequest&   request,
00342             const RequestLinkInfo& info
00343         ) = 0;
00344 
00353         virtual void entityEnd(
00354             const Stage            stage,
00355             const StatusRequest&   request,
00356             const RequestLinkInfo& info,
00357                   Result           result
00358         ) = 0;
00359     };                                  // class RequestHandler::Tracker
00360 
00362     struct RequestLinkInfo {
00364         Id<Associate>        asId_;
00366         Id<Contract>         coId_;
00368         Id<PersProduct>      ppId_;
00370         Id2<PersProductNode> ppnId_;
00372         StatusRequest::Cascade cascade_;
00373     public:
00379         RequestLinkInfo();
00381         bool operator<(const RequestLinkInfo& rhs) const;
00382     };                                  // struct RequestLinkInfo
00383 
00385     struct RequestLinks {
00387         typedef std::set<RequestLinkInfo> Entries;
00389         typedef Entries::const_iterator ConstIter;
00390 
00392         ConstIter begin() const;
00394         ConstIter end() const;
00396         void clear();
00397 
00399         void addAs(
00400             const Id<Associate>&         asId,
00401                   StatusRequest::Cascade cscd
00402         );
00404         void addCo(
00405             const Id<Contract>&          coId,
00406                   StatusRequest::Cascade cscd
00407         );
00409         void addPp(
00410             const Id<PersProduct>&       ppId,
00411                   StatusRequest::Cascade cscd
00412         );
00414         void addPpn(
00415             const Id2<PersProductNode>&  ppnId,
00416                   StatusRequest::Cascade cscd
00417         );
00418 
00419         // Container with all entries.
00420         Entries entries_;
00421     };                                  // struct RequestLinks
00422 }                                       // namespace OSB_LIB
00423 
00424 // ************************************************************************
00425 // inline definitions
00426 namespace OSB_LIB {
00427 }                                       // namespace OSB_LIB
00428 #endif                                  // #ifndef _REQUESTHANDLER_H_

Generated on Sat Sep 2 14:06:34 2006 for OSB Library by  doxygen 1.4.7