ROOT logo
// @(#)root/core:$Id: TSchemaRuleSet.cxx 25450 2008-09-18 21:13:42Z pcanal $
// author: Lukasz Janyst <ljanyst@cern.ch>

#include "TSchemaRuleSet.h"
#include "TSchemaRule.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TClass.h"

ClassImp(TSchemaRule)

using namespace ROOT;

//------------------------------------------------------------------------------
TSchemaRuleSet::TSchemaRuleSet(): fPersistentRules( 0 ), fRemainingRules( 0 ),
                                  fAllRules( 0 ), fVersion(-3), fCheckSum( 0 )
{
   fPersistentRules = new TObjArray();
   fRemainingRules  = new TObjArray();
   fAllRules        = new TObjArray();
   fAllRules->SetOwner( kFALSE );
}

//------------------------------------------------------------------------------
TSchemaRuleSet::~TSchemaRuleSet()
{
   delete fPersistentRules;
   delete fRemainingRules;
   delete fAllRules;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRuleSet::AddRule( TSchemaRule* rule, Bool_t checkConsistency )
{
   // The consistency check always fails if the TClass object was not set!

   //---------------------------------------------------------------------------
   // Cannot verify the consistency if the TClass object is not present
   //---------------------------------------------------------------------------
   if( checkConsistency && !fClass )
      return kFALSE;

   if( !rule->IsValid() )
      return kFALSE;

   //---------------------------------------------------------------------------
   // If we don't check the consistency then we should just add the object
   //---------------------------------------------------------------------------
   if( !checkConsistency ) {
      if( rule->GetEmbed() )
         fPersistentRules->Add( rule );
      else
         fRemainingRules->Add( rule );
      fAllRules->Add( rule );
      return kTRUE;
   }

   //---------------------------------------------------------------------------
   // Check if all of the target data members specified in the rule are
   // present int the target class
   //---------------------------------------------------------------------------
   TObject* obj;
   if( rule->GetTarget() ) {
      TObjArrayIter titer( rule->GetTarget() );
      while( (obj = titer.Next()) ) {
         TObjString* str = (TObjString*)obj;
         if( !fClass->GetDataMember( str->GetString() ) && !fClass->GetBaseClass( str->GetString() ) )
            return kFALSE;
 
      }
   }

   //---------------------------------------------------------------------------
   // Check if there is a rule conflicting with this one
   //---------------------------------------------------------------------------
   const TObjArray* rules = FindRules( rule->GetSourceClass() );
   TObjArrayIter it( rules );
   TSchemaRule *r;

   while( (obj = it.Next()) ) {
      r = (TSchemaRule *) obj;
      if( rule->Conflicts( r ) ) {
         delete rules;
         return kFALSE;
      }
   }
   delete rules;

   //---------------------------------------------------------------------------
   // No conflicts - insert the rules
   //---------------------------------------------------------------------------
   if( rule->GetEmbed() )
      fPersistentRules->Add( rule );
   else
      fRemainingRules->Add( rule );
   fAllRules->Add( rule );

   return kTRUE;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRuleSet::HasRuleWithSourceClass( const TString &source ) const
{
   // Return True if we have any rule whose source class is 'source'.
   
   TObjArrayIter it( fAllRules );
   TObject *obj;
   while( (obj = it.Next()) ) {
      TSchemaRule* rule = (TSchemaRule*)obj;
      if( rule->GetSourceClass() == source )
         return kTRUE;
   }
   return kFALSE;
}

//------------------------------------------------------------------------------
const TObjArray* TSchemaRuleSet::FindRules( const TString &source ) const
{
   // User has to delete the returned array
   TObject*      obj;
   TObjArrayIter it( fAllRules );
   TObjArray*    arr = new TObjArray();
   arr->SetOwner( kFALSE );
   
   while( (obj = it.Next()) ) {
      TSchemaRule* rule = (TSchemaRule*)obj;
      if( rule->GetSourceClass() == source )
         arr->Add( rule );
   }
   return arr;
}

//------------------------------------------------------------------------------
const TSchemaMatch* TSchemaRuleSet::FindRules( const TString &source, Int_t version ) const
{
   // User has to delete the returned array

   TObject*      obj;
   TObjArrayIter it( fAllRules );
   TSchemaMatch* arr = new TSchemaMatch();
   arr->SetOwner( kFALSE );

   while( (obj = it.Next()) ) {
      TSchemaRule* rule = (TSchemaRule*)obj;
      if( rule->GetSourceClass() == source && rule->TestVersion( version ) )
         arr->Add( rule );
   }

   if( arr->GetEntriesFast() )
      return arr;
   else {
      delete arr;
      return 0;
   }
}

//------------------------------------------------------------------------------
const TSchemaMatch* TSchemaRuleSet::FindRules( const TString &source, UInt_t checksum ) const
{
   // User has to delete the returned array

   TObject*      obj;
   TObjArrayIter it( fAllRules );
   TSchemaMatch* arr = new TSchemaMatch();
   arr->SetOwner( kFALSE );

   while( (obj = it.Next()) ) {
      TSchemaRule* rule = (TSchemaRule*)obj;
      if( rule->GetSourceClass() == source && rule->TestChecksum( checksum ) )
         arr->Add( rule );
   }


   if( arr->GetEntriesFast() )
      return arr;
   else {
      delete arr;
      return 0;
   }
}

//------------------------------------------------------------------------------
TClass* TSchemaRuleSet::GetClass()
{
   return fClass;
}

//------------------------------------------------------------------------------
UInt_t TSchemaRuleSet::GetClassCheckSum() const
{
   if (fCheckSum == 0 && fClass) {
      const_cast<TSchemaRuleSet*>(this)->fCheckSum = fClass->GetCheckSum();
   }
   return fCheckSum;
}

//------------------------------------------------------------------------------
TString TSchemaRuleSet::GetClassName() const
{
   return fClassName;
}

//------------------------------------------------------------------------------
Int_t TSchemaRuleSet::GetClassVersion() const
{
   return fVersion;
}

//------------------------------------------------------------------------------
const TObjArray* TSchemaRuleSet::GetRules() const
{
   return fAllRules;
}

//------------------------------------------------------------------------------
const TObjArray* TSchemaRuleSet::GetPersistentRules() const
{
   return fPersistentRules;
}

//------------------------------------------------------------------------------
void TSchemaRuleSet::RemoveRule( TSchemaRule* rule )
{
   // Remove given rule from the set - the rule is not being deleted!
   fPersistentRules->Remove( rule );
   fRemainingRules->Remove( rule );
   fAllRules->Remove( rule );
}

//------------------------------------------------------------------------------
void TSchemaRuleSet::RemoveRules( TObjArray* rules )
{
   // remove given array of rules from the set - the rules are not being deleted!
   TObject*      obj;
   TObjArrayIter it( rules );

   while( (obj = it.Next()) ) {
      fPersistentRules->Remove( obj );
      fRemainingRules->Remove( obj );
      fAllRules->Remove( obj );
   }
}

//------------------------------------------------------------------------------
void TSchemaRuleSet::SetClass( TClass* cls )
{
   fClass     = cls;
   fClassName = cls->GetName();
   fVersion   = cls->GetClassVersion();
}


//------------------------------------------------------------------------------
const TSchemaRule* TSchemaMatch::GetRuleWithSource( const TString& name ) const
{
   for( Int_t i = 0; i < GetEntries(); ++i ) {
      TSchemaRule* rule = (ROOT::TSchemaRule*)At(i);
      if( rule->HasSource( name ) ) return rule;
   }
   return 0;
}

//------------------------------------------------------------------------------
const TSchemaRule* TSchemaMatch::GetRuleWithTarget( const TString& name ) const
{
   for( Int_t i=0; i<GetEntries(); ++i) {
      ROOT::TSchemaRule *rule = (ROOT::TSchemaRule*)At(i);
      if( rule->HasTarget( name ) ) return rule;
   }
   return 0;
}

//------------------------------------------------------------------------------
Bool_t TSchemaMatch::HasRuleWithSource( const TString& name ) const
{
   for( Int_t i = 0; i < GetEntries(); ++i ) {
      TSchemaRule* rule = (ROOT::TSchemaRule*)At(i);
      if( rule->HasSource( name ) ) return kTRUE;
   }
   return kFALSE;
}

//------------------------------------------------------------------------------
Bool_t TSchemaMatch::HasRuleWithTarget( const TString& name ) const
{
   for( Int_t i=0; i<GetEntries(); ++i) {
      ROOT::TSchemaRule *rule = (ROOT::TSchemaRule*)At(i);
      if( rule->HasTarget( name ) ) return kTRUE;
   }
   return kFALSE;
}

//______________________________________________________________________________
void TSchemaRuleSet::Streamer(TBuffer &R__b)
{
   // Stream an object of class ROOT::TSchemaRuleSet.
   
   if (R__b.IsReading()) {
      R__b.ReadClassBuffer(ROOT::TSchemaRuleSet::Class(),this);
   } else {
      GetClassCheckSum();
      R__b.WriteClassBuffer(ROOT::TSchemaRuleSet::Class(),this);
   }
}

 TSchemaRuleSet.cxx:1
 TSchemaRuleSet.cxx:2
 TSchemaRuleSet.cxx:3
 TSchemaRuleSet.cxx:4
 TSchemaRuleSet.cxx:5
 TSchemaRuleSet.cxx:6
 TSchemaRuleSet.cxx:7
 TSchemaRuleSet.cxx:8
 TSchemaRuleSet.cxx:9
 TSchemaRuleSet.cxx:10
 TSchemaRuleSet.cxx:11
 TSchemaRuleSet.cxx:12
 TSchemaRuleSet.cxx:13
 TSchemaRuleSet.cxx:14
 TSchemaRuleSet.cxx:15
 TSchemaRuleSet.cxx:16
 TSchemaRuleSet.cxx:17
 TSchemaRuleSet.cxx:18
 TSchemaRuleSet.cxx:19
 TSchemaRuleSet.cxx:20
 TSchemaRuleSet.cxx:21
 TSchemaRuleSet.cxx:22
 TSchemaRuleSet.cxx:23
 TSchemaRuleSet.cxx:24
 TSchemaRuleSet.cxx:25
 TSchemaRuleSet.cxx:26
 TSchemaRuleSet.cxx:27
 TSchemaRuleSet.cxx:28
 TSchemaRuleSet.cxx:29
 TSchemaRuleSet.cxx:30
 TSchemaRuleSet.cxx:31
 TSchemaRuleSet.cxx:32
 TSchemaRuleSet.cxx:33
 TSchemaRuleSet.cxx:34
 TSchemaRuleSet.cxx:35
 TSchemaRuleSet.cxx:36
 TSchemaRuleSet.cxx:37
 TSchemaRuleSet.cxx:38
 TSchemaRuleSet.cxx:39
 TSchemaRuleSet.cxx:40
 TSchemaRuleSet.cxx:41
 TSchemaRuleSet.cxx:42
 TSchemaRuleSet.cxx:43
 TSchemaRuleSet.cxx:44
 TSchemaRuleSet.cxx:45
 TSchemaRuleSet.cxx:46
 TSchemaRuleSet.cxx:47
 TSchemaRuleSet.cxx:48
 TSchemaRuleSet.cxx:49
 TSchemaRuleSet.cxx:50
 TSchemaRuleSet.cxx:51
 TSchemaRuleSet.cxx:52
 TSchemaRuleSet.cxx:53
 TSchemaRuleSet.cxx:54
 TSchemaRuleSet.cxx:55
 TSchemaRuleSet.cxx:56
 TSchemaRuleSet.cxx:57
 TSchemaRuleSet.cxx:58
 TSchemaRuleSet.cxx:59
 TSchemaRuleSet.cxx:60
 TSchemaRuleSet.cxx:61
 TSchemaRuleSet.cxx:62
 TSchemaRuleSet.cxx:63
 TSchemaRuleSet.cxx:64
 TSchemaRuleSet.cxx:65
 TSchemaRuleSet.cxx:66
 TSchemaRuleSet.cxx:67
 TSchemaRuleSet.cxx:68
 TSchemaRuleSet.cxx:69
 TSchemaRuleSet.cxx:70
 TSchemaRuleSet.cxx:71
 TSchemaRuleSet.cxx:72
 TSchemaRuleSet.cxx:73
 TSchemaRuleSet.cxx:74
 TSchemaRuleSet.cxx:75
 TSchemaRuleSet.cxx:76
 TSchemaRuleSet.cxx:77
 TSchemaRuleSet.cxx:78
 TSchemaRuleSet.cxx:79
 TSchemaRuleSet.cxx:80
 TSchemaRuleSet.cxx:81
 TSchemaRuleSet.cxx:82
 TSchemaRuleSet.cxx:83
 TSchemaRuleSet.cxx:84
 TSchemaRuleSet.cxx:85
 TSchemaRuleSet.cxx:86
 TSchemaRuleSet.cxx:87
 TSchemaRuleSet.cxx:88
 TSchemaRuleSet.cxx:89
 TSchemaRuleSet.cxx:90
 TSchemaRuleSet.cxx:91
 TSchemaRuleSet.cxx:92
 TSchemaRuleSet.cxx:93
 TSchemaRuleSet.cxx:94
 TSchemaRuleSet.cxx:95
 TSchemaRuleSet.cxx:96
 TSchemaRuleSet.cxx:97
 TSchemaRuleSet.cxx:98
 TSchemaRuleSet.cxx:99
 TSchemaRuleSet.cxx:100
 TSchemaRuleSet.cxx:101
 TSchemaRuleSet.cxx:102
 TSchemaRuleSet.cxx:103
 TSchemaRuleSet.cxx:104
 TSchemaRuleSet.cxx:105
 TSchemaRuleSet.cxx:106
 TSchemaRuleSet.cxx:107
 TSchemaRuleSet.cxx:108
 TSchemaRuleSet.cxx:109
 TSchemaRuleSet.cxx:110
 TSchemaRuleSet.cxx:111
 TSchemaRuleSet.cxx:112
 TSchemaRuleSet.cxx:113
 TSchemaRuleSet.cxx:114
 TSchemaRuleSet.cxx:115
 TSchemaRuleSet.cxx:116
 TSchemaRuleSet.cxx:117
 TSchemaRuleSet.cxx:118
 TSchemaRuleSet.cxx:119
 TSchemaRuleSet.cxx:120
 TSchemaRuleSet.cxx:121
 TSchemaRuleSet.cxx:122
 TSchemaRuleSet.cxx:123
 TSchemaRuleSet.cxx:124
 TSchemaRuleSet.cxx:125
 TSchemaRuleSet.cxx:126
 TSchemaRuleSet.cxx:127
 TSchemaRuleSet.cxx:128
 TSchemaRuleSet.cxx:129
 TSchemaRuleSet.cxx:130
 TSchemaRuleSet.cxx:131
 TSchemaRuleSet.cxx:132
 TSchemaRuleSet.cxx:133
 TSchemaRuleSet.cxx:134
 TSchemaRuleSet.cxx:135
 TSchemaRuleSet.cxx:136
 TSchemaRuleSet.cxx:137
 TSchemaRuleSet.cxx:138
 TSchemaRuleSet.cxx:139
 TSchemaRuleSet.cxx:140
 TSchemaRuleSet.cxx:141
 TSchemaRuleSet.cxx:142
 TSchemaRuleSet.cxx:143
 TSchemaRuleSet.cxx:144
 TSchemaRuleSet.cxx:145
 TSchemaRuleSet.cxx:146
 TSchemaRuleSet.cxx:147
 TSchemaRuleSet.cxx:148
 TSchemaRuleSet.cxx:149
 TSchemaRuleSet.cxx:150
 TSchemaRuleSet.cxx:151
 TSchemaRuleSet.cxx:152
 TSchemaRuleSet.cxx:153
 TSchemaRuleSet.cxx:154
 TSchemaRuleSet.cxx:155
 TSchemaRuleSet.cxx:156
 TSchemaRuleSet.cxx:157
 TSchemaRuleSet.cxx:158
 TSchemaRuleSet.cxx:159
 TSchemaRuleSet.cxx:160
 TSchemaRuleSet.cxx:161
 TSchemaRuleSet.cxx:162
 TSchemaRuleSet.cxx:163
 TSchemaRuleSet.cxx:164
 TSchemaRuleSet.cxx:165
 TSchemaRuleSet.cxx:166
 TSchemaRuleSet.cxx:167
 TSchemaRuleSet.cxx:168
 TSchemaRuleSet.cxx:169
 TSchemaRuleSet.cxx:170
 TSchemaRuleSet.cxx:171
 TSchemaRuleSet.cxx:172
 TSchemaRuleSet.cxx:173
 TSchemaRuleSet.cxx:174
 TSchemaRuleSet.cxx:175
 TSchemaRuleSet.cxx:176
 TSchemaRuleSet.cxx:177
 TSchemaRuleSet.cxx:178
 TSchemaRuleSet.cxx:179
 TSchemaRuleSet.cxx:180
 TSchemaRuleSet.cxx:181
 TSchemaRuleSet.cxx:182
 TSchemaRuleSet.cxx:183
 TSchemaRuleSet.cxx:184
 TSchemaRuleSet.cxx:185
 TSchemaRuleSet.cxx:186
 TSchemaRuleSet.cxx:187
 TSchemaRuleSet.cxx:188
 TSchemaRuleSet.cxx:189
 TSchemaRuleSet.cxx:190
 TSchemaRuleSet.cxx:191
 TSchemaRuleSet.cxx:192
 TSchemaRuleSet.cxx:193
 TSchemaRuleSet.cxx:194
 TSchemaRuleSet.cxx:195
 TSchemaRuleSet.cxx:196
 TSchemaRuleSet.cxx:197
 TSchemaRuleSet.cxx:198
 TSchemaRuleSet.cxx:199
 TSchemaRuleSet.cxx:200
 TSchemaRuleSet.cxx:201
 TSchemaRuleSet.cxx:202
 TSchemaRuleSet.cxx:203
 TSchemaRuleSet.cxx:204
 TSchemaRuleSet.cxx:205
 TSchemaRuleSet.cxx:206
 TSchemaRuleSet.cxx:207
 TSchemaRuleSet.cxx:208
 TSchemaRuleSet.cxx:209
 TSchemaRuleSet.cxx:210
 TSchemaRuleSet.cxx:211
 TSchemaRuleSet.cxx:212
 TSchemaRuleSet.cxx:213
 TSchemaRuleSet.cxx:214
 TSchemaRuleSet.cxx:215
 TSchemaRuleSet.cxx:216
 TSchemaRuleSet.cxx:217
 TSchemaRuleSet.cxx:218
 TSchemaRuleSet.cxx:219
 TSchemaRuleSet.cxx:220
 TSchemaRuleSet.cxx:221
 TSchemaRuleSet.cxx:222
 TSchemaRuleSet.cxx:223
 TSchemaRuleSet.cxx:224
 TSchemaRuleSet.cxx:225
 TSchemaRuleSet.cxx:226
 TSchemaRuleSet.cxx:227
 TSchemaRuleSet.cxx:228
 TSchemaRuleSet.cxx:229
 TSchemaRuleSet.cxx:230
 TSchemaRuleSet.cxx:231
 TSchemaRuleSet.cxx:232
 TSchemaRuleSet.cxx:233
 TSchemaRuleSet.cxx:234
 TSchemaRuleSet.cxx:235
 TSchemaRuleSet.cxx:236
 TSchemaRuleSet.cxx:237
 TSchemaRuleSet.cxx:238
 TSchemaRuleSet.cxx:239
 TSchemaRuleSet.cxx:240
 TSchemaRuleSet.cxx:241
 TSchemaRuleSet.cxx:242
 TSchemaRuleSet.cxx:243
 TSchemaRuleSet.cxx:244
 TSchemaRuleSet.cxx:245
 TSchemaRuleSet.cxx:246
 TSchemaRuleSet.cxx:247
 TSchemaRuleSet.cxx:248
 TSchemaRuleSet.cxx:249
 TSchemaRuleSet.cxx:250
 TSchemaRuleSet.cxx:251
 TSchemaRuleSet.cxx:252
 TSchemaRuleSet.cxx:253
 TSchemaRuleSet.cxx:254
 TSchemaRuleSet.cxx:255
 TSchemaRuleSet.cxx:256
 TSchemaRuleSet.cxx:257
 TSchemaRuleSet.cxx:258
 TSchemaRuleSet.cxx:259
 TSchemaRuleSet.cxx:260
 TSchemaRuleSet.cxx:261
 TSchemaRuleSet.cxx:262
 TSchemaRuleSet.cxx:263
 TSchemaRuleSet.cxx:264
 TSchemaRuleSet.cxx:265
 TSchemaRuleSet.cxx:266
 TSchemaRuleSet.cxx:267
 TSchemaRuleSet.cxx:268
 TSchemaRuleSet.cxx:269
 TSchemaRuleSet.cxx:270
 TSchemaRuleSet.cxx:271
 TSchemaRuleSet.cxx:272
 TSchemaRuleSet.cxx:273
 TSchemaRuleSet.cxx:274
 TSchemaRuleSet.cxx:275
 TSchemaRuleSet.cxx:276
 TSchemaRuleSet.cxx:277
 TSchemaRuleSet.cxx:278
 TSchemaRuleSet.cxx:279
 TSchemaRuleSet.cxx:280
 TSchemaRuleSet.cxx:281
 TSchemaRuleSet.cxx:282
 TSchemaRuleSet.cxx:283
 TSchemaRuleSet.cxx:284
 TSchemaRuleSet.cxx:285
 TSchemaRuleSet.cxx:286
 TSchemaRuleSet.cxx:287
 TSchemaRuleSet.cxx:288
 TSchemaRuleSet.cxx:289
 TSchemaRuleSet.cxx:290
 TSchemaRuleSet.cxx:291
 TSchemaRuleSet.cxx:292
 TSchemaRuleSet.cxx:293
 TSchemaRuleSet.cxx:294
 TSchemaRuleSet.cxx:295
 TSchemaRuleSet.cxx:296
 TSchemaRuleSet.cxx:297
 TSchemaRuleSet.cxx:298
 TSchemaRuleSet.cxx:299
 TSchemaRuleSet.cxx:300
 TSchemaRuleSet.cxx:301
 TSchemaRuleSet.cxx:302
 TSchemaRuleSet.cxx:303
 TSchemaRuleSet.cxx:304
 TSchemaRuleSet.cxx:305