/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.core.extension; import java.util.SortedSet; import java.util.TreeSet; import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.eclipse.skalli.commons.HtmlUtils; import org.eclipse.skalli.model.ExtensionEntityBase; import org.eclipse.skalli.model.Issue; import org.eclipse.skalli.model.Issuer; import org.eclipse.skalli.model.Project; import org.eclipse.skalli.model.Severity; import org.eclipse.skalli.services.extension.ExtensionValidator; import org.jsoup.Jsoup; import org.jsoup.safety.Whitelist; /** * <p>Validates the description of a project.</p> * <p>The following issue severities are covered: * <ul> * <li><strong>FATAL</strong> if the description contains forbidden HTML tags</li> * <li><strong>ERROR</strong> if description is empty</li> * <li><strong>INFO</strong> if description is rather short (< 25 characters)</li> * </ul> * </p> */ public class ProjectDescriptionValidator implements Issuer, ExtensionValidator<Project> { public static final int DESCRIPTION_RECOMMENDED_LENGHT = 25; private static final String TXT_DESCRIPTION_EMPTY = "The project description is empty. Let others know what this is about."; private static final String TXT_DESCRIPTION_SHORT = "The project description is quite short. Give some more context."; private static final String TXT_NO_TAGS_ALLOWED = "The project description must not contain any HTML tags for description " + "format 'text'. Remove all tags or select another description format."; private static final String TXT_ALLOWED_TAGS = "The project description contains unsupported HTML tags or attributes. " + "Supported tags are: <" + StringUtils.join(HtmlUtils.ALLOWED_TAGS, ">, <") + ">."; @Override public Class<Project> getExtensionClass() { return Project.class; } @SuppressWarnings("nls") @Override public SortedSet<Issue> validate(UUID entity, ExtensionEntityBase extension, Severity minSeverity) { SortedSet<Issue> issues = new TreeSet<Issue>(); Project project = (Project)extension; String description = project.getDescription(); if (description == null) { description = StringUtils.EMPTY; } Whitelist whitelist = null; String fatalMessage = null; String format = project.getDescriptionFormat(); if ("html".equals(format)) { whitelist = HtmlUtils.getWhiteList(); fatalMessage = TXT_ALLOWED_TAGS; } else { whitelist = Whitelist.none(); fatalMessage = TXT_NO_TAGS_ALLOWED; } if (!Jsoup.isValid(description, whitelist)) { issues.add(newIssue(Severity.FATAL, entity, fatalMessage)); } if (Severity.WARNING.compareTo(minSeverity) <= 0 && StringUtils.isBlank(description)) { issues.add(newIssue(Severity.WARNING, entity, TXT_DESCRIPTION_EMPTY)); } else { int descriptionLength = description.length(); if (Severity.INFO.compareTo(minSeverity) <= 0 && descriptionLength < DESCRIPTION_RECOMMENDED_LENGHT) { issues.add(newIssue(Severity.INFO, entity, TXT_DESCRIPTION_SHORT)); } } return issues; } private Issue newIssue(final Severity severity, final UUID entityId, final String text) { return new Issue(severity, ProjectDescriptionValidator.class, entityId, null, Project.PROPERTY_DESCRIPTION, 0, text); } }