summaryrefslogtreecommitdiff
path: root/DAnCE/tools/Artifact_Installation/Artifact_Installation_Impl.h
blob: 659bf4186dabccad69bec565ecb95e78c9271a4f (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
/**
 * @file Artifact_Installation_Impl.h
 *
 * @author Martin Corino <mcorino@remedy.nl>
 */

#ifndef DANCE_ARTIFACT_INSTALLATION_IMPL_H
#define DANCE_ARTIFACT_INSTALLATION_IMPL_H

#include /**/ "ace/pre.h"

#include /**/ "ace/config-all.h"

#include "ace/Service_Object.h"
#include "ace/Recursive_Thread_Mutex.h"

#include "dance/DAnCE_ArtifactInstallationS.h"
#include "DAnCE_Artifact_Installation_export.h"
#include "DAnCE_Artifact_Installation_Handler.h"
#include <map>
#include <vector>
#include <stack>

namespace DAnCE
  {
    class ArtifactRegistry
      {
        public:
          typedef ACE_MT_SYNCH::CONDITION TCONDITION;
          struct Version
          {
            std::string protocol_;
            std::string location_;
            Version ();
            Version (const std::string& protocol,
                     const std::string& location);
            Version (const Version& version);
            Version& operator =(const Version& version);
          };
          typedef std::vector<Version> TVersions;

          ArtifactRegistry (TCONDITION& condition, bool locked=false);
          ~ArtifactRegistry ();

          const std::string& location () const;

          TVersions& versions ();
          const TVersions& versions () const;

          u_long install_count () const;
          void increment_install_count ();
          void decrement_install_count ();

          void set_locked ();
          void set_unlocked ();
          bool is_locked () const;

          class Guard
            {
              public:
                Guard (ArtifactRegistry* ar);
                ~Guard ();

                ArtifactRegistry* operator ->(void);

                ArtifactRegistry& operator *(void);

                ArtifactRegistry* operator &(void);

              private:
                ArtifactRegistry* arp_;
            };

        private:
          TCONDITION& condition_;
          bool locked_;
          u_long install_count_;
          TVersions  versions_;
      };

    class DAnCE_Artifact_Installation_Export ArtifactInstallation_Impl
      : public POA_DAnCE::ArtifactInstallation
      {
        public:
          typedef ACE_MT_SYNCH::MUTEX TLOCK;
          typedef ACE_MT_SYNCH::CONDITION TCONDITION;
          typedef ArtifactInstallationHandler::TPropertyMap TPropertyMap;

          ArtifactInstallation_Impl ();
          virtual ~ArtifactInstallation_Impl ();

          virtual void initialize ();

          virtual void clear ();

          virtual void install (const char * plan_uuid,
                const ::Deployment::ArtifactDeploymentDescription & artifact);

          virtual void remove (const char * plan_uuid,
                               const char * artifact_name);

          virtual void remove_all (const char * plan_uuid);

          virtual char * get_artifact_location (const char * plan_uuid,
                                                const char * artifact_name);

        private:
          typedef std::stack<std::string> TProtocolStack;

          // key is artifact name
          typedef std::map<std::string,
                           ArtifactRegistry*> TArtifactsMap;
          // key is plan uuid
          typedef std::map<std::string,
                           TArtifactsMap> TArtifactsRegistry;

          ArtifactRegistry* allocate_artifact_registry (const std::string& plan_uuid,
                                                        const std::string& name);

          ArtifactRegistry* lock_artifact_registry (const std::string& plan_uuid,
                                                    const std::string& name);

          void parse_uri (const char* plan_uuid,
                          std::string& location,
                          TProtocolStack& protstack);

          bool install_i (const std::string& plan_uuid,
                          const std::string& protocol,
                          std::string& location,
                          const TPropertyMap& properties);

          void remove_i (const char * plan_uuid,
                         const char * artifact_name,
                         ArtifactRegistry* artifact_reg,
                         bool do_delete = true);

          void remove_intermediates (const std::string& plan_uuid,
                                     const std::string& artifact_name,
                                     ArtifactRegistry& artifact_reg);

          ArtifactRegistry* remove_artifact_registry (const std::string& plan_uuid,
                                                      const std::string& name);

          void remove_artifacts_map (const std::string& plan_uuid,
                                     TArtifactsMap& artifacts_map);

          TArtifactsRegistry artifacts_;
          TLOCK artifacts_lock_;
          TCONDITION artifacts_condition_;

        public:

          static int register_handler (ArtifactInstallationHandler* aih);

          static int deregister_handler (ArtifactInstallationHandler* aih);

          typedef std::map<std::string,
                           ArtifactInstallationHandler*> THandlerMap;

        private:
          static THandlerMap handlers_;
          static TLOCK handler_lock_;
      };
  }

#if defined (__ACE_INLINE__)
#include "Artifact_Installation_Impl.inl"
#endif

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