summaryrefslogtreecommitdiffstats
path: root/tags/cpp-1.0-incubating-M2-RC1/sca/runtime/core/src/tuscany/sca/model/Composite.h
blob: 3e9fdfa8326bcba7f1c92e6c459306ed26b10b1b (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
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 *   
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/* $Rev$ $Date$ */

#ifndef tuscany_sca_model_composite_h
#define tuscany_sca_model_composite_h

#include "tuscany/sca/export.h"
#include <string>
using std::string;

#include <map>
using std::map;
#include <vector>
using std::vector;

#include "commonj/sdo/SDO.h"

#include "tuscany/sca/model/ComponentType.h"


namespace tuscany
{
    namespace sca
    {

        namespace model
        {
            class Component;
            class ComponentType;
            class Service;
            class WSDLDefinition;
            class Wire;
            
            /**
             * Represents a composite.
             * A composite is used to assemble SCA elements in logical groupings.
             * It is the basic unit of composition within an SCA System. An SCA composite contains a
             * set of components, services, references and the wires that interconnect them, plus a set
             * of properties which can be used to configure components.
             */
            class Composite : public ComponentType
            {
            public:

                /**
                 * Constructor.
                 * @param name the name of the composite.
                 * @param root the root of the composite in the file system.
                 */
                SCA_API Composite(const string& name, const string& root);

                /**
                 * Destructor.
                 */
                SCA_API virtual ~Composite();

                /**
                 * Returns the root directory of the composite.
                 * @return The root of the composite in the file system.
                 */
                SCA_API const string& getRoot() const { return root; }
                
                /**
                 * Add a new component to the composite.
                 * @param component The component to add.
                 */
                SCA_API void addComponent(Component* component);

                /**
                 * Add/include a composite in this composite.
                 * @param composite The composite included in this composite.
                 */
                SCA_API void addInclude(Composite* composite);

                /**
                 * Add a wire to the model.
                 * @param source The source location. Either the source component and
                 * reference (optional), or an entry point.
                 * @param target The target location. Either the target component and
                 * service (optional), or an external service.
                 */
                SCA_API void addWire(const string& source, const string& target);
 
                /**
                 * Find a component by name.
                 * @param componentName The name of the component to be found.
                 * @return The component that was found, or 0 if not found.
                 */
                SCA_API Component* findComponent(const string& componentName);

                /**
                 * Find a component and service by name.
                 * @param componentServiceName A string of the form 
                 * "componentName"/"serviceName" where the service name is optional
                 * if there is only one service on the component.
                 * @return The Service that was found, or 0 if not found.
                 */
                SCA_API Service* findComponentService(const string& componentServiceName);

                /**
                 * Add a WSDL definition to the composite.
                 * @param wsdlModel A data object holding all the information about 
                 * the WSDL definition from a WSDL file.
                 */
                SCA_API void addWSDLDefinition(commonj::sdo::DataObjectPtr wsdlModel);

                /**
                 * Find a WSDL definition by target namespace.
                 * @param wsdlNamespace The namespace of the WSDL definitions to find.
                 */
                SCA_API WSDLDefinition* findWSDLDefinition(const string& wsdlNamespace);

                /**
                 * Return a cached SDO XSDHelper.
                 */
                SCA_API commonj::sdo::XSDHelperPtr getXSDHelper(void);

                /**
                 * Return a cached SDO XMLHelper.
                 */
                SCA_API commonj::sdo::XMLHelperPtr getXMLHelper(void);

                /**
                 * Return a data factory which has all the types defined in XSDs and
                 * WSDL files configured for this composite.
                 * @return The data factory for this composite.
                 */
                SCA_API commonj::sdo::DataFactoryPtr getDataFactory(void);

                /**
                 * Work through the list of wires and connect the source and target uris.
                 */
                SCA_API void resolveWires();
 
            private:

                /**
                 * Directory of the root of the composite.
                 */
                string root;

                /**
                 * Cached XSDHelper.
                 */
                commonj::sdo::XSDHelperPtr xsdHelper;

                /**
                 * Cached XMLHelper.
                 */
                commonj::sdo::XMLHelperPtr xmlHelper;

                /**
                 * Map (by name) of all the components in this composite.
                 */
                typedef map<string, Component*> COMPONENT_MAP;
                COMPONENT_MAP components;

                /**
                 * Vector of all the composites included in this composite.
                 */
                typedef vector<Composite*> INCLUDES;
                INCLUDES includes;

                /**
                 * Vector of all the wires in this composite.
                 */
                typedef vector<Wire*> WIRES;
                WIRES wires;

                /**
                 * Map by namespace of all the wsdl definitions in this composite.
                 */
                typedef map<string, WSDLDefinition*> WSDL_MAP;
                WSDL_MAP wsdlDefinitions;
            };

        } // End namespace model
    } // End namespace sca
} // End namespace tuscany

#endif // tuscany_sca_model_composite_h