video-surveillance-app/src/main/java/me/belkacemi/iotalarm/domain/model/DeviceId.java

54 lines
1.7 KiB
Java
Raw Normal View History

package me.belkacemi.iotalarm.domain.model;
import java.util.regex.Pattern;
/**
* Value Object identifiant un capteur physique.
*
* <p>Dans le studio il n'y en a qu'un : {@code iphone-biblio}, un vieil iPhone
* recyclé, calé entre deux livres de la bibliothèque.</p>
*
* <p>L'identifiant est contraint dès la construction. Le domaine refuse les
* données invalides à sa frontière, il n'a donc jamais à s'en méfier ensuite.</p>
*/
public record DeviceId(String value) {
private static final Pattern VALID = Pattern.compile("^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$");
public DeviceId {
if (value == null || value.isBlank()) {
throw new IllegalArgumentException("L'identifiant de capteur est obligatoire");
}
value = value.trim().toLowerCase();
if (!VALID.matcher(value).matches()) {
throw new IllegalArgumentException(
"Identifiant de capteur invalide : '" + value
+ "' (minuscules, chiffres et tirets, 3 a 64 caracteres)");
}
}
public static DeviceId of(String value) {
return new DeviceId(value);
}
/** Libelle lisible affiche dans la console : {@code iphone-biblio} -> {@code "Iphone Biblio"}. */
public String displayName() {
StringBuilder sb = new StringBuilder(value.length());
for (String part : value.split("-")) {
if (part.isEmpty()) {
continue;
}
if (!sb.isEmpty()) {
sb.append(' ');
}
sb.append(Character.toUpperCase(part.charAt(0))).append(part.substring(1));
}
return sb.toString();
}
@Override
public String toString() {
return value;
}
}