package org.molgenis.data.meta; import org.molgenis.MolgenisReservedKeywords; import org.molgenis.data.MolgenisDataException; import java.util.Set; import static com.google.common.collect.Sets.newHashSet; /** * Validates if metadata is internally consistent and correct. */ public class NameValidator { private static final int MAX_ATTRIBUTE_LENGTH = 30; public static final Set<String> KEYWORDS = newHashSet(); static { // some words are reserved for the RestAPI and default packages/entities/attributes, etc. KEYWORDS.addAll(MolgenisReservedKeywords.MOLGENIS_KEYWORDS); } /** * Checks if a name is a reserved keyword. */ private static void checkForKeyword(String name) { if (KEYWORDS.contains(name) || KEYWORDS.contains(name.toUpperCase())) { throw new MolgenisDataException("Name [" + name + "] is not allowed because it is a reserved keyword."); } } /** * Validates names of entities, packages and attributes. Rules: only [a-zA-Z0-9_#] are allowed, name must start with * a letter * * @throws MolgenisDataException */ public static void validateName(String name) { checkForKeyword(name); if (name.length() > MAX_ATTRIBUTE_LENGTH) { throw new MolgenisDataException( "Name [" + name + "] is too long: maximum length is " + MAX_ATTRIBUTE_LENGTH + " characters."); } if (!name.matches("[a-zA-Z0-9_#]+(-[a-z]{2,3})??$")) { throw new MolgenisDataException("Invalid characters in: [" + name + "] Only letters (a-z, A-Z), digits (0-9), underscores (_) and hashes (#) are allowed."); } if (Character.isDigit(name.charAt(0))) { throw new MolgenisDataException("Invalid name: [" + name + "] Names must start with a letter."); } } }