summaryrefslogtreecommitdiff
path: root/modules/CIAO/DAnCE/ExecutionManager/ExecutionManager_Impl.cpp
blob: 7e40eabf0fbc46c4fcdb8d33d965e2f6048dfdae (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
//--*C++*--
// $Id$

#include "ExecutionManager_Impl.h"
#include "ace/Log_Msg.h"
#include "tools/Config_Handlers/DnC_Dump.h"
#include "DAnCE/Logger/Log_Macros.h"


using namespace DAnCE;

ExecutionManager_Impl::ExecutionManager_Impl (CORBA::ORB_ptr orb,
                                              PortableServer::POA_ptr poa,
                                              CosNaming::NamingContext_ptr nc)
  : orb_ (CORBA::ORB::_duplicate (orb)),
    poa_ (PortableServer::POA::_duplicate (poa)),
    locator_ (orb, nc)
{
  DANCE_TRACE ( "ExecutionManager_Impl::ExecutionManager_Impl");
}

ExecutionManager_Impl::~ExecutionManager_Impl()
{
  DANCE_TRACE ( "ExecutionManager_Impl::~ExecutionManager_Impl");
  for (TDomainManagers::iterator iter = this->managers_.begin();
       iter != this->managers_.end();
       ++iter)
    {
      DANCE_DEBUG ((LM_TRACE, DLINFO ACE_TEXT("ExecutionManager_Impl::~ExecutionManager_Impl - ")
                    ACE_TEXT("deactivating DAM \"%C\"\n"), (*iter).ext_id_.c_str()));
      PortableServer::ObjectId_var id = this->poa_->servant_to_id ( (*iter).int_id_);
      DANCE_DEBUG ((LM_TRACE, DLINFO ACE_TEXT("ExecutionManager_Impl::~ExecutionManager_Impl - ")
                    ACE_TEXT("before deactivate_object...\n")));
      this->poa_->deactivate_object (id.in());
      DANCE_DEBUG ((LM_TRACE, DLINFO ACE_TEXT("ExecutionManager_Impl::~ExecutionManager_Impl - ")
                    ACE_TEXT("deleting DomainApplicationManager\n")));
      delete (*iter).int_id_;
      DANCE_DEBUG ((LM_TRACE, DLINFO ACE_TEXT("ExecutionManager_Impl::~ExecutionManager_Impl - ")
                    ACE_TEXT("DomainApplicationManager deleted\n")));
    }
}

::Deployment::DomainApplicationManager_ptr
ExecutionManager_Impl::preparePlan (const ::Deployment::DeploymentPlan & plan,
                                    ::Deployment::ResourceCommitmentManager_ptr /*resourceCommitment*/)
{
  DANCE_TRACE ( "ExecutionManager_Impl::preparePlan");

  // Check if plan is already deployed.
  DomainApplicationManager_Impl * dam = 0;
  if (0 == this->managers_.find (plan.UUID.in(), dam))
    {
      DANCE_DEBUG((LM_NOTICE, DLINFO ACE_TEXT("ExecutionManager_Impl::preparePlan - ")
                   ACE_TEXT("DomainApplicationManager with specified UUID already exists\n")));
      // Should we return on this situation reference on existed DomainApplicationManager or
      // we should throw PlanError exception?
      CORBA::Object_var ref = this->poa_->servant_to_reference (dam);
      return Deployment::DomainApplicationManager::_narrow (ref.in ());
    }

  DomainApplicationManager_Impl* dam_servant = 0;
  ACE_NEW_THROW_EX (dam_servant,
                    DAnCE::DomainApplicationManager_Impl (this->orb_.in (),
                                                          this->poa_.in (),
                                                          plan,
                                                          this->locator_),
                    CORBA::NO_MEMORY ());
  this->managers_.rebind (plan.UUID.in(), dam_servant);
  DANCE_DEBUG((LM_TRACE, DLINFO ACE_TEXT("ExecutionManager_Impl::preparePlan - ")
               ACE_TEXT("Domain Application Manager was successfully created.\n")));

  PortableServer::ObjectId_var id = this->poa_->activate_object (dam_servant);

  DANCE_DEBUG((LM_NOTICE, DLINFO ACE_TEXT("ExecutionManager_Impl::preparePlan - ")
               ACE_TEXT("Plan with UUID %C was successfully prepared.\n"),
                        plan.UUID.in ()));

  CORBA::Object_var ref = this->poa_->id_to_reference (id.in());
  return Deployment::DomainApplicationManager::_narrow (ref.in ());
}

::Deployment::DomainApplicationManagers *
ExecutionManager_Impl::getManagers ()
{
  DANCE_TRACE ( "ExecutionManager_Impl::getManagers ()");

  ::Deployment::DomainApplicationManagers * managers = 0;
  ACE_NEW_THROW_EX (managers,
                    ::Deployment::DomainApplicationManagers(),
                    CORBA::NO_MEMORY());

  managers->length (this->managers_.current_size());
  unsigned int index = 0;
  for (TDomainManagers::iterator iter = this->managers_.begin();
       iter != this->managers_.end();
       ++iter)
    {
      CORBA::Object_var ref = this->poa_->servant_to_reference ( (*iter).int_id_);
      (*managers) [index]
      = Deployment::DomainApplicationManager::_narrow (ref.in ());
      ++index;
    }

  return managers;
}

void
ExecutionManager_Impl::destroyManager (::Deployment::DomainApplicationManager_ptr appManager)
{
  DANCE_DEBUG((LM_DEBUG, DLINFO ACE_TEXT("ExecutionManager_Impl::destroyManager - started\n")));

  for (TDomainManagers::iterator iter = this->managers_.begin();
       iter != this->managers_.end();
       ++iter)
    {
      CORBA::Object_var app = this->poa_->servant_to_reference ( (*iter).int_id_);
      if (appManager->_is_equivalent (app.in ()))
        {
          this->managers_.unbind ( (*iter).ext_id_);
          PortableServer::ObjectId_var id = this->poa_->reference_to_id (appManager);
          this->poa_->deactivate_object (id.in());
          DANCE_DEBUG((LM_INFO, DLINFO ACE_TEXT("ExecutionManager_Impl::destroyManager - deleting DomainApplicationManager\n")));
          delete (*iter).int_id_;
          (*iter).int_id_ = 0;
          DANCE_DEBUG((LM_INFO, DLINFO ACE_TEXT("ExecutionManager_Impl::destroyManager - DomainApplicationManager deleted\n")));
          //this->managers_.unbind ( (*iter).ext_id_);
          DANCE_DEBUG((LM_INFO, DLINFO ACE_TEXT("ExecutionManager_Impl::destroyManager - finished\n")));
          return;
        }
    }
  DANCE_ERROR ((LM_ERROR, DLINFO ACE_TEXT("ExecutionManager_Impl::destroyManager - ")
                 ACE_TEXT("corresponding DomainApplicationManager cannot be found\n")));
  throw ::Deployment::StopError();
}

// This one derived from ExecutionManagerDaemon interface
// for shutdowning DAnCE agent
void
ExecutionManager_Impl::shutdown ()
{
  DANCE_TRACE ("ExecutionManager_Impl::shutdown");
  this->orb_->shutdown();
}


void
ExecutionManager_Impl::add_node_manager (const ACE_TCHAR *name,
                                         const ACE_TCHAR *ior)
{
  DANCE_TRACE ("ExecutionManager_Impl::add_node_manager");
  this->locator_.store_ior (name, ior);
}

void
ExecutionManager_Impl::load_node_map (const ACE_TCHAR *filename)
{
  DANCE_TRACE ("ExecutionManager_Impl::add_node_manager");
  this->locator_.process_node_map (filename);
}