root/branches/Carsten_PtrWork2/Tools/fcd2code/FieldContainer.py

Revision 1070, 10.9 kB (checked in by cneumann, 10 months ago)

removed: FieldBundle? (createLocal replacement NIY)
changed: new RefCountPointer? implementation from Gerrits OpenSG.merge git

temporarily removed global pointer
preparation for external ref count removal

This is WIP but the unit tests all still pass.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1
2 import logging;
3
4 from FCDElement import FCDElement;
5
6 class FieldContainer(FCDElement):
7     """Represents a <Field/> element from a .fcd file.
8     """
9
10     def __init__(self):
11         super(FieldContainer, self).__init__();
12         self.m_log    = logging.getLogger("FieldContainer");
13         self.m_fields = [];
14        
15         self.initFCDDict();
16    
17     def initFCDDict(self):
18         """Sets the fcd dictionary to default values.
19         """
20         self.setFCD("name",                   "");
21         self.setFCD("parent",                 "");
22         self.setFCD("mixinparent",            "");
23         self.setFCD("library",                "");
24         self.setFCD("pointerfieldtypes",      "");
25         self.setFCD("structure",              "");
26         self.setFCD("systemcomponent",        "true");
27         self.setFCD("parentsystemcomponent""true");
28         self.setFCD("decoratable",            "false");
29         self.setFCD("useLocalIncludes",       "false");
30         self.setFCD("isNodeCore",             "false");
31         self.setFCD("isBundle",               "false");
32         self.setFCD("description",            "");
33         self.setFCD("group",                  "");
34         self.setFCD("namespace",              "");
35         self.setFCD("decorateeFieldFlags",    "");
36         self.setFCD("additionalIncludes",     "");
37         self.setFCD("fcdFileLines",           []);
38         self.setFCD("fieldsUnmarkedOnCreate", "0")
39         self.setFCD("libnamespace",           "OSG")
40
41     #
42     # Access fields
43     
44     def addField(self, field):
45         idx = len(self.m_fields);
46         field.setFieldContainer(self);
47         self.m_fields.append(field);
48         return idx;
49    
50     #
51     # Common tests
52     
53     def isSystemComponent(self):
54         return self["isSystemComponent"];
55    
56     def isDecoratable(self):
57         return self["isDecoratable"];
58    
59     def setupFieldContainer(self):
60         self["Classname"]   = self.getFCD("name");
61         self["CLASSNAME"]   = self.getFCD("name").upper();
62         self["Parent"]      = self.getFCD("parent");
63         self["isDecorator"] = False;
64    
65     def setupDecorator(self):
66         self["Classname"]   = self.getFCD("name") + "Decorator";
67         self["CLASSNAME"]   = self.getFCD("name").upper() + "DECORATOR";
68         self["Parent"]      = self.getFCD("name");
69         self["isDecorator"] = True;
70    
71     def finalize(self):
72         if len(self.m_fields) > 0:
73             self["hasFields"] = True;
74         else:
75             self["hasFields"] = False;
76        
77         if self.getFCD("library") != "":
78             self["isInLibrary"] = True;
79             self["Libname"]     = self.getFCD("library");
80             self["LIBNAME"]     = self.getFCD("library").upper();
81         else:
82             if self.getFCD("systemcomponent") == "true":
83                 self.m_log.error("finalize: \"library\" not set for a systemcomponent.");
84                 self["isInLibrary"] = True;
85                 self["Libname"]     = "<UNDEF>";
86                 self["LIBNAME"]     = "<UNDEF>";
87             else:
88                 self["isInLibrary"] = False;
89                 self["Libname"]     = None;
90                 self["LIBNAME"]     = None;
91        
92         if self.getFCD("name") != "":
93             self["Classname"] = self.getFCD("name");
94             self["CLASSNAME"] = self.getFCD("name").upper();
95         else:
96             self.m_log.error("finalize: \"name\" has no valid value.");
97             self["Classname"] = "<UNDEF>";
98             self["CLASSNAME"] = "<UNDEF>";
99        
100         if self.getFCD("parent") != "":
101             self["Parent"] = self.getFCD("parent");
102         else:
103             self.m_log.error("finalize: \"parent\" has no valid value.");
104             self["Parent"] = "<UNDEF>";
105
106         if self.getFCD("mixinparent") != "":
107             self["MixinParent"] = self.getFCD("mixinparent");
108             self["hasMixinParent"] = True
109         else:
110             self["MixinParent"] = ""
111             self["hasMixinParent"] = False
112        
113        
114         if self.getFCD("decoratable") == "true":
115             self["isDecoratable"] = True;
116         else:
117             self["isDecoratable"] = False;
118        
119         if self.getFCD("isBundle") == "true":
120             self["isBundle"] = True;
121         else:
122             self["isBundle"] = False;
123            
124         if self.getFCD("systemcomponent") == "true":
125             self["isSystemComponent"] = True;
126         else:
127             self["isSystemComponent"] = False;
128        
129         if self.getFCD("structure") == "concrete":
130             self["isAbstract"] = False;
131         elif self.getFCD("structure") == "abstract":
132             self["isAbstract"] = True;
133         else:
134             self.m_log.warning("finalize: \"structure\" has no valid value.");
135        
136         if ((self.getFCD("parentsystemcomponent") == "true") and
137             (self.getFCD("systemcomponent")       == "false")   ):
138             self["ParentHeaderPrefix"] = "OpenSG/";
139         else:
140             self["ParentHeaderPrefix"] = "";
141        
142         if self.getFCD("systemcomponent") == "false":
143             self["HeaderPrefix"] = "OpenSG/";
144         else:
145             self["HeaderPrefix"] = "";
146        
147         if self.getFCD("description").strip() == "":
148             self["Description"]     = "";
149             self["SafeDescription"] = "\"\"";
150         else:
151             self["Description"]     = self._formatString    (self.getFCD("description"), 4)
152             self["SafeDescription"] = self._formatSafeString(self.getFCD("description"), 4)
153        
154         self["hasPrivateFields"]   = False;
155         self["hasProtectedFields"] = False;
156         self["hasPublicFields"]    = False;
157         self["hasPtrFields"]       = False;
158         self["hasParentPtrFields"] = False;
159         self["hasChildPtrFields"]  = False;
160        
161         self["Fields"]  = [];
162         self["SFields"] = [];
163         self["MFields"] = [];
164
165         self["hasValueMField"] = False;
166        
167         for i, field in enumerate(self.m_fields):
168            
169             field.finalize();
170            
171             if i == 0:
172                 field["prevField"]    = None;
173                 field["isFirstField"] = True;
174             else:
175                 field["prevField"]    = self.m_fields[i - 1];
176                 field["isFirstField"] = False;
177            
178             if i == len(self.m_fields) - 1:
179                 field["Separator"]   = "";
180                 field["nextField"]   = None;
181                 field["isLastField"] = True;
182             else:
183                 field["Separator"]   = ",";
184                 field["nextField"]   = self.m_fields[i + 1];
185                 field["isLastField"] = False;
186            
187             self["Fields"].append(field);
188            
189             if field["access"] == "private":
190                 self["hasPrivateFields"] = True;
191                
192             if field["access"] == "protected":
193                 self["hasProtectedFields"] = True;
194            
195             if field["access"] == "public":
196                 self["hasPublicFields"] = True;
197            
198             if field["category"] == "pointer":
199                 self["hasPtrFields"] = True;
200            
201             if field["category"] == "pointer" and field["pointertype"] == "parent":
202                 self["hasParentPtrFields"] = True;
203                
204             if field["category"] == "pointer" and field["pointertype"] == "child":
205                 self["hasChildPtrFields"] = True;
206                
207             if field["isSField"]:
208                 self["SFields"].append(field);
209            
210             if field["isMField"]:
211                 self["MFields"].append(field);
212
213                 if field["category"] != "pointer":
214                     self["hasValueMField"] = True;
215        
216         self["PointerField"]   = False;
217         self["SFPointerField"] = False;
218         self["MFPointerField"] = False;
219        
220         if self.getFCD("pointerfieldtypes") == "both":
221             self["PointerField"]   = True;
222             self["SFPointerField"] = True;
223             self["MFPointerField"] = True;
224         elif self.getFCD("pointerfieldtypes") == "single":
225             self["PointerField"]   = True;
226             self["SFPointerField"] = True;
227         elif self.getFCD("pointerfieldtypes") == "multi":
228             self["PointerField"]   = True;
229             self["MFPointerField"] = True;
230        
231         self["MethodType"]  = "";
232        
233         if self.getFCD("decoratable") == "true":
234             self["MethodType"] = "virtual";
235
236         if self.getFCD("group") != "":
237             self["Group"] = self.getFCD("group");
238         else:
239             if self["CLASSNAME"]     .endswith("ATTACHMENT") == True or \
240                self["Parent"].upper().endswith("ATTACHMENT") == True:
241                 self["Group"] = self["Classname"]
242             else:
243                 self["Group"] = "NULL";
244
245         if self.getFCD("namespace") != "":
246             self["Namespace"] = self.getFCD("namespace");
247         else:
248             self["Namespace"] = "0";
249
250         if self.getFCD("libnamespace") != "":
251             self["LibNamespace"] = self.getFCD("libnamespace");
252         else:
253             self["LibNamespace"] = "OSG";
254
255         self["FieldsUnmarkedOnCreate"] = self.getFCD("fieldsUnmarkedOnCreate");   
256
257         decorateeFieldFlags = self.getFCD("decorateeFieldFlags");
258         if decorateeFieldFlags == "":
259             self["DecorateeFieldFlags"] = "Field::SFDefaultFlags";
260         else:
261             dffList  = decorateeFieldFlags.split(",");
262             numFlags = len(dffList);
263             decorateeFieldFlags = "(";
264            
265             for i, flag in enumerate(dffList):
266                 flag = flag.strip();
267                
268                 if (i == 0) and (i != numFlags - 1):
269                     decorateeFieldFlags = decorateeFieldFlags + "Field::" + flag + " |";
270                     continue;
271                
272                 if i == numFlags - 1:
273                     if i == 0:
274                         decorateeFieldFlags = decorateeFieldFlags + "Field::" + flag;
275                     else:
276                         decorateeFieldFlags = decorateeFieldFlags + " Field::" + flag;
277                     continue;
278                
279                 decorateeFieldFlags = decorateeFieldFlags + " Field::" + flag + " |";
280             decorateeFieldFlags = decorateeFieldFlags + ")";
281             self["DecorateeFieldFlags"] = decorateeFieldFlags;
282        
283         includesList = self.getFCD("additionalIncludes").split(",");
284         self["AdditionalIncludes"] = [];
285         for include in includesList:
286             include = include.strip();
287             if include != "":
288                 self["AdditionalIncludes"].append(include);
289
290     def setFCDContents(self, fcdContents):
291         self.setFCD("fcdFileLines", fcdContents);
292         if fcdContents == []:
293             self["Fcdxml"] = "\"\"";
294         else:
295             self["Fcdxml"] = self._formatXML(fcdContents, 4);
296    
297     def _dumpValues(self):
298         self.m_log.info("FieldContainer dumpValues:");
299         super(FieldContainer, self)._dumpValues(self.m_log);
300        
301         for field in self.m_fields:
302             field._dumpValues();
303    
Note: See TracBrowser for help on using the browser.