use of com.helger.html.hc.html.grouping.HCOL in project phoss-directory by phax.
the class PDCommonUI method showBusinessInfoDetails.
@Nonnull
public static BootstrapViewForm showBusinessInfoDetails(@Nonnull final PDStoredBusinessEntity aStoredDoc, @Nonnull final Locale aDisplayLocale) {
final BootstrapViewForm aViewForm = new BootstrapViewForm();
if (aStoredDoc.hasCountryCode()) {
final HCNodeList aCountryCtrl = new HCNodeList();
final String sCountryCode = aStoredDoc.getCountryCode();
aCountryCtrl.addChild(getFlagNode(sCountryCode));
final Locale aCountry = CountryCache.getInstance().getCountry(sCountryCode);
if (aCountry != null)
aCountryCtrl.addChild(" " + aCountry.getDisplayCountry(aDisplayLocale) + " [" + sCountryCode + "]");
else
aCountryCtrl.addChild(" " + sCountryCode);
aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("Country").setCtrl(aCountryCtrl));
}
if (aStoredDoc.names().isNotEmpty()) {
final ICommonsList<PDStoredMLName> aNames = getUIFilteredNames(aStoredDoc.names(), aDisplayLocale);
IHCNode aNameCtrl;
if (aNames.size() == 1)
aNameCtrl = getMLNameNode(aNames.getFirst(), aDisplayLocale);
else {
final HCUL aNameUL = new HCUL();
aNames.forEach(x -> aNameUL.addItem(getMLNameNode(x, aDisplayLocale)));
aNameCtrl = aNameUL;
}
aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("Entity Name").setCtrl(aNameCtrl));
}
if (aStoredDoc.hasGeoInfo())
aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("Geographical information").setCtrl(HCExtHelper.nl2divList(aStoredDoc.getGeoInfo())));
if (aStoredDoc.identifiers().isNotEmpty()) {
final BootstrapTable aIDTable = new BootstrapTable(HCCol.star(), HCCol.star()).setStriped(true).setBordered(true).setCondensed(true);
aIDTable.addHeaderRow().addCells("Scheme", "Value");
for (final PDStoredIdentifier aStoredID : aStoredDoc.identifiers()) aIDTable.addBodyRow().addCells(aStoredID.getScheme(), aStoredID.getValue());
aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("Additional identifiers").setCtrl(aIDTable));
}
if (aStoredDoc.websiteURIs().isNotEmpty()) {
final HCOL aOL = new HCOL();
for (final String sWebsiteURI : aStoredDoc.websiteURIs()) aOL.addItem(HCA.createLinkedWebsite(sWebsiteURI, HC_Target.BLANK));
aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("Website URIs").setCtrl(aOL));
}
if (aStoredDoc.contacts().isNotEmpty()) {
final BootstrapTable aContactTable = new BootstrapTable(HCCol.star(), HCCol.star(), HCCol.star(), HCCol.star()).setStriped(true).setBordered(true);
aContactTable.addHeaderRow().addCells("Type", "Name", "Phone Number", "Email");
for (final PDStoredContact aStoredContact : aStoredDoc.contacts()) aContactTable.addBodyRow().addCells(aStoredContact.getType(), aStoredContact.getName(), aStoredContact.getPhone(), aStoredContact.getEmail());
aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("Contacts").setCtrl(aContactTable));
}
if (aStoredDoc.hasAdditionalInformation())
aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("Additional information").setCtrl(HCExtHelper.nl2divList(aStoredDoc.getAdditionalInformation())));
if (aStoredDoc.hasRegistrationDate())
aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("Registration date").setCtrl(PDTToString.getAsString(aStoredDoc.getRegistrationDate(), aDisplayLocale)));
return aViewForm;
}
use of com.helger.html.hc.html.grouping.HCOL in project phoss-directory by phax.
the class PagePublicSearchSimple method _showResultList.
private void _showResultList(@Nonnull final WebPageExecutionContext aWPEC, @Nonnull @Nonempty final String sQuery, @Nonnegative final int nMaxResults) {
final HCNodeList aNodeList = aWPEC.getNodeList();
final Locale aDisplayLocale = aWPEC.getDisplayLocale();
final IRequestWebScopeWithoutResponse aRequestScope = aWPEC.getRequestScope();
final PDStorageManager aStorageMgr = PDMetaManager.getStorageMgr();
// Search all documents
if (LOGGER.isInfoEnabled())
LOGGER.info("Searching generically for '" + sQuery + "'");
// Build Lucene query
final Query aLuceneQuery = PDQueryManager.convertQueryStringToLuceneQuery(PDMetaManager.getLucene(), CPDStorage.FIELD_ALL_FIELDS, sQuery);
if (LOGGER.isDebugEnabled())
LOGGER.debug("Created query for '" + sQuery + "' is <" + aLuceneQuery + ">");
PDSessionSingleton.getInstance().setLastQuery(aLuceneQuery);
// Search all documents
final ICommonsList<PDStoredBusinessEntity> aResultBEs = aStorageMgr.getAllDocuments(aLuceneQuery, nMaxResults);
// Also get the total hit count for UI display. May be < 0 in case of
// error
final int nTotalBEs = aStorageMgr.getCount(aLuceneQuery);
if (LOGGER.isInfoEnabled())
LOGGER.info(" Result for <" + aLuceneQuery + "> (max=" + nMaxResults + ") " + (aResultBEs.size() == 1 ? "is 1 document" : "are " + aResultBEs.size() + " documents") + "." + (nTotalBEs >= 0 ? " " + nTotalBEs + " total hits are available." : ""));
// Group by participant ID
final ICommonsMap<IParticipantIdentifier, ICommonsList<PDStoredBusinessEntity>> aGroupedBEs = PDStorageManager.getGroupedByParticipantID(aResultBEs);
// Display results
if (aGroupedBEs.isEmpty()) {
aNodeList.addChild(info("No search results found for query '" + sQuery + "'"));
} else {
aNodeList.addChild(div(badgeSuccess("Found " + (aGroupedBEs.size() == 1 ? "1 entity" : aGroupedBEs.size() + " entities") + " matching '" + sQuery + "'")));
if (nTotalBEs > nMaxResults) {
aNodeList.addChild(div(badgeWarn("Found more entities than displayed (" + nTotalBEs + " entries exist). Try to be more specific.")));
}
// Show basic information
final HCOL aOL = new HCOL().setStart(1);
for (final Map.Entry<IParticipantIdentifier, ICommonsList<PDStoredBusinessEntity>> aEntry : aGroupedBEs.entrySet()) {
final IParticipantIdentifier aDocParticipantID = aEntry.getKey();
final ICommonsList<PDStoredBusinessEntity> aDocs = aEntry.getValue();
// Start result document
final HCDiv aResultItem = div().addClass(CSS_CLASS_RESULT_DOC);
final HCDiv aHeadRow = aResultItem.addAndReturnChild(new HCDiv());
{
final boolean bIsPeppolDefault = aDocParticipantID.hasScheme(PEPPOL_DEFAULT_SCHEME);
IHCNode aParticipantNode = null;
if (bIsPeppolDefault) {
final IParticipantIdentifierScheme aScheme = ParticipantIdentifierSchemeManager.getSchemeOfIdentifier(aDocParticipantID);
if (aScheme != null) {
aParticipantNode = new HCNodeList().addChild(aDocParticipantID.getValue());
if (StringHelper.hasText(aScheme.getSchemeAgency()))
((HCNodeList) aParticipantNode).addChild(" (" + aScheme.getSchemeAgency() + ")");
}
}
if (aParticipantNode == null) {
// Fallback
aParticipantNode = code(aDocParticipantID.getURIEncoded());
}
aHeadRow.addChild("Participant ID: ").addChild(aParticipantNode);
}
if (aDocs.size() > 1)
aHeadRow.addChild(" (" + aDocs.size() + " entities)");
// Show all entities of the stored document
final HCUL aUL = aResultItem.addAndReturnChild(new HCUL());
for (final PDStoredBusinessEntity aStoredDoc : aEntry.getValue()) {
final BootstrapTable aTable = new BootstrapTable(HCCol.perc(20), HCCol.star());
aTable.setCondensed(true);
if (aStoredDoc.hasCountryCode()) {
// Add country flag (if available)
final String sCountryCode = aStoredDoc.getCountryCode();
final Locale aCountry = CountryCache.getInstance().getCountry(sCountryCode);
aTable.addBodyRow().addCell("Country:").addCell(new HCNodeList().addChild(PDCommonUI.getFlagNode(sCountryCode)).addChild(" ").addChild(span(aCountry != null ? aCountry.getDisplayCountry(aDisplayLocale) + " (" + sCountryCode + ")" : sCountryCode).addClass(CSS_CLASS_RESULT_DOC_COUNTRY_CODE)));
}
if (aStoredDoc.names().isNotEmpty()) {
// TODO add locale filter here
final ICommonsList<PDStoredMLName> aNames = PDCommonUI.getUIFilteredNames(aStoredDoc.names(), aDisplayLocale);
IHCNode aNameCtrl;
if (aNames.size() == 1)
aNameCtrl = PDCommonUI.getMLNameNode(aNames.getFirst(), aDisplayLocale);
else {
final HCUL aNameUL = new HCUL();
aNames.forEach(x -> aNameUL.addItem(PDCommonUI.getMLNameNode(x, aDisplayLocale)));
aNameCtrl = aNameUL;
}
aTable.addBodyRow().addCell("Entity Name:").addCell(span(aNameCtrl).addClass(CSS_CLASS_RESULT_DOC_NAME));
}
if (aStoredDoc.hasGeoInfo())
aTable.addBodyRow().addCell("Geographical information:").addCell(div(HCExtHelper.nl2divList(aStoredDoc.getGeoInfo())).addClass(CSS_CLASS_RESULT_DOC_GEOINFO));
if (aStoredDoc.hasAdditionalInformation())
aTable.addBodyRow().addCell("Additional information:").addCell(div(HCExtHelper.nl2divList(aStoredDoc.getAdditionalInformation())).addClass(CSS_CLASS_RESULT_DOC_FREETEXT));
aUL.addAndReturnItem(aTable).addClass(CSS_CLASS_RESULT_DOC_HEADER);
}
final BootstrapButton aShowDetailsBtn = new BootstrapButton(EBootstrapButtonType.SUCCESS, EBootstrapButtonSize.DEFAULT).addChild("Show details").setIcon(EDefaultIcon.MAGNIFIER).addClass(CSS_CLASS_RESULT_DOC_SDBUTTON).setOnClick(aWPEC.getSelfHref().add(FIELD_QUERY, sQuery).add(CPageParam.PARAM_ACTION, CPageParam.ACTION_VIEW).add(FIELD_PARTICIPANT_ID, aDocParticipantID.getURIEncoded()));
aResultItem.addChild(div(aShowDetailsBtn));
aOL.addItem(aResultItem);
// Is the max result limit reached?
if (aOL.getChildCount() >= nMaxResults)
break;
}
aNodeList.addChild(aOL);
aNodeList.addChild(div(new BootstrapButton().setOnClick(AJAX_EXPORT_LAST.getInvocationURL(aRequestScope)).addChild("Download results as XML").setIcon(EDefaultIcon.SAVE_ALL)));
}
}
use of com.helger.html.hc.html.grouping.HCOL in project phoss-smp by phax.
the class PageSecureServiceGroupMigrationOutbound method showListOfExistingObjects.
@Override
protected void showListOfExistingObjects(@Nonnull final WebPageExecutionContext aWPEC) {
final HCNodeList aNodeList = aWPEC.getNodeList();
final ISMPParticipantMigrationManager aParticipantMigrationMgr = SMPMetaManager.getParticipantMigrationMgr();
final ISMPSettings aSettings = SMPMetaManager.getSettings();
final ISMPServiceGroupManager aServiceGroupManager = SMPMetaManager.getServiceGroupMgr();
{
final HCOL aOL = new HCOL();
aOL.addItem("The migration is initiated on this SMP, and the SML is informed about the upcoming migration");
aOL.addItem("The other SMP, that is taking over the Service Group, must acknowledge the migration by providing the same migration code (created by this SMP) to the SML");
aOL.addItem("If the migration was successful, the Service Group must be deleted from this SMP, ideally a temporary redirect to the new SMP is created. If the migration was cancelled no action is needed.");
aNodeList.addChild(info().addChild(div("The process of migrating a Service Group to another SMP consists of multiple steps:")).addChild(aOL).addChild(div("Therefore each open Migration must either be finished (deleting the Service Group) or cancelled (no action taken)." + " If a Migration is cancelled, it can be retried later.")));
}
EValidity eCanStartMigration = EValidity.VALID;
if (aSettings.getSMLInfo() == null) {
final BootstrapWarnBox aWarn = aNodeList.addAndReturnChild(warn().addChild(div("No valid SML Configuration is selected hence no participant can be migrated.")).addChild(div(new BootstrapButton().addChild("Select SML Configuration in the Settings").setOnClick(aWPEC.getLinkToMenuItem(CMenuSecure.MENU_SMP_SETTINGS)).setIcon(EDefaultIcon.EDIT))));
if (aSettings.isSMLEnabled() || aSettings.isSMLRequired()) {
aWarn.addChild(div(new BootstrapButton().addChild("Create a new SML Configuration").setOnClick(createCreateURL(aWPEC, CMenuSecure.MENU_SML_CONFIGURATION)).setIcon(EDefaultIcon.YES)));
}
eCanStartMigration = EValidity.INVALID;
} else if (!aSettings.isSMLEnabled()) {
aNodeList.addChild(warn().addChild(div("SML Connection is not enabled hence no participant can be migrated.")).addChild(div(new BootstrapButton().addChild("Enable SML in the Settings").setOnClick(aWPEC.getLinkToMenuItem(CMenuSecure.MENU_SMP_SETTINGS)).setIcon(EDefaultIcon.EDIT))));
eCanStartMigration = EValidity.INVALID;
} else {
if (aServiceGroupManager.getSMPServiceGroupCount() <= 0) {
aNodeList.addChild(warn("No Service Group is present! At least one Service Group must be present to migrate it."));
// Note: makes no to allow to create a new Service Group here and than
// directly migrate it away
eCanStartMigration = EValidity.INVALID;
}
}
{
final BootstrapButtonToolbar aToolbar = new BootstrapButtonToolbar(aWPEC);
aToolbar.addButton("Refresh", aWPEC.getSelfHref(), EDefaultIcon.REFRESH);
aToolbar.addChild(new BootstrapButton().addChild("Start Participant Migration").setOnClick(createCreateURL(aWPEC)).setDisabled(eCanStartMigration.isInvalid()).setIcon(EDefaultIcon.NEW));
aNodeList.addChild(aToolbar);
}
final BootstrapTabBox aTabBox = aNodeList.addAndReturnChild(new BootstrapTabBox());
final ICommonsList<ISMPParticipantMigration> aAllMigs = aParticipantMigrationMgr.getAllOutboundParticipantMigrations(null);
for (final EParticipantMigrationState eState : EParticipantMigrationState.values()) if (eState.isOutboundState()) {
final ICommonsList<ISMPParticipantMigration> aMatchingMigs = aAllMigs.getAll(x -> x.getState() == eState);
aTabBox.addTab(eState.getID(), eState.getDisplayName() + " (" + aMatchingMigs.size() + ")", _createTable(aWPEC, aMatchingMigs, eState));
}
}
use of com.helger.html.hc.html.grouping.HCOL in project phoss-smp by phax.
the class PageSecureTasksProblems method _iterateTrustStore.
private void _iterateTrustStore(@Nonnull final WebPageExecutionContext aWPEC, @Nonnull final HCOL aOL, @Nonnull final OffsetDateTime aNowDT, @Nonnull final OffsetDateTime aNowPlusDT, @Nonnull final KeyStore aTrustStore) {
final Locale aDisplayLocale = aWPEC.getDisplayLocale();
final HCOL aTrustStoreOL = new HCOL();
boolean bHasError = false;
try {
for (final String sAlias : CollectionHelper.newList(aTrustStore.aliases())) {
final Certificate aCert = aTrustStore.getCertificate(sAlias);
if (aCert instanceof X509Certificate) {
final X509Certificate aX509Cert = (X509Certificate) aCert;
final String sLogPrefix = "The provided certificate with subject '" + aX509Cert.getSubjectX500Principal().getName() + "' ";
final OffsetDateTime aNotBefore = PDTFactory.createOffsetDateTime(aX509Cert.getNotBefore());
if (aNowDT.isBefore(aNotBefore)) {
aTrustStoreOL.addItem(_createError(sLogPrefix + " is not yet valid."), div("It will be valid from " + PDTToString.getAsString(aNotBefore, aDisplayLocale)));
bHasError = true;
}
final OffsetDateTime aNotAfter = PDTFactory.createOffsetDateTime(aX509Cert.getNotAfter());
if (aNowDT.isAfter(aNotAfter)) {
aTrustStoreOL.addItem(_createError(sLogPrefix + " is already expired."), div("It was valid until " + PDTToString.getAsString(aNotAfter, aDisplayLocale)));
bHasError = true;
} else if (aNowPlusDT.isAfter(aNotAfter))
aTrustStoreOL.addItem(_createWarning(sLogPrefix + " will expire soon."), div("It is only valid until " + PDTToString.getAsString(aNotAfter, aDisplayLocale)));
} else
aTrustStoreOL.addItem(_createWarning("The certificate is not an X.509 certificate! It is internally a " + ClassHelper.getClassName(aCert)));
}
} catch (final GeneralSecurityException ex) {
aTrustStoreOL.addItem(_createError("Error iterating trust store."), div(SMPCommonUI.getTechnicalDetailsUI(ex)));
bHasError = true;
}
if (aTrustStoreOL.hasChildren())
aOL.addItem(bHasError ? _createError("Trust store issues") : _createWarning("Trust store issues"), aTrustStoreOL);
}
use of com.helger.html.hc.html.grouping.HCOL in project phoss-smp by phax.
the class PageSecureTasksProblems method fillContent.
@Override
protected void fillContent(@Nonnull final WebPageExecutionContext aWPEC) {
final HCNodeList aNodeList = aWPEC.getNodeList();
final Locale aDisplayLocale = aWPEC.getDisplayLocale();
final ISMPServiceGroupManager aServiceGroupMgr = SMPMetaManager.getServiceGroupMgr();
final ISMPServiceInformationManager aServiceInfoMgr = SMPMetaManager.getServiceInformationMgr();
final OffsetDateTime aNowDT = PDTFactory.getCurrentOffsetDateTime();
final OffsetDateTime aNowPlusDT = aNowDT.plusMonths(3);
aNodeList.addChild(info("This page tries to identify upcoming tasks and potential problems in the SMP configuration. It is meant to highlight immediate and upcoming action items as well as potential misconfiguration."));
final HCOL aOL = new HCOL();
// Check for default password
if (PhotonSecurityManager.getUserMgr().areUserIDAndPasswordValid(CSecurity.USER_ADMINISTRATOR_ID, CSecurity.USER_ADMINISTRATOR_PASSWORD)) {
aOL.addItem(_createError("Please change the password of the default user " + CSecurity.USER_ADMINISTRATOR_EMAIL + "!"), div("This is a severe security risk"));
}
_checkSettings(aOL);
// check keystore configuration
_checkKeyStore(aWPEC, aOL, aNowDT, aNowPlusDT);
// Check truststore configuration
_checkTrustStore(aWPEC, aOL, aNowDT, aNowPlusDT);
// Check SML configuration
_checkSMLConfiguration(aOL);
// Check Directory configuration
_checkDirectoryConfig(aWPEC, aOL, aNowDT, aNowPlusDT);
// check service groups and redirects
{
final ICommonsList<ISMPServiceGroup> aServiceGroups = aServiceGroupMgr.getAllSMPServiceGroups();
if (aServiceGroups.isEmpty()) {
aOL.addItem(_createWarning("No service group is configured. This SMP is currently empty."));
} else {
// For all service groups
for (final ISMPServiceGroup aServiceGroup : CollectionHelper.getSorted(aServiceGroups, ISMPServiceGroup.comparator())) {
final HCUL aULPerSG = new HCUL();
final ICommonsList<ISMPServiceInformation> aServiceInfos = aServiceInfoMgr.getAllSMPServiceInformationOfServiceGroup(aServiceGroup);
if (aServiceInfos.isEmpty()) {
// This is merely a warning or an error
aULPerSG.addItem(_createInfo("No endpoint is configured for this service group."));
} else {
for (final ISMPServiceInformation aServiceInfo : aServiceInfos) {
final HCUL aULPerDocType = new HCUL();
final ICommonsList<ISMPProcess> aProcesses = aServiceInfo.getAllProcesses();
for (final ISMPProcess aProcess : aProcesses) {
final HCUL aULPerProcess = new HCUL();
final ICommonsList<ISMPEndpoint> aEndpoints = aProcess.getAllEndpoints();
for (final ISMPEndpoint aEndpoint : aEndpoints) {
final HCUL aULPerEndpoint = new HCUL();
final ESMPTransportProfile eTransportProfile = ESMPTransportProfile.getFromIDOrNull(aEndpoint.getTransportProfile());
if (eTransportProfile == null)
aULPerEndpoint.addItem(_createWarning("The endpoint uses the non-standard transport profile '" + aEndpoint.getTransportProfile() + "'."));
if (aEndpoint.getServiceActivationDateTime() != null) {
if (aEndpoint.getServiceActivationDateTime().isAfter(XMLOffsetDateTime.of(aNowDT)))
aULPerEndpoint.addItem(_createWarning("The endpoint is not yet active."), div("It will be active from " + PDTToString.getAsString(aEndpoint.getServiceActivationDateTime(), aDisplayLocale) + "."));
}
if (aEndpoint.getServiceExpirationDateTime() != null) {
if (aEndpoint.getServiceExpirationDateTime().isBefore(XMLOffsetDateTime.of(aNowDT)))
aULPerEndpoint.addItem(_createError("The endpoint is no longer active."), div("It was valid until " + PDTToString.getAsString(aEndpoint.getServiceExpirationDateTime(), aDisplayLocale) + "."));
else if (aEndpoint.getServiceExpirationDateTime().isBefore(XMLOffsetDateTime.of(aNowPlusDT)))
aULPerEndpoint.addItem(_createWarning("The endpoint will be inactive soon."), div("It is only valid until " + PDTToString.getAsString(aEndpoint.getServiceExpirationDateTime(), aDisplayLocale) + "."));
}
X509Certificate aX509Cert = null;
try {
aX509Cert = CertificateHelper.convertStringToCertficate(aEndpoint.getCertificate());
} catch (final CertificateException ex) {
// Ignore
}
if (aX509Cert == null)
aULPerEndpoint.addItem(_createError("The X.509 certificate configured at the endpoint is invalid and could not be interpreted as a certificate."));
else {
final OffsetDateTime aNotBefore = PDTFactory.createOffsetDateTime(aX509Cert.getNotBefore());
if (aNowDT.isBefore(aNotBefore))
aULPerEndpoint.addItem(_createError("The endpoint certificate is not yet active."), div("It will be valid from " + PDTToString.getAsString(aNotBefore, aDisplayLocale) + "."));
final OffsetDateTime aNotAfter = PDTFactory.createOffsetDateTime(aX509Cert.getNotAfter());
if (aNowDT.isAfter(aNotAfter))
aULPerEndpoint.addItem(_createError("The endpoint certificate is already expired."), div("It was valid until " + PDTToString.getAsString(aNotAfter, aDisplayLocale) + "."));
else if (aNowPlusDT.isAfter(aNotAfter))
aULPerEndpoint.addItem(_createWarning("The endpoint certificate will expire soon."), div("It is only valid until " + PDTToString.getAsString(aNotAfter, aDisplayLocale) + "."));
}
// Show per endpoint errors
if (aULPerEndpoint.hasChildren())
aULPerProcess.addItem(div("Transport profile ").addChild(code(aEndpoint.getTransportProfile())), aULPerEndpoint);
}
// Show per process errors
if (aULPerProcess.hasChildren())
aULPerDocType.addItem(div("Process ").addChild(code(aProcess.getProcessIdentifier().getURIEncoded()).addClass(CUICoreCSS.CSS_CLASS_NOWRAP)), aULPerProcess);
}
// Show per document type errors
if (aULPerDocType.hasChildren())
aULPerSG.addItem(div("Document type ").addChild(code(aServiceInfo.getDocumentTypeIdentifier().getURIEncoded()).addClass(CUICoreCSS.CSS_CLASS_NOWRAP)), aULPerDocType);
}
}
// Show per service group errors
if (aULPerSG.hasChildren())
aOL.addItem(div("Service group ").addChild(code(aServiceGroup.getParticipantIdentifier().getURIEncoded())), aULPerSG);
}
}
}
// Show results
if (aOL.hasChildren()) {
aNodeList.addChild(warn("The following list of tasks and problems were identified:"));
aNodeList.addChild(aOL);
} else
aNodeList.addChild(success("Great job, no tasks or problems identified!"));
}
Aggregations