]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeNode.cpp
*** empty log message ***
[creaImageIO.git] / src2 / creaImageIOTreeNode.cpp
1 #include <creaImageIOTreeNode.h>
2 #include <creaImageIOTree.h>
3 #include <creaImageIOSystem.h>
4 #include <algorithm>
5
6 namespace creaImageIO
7 {
8   namespace tree
9   {
10
11     //=============================================================
12     /// Ctor with parent
13     Node::Node(Node* parent)
14       : mParent(parent),
15         mData(0),
16         mChildrenLoaded(false)
17     {
18       if (parent) 
19         {
20           GimmickMessage(5,"Default Node constructor (level "<<GetLevel()<<")"
21                          << std::endl);
22           // Insert into parent's children list
23           parent->GetChildrenList().push_back(this);
24           InitializeAttributeMap();
25         }
26       else
27         {
28           GimmickMessage(5,"Default Node constructor without parent"    
29                          << std::endl);
30         }
31     }
32     //=============================================================
33
34     //=============================================================
35     /// Ctor with parent and attributes map 
36     Node::Node(Node* parent, const AttributeMapType& attr)
37      : mParent(parent),
38         mData(0),
39         mChildrenLoaded(false)
40     {
41       GimmickMessage(5,"Node constructor (level "<<GetLevel()<<")"
42                      << std::endl);
43      if (parent) 
44         {
45           // Insert into parent's children list
46           parent->GetChildrenList().push_back(this);
47           // Initialize attributes
48           LevelDescriptor::AttributeDescriptorListType::const_iterator a;
49           for (a = GetTree()->GetAttributeDescriptorList(GetLevel()).begin();
50                a!= GetTree()->GetAttributeDescriptorList(GetLevel()).end();
51                ++a)
52             {
53               std::string v;
54               AttributeMapType::const_iterator i = attr.find(a->GetKey());
55               if ( i != attr.end() )  
56                 {
57                   v = i->second;
58                 }
59               GimmickMessage(5,"Setting attribute '"<<a->GetName()<<"' = '"
60                              <<v<<"'"<<std::endl);
61               UnsafeSetAttribute( a->GetKey(), v );
62             }
63         }
64       
65     }
66     //=============================================================
67
68
69     //=============================================================
70     Node::~Node()
71     {
72       GimmickMessage(5,"Node destructor"
73                      << std::endl);
74       ChildrenListType::iterator i;
75       for (i=GetChildrenList().begin(); i!=GetChildrenList().end(); i++)
76         {
77           delete *i;
78         }
79       if (mData) 
80         {
81           delete mData;
82           mData = 0;
83         }
84     }
85     //=============================================================
86
87
88     //=============================================================
89     /// Initializes the attribute map i.e. creates the entries
90     void Node::InitializeAttributeMap()
91     {
92       // Initialize attributes
93       LevelDescriptor::AttributeDescriptorListType::const_iterator a;
94       for (a = GetTree()->GetAttributeDescriptorList(GetLevel()).begin();
95            a!= GetTree()->GetAttributeDescriptorList(GetLevel()).end();
96            ++a)
97         {
98           UnsafeSetAttribute( a->GetKey(), "" );
99         }
100     }
101     //=============================================================
102
103     //=============================================================
104     /// Returns the level descriptor of the node
105     const LevelDescriptor& Node::GetLevelDescriptor() const
106     { 
107       return GetTree()->GetLevelDescriptor(GetLevel()); 
108     }
109     //=============================================================
110
111     //=============================================================
112     void Node::RemoveChildrenFromList(Node* node)
113     {
114       ChildrenListType::iterator i = find(GetChildrenList().begin(),
115                                           GetChildrenList().end(),
116                                           node);
117       if (i != GetChildrenList().end())
118         {
119           GetChildrenList().erase(i);
120         }
121     }
122     //=============================================================
123
124     //=============================================================
125     const std::string& Node::GetAttribute(const std::string& k) const
126     {
127       //    std::cout << "this = "<<(void*)this<<std::endl;
128       //    std::cout << "mFieldValueMap="<<(void*)(&mFieldValueMap)<<std::endl;
129       AttributeMapType::const_iterator i = mAttributeMap.find(k);
130       if (i == mAttributeMap.end())
131         {
132           static std::string def("");
133           return def;
134           //    CREAIMAGEIO_ERROR("DicomNode::GetFieldValue : no field with key '"<<k<<"'");
135         }
136       return i->second;
137   }
138   //=============================================================
139
140   //=============================================================
141     void Node::SetAttribute(const std::string& k, 
142                                  const std::string& v)
143   {
144     AttributeMapType::iterator i = mAttributeMap.find(k);
145     if (i==mAttributeMap.end())
146       {
147         std::cout<<"[Gimmick!] Node::SetAttribute : no attribute with key '"
148                  <<k<<"'"<<std::endl;
149         creaError( "[Gimmick!] Node::SetAttribute : no attribute with key '"
150                    <<k<<"'");
151       }
152     i->second = v;
153   }
154     //=============================================================
155
156     //=============================================================
157     bool Node::Matches(  const AttributeMapType& m ) const
158     {
159       GimmickMessage(2,"'"<<GetLabel()<<"' matching..."<<std::endl);
160       const std::vector<std::string>& id 
161         = GetLevelDescriptor().GetIdentifierList();
162       std::vector<std::string>::const_iterator i;
163       for (i = id.begin(); i != id.end(); ++i)
164         {
165           if (mAttributeMap.find(*i)->second != m.find(*i)->second ) 
166             {
167               GimmickMessage(2,"IDENTIFIER '"<<*i<<"' values do not match"<<std::endl);
168               return false;
169             }
170           GimmickMessage(2,"IDENTIFIER '"<<*i<<"' values match"<<std::endl);
171         }
172       return true;
173     }
174     //=============================================================
175     
176     //=============================================================
177     void Node::Print() const
178     {
179       std::string mess;
180       for (int i = 0; i<GetLevel(); ++i) mess += "  ";
181       mess += "|_ " + GetLabel();
182       GimmickMessage(1,mess<<std::endl);
183       ChildrenListType::const_iterator i;
184       for (i=GetChildrenList().begin(); i!=GetChildrenList().end(); i++)
185         {
186           (*i)->Print();
187         } 
188     }
189     //=============================================================
190
191     //=============================================================
192     std::string Node::GetLabel() const
193     {
194       std::string l;
195       const std::vector<std::string>& label 
196         = GetLevelDescriptor().GetLabelList();
197       
198       std::vector<std::string>::const_iterator i;
199       for (i = label.begin(); i != label.end(); )
200         {
201           GimmickMessage(3,"LABEL '"<<*i<<"'"<<std::endl);
202           AttributeMapType::const_iterator j = mAttributeMap.find(*i);
203           if (j != mAttributeMap.end())
204             {
205               l += j->second;
206               ++i;
207               if (i != label.end()) l += "|";
208             }
209           else 
210             {
211               GimmickError("Node::GetLabel() : LABEL attribute '"
212                            <<*i
213                            <<"' is not in node attribute map (should be!)" );
214             }
215         }
216       if (l.size()==0) l="?";
217       return l;
218     }
219     //=============================================================
220
221   }
222
223 }
224