Skip to content

Commit

Permalink
Add enum serialization/parsing test
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Apr 19, 2024
1 parent ed75e60 commit 2896695
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public SchemaPropertyWrapperImpl(PrismPropertyWrapper parent, PrismPropertyValue
}
Element schemaElement = schemaDefinitionType.getSchema();
try {
PrismSchemaImpl newValue = new PrismSchemaImpl(DOMUtil.getSchemaTargetNamespace(schemaElement));
SchemaParsingUtil.parse(newValue, schemaElement, true, "schema", false);
PrismSchemaImpl newValue = SchemaParsingUtil.createAndParse(
schemaElement, true, "schema", false);
this.namespace = newValue.getNamespace();
this.definitions = newValue.getDefinitions();
} catch (SchemaException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,24 @@

package com.evolveum.midpoint.init;

import java.io.IOException;
import java.util.*;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.Freezable;

import com.evolveum.midpoint.prism.impl.schema.SchemaParsingUtil;
import com.evolveum.midpoint.repo.api.CacheRegistry;

import com.evolveum.midpoint.util.DOMUtil;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import com.evolveum.midpoint.CacheInvalidationContext;
import com.evolveum.midpoint.prism.ComplexTypeDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.impl.schema.PrismSchemaImpl;
import com.evolveum.midpoint.prism.impl.schema.SchemaParsingUtil;
import com.evolveum.midpoint.prism.impl.schema.SchemaRegistryImpl;
import com.evolveum.midpoint.prism.schema.PrismSchema;
import com.evolveum.midpoint.repo.api.Cache;
import com.evolveum.midpoint.repo.api.CacheRegistry;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.schema.ResultHandler;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand Down Expand Up @@ -79,8 +72,8 @@ public void init() {
SchemaDefinitionType def = schemaType.getDefinition();
Element schemaElement = def.getSchema();

PrismSchemaImpl extensionSchema = new PrismSchemaImpl(DOMUtil.getSchemaTargetNamespace(schemaElement));
SchemaParsingUtil.parse(extensionSchema, schemaElement, true, "schema for " + extensionForType, false);
PrismSchemaImpl extensionSchema = SchemaParsingUtil.createAndParse(
schemaElement, true, "schema for " + extensionForType, false);
ComplexTypeDefinition finalDef = detectExtensionSchemas(extensionSchema, dbExtensions);
if (finalDef != null) {
dbExtensions.put(extensionForType, finalDef);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,11 @@ public ItemDefinitionLikeBuilder newObjectLikeDefinition(QName itemName, Abstrac
return null;
}

@Override
public @Nullable QName getExtensionForType() {
return null;
}

@Override
public @NotNull Collection<? extends SerializableItemDefinition> getDefinitionsToSerialize() {
return itemDefinitions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,38 +7,42 @@

package com.evolveum.midpoint.schema.processor;

import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.AssertJUnit.*;

import static com.evolveum.midpoint.prism.schema.PrismSchemaBuildingUtil.addNewContainerDefinition;
import static com.evolveum.midpoint.schema.constants.MidPointConstants.NS_RI;
import static com.evolveum.midpoint.schema.constants.SchemaConstants.ACCOUNT_OBJECT_CLASS_LOCAL_NAME;
import static com.evolveum.midpoint.schema.constants.SchemaConstants.RI_ACCOUNT_OBJECT_CLASS;

import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.AssertJUnit.*;

import java.io.IOException;

import com.evolveum.midpoint.prism.impl.schema.SchemaParsingUtil;
import com.evolveum.midpoint.prism.schema.PrismSchemaBuildingUtil;
import com.evolveum.midpoint.schema.util.SchemaDebugUtil;

import com.evolveum.midpoint.util.exception.ConfigurationException;
import java.util.List;
import javax.xml.namespace.QName;

import org.testng.AssertJUnit;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import com.evolveum.midpoint.prism.Definition;
import com.evolveum.midpoint.prism.EnumerationTypeDefinition;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.impl.EnumerationTypeDefinitionImpl;
import com.evolveum.midpoint.prism.impl.EnumerationTypeDefinitionImpl.ValueDefinitionImpl;
import com.evolveum.midpoint.prism.impl.schema.PrismSchemaImpl;
import com.evolveum.midpoint.prism.impl.schema.SchemaParsingUtil;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.schema.PrismSchema;
import com.evolveum.midpoint.prism.schema.PrismSchemaBuildingUtil;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.schema.AbstractSchemaTest;
import com.evolveum.midpoint.schema.MidPointPrismContextFactory;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.util.SchemaDebugUtil;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;
Expand Down Expand Up @@ -67,12 +71,12 @@ public void testAccessList() throws Exception {
AssertJUnit.assertFalse("uid updateability", attrDef.canModify());
AssertJUnit.assertFalse("uid createability", attrDef.canAdd());

attrDef = objectDef.findAttributeDefinitionRequired(new ItemName(MidPointConstants.NS_RI, "title"));
attrDef = objectDef.findAttributeDefinitionRequired(new ItemName(NS_RI, "title"));
AssertJUnit.assertTrue(attrDef.canRead());
AssertJUnit.assertTrue(attrDef.canModify());
AssertJUnit.assertTrue(attrDef.canAdd());

attrDef = objectDef.findAttributeDefinitionRequired(new ItemName(MidPointConstants.NS_RI, "photo"));
attrDef = objectDef.findAttributeDefinitionRequired(new ItemName(NS_RI, "photo"));
AssertJUnit.assertFalse(attrDef.canRead());
AssertJUnit.assertTrue(attrDef.canModify());
AssertJUnit.assertTrue(attrDef.canAdd());
Expand All @@ -81,11 +85,19 @@ public void testAccessList() throws Exception {
@Test
public void testRoundTripGeneric() throws SchemaException {
// GIVEN
PrismSchemaImpl schema = new PrismSchemaImpl(MidPointConstants.NS_RI);
PrismSchemaImpl schema = new PrismSchemaImpl(NS_RI);
// Ordinary property
PrismSchemaBuildingUtil.addNewPropertyDefinition(schema, "number1", DOMUtil.XSD_INT);

// Property container
// Enum type
var red = new ValueDefinitionImpl("red", "Please stop here", "RED");
var yellow = new ValueDefinitionImpl("yellow", "Like a sun", "YELLOW");
var green = new ValueDefinitionImpl("green", "The color of grass", "GREEN");
var colorTypeName = new QName(NS_RI, "ColorType");
var colorTypeDef = new EnumerationTypeDefinitionImpl(colorTypeName, DOMUtil.XSD_STRING, List.of(red, yellow, green));
schema.add((Definition) colorTypeDef);

// A container
var containerDefinition = addNewContainerDefinition(schema, "test", "ContainerType");
// ... in it ordinary property
containerDefinition.mutator().createPropertyDefinition("login", DOMUtil.XSD_STRING);
Expand All @@ -94,8 +106,10 @@ public void testRoundTripGeneric() throws SchemaException {
// ... property reference
containerDefinition.mutator().createPropertyDefinition(SchemaConstants.C_CREDENTIALS, CredentialsType.COMPLEX_TYPE);
// ... read-only int property
PrismPropertyDefinition<?> counterProperty = containerDefinition.mutator().createPropertyDefinition("counter", DOMUtil.XSD_INT);
var counterProperty = containerDefinition.mutator().createPropertyDefinition("counter", DOMUtil.XSD_INT);
counterProperty.mutator().setReadOnly();
// ... custom enum property
containerDefinition.mutator().createPropertyDefinition("color", colorTypeName);

System.out.println("Generic schema before serializing to XSD: ");
System.out.println(schema.debugDump());
Expand All @@ -113,52 +127,71 @@ public void testRoundTripGeneric() throws SchemaException {

Document parsedXsd = DOMUtil.parseDocument(stringXmlSchema);

PrismSchema newSchema = SchemaParsingUtil.createAndParse(DOMUtil.getFirstChildElement(parsedXsd), true, "serialized schema");
PrismSchema parsedSchema = SchemaParsingUtil.createAndParse(
DOMUtil.getFirstChildElement(parsedXsd), true, "serialized schema");

System.out.println("Generic schema after parsing from XSD: ");
System.out.println(newSchema.debugDump());
System.out.println(parsedSchema.debugDump());
System.out.println();

// THEN

PrismPropertyDefinition<?> number1def = newSchema.findItemDefinitionByElementName(new ItemName(MidPointConstants.NS_RI, "number1"), PrismPropertyDefinition.class);
assertEquals(new ItemName(MidPointConstants.NS_RI, "number1"), number1def.getItemName());
PrismPropertyDefinition<?> number1def = parsedSchema.findItemDefinitionByElementName(new ItemName(NS_RI, "number1"), PrismPropertyDefinition.class);
assertEquals(new ItemName(NS_RI, "number1"), number1def.getItemName());
assertEquals(DOMUtil.XSD_INT, number1def.getTypeName());

PrismContainerDefinition<?> newContainerDef = schema.findContainerDefinitionByType(new ItemName(MidPointConstants.NS_RI, "ContainerType"));
assertEquals(new ItemName(MidPointConstants.NS_RI, "ContainerType"), newContainerDef.getTypeName());
PrismContainerDefinition<?> newContainerDef = schema.findContainerDefinitionByType(new ItemName(NS_RI, "ContainerType"));
assertEquals(new ItemName(NS_RI, "ContainerType"), newContainerDef.getTypeName());

PrismPropertyDefinition<?> loginDef = newContainerDef.findPropertyDefinition(new ItemName(MidPointConstants.NS_RI, "login"));
assertEquals(new ItemName(MidPointConstants.NS_RI, "login"), loginDef.getItemName());
PrismPropertyDefinition<?> loginDef = newContainerDef.findPropertyDefinition(new ItemName(NS_RI, "login"));
assertEquals(new ItemName(NS_RI, "login"), loginDef.getItemName());
assertEquals(DOMUtil.XSD_STRING, loginDef.getTypeName());
assertTrue("Read flag is wrong", loginDef.canRead());
assertTrue("Create flag is wrong", loginDef.canAdd());
assertTrue("Update flag is wrong", loginDef.canModify());

PrismPropertyDefinition<?> passwdDef = newContainerDef.findPropertyDefinition(new ItemName(MidPointConstants.NS_RI, "password"));
assertEquals(new ItemName(MidPointConstants.NS_RI, "password"), passwdDef.getItemName());
PrismPropertyDefinition<?> passwdDef = newContainerDef.findPropertyDefinition(new ItemName(NS_RI, "password"));
assertEquals(new ItemName(NS_RI, "password"), passwdDef.getItemName());
assertEquals(ProtectedStringType.COMPLEX_TYPE, passwdDef.getTypeName());

PrismPropertyDefinition<?> credDef = newContainerDef.findPropertyDefinition(new ItemName(SchemaConstants.NS_C, "credentials"));
assertEquals(new ItemName(SchemaConstants.NS_C, "credentials"), credDef.getItemName());
assertEquals(new ItemName(SchemaConstants.NS_C, "CredentialsType"), credDef.getTypeName());

PrismPropertyDefinition<?> countDef = newContainerDef.findPropertyDefinition(new ItemName(MidPointConstants.NS_RI, "counter"));
assertEquals(new ItemName(MidPointConstants.NS_RI, "counter"), countDef.getItemName());
PrismPropertyDefinition<?> countDef = newContainerDef.findPropertyDefinition(new ItemName(NS_RI, "counter"));
assertEquals(new ItemName(NS_RI, "counter"), countDef.getItemName());
assertEquals(DOMUtil.XSD_INT, countDef.getTypeName());
assertTrue("Read flag is wrong", countDef.canRead());
assertFalse("Create flag is wrong", countDef.canAdd());
assertFalse("Update flag is wrong", countDef.canModify());

PrismPropertyDefinition<?> colorDef = newContainerDef.findPropertyDefinition(new ItemName(NS_RI, "color"));
assertEquals(new ItemName(NS_RI, "color"), colorDef.getItemName());
assertEquals(colorTypeName, colorDef.getTypeName());

var parsedColorDef = (EnumerationTypeDefinition) parsedSchema.findTypeDefinitionByType(colorTypeName);
var values = parsedColorDef.getValues();
assertThat(values).as("color values").hasSize(3);
var parsedYellowDef = values.stream()
.filter(v -> "yellow".equals(v.getValue()))
.findFirst()
.orElseThrow();
assertThat(parsedYellowDef.getConstantName().orElseThrow())
.as("YELLOW constant name")
.isEqualTo("YELLOW");
assertThat(parsedYellowDef.getDocumentation().orElseThrow())
.as("YELLOW documentation")
.contains("Like a sun"); // FIXME the real text is the XML serialization
}

@Test
public void testRoundTripResource() throws SchemaException, ConfigurationException {
// GIVEN
var schema = new NativeResourceSchemaImpl();

ItemName loginAttrName = new ItemName(MidPointConstants.NS_RI, "login");
ItemName passwordAttrName = new ItemName(MidPointConstants.NS_RI, "password");
ItemName sepAttrName = new ItemName(MidPointConstants.NS_RI, "sep");
ItemName loginAttrName = new ItemName(NS_RI, "login");
ItemName passwordAttrName = new ItemName(NS_RI, "password");
ItemName sepAttrName = new ItemName(NS_RI, "sep");

// Property container
var objectClassBuilder = schema.newComplexTypeDefinitionLikeBuilder(ACCOUNT_OBJECT_CLASS_LOCAL_NAME);
Expand Down

0 comments on commit 2896695

Please sign in to comment.