El paquete io.github.devbpm.linneo.catalog.openmetadata traduce una Taxonomy a clasificaciones y
etiquetas de OpenMetadata y calcula las etiquetas de cada columna clasificada. No
hace llamadas de red: envía los cuerpos JSON con el cliente HTTP que ya uses a PUT /api/v1/classifications y
PUT /api/v1/tags, y después añade las etiquetas a las columnas de cada tabla. Los cuerpos siguen los esquemas
CreateClassification y CreateTag de OpenMetadata, incluido parent. Se comprobaron con OpenMetadata 2.0.6 y solo
usan campos presentes desde la 0.13.2. OpenMetadata acepta associatedTags en una etiqueta pero nunca las guarda, así
que Linneo no las envía: la protección que implica una categoría va en cada columna, véase
Etiquetas de una columna.
El repositorio incluye una prueba de integración, OpenMetadataIT, que envía estos cuerpos a un servidor real; véase
«Integration tests against catalog servers» en CONTRIBUTING.md.
io.github.devbpm.linneo.catalog.openmetadata.OpenMetadataCatalog — public final class, @since 0.1.0
Inmutable y seguro entre hilos. No tiene constructor público.
| Método | Devuelve | Descripción |
|---|---|---|
static OpenMetadataCatalog of(Taxonomy taxonomy) |
catálogo | Con los nombres por defecto (OpenMetadataMapping.defaults()). |
static OpenMetadataCatalog of(Taxonomy taxonomy, OpenMetadataMapping mapping) |
catálogo | Con los nombres y el umbral de sensibilidad indicados. NullPointerException si algún argumento es null. |
List<OmClassification> classifications() |
lista inmutable | Las clasificaciones que hay que crear, en orden de creación. No incluye las clasificaciones predefinidas PersonalData y PII: se reutilizan. |
List<OmTag> tags() |
lista | Las etiquetas que hay que crear, en orden de creación: primero las de niveles y después una por categoría, cada padre antes que sus hijas. |
String tagOf(DataCategory category) |
String |
El nombre completo de la etiqueta de la categoría, como DataCategory.user.contact.email. |
List<String> tagsOf(DataCategory category) |
lista | La etiqueta propia de la categoría seguida de las que implica (las etiquetas que implica la categoría). |
List<String> tagsOf(FieldClassification field) |
lista | Las etiquetas de una columna clasificada: su categoría, si es dato personal y de qué tipo, y la protección efectiva del campo. |
Taxonomy taxonomy = Taxonomy.load();
OpenMetadataCatalog catalog = OpenMetadataCatalog.of(taxonomy);
for (OmClassification c : catalog.classifications()) {
String body = c.toJson(); // PUT /api/v1/classifications
}
for (OmTag t : catalog.tags()) {
String body = t.toJson(); // PUT /api/v1/tags, en este orden
}
ClassClassification person = new Classifier(taxonomy).classify(Person.class);
for (FieldClassification field : person.fields()) {
List<String> columnTags = catalog.tagsOf(field); // para la columna que corresponde al campo
}
Con el mapeo por defecto, classifications() devuelve:
name |
mutuallyExclusive |
description |
|---|---|---|
DataCategory |
true |
What a column holds, from the Linneo data category taxonomy (fideslang default taxonomy plus extensions). |
Confidentiality |
true |
Harm that disclosing the data would cause. |
Integrity |
true |
Harm that an unwanted change to the data would cause. |
Identifiability |
true |
How directly a personal data value points to the person. |
DataHandling |
false |
Handling rules that apply to the data. |
Las descripciones se generan en inglés.
tags() devuelve, en este orden (12 más una por categoría; 137 con la taxonomía estándar):
| Etiquetas | Clasificación | name / displayName |
description |
|---|---|---|---|
Public, Low, Medium, High |
Confidentiality |
el nivel, con mayúscula inicial | Confidentiality level <Level>. |
Low, Medium, High |
Integrity |
el nivel, con mayúscula inicial | Integrity level <Level>. |
Identified, Pseudonymized, Anonymized, Aggregated |
Identifiability |
el valor, con mayúscula inicial | Personal data that is <value>. |
Secret |
DataHandling |
Secret |
A secret that grants access: it must never be read back, exported or published, only verified. |
| una por categoría, en orden de clave | DataCategory |
name: último segmento de la clave; displayName: nombre de la categoría |
la descripción de la categoría, más ` Deprecated. o Deprecated: use |
Una etiqueta de categoría tiene parent = DataCategory.<clave del padre> (ninguno en una raíz), así que la
jerarquía se convierte en etiquetas anidadas: user.contact.email es la etiqueta DataCategory.user.contact.email.
Las etiquetas de nivel no tienen padre.
| Linneo | Etiqueta de OpenMetadata (nombres por defecto) |
|---|---|
Categoría <key> |
DataCategory.<key> |
Naturaleza ORDINARY |
PersonalData.Personal (predefinida) |
Naturaleza SPECIAL_CATEGORY o CRIMINAL_OFFENCE |
PersonalData.SpecialCategory (predefinida; la única etiqueta de OpenMetadata para datos con protección reforzada) |
Naturaleza NONE |
ninguna etiqueta PersonalData |
Personal, confidencialidad ≥ sensitiveFrom (por defecto MEDIUM) |
PII.Sensitive (predefinida) |
Personal, confidencialidad < sensitiveFrom |
PII.NonSensitive (predefinida) |
| No personal | PII.None (predefinida) |
| Confidencialidad | Confidentiality.Public / .Low / .Medium / .High |
| Integridad | Integrity.Low / .Medium / .High |
| Identificabilidad (solo campos) | Identifiability.Identified / .Pseudonymized / .Anonymized / .Aggregated |
| Secreto | DataHandling.Secret |
Los nombres de etiqueta Personal, SpecialCategory, None, NonSensitive, Sensitive y Secret son fijos; los
nombres de las clasificaciones se configuran con OpenMetadataMapping.
tagsOf(DataCategory) calcula las etiquetas que implica una categoría a partir de sus facetas, en este orden:
PersonalData.Personal o PersonalData.SpecialCategory — solo si la categoría es personal;PII.None, PII.NonSensitive o PII.Sensitive;Confidentiality.<nivel>;Integrity.<nivel>;DataHandling.Secret — solo si la categoría es secreta.tagsOf(DataCategory) antepone la etiqueta propia de la categoría. Por ejemplo, user.authorization.password da
[DataCategory.user.authorization.password, PersonalData.Personal, PII.Sensitive, Confidentiality.High,
Integrity.High, DataHandling.Secret].
tagsOf(FieldClassification) usa los niveles efectivos y la identificabilidad del campo:
DataCategory.<key>;field.isPersonal() (categoría personal guardada como IDENTIFIED o PSEUDONYMIZED): la etiqueta
PersonalData de la naturaleza y después PII.Sensitive o PII.NonSensitive según la confidencialidad del
campo; si no, PII.None (un campo personal anonimizado o agregado recibe PII.None y ninguna etiqueta
PersonalData);Confidentiality.<nivel del campo>;Integrity.<nivel del campo>;Identifiability.<valor> — solo si el campo tiene identificabilidad (categoría personal);DataHandling.Secret — solo si la categoría es secreta.@Category(value = Categories.USER_UNIQUE_ID_PSEUDONYMOUS, identifiability = Identifiability.PSEUDONYMIZED,
confidentiality = Confidentiality.MEDIUM)
private String reference;
// tagsOf → [DataCategory.user.unique_id.pseudonymous, PersonalData.Personal, PII.Sensitive,
// Confidentiality.Medium, Integrity.Medium, Identifiability.Pseudonymized]
io.github.devbpm.linneo.catalog.openmetadata.OmClassification — public record, @since 0.1.0
public record OmClassification(String name, String description, boolean mutuallyExclusive)
Una clasificación de OpenMetadata que hay que crear: el cuerpo de PUT /api/v1/classifications.
mutuallyExclusive indica que una entidad solo puede llevar una de sus etiquetas. El constructor lanza
NullPointerException si name o description son null.
| Método | Descripción |
|---|---|
String toJson() |
El cuerpo JSON de una petición CreateClassification. |
{"name":"DataCategory","description":"What a column holds, from the Linneo data category taxonomy (fideslang default taxonomy plus extensions).","mutuallyExclusive":true}
io.github.devbpm.linneo.catalog.openmetadata.OmTag — public record, @since 0.1.0
public record OmTag(String classification, String parent, String name, String displayName, String description)
Una etiqueta de OpenMetadata que hay que crear: el cuerpo de PUT /api/v1/tags.
| Componente | Admite null |
Descripción |
|---|---|---|
classification |
no | Nombre de la clasificación a la que pertenece. |
parent |
sí | Nombre completo de la etiqueta padre; null en la raíz de la clasificación. |
name |
no | El nombre de la etiqueta, un único segmento sin puntos. |
displayName |
no | El nombre legible. |
description |
no | Qué significa. |
El constructor lanza NullPointerException si classification, name, displayName o description son null.
| Método | Descripción |
|---|---|
String fullyQualifiedName() |
parent (o classification si no hay padre) + . + name, como DataCategory.user.contact.email. |
String toJson() |
El cuerpo JSON de una petición CreateTag. |
{"classification":"DataCategory","parent":"DataCategory.user.contact","name":"email","displayName":"User Contact Email","description":"User's contact email address."}
toJson() escribe un objeto JSON compacto (sin espacios) con el escritor interno
io.github.devbpm.linneo.internal.Json, compartido con los exportadores de DataHub y Atlas (el paquete no se exporta),
para que la biblioteca no necesite ninguna dependencia JSON:
OmClassification: name, description, mutuallyExclusive. OmTag:
classification, parent, name, displayName, description.OmTag omite parent cuando es null.mutuallyExclusive)." → \", \ → \\, salto de línea → \n, retorno de carro → \r, tabulador → \t, retroceso
→ \b, avance de página → \f, otros caracteres de control por debajo de U+0020 → \u00XX. El resto de
caracteres, incluidos los no ASCII, se escriben tal cual (el resultado es un String de Java; codifícalo en UTF-8
al enviarlo).Véase también: Mapeo · Resultados · Niveles de protección · Comparativa de catálogos de datos · curso: OpenMetadata