blob: 79fb3e1392c88f5e9622d75af7c5965660f3d84d [file] [log] [blame]
/*
* Copyright (c) 2015 Eike Stepper (Berlin, Germany) and others.
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.userstorage.util;
import org.eclipse.userstorage.IBlob;
import java.io.Serializable;
import java.util.regex.Pattern;
/**
* Signals that the lexical conventions for {@link IBlob#getKey() keys} have been violated.
* <p>
* The lexical conventions for keys are:
* <p>
* <ul>
* <li> 5-25 characters are required.
* <li> Lower case letters, upper case letters, digits, and underscores are valid characters.
* <li> First character must be a lower case or upper case letter.
* </ul>
* <p>
*
* @author Eike Stepper
*/
public final class BadKeyException extends RuntimeException
{
private static final int MIN_CHARS = 5;
private static final int MAX_CHARS = 25;
private static final Pattern PATTERN = Pattern.compile("[a-zA-Z][a-zA-z0-9_]*");
private static final long serialVersionUID = 1L;
/**
* Public constructor to make this exception {@link Serializable}.
*/
public BadKeyException()
{
}
private BadKeyException(String message)
{
super(message);
}
/**
* Validates that the given {@link IBlob#getKey() key} complies
* with the {@link BadKeyException lexical conventions} for keys.
* <p>
*
* @param key the key to validate.<p>
* @return the passed key if it complies with the lexical conventions, i.e.,
* if no BadKeyException is thrown.<p>
* @throws BadKeyException if the passed key violates the lexical conventions.
*/
public static String validate(String key) throws BadKeyException
{
if (key == null)
{
throw new BadKeyException("Key is null");
}
int length = key.length();
if (length < MIN_CHARS)
{
throw new BadKeyException("Key is shorter than the minimum of " + MIN_CHARS + " characters");
}
if (length > MAX_CHARS)
{
throw new BadKeyException("Key is longer than the maximum of " + MAX_CHARS + " characters");
}
if (!PATTERN.matcher(key).matches())
{
throw new BadKeyException("Key '" + key + "' does not match pattern " + PATTERN);
}
return key;
}
}