summaryrefslogtreecommitdiff
path: root/DAnCE/dance/DomainApplication/Domain_Application_Impl.h
blob: 8938c89724caebb993ff14eb2dbadfe79f02c51a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/**========================================================
 *
 * @file   Domain_Application_Impl.h
 *
 * @brief  This file contains the implementation of
 *         the DomainApplication interface.
 *
 * @author Vinzenz Tornow <vt@prismtech.com>
 *========================================================*/

#ifndef DOMAIN_APPLICATION_H
#define DOMAIN_APPLICATION_H
#include /**/ "ace/pre.h"

#include "Domain_Application_Export.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "dance/Deployment/Deployment_DomainApplicationS.h"
#include "dance/Deployment/Deployment_NodeApplicationManagerC.h"
#include "dance/Deployment/Deployment_NodeApplicationManagerS.h"
#include "dance/Deployment/Deployment_NodeManagerC.h"
#include "Completion/CompletionHandler_T.h"
#include "Completion/Completion_Counter_Base.h"
#include "ace/Map_Manager.h"
#include "ace/Refcounted_Auto_Ptr.h"

namespace DAnCE
  {
  class DomainApplication_Impl;

  typedef CompletionHandler<DomainApplication_Impl>  DA_CompletionHandler;

  typedef ACE_Refcounted_Auto_Ptr<DA_CompletionHandler, ACE_Null_Mutex>  DA_CompletionHandler_AutoPtr;

  typedef PortableServer::Servant_var<DomainApplication_Impl> DomainApplication_Impl_var;

  class DA_NAM_ReplyHandlerImpl;
  class DA_NA_ReplyHandlerImpl;

  /**
   * @class DomainApplication_Impl
   *
   * @brief This class implements the DomainApplication interface.
   **/
  class Domain_Application_Export DomainApplication_Impl
        : public virtual POA_Deployment::AMH_DomainApplication
    {
    public:
      typedef ACE_Map_Manager < ::Deployment::NodeApplicationManager_var,
        ::Deployment::NodeManager_var,
        ACE_Null_Mutex > TNam2Nm;
      typedef ACE_Map_Manager<
        ::Deployment::NodeManager_var,
        ACE_CString,
        ACE_Null_Mutex> TNm2Id;
      typedef ACE_Map_Manager < ::Deployment::Application_var,
        ::Deployment::NodeApplicationManager_var,
        ACE_Null_Mutex > TApp2Mgr;
      typedef ACE_Map_Manager < ::Deployment::Application_var,
        ACE_CString,
        ACE_Null_Mutex > TApp2Id;

      DomainApplication_Impl (const char* plan_uuid,
                              PortableServer::POA_ptr poa,
                              TNam2Nm& nams,
                              TNm2Id& node_ids);

      virtual ~DomainApplication_Impl();

      void startLaunch (const ::Deployment::Properties & configProperty,
                        DA_CompletionHandler* dam_handler);

      void destroyApplication (const DA_CompletionHandler_AutoPtr& _ch_ptr);

      void getConnections (::Deployment::Connections& conn);

      const char* getPlanUUID (void);

      /**
      * The second step in launching an application in the
      * domain-level.  If the start parameter is true, the application
      * is started as well.  Raises the StartError exception if
      * launching or starting the application fails.
      */
      virtual void
      finishLaunch (::Deployment::AMH_ApplicationResponseHandler_ptr _tao_rh,
                    const ::Deployment::Connections & connections,
                    CORBA::Boolean start);
      /**
      * Starts the application. Raises the StartError exception if
      * starting the application fails.
      */
      virtual void start (::Deployment::AMH_ApplicationResponseHandler_ptr _tao_rh);

    private:
      friend class DA_NAM_ReplyHandlerImpl;
      friend class DA_NA_ReplyHandlerImpl;

      PortableServer::POA_var poa_;
      ACE_CString planUUID_;
      TApp2Mgr node_applications_;
      TApp2Id app_node_ids_;
      ::Deployment::Connections connections_;
      TNam2Nm & nams_;
      TNm2Id & node_ids_;
    };

  class DA_NAM_ReplyHandlerImpl
        : public POA_Deployment::AMI_NodeApplicationManagerHandler
    {
    public:
      class Counter
          : public Completion_Counter_Base<ACE_Null_Mutex>
        {
        public:
          Counter (unsigned int exec_count,
                   DomainApplication_Impl* da_servant,
                   const DA_CompletionHandler_AutoPtr& dam_completion_handler);

          protected:
            virtual void on_all_completed ();
            virtual void on_all_completed_with_failure ();

          private:
            DomainApplication_Impl_var da_servant_;
            DA_CompletionHandler_AutoPtr dam_ch_ptr_;
        };

      typedef ACE_Refcounted_Auto_Ptr<Counter, ACE_Null_Mutex> Counter_AutoPtr;

      DA_NAM_ReplyHandlerImpl (DomainApplication_Impl* da_servant,
                               ::Deployment::NodeApplicationManager_ptr nam,
                               const char* node_id,
                               const Counter_AutoPtr& counter);

      virtual void startLaunch (
        ::Deployment::Application_ptr ami_return_val,
        const ::Deployment::Connections & providedReference);
      virtual void startLaunch_excep (
        ::Messaging::ExceptionHolder * excep_holder);

      virtual void destroyApplication (void);
      virtual void destroyApplication_excep (
        ::Messaging::ExceptionHolder * excep_holder);

    private:
      DomainApplication_Impl_var da_servant_;
      ACE_CString node_id_;
      ::Deployment::NodeApplicationManager_var nam_;
      Counter_AutoPtr counter_;
    };

  class DA_NA_ReplyHandlerImpl
        : public POA_Deployment::AMI_ApplicationHandler
    {
    public:
      class Counter
          : public Completion_Counter_Base<ACE_Null_Mutex>
        {
        public:
          Counter (unsigned int exec_count,
                  DomainApplication_Impl* da_servant,
                  ::Deployment::AMH_ApplicationResponseHandler_ptr _tao_rh);

          protected:
            virtual void on_all_completed ();
            virtual void on_all_completed_with_failure ();

          private:
            DomainApplication_Impl_var da_servant_;
            ::Deployment::AMH_ApplicationResponseHandler_var da_rh_;
        };

      typedef ACE_Refcounted_Auto_Ptr<Counter, ACE_Null_Mutex> Counter_AutoPtr;

      DA_NA_ReplyHandlerImpl (DomainApplication_Impl* da_servant,
                              const char* node_id,
                              const Counter_AutoPtr& counter);

      virtual void finishLaunch ();
      virtual void finishLaunch_excep (
        ::Messaging::ExceptionHolder * excep_holder);

      virtual void start (void);
      virtual void start_excep (
        ::Messaging::ExceptionHolder * excep_holder);

    private:
      DomainApplication_Impl_var da_servant_;
      ACE_CString node_id_;
      Counter_AutoPtr counter_;
    };

} // DAnCE

#include /**/ "ace/post.h"
#endif // DOMAIN_APPLICATION_H