Una DataCategory lleva cuatro facetas de protección: nature, confidentiality,
integrity y secret. Identifiability no es una faceta de la categoría: pertenece al campo (ver
@Category).
| Faceta | Tipo | Valores (de menos a más protección) | Dónde |
|---|---|---|---|
| naturaleza | LegalNature |
NONE, ORDINARY, SPECIAL_CATEGORY / CRIMINAL_OFFENCE |
categoría |
| confidencialidad | Confidentiality |
PUBLIC, LOW, MEDIUM, HIGH |
categoría; un campo puede elevarla |
| integridad | Integrity |
LOW, MEDIUM, HIGH |
categoría; un campo puede elevarla |
| secreto | boolean |
false, true |
categoría |
| identificabilidad | Identifiability |
IDENTIFIED, PSEUDONYMIZED, ANONYMIZED, AGGREGATED |
solo el campo |
Los cuatro enumerados son @since 0.1.0.
io.github.devbpm.linneo.LegalNature — qué es una categoría de datos según la normativa de protección de datos: Reglamento (UE) 2016/679 (RGPD, con las
correcciones de DOUE L 127, 23.5.2018) y, para España, Ley Orgánica 3/2018 (LOPDGDD, texto consolidado de 27 de
diciembre de 2025).
| Constante | Significado |
|---|---|
NONE |
No son datos personales: datos del sistema, de la organización o de referencia. |
ORDINARY |
Datos personales (artículo 4.1 del RGPD). |
SPECIAL_CATEGORY |
Categoría especial de datos personales (artículo 9 del RGPD): origen étnico o racial, opiniones políticas, convicciones religiosas o filosóficas, afiliación sindical, datos genéticos, datos biométricos tratados para identificar de manera unívoca a una persona, salud, vida sexual y orientación sexual. En España, el consentimiento por sí solo no levanta la prohibición cuando la finalidad principal es identificar ideología, afiliación sindical, religión, orientación sexual, creencias u origen racial o étnico (artículo 9.1 de la LOPDGDD), y el tratamiento amparado en el artículo 9.2 g), h) e i) del RGPD requiere una norma con rango de ley (artículo 9.2 de la LOPDGDD). |
CRIMINAL_OFFENCE |
Datos personales relativos a condenas e infracciones penales o medidas de seguridad conexas (artículo 10 del RGPD y de la LOPDGDD). Los datos de infracciones y sanciones administrativas no son de esta naturaleza: son ORDINARY con confidencialidad alta (artículo 27 de la LOPDGDD). |
| Método | Descripción |
|---|---|
boolean isPersonal() |
false solo para NONE. |
boolean admits(LegalNature child) |
Si una categoría hija puede tener la naturaleza child cuando su padre tiene esta. |
boolean requiresMaximumProtection() |
true para SPECIAL_CATEGORY y CRIMINAL_OFFENCE: los datos de esa naturaleza deben tener confidencialidad HIGH e integridad HIGH. |
admits es la regla que aplica el constructor a la naturaleza de una categoría hija:
| Naturaleza del padre | Naturalezas admitidas en la hija |
|---|---|
NONE |
NONE |
ORDINARY |
ORDINARY, SPECIAL_CATEGORY, CRIMINAL_OFFENCE |
SPECIAL_CATEGORY |
SPECIAL_CATEGORY |
CRIMINAL_OFFENCE |
CRIMINAL_OFFENCE |
Así, la naturaleza la fija la raíz de la jerarquía: una jerarquía NONE nunca contiene datos personales, una
categoría ORDINARY puede tener hijas de categoría especial o de infracciones penales, y estas conservan su
naturaleza en todo el subárbol.
requiresMaximumProtection() es la regla que fija los niveles: TaxonomyBuilder.build() lanza TaxonomyException
si una categoría SPECIAL_CATEGORY o CRIMINAL_OFFENCE no resuelve (declarada o heredada) a confidencialidad HIGH
e integridad HIGH.
LegalNature.ORDINARY.admits(LegalNature.SPECIAL_CATEGORY); // true
LegalNature.SPECIAL_CATEGORY.admits(LegalNature.CRIMINAL_OFFENCE); // false
LegalNature.NONE.admits(LegalNature.ORDINARY); // false
io.github.devbpm.linneo.Confidentiality — cuánto daño causaría divulgar los datos. LOW, MEDIUM y HIGH
siguen las escalas habituales de tres niveles de los marcos de seguridad de la información (por ejemplo, el ENS o
FIPS 199); PUBLIC es para datos destinados a ser públicos.
| Constante | Significado |
|---|---|
PUBLIC |
Datos públicos: divulgarlos no causa daño. |
LOW |
La divulgación causaría un daño limitado. |
MEDIUM |
La divulgación causaría un daño grave. |
HIGH |
La divulgación causaría un daño muy grave. Es siempre el nivel de los datos de categoría especial y de condenas e infracciones penales. |
Las constantes se declaran en orden creciente, así que compareTo las ordena por exigencia.
| Método | Descripción |
|---|---|
Confidentiality max(Confidentiality other) |
El más exigente entre este nivel y other. |
io.github.devbpm.linneo.Integrity — cuánto daño causaría un cambio no autorizado o no detectado en los datos. La
integridad es independiente de la confidencialidad: un registro de auditoría o una matriz de permisos pueden ser
inofensivos de divulgar y críticos de mantener inalterados.
| Constante | Significado |
|---|---|
LOW |
Un cambio no deseado causaría un daño limitado. |
MEDIUM |
Un cambio no deseado causaría un daño grave. |
HIGH |
Un cambio no deseado causaría un daño muy grave. |
Las constantes se declaran en orden creciente, así que compareTo las ordena por exigencia.
| Método | Descripción |
|---|---|
Integrity max(Integrity other) |
El más exigente entre este nivel y other. |
Confidentiality.LOW.max(Confidentiality.HIGH); // HIGH
Integrity.HIGH.compareTo(Integrity.MEDIUM) > 0; // true
io.github.devbpm.linneo.Identifiability — hasta qué punto un valor almacenado de datos personales apunta
directamente a una persona. Pertenece al campo, no a la categoría: la misma categoría puede guardarse identificada en
una tabla y seudonimizada en otra.
| Constante | Significado | ¿Dato personal? |
|---|---|---|
IDENTIFIED |
El valor identifica a la persona directamente o mediante otros datos que tiene el responsable. | sí |
PSEUDONYMIZED |
El valor solo puede vincularse a la persona con información adicional guardada por separado (artículo 4.5 del RGPD). | sí (considerando 26 del RGPD) |
ANONYMIZED |
El valor ya no puede vincularse a la persona. | no, mientras nadie pueda reidentificarla |
AGGREGATED |
El valor resume a varias personas y no describe a ninguna de ellas. | no, mientras nadie pueda reidentificarla |
FieldClassification.isPersonal() aplica la última columna: un campo es dato personal solo cuando su categoría es
personal y su identificabilidad es IDENTIFIED o PSEUDONYMIZED (ver Resultados). Un campo
con categoría personal y sin identificabilidad declarada es IDENTIFIED; un campo con categoría no personal no tiene
identificabilidad.
TaxonomyBuilder.build() resuelve las facetas empezando por el padre:
nature, confidentiality e integrity.nature: debe admitirla la naturaleza del padre (parent.nature().admits(child));confidentiality, integrity: no pueden ser inferiores a las del padre (compareTo).
En caso contrario, build() lanza TaxonomyException.requiresMaximumProtection() (SPECIAL_CATEGORY o
CRIMINAL_OFFENCE) debe acabar con confidencialidad HIGH e integridad HIGH, declaradas o heredadas. Una hija
que pasa a ser categoría especial bajo un padre con niveles inferiores debe, por tanto, subirlos también.secret se combina con OR hacia abajo: una categoría es secreta si lo declara o si su padre es secreto. Una
categoría secreta hace secretas a todas sus descendientes, y nada puede revertirlo.attributes se heredan: la hija recibe los atributos del padre, sobrescritos por los que declara.La DataCategory resultante contiene los valores efectivos, así que DataCategory.confidentiality() ya incluye lo
heredado. En la taxonomía estándar, por ejemplo:
| Categoría | Declara | Efectivo |
|---|---|---|
user |
ORDINARY, LOW, MEDIUM, no secreta |
ORDINARY, LOW, MEDIUM, no secreta |
user.authorization |
confidencialidad HIGH, integridad HIGH |
ORDINARY, HIGH, HIGH, no secreta |
user.authorization.biometric |
naturaleza SPECIAL_CATEGORY, secreta |
SPECIAL_CATEGORY, HIGH, HIGH, secreta |
user.authorization.password |
secreta | ORDINARY, HIGH, HIGH, secreta |
A nivel de campo, @Category aplica la misma dirección: un campo puede elevar la
confidencialidad o la integridad por encima de las de su categoría, nunca rebajarlas (LOWERED_LEVEL).
Véase también: Términos · Taxonomía estándar ·
Extender la taxonomía · @Category ·
curso: La taxonomía