Coverage Report - org.apache.maven.report.projectinfo.TeamListReport
 
Classes in this File Line Coverage Branch Coverage Complexity
TeamListReport
89%
8/9
N/A
4,571
TeamListReport$TeamListRenderer
63%
152/241
39%
43/110
4,571
 
 1  
 package org.apache.maven.report.projectinfo;
 2  
 
 3  
 /*
 4  
  * Licensed to the Apache Software Foundation (ASF) under one
 5  
  * or more contributor license agreements.  See the NOTICE file
 6  
  * distributed with this work for additional information
 7  
  * regarding copyright ownership.  The ASF licenses this file
 8  
  * to you under the Apache License, Version 2.0 (the
 9  
  * "License"); you may not use this file except in compliance
 10  
  * with the License.  You may obtain a copy of the License at
 11  
  *
 12  
  *   http://www.apache.org/licenses/LICENSE-2.0
 13  
  *
 14  
  * Unless required by applicable law or agreed to in writing,
 15  
  * software distributed under the License is distributed on an
 16  
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 17  
  * KIND, either express or implied.  See the License for the
 18  
  * specific language governing permissions and limitations
 19  
  * under the License.
 20  
  */
 21  
 
 22  
 import org.apache.maven.doxia.sink.Sink;
 23  
 import org.apache.maven.model.Contributor;
 24  
 import org.apache.maven.model.Developer;
 25  
 import org.apache.maven.model.Model;
 26  
 import org.apache.maven.reporting.AbstractMavenReportRenderer;
 27  
 import org.codehaus.plexus.i18n.I18N;
 28  
 import org.codehaus.plexus.util.StringUtils;
 29  
 
 30  
 import java.util.ArrayList;
 31  
 import java.util.HashMap;
 32  
 import java.util.Iterator;
 33  
 import java.util.List;
 34  
 import java.util.Locale;
 35  
 import java.util.Map;
 36  
 import java.util.Properties;
 37  
 
 38  
 /**
 39  
  * Generates the Project Team report.
 40  
  *
 41  
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton </a>
 42  
  * @version $Id: TeamListReport.java 728546 2008-12-21 22:56:51Z bentmann $
 43  
  * @since 2.0
 44  
  * @goal project-team
 45  
  */
 46  1
 public class TeamListReport
 47  
     extends AbstractProjectInfoReport
 48  
 {
 49  
     // ----------------------------------------------------------------------
 50  
     // Public methods
 51  
     // ----------------------------------------------------------------------
 52  
 
 53  
     /** {@inheritDoc} */
 54  
     public String getName( Locale locale )
 55  
     {
 56  1
         return i18n.getString( "project-info-report", locale, "report.team-list.name" );
 57  
     }
 58  
 
 59  
     /** {@inheritDoc} */
 60  
     public String getDescription( Locale locale )
 61  
     {
 62  0
         return i18n.getString( "project-info-report", locale, "report.team-list.description" );
 63  
     }
 64  
 
 65  
     /** {@inheritDoc} */
 66  
     public void executeReport( Locale locale )
 67  
     {
 68  1
         TeamListRenderer r = new TeamListRenderer( getSink(), project.getModel(), i18n, locale );
 69  
 
 70  1
         r.render();
 71  1
     }
 72  
 
 73  
     /** {@inheritDoc} */
 74  
     public String getOutputName()
 75  
     {
 76  3
         return "team-list";
 77  
     }
 78  
 
 79  
     // ----------------------------------------------------------------------
 80  
     // Private
 81  
     // ----------------------------------------------------------------------
 82  
 
 83  
     /**
 84  
      * Internal renderer class
 85  
      */
 86  1
     private static class TeamListRenderer
 87  
         extends AbstractMavenReportRenderer
 88  
     {
 89  
         private static final String PROPERTIES = "properties";
 90  
 
 91  
         private static final String TIME_ZONE = "timeZone";
 92  
 
 93  
         private static final String ROLES = "roles";
 94  
 
 95  
         private static final String ORGANIZATION_URL = "organizationUrl";
 96  
 
 97  
         private static final String ORGANIZATION = "organization";
 98  
 
 99  
         private static final String URL = "url";
 100  
 
 101  
         private static final String EMAIL = "email";
 102  
 
 103  
         private static final String NAME = "name";
 104  
 
 105  
         private static final String ID = "id";
 106  
 
 107  
         private Model model;
 108  
 
 109  
         private I18N i18n;
 110  
 
 111  
         private Locale locale;
 112  
 
 113  1
         private static final String[] EMPTY_STRING_ARRAY = new String[0];
 114  
 
 115  
         TeamListRenderer( Sink sink, Model model, I18N i18n, Locale locale )
 116  
         {
 117  1
             super( sink );
 118  
 
 119  1
             this.model = model;
 120  
 
 121  1
             this.i18n = i18n;
 122  
 
 123  1
             this.locale = locale;
 124  1
         }
 125  
 
 126  
         /** {@inheritDoc} */
 127  
         public String getTitle()
 128  
         {
 129  1
             return i18n.getString( "project-info-report", locale, "report.team-list.title" );
 130  
         }
 131  
 
 132  
         /** {@inheritDoc} */
 133  
         public void renderBody()
 134  
         {
 135  1
             startSection( i18n.getString( "project-info-report", locale, "report.team-list.intro.title" ) );
 136  
 
 137  
             // To handle JS
 138  1
             StringBuffer javascript = new StringBuffer( "function offsetDate(id, offset) {\n" );
 139  1
             javascript.append( "    var now = new Date();\n" );
 140  1
             javascript.append( "    var nowTime = now.getTime();\n" );
 141  1
             javascript.append( "    var localOffset = now.getTimezoneOffset();\n" );
 142  1
             javascript.append( "    var developerTime = nowTime + ( offset * 60 * 60 * 1000 )"
 143  
                                + "+ ( localOffset * 60 * 1000 );\n" );
 144  1
             javascript.append( "    var developerDate = new Date(developerTime);\n" );
 145  1
             javascript.append( "\n" );
 146  1
             javascript.append( "    document.getElementById(id).innerHTML = developerDate;\n" );
 147  1
             javascript.append( "}\n" );
 148  1
             javascript.append( "\n" );
 149  1
             javascript.append( "function init(){\n" );
 150  
 
 151  
             // Introduction
 152  1
             paragraph( i18n.getString( "project-info-report", locale, "report.team-list.intro.description1" ) );
 153  1
             paragraph( i18n.getString( "project-info-report", locale, "report.team-list.intro.description2" ) );
 154  
 
 155  
             // Developer section
 156  1
             List developers = model.getDevelopers();
 157  
 
 158  1
             startSection( i18n.getString( "project-info-report", locale, "report.team-list.developers.title" ) );
 159  
 
 160  1
             if ( developers == null || developers.isEmpty() )
 161  
             {
 162  0
                 paragraph( i18n.getString( "project-info-report", locale, "report.team-list.nodeveloper" ) );
 163  
             }
 164  
             else
 165  
             {
 166  1
                 paragraph( i18n.getString( "project-info-report", locale, "report.team-list.developers.intro" ) );
 167  
 
 168  1
                 startTable();
 169  
 
 170  
                 // By default we think that all headers not required
 171  1
                 Map headersMap = new HashMap();
 172  
                 // set true for headers that are required
 173  1
                 checkRequiredHeaders( headersMap, developers );
 174  1
                 String[] requiredHeaders = getRequiredDevHeaderArray( headersMap );
 175  
 
 176  1
                 tableHeader( requiredHeaders );
 177  
 
 178  
                 // To handle JS
 179  1
                 int developersRows = 0;
 180  1
                 for ( Iterator i = developers.iterator(); i.hasNext(); )
 181  
                 {
 182  1
                     Developer developer = (Developer) i.next();
 183  
 
 184  1
                     renderDeveloper( developer, developersRows, headersMap, javascript );
 185  
 
 186  1
                     developersRows++;
 187  
                 }
 188  
 
 189  1
                 endTable();
 190  
             }
 191  
 
 192  1
             endSection();
 193  
 
 194  
             // contributors section
 195  1
             List contributors = model.getContributors();
 196  
 
 197  1
             startSection( i18n.getString( "project-info-report", locale, "report.team-list.contributors.title" ) );
 198  
 
 199  1
             if ( contributors == null || contributors.isEmpty() )
 200  
             {
 201  1
                 paragraph( i18n.getString( "project-info-report", locale, "report.team-list.nocontributor" ) );
 202  
             }
 203  
             else
 204  
             {
 205  0
                 paragraph( i18n.getString( "project-info-report", locale, "report.team-list.contributors.intro" ) );
 206  
 
 207  0
                 startTable();
 208  
 
 209  0
                 Map headersMap = new HashMap();
 210  0
                 checkRequiredHeaders( headersMap, contributors );
 211  0
                 String[] requiredHeaders = getRequiredContrHeaderArray( headersMap );
 212  
 
 213  0
                 tableHeader( requiredHeaders );
 214  
 
 215  
                 // To handle JS
 216  0
                 int contributorsRows = 0;
 217  0
                 for ( Iterator i = contributors.iterator(); i.hasNext(); )
 218  
                 {
 219  0
                     Contributor contributor = (Contributor) i.next();
 220  
 
 221  0
                     renderContributor( contributor, contributorsRows, headersMap, javascript );
 222  
 
 223  0
                     contributorsRows++;
 224  
                 }
 225  
 
 226  0
                 endTable();
 227  
             }
 228  
 
 229  1
             endSection();
 230  
 
 231  1
             endSection();
 232  
 
 233  
             // To handle JS
 234  1
             javascript.append( "}\n" ).append( "\n" ).append( "window.onLoad = init();\n" );
 235  1
             javaScript( javascript.toString() );
 236  1
         }
 237  
 
 238  
         private void renderDeveloper( Developer developer, int developerRow, Map headersMap, StringBuffer javascript )
 239  
         {
 240  
             // To handle JS
 241  1
             sink.tableRow();
 242  
 
 243  1
             if ( headersMap.get( ID ) == Boolean.TRUE )
 244  
             {
 245  1
                 tableCell( "<a name=\"" + developer.getId() + "\"></a>" + developer.getId(), true );
 246  
             }
 247  1
             if ( headersMap.get( NAME ) == Boolean.TRUE )
 248  
             {
 249  1
                 tableCell( developer.getName() );
 250  
             }
 251  1
             if ( headersMap.get( EMAIL ) == Boolean.TRUE )
 252  
             {
 253  1
                 tableCell( createLinkPatternedText( developer.getEmail(), developer.getEmail() ) );
 254  
             }
 255  1
             if ( headersMap.get( URL ) == Boolean.TRUE )
 256  
             {
 257  0
                 tableCellForUrl( developer.getUrl() );
 258  
             }
 259  1
             if ( headersMap.get( ORGANIZATION ) == Boolean.TRUE )
 260  
             {
 261  1
                 tableCell( developer.getOrganization() );
 262  
             }
 263  1
             if ( headersMap.get( ORGANIZATION_URL ) == Boolean.TRUE )
 264  
             {
 265  0
                 tableCellForUrl( developer.getOrganizationUrl() );
 266  
             }
 267  1
             if ( headersMap.get( ROLES ) == Boolean.TRUE )
 268  
             {
 269  1
                 if ( developer.getRoles() != null )
 270  
                 {
 271  
                     // Comma separated roles
 272  1
                     tableCell( StringUtils.join( developer.getRoles().toArray( EMPTY_STRING_ARRAY ), ", " ) );
 273  
                 }
 274  
                 else
 275  
                 {
 276  0
                     tableCell( null );
 277  
                 }
 278  
             }
 279  1
             if ( headersMap.get( TIME_ZONE ) == Boolean.TRUE )
 280  
             {
 281  1
                 tableCell( developer.getTimezone() );
 282  
 
 283  
                 // To handle JS
 284  1
                 sink.tableCell();
 285  1
                 sink.rawText( "<span id=\"developer-" + developerRow + "\">" );
 286  1
                 text( developer.getTimezone() );
 287  1
                 if ( !StringUtils.isEmpty( developer.getTimezone() ) )
 288  
                 {
 289  1
                     javascript.append( "    offsetDate('developer-" ).append( developerRow ).append( "', '" );
 290  1
                     javascript.append( developer.getTimezone() );
 291  1
                     javascript.append( "');\n" );
 292  
                 }
 293  1
                 sink.rawText( "</span>" );
 294  1
                 sink.tableCell_();
 295  
             }
 296  
 
 297  1
             if ( headersMap.get( PROPERTIES ) == Boolean.TRUE )
 298  
             {
 299  0
                 Properties props = developer.getProperties();
 300  0
                 if ( props != null )
 301  
                 {
 302  0
                     tableCell( propertiesToString( props ) );
 303  
                 }
 304  
                 else
 305  
                 {
 306  0
                     tableCell( null );
 307  
                 }
 308  
             }
 309  
 
 310  1
             sink.tableRow_();
 311  1
         }
 312  
 
 313  
         private void renderContributor( Contributor contributor, int contributorRow, Map headersMap,
 314  
                                         StringBuffer javascript )
 315  
         {
 316  0
             sink.tableRow();
 317  0
             if ( headersMap.get( NAME ) == Boolean.TRUE )
 318  
             {
 319  0
                 tableCell( contributor.getName() );
 320  
             }
 321  0
             if ( headersMap.get( EMAIL ) == Boolean.TRUE )
 322  
             {
 323  0
                 tableCell( createLinkPatternedText( contributor.getEmail(), contributor.getEmail() ) );
 324  
             }
 325  0
             if ( headersMap.get( URL ) == Boolean.TRUE )
 326  
             {
 327  0
                 tableCellForUrl( contributor.getUrl() );
 328  
             }
 329  0
             if ( headersMap.get( ORGANIZATION ) == Boolean.TRUE )
 330  
             {
 331  0
                 tableCell( contributor.getOrganization() );
 332  
             }
 333  0
             if ( headersMap.get( ORGANIZATION_URL ) == Boolean.TRUE )
 334  
             {
 335  0
                 tableCellForUrl( contributor.getOrganizationUrl() );
 336  
             }
 337  0
             if ( headersMap.get( ROLES ) == Boolean.TRUE )
 338  
             {
 339  0
                 if ( contributor.getRoles() != null )
 340  
                 {
 341  
                     // Comma separated roles
 342  0
                     tableCell( StringUtils.join( contributor.getRoles().toArray( EMPTY_STRING_ARRAY ), ", " ) );
 343  
                 }
 344  
                 else
 345  
                 {
 346  0
                     tableCell( null );
 347  
                 }
 348  
 
 349  
             }
 350  0
             if ( headersMap.get( TIME_ZONE ) == Boolean.TRUE )
 351  
             {
 352  0
                 tableCell( contributor.getTimezone() );
 353  
 
 354  
                 // To handle JS
 355  0
                 sink.tableCell();
 356  0
                 sink.rawText( "<span id=\"contributor-" + contributorRow + "\">" );
 357  0
                 text( contributor.getTimezone() );
 358  0
                 if ( !StringUtils.isEmpty( contributor.getTimezone() ) )
 359  
                 {
 360  0
                     javascript.append( "    offsetDate('contributor-" ).append( contributorRow )
 361  
                         .append( "', '" );
 362  0
                     javascript.append( contributor.getTimezone() );
 363  0
                     javascript.append( "');\n" );
 364  
                 }
 365  0
                 sink.rawText( "</span>" );
 366  0
                 sink.tableCell_();
 367  
             }
 368  
 
 369  0
             if ( headersMap.get( PROPERTIES ) == Boolean.TRUE )
 370  
             {
 371  0
                 Properties props = contributor.getProperties();
 372  0
                 if ( props != null )
 373  
                 {
 374  0
                     tableCell( propertiesToString( props ) );
 375  
                 }
 376  
                 else
 377  
                 {
 378  0
                     tableCell( null );
 379  
                 }
 380  
             }
 381  
 
 382  0
             sink.tableRow_();
 383  0
         }
 384  
 
 385  
         /**
 386  
          * @param requiredHeaders
 387  
          * @return
 388  
          */
 389  
         private String[] getRequiredContrHeaderArray( Map requiredHeaders )
 390  
         {
 391  0
             List requiredArray = new ArrayList();
 392  0
             String name = i18n.getString( "project-info-report", locale, "report.team-list.contributors.name" );
 393  0
             String email = i18n.getString( "project-info-report", locale, "report.team-list.contributors.email" );
 394  0
             String url = i18n.getString( "project-info-report", locale, "report.team-list.contributors.url" );
 395  0
             String organization = i18n.getString( "project-info-report", locale,
 396  
                                                   "report.team-list.contributors.organization" );
 397  0
             String organizationUrl = i18n.getString( "project-info-report", locale,
 398  
                                                      "report.team-list.contributors.organizationurl" );
 399  0
             String roles = i18n.getString( "project-info-report", locale, "report.team-list.contributors.roles" );
 400  0
             String timeZone = i18n.getString( "project-info-report", locale, "report.team-list.contributors.timezone" );
 401  0
             String actualTime = i18n.getString( "project-info-report", locale,
 402  
                                                 "report.team-list.contributors.actualtime" );
 403  0
             String properties = i18n.getString( "project-info-report", locale,
 404  
                                                 "report.team-list.contributors.properties" );
 405  
 
 406  0
             setRequiredArray( requiredHeaders, requiredArray, name, email, url, organization, organizationUrl, roles,
 407  
                               timeZone, actualTime, properties );
 408  
 
 409  0
             String[] array = new String[requiredArray.size()];
 410  0
             for ( int i = 0; i < array.length; i++ )
 411  
             {
 412  0
                 array[i] = (String) requiredArray.get( i );
 413  
             }
 414  
 
 415  0
             return array;
 416  
         }
 417  
 
 418  
         /**
 419  
          * @param requiredHeaders
 420  
          * @return
 421  
          */
 422  
         private String[] getRequiredDevHeaderArray( Map requiredHeaders )
 423  
         {
 424  1
             List requiredArray = new ArrayList();
 425  
 
 426  1
             String id = i18n.getString( "project-info-report", locale, "report.team-list.developers.id" );
 427  1
             String name = i18n.getString( "project-info-report", locale, "report.team-list.developers.name" );
 428  1
             String email = i18n.getString( "project-info-report", locale, "report.team-list.developers.email" );
 429  1
             String url = i18n.getString( "project-info-report", locale, "report.team-list.developers.url" );
 430  1
             String organization = i18n.getString( "project-info-report", locale,
 431  
                                                   "report.team-list.developers.organization" );
 432  1
             String organizationUrl = i18n.getString( "project-info-report", locale,
 433  
                                                      "report.team-list.developers.organizationurl" );
 434  1
             String roles = i18n.getString( "project-info-report", locale, "report.team-list.developers.roles" );
 435  1
             String timeZone = i18n.getString( "project-info-report", locale, "report.team-list.developers.timezone" );
 436  1
             String actualTime = i18n
 437  
                 .getString( "project-info-report", locale, "report.team-list.developers.actualtime" );
 438  1
             String properties = i18n
 439  
                 .getString( "project-info-report", locale, "report.team-list.developers.properties" );
 440  
 
 441  1
             if ( requiredHeaders.get( ID ) == Boolean.TRUE )
 442  
             {
 443  1
                 requiredArray.add( id );
 444  
             }
 445  
 
 446  1
             setRequiredArray( requiredHeaders, requiredArray, name, email, url, organization, organizationUrl, roles,
 447  
                               timeZone, actualTime, properties );
 448  
 
 449  1
             String[] array = new String[requiredArray.size()];
 450  8
             for ( int i = 0; i < array.length; i++ )
 451  
             {
 452  7
                 array[i] = (String) requiredArray.get( i );
 453  
             }
 454  
 
 455  1
             return array;
 456  
         }
 457  
 
 458  
         /**
 459  
          * @param requiredHeaders
 460  
          * @param requiredArray
 461  
          * @param name
 462  
          * @param email
 463  
          * @param url
 464  
          * @param organization
 465  
          * @param organizationUrl
 466  
          * @param roles
 467  
          * @param timeZone
 468  
          * @param actualTime
 469  
          * @param properties
 470  
          */
 471  
         private void setRequiredArray( Map requiredHeaders, List requiredArray, String name, String email, String url,
 472  
                                        String organization, String organizationUrl, String roles, String timeZone,
 473  
                                        String actualTime, String properties )
 474  
         {
 475  1
             if ( requiredHeaders.get( NAME ) == Boolean.TRUE )
 476  
             {
 477  1
                 requiredArray.add( name );
 478  
             }
 479  1
             if ( requiredHeaders.get( EMAIL ) == Boolean.TRUE )
 480  
             {
 481  1
                 requiredArray.add( email );
 482  
             }
 483  1
             if ( requiredHeaders.get( URL ) == Boolean.TRUE )
 484  
             {
 485  0
                 requiredArray.add( url );
 486  
             }
 487  1
             if ( requiredHeaders.get( ORGANIZATION ) == Boolean.TRUE )
 488  
             {
 489  1
                 requiredArray.add( organization );
 490  
             }
 491  1
             if ( requiredHeaders.get( ORGANIZATION_URL ) == Boolean.TRUE )
 492  
             {
 493  0
                 requiredArray.add( organizationUrl );
 494  
             }
 495  1
             if ( requiredHeaders.get( ROLES ) == Boolean.TRUE )
 496  
             {
 497  1
                 requiredArray.add( roles );
 498  
             }
 499  1
             if ( requiredHeaders.get( TIME_ZONE ) == Boolean.TRUE )
 500  
             {
 501  1
                 requiredArray.add( timeZone );
 502  1
                 requiredArray.add( actualTime );
 503  
             }
 504  
 
 505  1
             if ( requiredHeaders.get( PROPERTIES ) == Boolean.TRUE )
 506  
             {
 507  0
                 requiredArray.add( properties );
 508  
             }
 509  1
         }
 510  
 
 511  
         /**
 512  
          * @param requiredHeaders
 513  
          * @param units
 514  
          */
 515  
         private void checkRequiredHeaders( Map requiredHeaders, List units )
 516  
         {
 517  1
             requiredHeaders.put( ID, Boolean.FALSE );
 518  1
             requiredHeaders.put( NAME, Boolean.FALSE );
 519  1
             requiredHeaders.put( EMAIL, Boolean.FALSE );
 520  1
             requiredHeaders.put( URL, Boolean.FALSE );
 521  1
             requiredHeaders.put( ORGANIZATION, Boolean.FALSE );
 522  1
             requiredHeaders.put( ORGANIZATION_URL, Boolean.FALSE );
 523  1
             requiredHeaders.put( ROLES, Boolean.FALSE );
 524  1
             requiredHeaders.put( TIME_ZONE, Boolean.FALSE );
 525  1
             requiredHeaders.put( PROPERTIES, Boolean.FALSE );
 526  
 
 527  1
             for ( Iterator i = units.iterator(); i.hasNext(); )
 528  
             {
 529  1
                 Object unit = i.next();
 530  1
                 String name = null;
 531  1
                 String email = null;
 532  1
                 String url = null;
 533  1
                 String organization = null;
 534  1
                 String organizationUrl = null;
 535  1
                 List roles = null;
 536  1
                 String timeZone = null;
 537  1
                 Properties properties = null;
 538  
 
 539  1
                 if ( unit.getClass().getName().equals( Contributor.class.getName() ) )
 540  
                 {
 541  0
                     Contributor contributor = (Contributor) unit;
 542  0
                     name = contributor.getName();
 543  0
                     email = contributor.getEmail();
 544  0
                     url = contributor.getUrl();
 545  0
                     organization = contributor.getOrganization();
 546  0
                     organizationUrl = contributor.getOrganizationUrl();
 547  0
                     roles = contributor.getRoles();
 548  0
                     timeZone = contributor.getTimezone();
 549  0
                     properties = contributor.getProperties();
 550  
                 }
 551  
                 else
 552  
                 {
 553  1
                     Developer developer = (Developer) unit;
 554  1
                     name = developer.getName();
 555  1
                     email = developer.getEmail();
 556  1
                     url = developer.getUrl();
 557  1
                     organization = developer.getOrganization();
 558  1
                     organizationUrl = developer.getOrganizationUrl();
 559  1
                     roles = developer.getRoles();
 560  1
                     timeZone = developer.getTimezone();
 561  1
                     properties = developer.getProperties();
 562  1
                     if ( StringUtils.isNotEmpty( developer.getId() ) )
 563  
                     {
 564  1
                         requiredHeaders.put( ID, Boolean.TRUE );
 565  
                     }
 566  
                 }
 567  1
                 if ( StringUtils.isNotEmpty( name ) )
 568  
                 {
 569  1
                     requiredHeaders.put( NAME, Boolean.TRUE );
 570  
                 }
 571  1
                 if ( StringUtils.isNotEmpty( email ) )
 572  
                 {
 573  1
                     requiredHeaders.put( EMAIL, Boolean.TRUE );
 574  
                 }
 575  1
                 if ( StringUtils.isNotEmpty( url ) )
 576  
                 {
 577  0
                     requiredHeaders.put( URL, Boolean.TRUE );
 578  
                 }
 579  1
                 if ( StringUtils.isNotEmpty( organization ) )
 580  
                 {
 581  1
                     requiredHeaders.put( ORGANIZATION, Boolean.TRUE );
 582  
                 }
 583  1
                 if ( StringUtils.isNotEmpty( organizationUrl ) )
 584  
                 {
 585  0
                     requiredHeaders.put( ORGANIZATION_URL, Boolean.TRUE );
 586  
                 }
 587  1
                 if ( null != roles && !roles.isEmpty() )
 588  
                 {
 589  1
                     requiredHeaders.put( ROLES, Boolean.TRUE );
 590  
                 }
 591  1
                 if ( StringUtils.isNotEmpty( timeZone ) )
 592  
                 {
 593  1
                     requiredHeaders.put( TIME_ZONE, Boolean.TRUE );
 594  
                 }
 595  1
                 if ( null != properties && !properties.isEmpty() )
 596  
                 {
 597  0
                     requiredHeaders.put( PROPERTIES, Boolean.TRUE );
 598  
                 }
 599  
             }
 600  1
         }
 601  
 
 602  
         /**
 603  
          * Create a table cell with a link to the given url. The url is not validated.
 604  
          *
 605  
          * @param url
 606  
          */
 607  
         private void tableCellForUrl( String url )
 608  
         {
 609  0
             sink.tableCell();
 610  
 
 611  0
             if ( StringUtils.isEmpty( url ) )
 612  
             {
 613  0
                 text( url );
 614  
             }
 615  
             else
 616  
             {
 617  0
                 link( url, url );
 618  
             }
 619  
 
 620  0
             sink.tableCell_();
 621  0
         }
 622  
     }
 623  
 }