Sample DLM merging debug output

This page is part of the Aggregated Layout Management Convergence 2.x effort that will be added to 3.x.

When users log-in their personal layout fragment or PLF is first loaded. The PLF contains both visual layout elements that they own and non-visual, "ghost" nodes used to record previous changes made to fragments. Then the [RDBMDistributedLayoutStore|Sungard SCT's RDBMDistributedLayoutStore
] passes through all configured fragments asking each if they are applicable to this user as determined by their configured audiences. If DLM debugging is turned on these evaulations can be seen from entries made in the log files as shown below.

The paren and attribute evaluators each log an entry as they enter the isApplicable method and as they exit. When exiting they indicate if the result was true or false. The nesting is part of the logging and serves to help see the nesting of the evaluator hierarchy built up based on configuration found in the Sample dlm.xml file page.

For example, the Student fragment is configured with this element in dlm.xml

Student Fragment Configuration
  <dlm:fragment name='Students' ownerID='student-lo' precedence='100'>
   <dlm:role>student</dlm:role>
   <dlm:audience evaluatorFactory='com.pipeline.uportal.dlm.provider.CPPersonEvaluatorFactory'>
     <paren mode="AND">     
       <attribute name='role' mode='equals' value='student'/>
       <paren mode="NOT">
         <attribute name='role' mode='equals' value='faculty'/>
       </paren>
     </paren>
   </dlm:audience>
 </dlm:fragment>

The fragment being evaluated is identified by an entry formated like >>>> calling <fragmentName>.isApplicable( <userLoginID> ). So the test of the Student fragment starts on line 3 and returns on line 13 showing that it was not applicable to user mboyd. Now remember that fragments can have zero to many audience evaluators. So the first nested evaluator that is called for any fragment is an OR paren. Within that evaluator you then begin to see the evaluators reflected by the configuration above.

The AND paren is entered followed by the attribute evaluator that compares all roles held by mboyd, admin and faculty, to the role of student and finds that none match. Hence it then exits with a value of false causing the AND paren and OR parens to do likewise. Only the Faculty fragment is found to be applicable to user mboyd.

Note that the leading timestamp, class, lines, etc., have been removed for brevity.

Note also the logging of user preference attributes including those from preference values set by fragment owners.

Sample Fragment Merging Debug Log Entries
>>>> calling All Users.isApplicable( mboyd )
 ---- All Users.isApplicable( mboyd )=true
 >>>> calling Students.isApplicable( mboyd )
  >>>> calling paren[campuspipeline.uportal.dlm.provider.Paren@4e4a8a, op=OR].isApplicable()
  >>>> calling paren[campuspipeline.uportal.dlm.provider.Paren@7fc8b2, op=AND].isApplicable()
  >>>> calling Evaluator[role','1','student'].isApplicable()
 ----- comparing value 'student' to role 'admin'
 ----- comparing value 'student' to role 'faculty'
 Evaluating person roles to: false
  ---- Evaluator[role','1','student'].isApplicable()=false
  ---- paren[campuspipeline.uportal.dlm.provider.Paren@7fc8b2, op=AND].isApplicable()=false
  ---- paren[campuspipeline.uportal.dlm.provider.Paren@4e4a8a, op=OR].isApplicable()=false
 ---- Students.isApplicable( mboyd )=false
 >>>> calling Faculty.isApplicable( mboyd )
  >>>> calling paren[campuspipeline.uportal.dlm.provider.Paren@487093, op=OR].isApplicable()
  >>>> calling Evaluator['role','1','faculty'].isApplicable()
 ----- comparing value 'faculty' to role 'admin'
 ----- comparing value 'faculty' to role 'faculty'
 Evaluating person roles to: true
  ---- Evaluator[role','1','faculty'].isApplicable()=true
  ---- paren[campuspipeline.uportal.dlm.provider.Paren@487093, op=OR].isApplicable()=true
 ---- Faculty.isApplicable( mboyd )=true
 >>>> calling Employee.isApplicable( mboyd )
  >>>> calling paren[campuspipeline.uportal.dlm.provider.Paren@56c3cf, op=OR].isApplicable()
  >>>> calling Evaluator[role','1','employee'].isApplicable()
 ----- comparing value 'employee' to role 'admin'
 ----- comparing value 'employee' to role 'faculty'
 Evaluating person roles to: false
  ---- Evaluator[role','1','employee'].isApplicable()=false
  ---- paren[campuspipeline.uportal.dlm.provider.Paren@56c3cf, op=OR].isApplicable()=false
 ---- Employee.isApplicable( mboyd )=false

 ***** mboyd's StructureStylesheetUserPrefereneces

*** Folder Attributes
> n13.width = (33%) 33%
> s12.width = (33%) 33%
> u13l1s11.width = (null) 50%
> u11l1s12.width = (null) 50%
> u11l1s16.width = (null) 20%
> u11l1s9.width = (null) 30%
> u13l1s9.width = (null) 50%

*** Channel Attributes