00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _REQUESTHANDLER_H_
00031 #define _REQUESTHANDLER_H_
00032
00033
00034
00035
00036 #include <set>
00037
00038
00039
00040
00041 #include "osbid.h"
00042 #include "statusrequest.h"
00043
00044
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;
00061 };
00062
00063
00064
00065 namespace OSB_LIB {
00066
00067
00068
00069 struct RequestLinkInfo;
00070 struct RequestLinks;
00071
00072
00073
00074
00075
00076
00089 class RequestHandler {
00090 public:
00092 enum Result {
00094 resOk = 0,
00096 resProcessed,
00103 resSkipped,
00105 resError
00106 };
00107
00108
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:
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:
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 };
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 };
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 };
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
00420 Entries entries_;
00421 };
00422 }
00423
00424
00425
00426 namespace OSB_LIB {
00427 }
00428 #endif // #ifndef _REQUESTHANDLER_H_