Source:
<code>public Component getContent(Project project, ExtensionUtil util) { CssLayout layout = new CssLayout(); layout.addStyleName(STYLE_ABOUT_INFOBOX); layout.setSizeFull(); String description = "No description available"; if (StringUtils.isNotBlank(project.getDescription())) { description = project.getDescription(); if (project.getDescriptionFormat().equals("text")) { description = StringEscapeUtils.escapeHtml(description); description = StringUtils.replace(description, "\n", "<br />"); } } createLabel(layout, description, STYLE_ABOUT); InfoExtension ext = project.getExtension(InfoExtension.class); if (ext != null && StringUtils.isNotBlank(ext.getPageUrl())) { createLink(layout, "Project Homepage", ext.getPageUrl(), DEFAULT_TARGET, STYLE_HOMEPAGE); } TaggingService taggingService = Services.getService(TaggingService.class); if (taggingService != null) { TagComponent tagComponent = new TagComponent(project, taggingService, util); layout.addComponent(tagComponent); } if (!util.getProjectTemplate().isHidden(Project.class.getName(), Project.PROPERTY_PHASE, util.isUserProjectAdmin(project))) { createLabel(layout, MessageFormat.format("This project is in the <b>{0}</b> phase.", project.getPhase()), STYLE_PHASE); } layout.addComponent(new Label("<div id=" + DEBUG_ID + "></div>", Label.CONTENT_XHTML)); addLastModifiedInfo(layout,getCaption(), ext); <START> addLastModifiedInfo(layout,"Project", project); <END> return layout; }</code><technical_language>I find confusing: in extreme case, if infobox renders information N extensions, N timestamps --- user information belongs timestamp! Suggestions: * a rule of thumb, render timestamps for info boxes show dynamic asynchronously polled content (like Timeline Maven info boxes), for info boxes display manually edited content. * render global modification timestamp, i.e. of project, is updated extension is changed. * box natural place for this global timestamp, this box kind of represents project a whole</technical_language>

Target:
public Component getContent(Project project, ExtensionUtil util) { CssLayout layout = new CssLayout(); layout.addStyleName(STYLE_ABOUT_INFOBOX); layout.setSizeFull(); String description = "No description available"; if (StringUtils.isNotBlank(project.getDescription())) { description = project.getDescription(); if (project.getDescriptionFormat().equals("text")) { description = StringEscapeUtils.escapeHtml(description); description = StringUtils.replace(description, "\n", "<br />"); } } createLabel(layout, description, STYLE_ABOUT); InfoExtension ext = project.getExtension(InfoExtension.class); if (ext != null && StringUtils.isNotBlank(ext.getPageUrl())) { createLink(layout, "Project Homepage", ext.getPageUrl(), DEFAULT_TARGET, STYLE_HOMEPAGE); } TaggingService taggingService = Services.getService(TaggingService.class); if (taggingService != null) { TagComponent tagComponent = new TagComponent(project, taggingService, util); layout.addComponent(tagComponent); } if (!util.getProjectTemplate().isHidden(Project.class.getName(), Project.PROPERTY_PHASE, util.isUserProjectAdmin(project))) { createLabel(layout, MessageFormat.format("This project is in the <b>{0}</b> phase.", project.getPhase()), STYLE_PHASE); } layout.addComponent(new Label("<div id=" + DEBUG_ID + "></div>", Label.CONTENT_XHTML)); addLastModifiedInfo(layout, project); return layout; }