/*******************************************************************************
* 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.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.skalli.commons.CollectionUtils;
import org.eclipse.skalli.commons.HtmlUtils;
import org.eclipse.skalli.model.EntityBase;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.model.Severity;
import org.eclipse.skalli.services.extension.DataMigration;
import org.eclipse.skalli.services.extension.ExtensionService;
import org.eclipse.skalli.services.extension.ExtensionServiceBase;
import org.eclipse.skalli.services.extension.ExtensionValidator;
import org.eclipse.skalli.services.extension.Indexer;
import org.eclipse.skalli.services.extension.PropertyValidator;
import org.eclipse.skalli.services.extension.validators.RegularExpressionValidator;
import org.eclipse.skalli.services.extension.validators.StringLengthValidator;
import org.eclipse.skalli.services.extension.validators.WhitelistValidator;
import org.jsoup.safety.Whitelist;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ExtensionServiceCore
extends ExtensionServiceBase<Project>
implements ExtensionService<Project>
{
private static final Logger LOG = LoggerFactory.getLogger(ExtensionServiceCore.class);
private static final String CAPTION = "Basics";
private static final String DESCRIPTION = "Information related to all projects.";
private static final Map<String, String> CAPTIONS = CollectionUtils.addAll(ExtensionServiceBase.CAPTIONS,
new String[][] {
{ EntityBase.PROPERTY_PARENT_ENTITY_ID, "Parent Project ID" },
{ EntityBase.PROPERTY_PARENT_ENTITY, "Parent Project" },
{ Project.PROPERTY_PROJECTID, "Project ID" },
{ Project.PROPERTY_TEMPLATEID, "Project Template" },
{ Project.PROPERTY_PARENT_PROJECT, "Parent Project" },
{ Project.PROPERTY_NAME, "Display Name" },
{ Project.PROPERTY_SHORT_NAME, "Short Name" },
{ Project.PROPERTY_DESCRIPTION_FORMAT, "Description Format" },
{ Project.PROPERTY_DESCRIPTION, "Description" },
{ Project.PROPERTY_LOGO_URL, "Project Logo" },
{ Project.PROPERTY_PHASE, "Project Phase" },
{ Project.PROPERTY_REGISTERED, "Registered at" } });
private static final Map<String, String> DESCRIPTIONS = CollectionUtils.addAll(ExtensionServiceBase.DESCRIPTIONS,
new String[][] {
{ EntityBase.PROPERTY_PARENT_ENTITY, "Project to which this project is assigned as subproject" },
{ EntityBase.PROPERTY_PARENT_ENTITY_ID,
"Unique identifier of a project to which this project is assigned as subproject" },
{ Project.PROPERTY_PROJECTID, "Unique symbolic name for this project" },
{ Project.PROPERTY_TEMPLATEID, "Identifier of the project template this project is derived from" },
{ Project.PROPERTY_PARENT_PROJECT, "Project to which this project is a subproject" },
{ Project.PROPERTY_NAME, "A human readable name for this project" },
{ Project.PROPERTY_SHORT_NAME, "Abbreviation of the project name. If not maintained, it will be " +
"contructed automatically from the display name if needed." },
{ Project.PROPERTY_DESCRIPTION_FORMAT, "Format of the description" },
{ Project.PROPERTY_DESCRIPTION, "Description of this project" },
{ Project.PROPERTY_LOGO_URL, "Link to a picture that serves as logo of this project" },
{ Project.PROPERTY_PHASE, "Current lifecycle phase of this project" },
{ Project.PROPERTY_REGISTERED, "Creation date of this project" } });
private static final int PROJECTID_MIN_LENGHTH = 3;
private static final int PROJECTID_MAX_LENGHTH = 64;
private static final String PROJECTID_REGEX = "[a-z][a-z0-9_\\-.]*"; //$NON-NLS-1$
private static final int NAME_MIN_LENGHTH = 3;
private static final int NAME_MAX_LENGHTH = 255;
private static final int SHORT_NAME_MIN_LENGHTH = 2;
private static final int SHORT_NAME_MAX_LENGHTH = 10;
private static final String SHORT_NAME_REGEX = "[a-zA-Z0-9]*"; //$NON-NLS-1$
@Override
public Class<Project> getExtensionClass() {
return Project.class;
}
@Override
public Project newExtension() {
return new Project();
}
protected void activate(ComponentContext context) {
LOG.info("activated core model"); //$NON-NLS-1$
}
protected void deactivate(ComponentContext context) {
LOG.info("deactivated core model"); //$NON-NLS-1$
}
@Override
public Set<DataMigration> getMigrations() {
Set<DataMigration> migrations = new HashSet<DataMigration>();
migrations.add(new DataMigration0());
migrations.add(new DataMigration2());
migrations.add(new DataMigration3());
migrations.add(new DataMigration5());
migrations.add(new DataMigration8());
migrations.add(new DataMigration9());
migrations.add(new DataMigration10());
migrations.add(new DataMigration11());
migrations.add(new DataMigration12());
migrations.add(new DataMigration13());
migrations.add(new DataMigration14());
migrations.add(new DataMigration15());
migrations.add(new DataMigration16());
migrations.add(new DataMigration19());
return migrations;
}
@Override
public String getShortName() {
return "project"; //$NON-NLS-1$
}
@Override
public String getCaption() {
return CAPTION;
}
@Override
public String getDescription() {
return DESCRIPTION;
}
@Override
public String getModelVersion() {
return Project.MODEL_VERSION;
}
@Override
public String getNamespace() {
return Project.NAMESPACE;
}
@Override
public String getXsdFileName() {
return "project.xsd"; //$NON-NLS-1$
}
@Override
public Indexer<Project> getIndexer() {
return new ProjectIndexer();
}
@Override
public String getCaption(String propertyName) {
return CAPTIONS.get(propertyName);
}
@Override
public String getDescription(String propertyName) {
return DESCRIPTIONS.get(propertyName);
}
@Override
public List<PropertyValidator> getPropertyValidators(String propertyName, String caption) {
List<PropertyValidator> validators = new ArrayList<PropertyValidator>();
if (Project.PROPERTY_PROJECTID.equals(propertyName)) {
validators.add(new StringLengthValidator(Severity.FATAL, getExtensionClass(), propertyName, caption,
PROJECTID_MIN_LENGHTH, PROJECTID_MAX_LENGHTH));
validators.add(new RegularExpressionValidator(Severity.FATAL, getExtensionClass(), propertyName, caption,
PROJECTID_REGEX));
}
else if (Project.PROPERTY_NAME.equals(propertyName)) {
validators.add(new StringLengthValidator(Severity.FATAL, getExtensionClass(), propertyName, caption,
NAME_MIN_LENGHTH, NAME_MAX_LENGHTH));
validators.add(new WhitelistValidator(Severity.FATAL, getExtensionClass(), propertyName,
MessageFormat.format("{0} must not contain any HTML tags", caption),
MessageFormat.format("Property ''{0}'' must not contain any HTML tags", propertyName),
Whitelist.none()));
}
else if (Project.PROPERTY_SHORT_NAME.equals(propertyName)) {
validators.add(new StringLengthValidator(Severity.FATAL, getExtensionClass(), propertyName, caption,
SHORT_NAME_MIN_LENGHTH, SHORT_NAME_MAX_LENGHTH));
validators.add(new RegularExpressionValidator(Severity.FATAL, getExtensionClass(), propertyName,
MessageFormat.format("{0} must contain letters and digits only", caption),
HtmlUtils.formatEscaped("Property ''{0}'' must contain letters and digits only", propertyName),
SHORT_NAME_REGEX));
} else if (Project.PROPERTY_DELETED.equals(propertyName)) {
validators.add(new NoSubprojectsValidator());
} else if (Project.PROPERTY_PHASE.equals(propertyName)) {
validators.add(new WhitelistValidator(Severity.FATAL, getExtensionClass(), propertyName,
MessageFormat.format("{0} must not contain any HTML tags", caption),
MessageFormat.format("Property ''{0}'' must not contain any HTML tags", propertyName),
Whitelist.none()));
}
return validators;
}
@Override
public List<ExtensionValidator<Project>> getExtensionValidators(Map<String, String> captions) {
List<ExtensionValidator<Project>> validators = new ArrayList<ExtensionValidator<Project>>();
validators.add(new ProjectDescriptionValidator());
return validators;
}
}