package com.evolveum.midpoint.schema; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.xml.sax.SAXException; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import java.io.File; import java.io.IOException; import static org.testng.AssertJUnit.assertEquals; /** * @author Viliam Repan (lazyman) */ public class TestParseLookupTable { public static final File LOOKUP_TABLE_FILE = new File("src/test/resources/common/lookup-table.xml"); @BeforeSuite public void setup() throws SchemaException, SAXException, IOException { PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); } @Test public void testParseTableFileRoundTrip() throws Exception { System.out.println("===[ testParseTableFileRoundTrip ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN PrismObject<LookupTableType> table = prismContext.parserFor(LOOKUP_TABLE_FILE).xml().parse(); // THEN System.out.println("Parsed table:"); System.out.println(table.debugDump()); assertTable(table); // WHEN String xml = prismContext.serializeObjectToString(table, PrismContext.LANG_XML); // THEN System.out.println("Serialized object:"); System.out.println(xml); // WHEN PrismObject<ObjectTemplateType> reparsedObject = prismContext.parseObject(xml); // THEN System.out.println("Re-parsed object:"); System.out.println(reparsedObject.debugDump()); assertTable(table); PrismAsserts.assertEquals(table.asObjectable(), reparsedObject.asObjectable()); } private void assertTable(PrismObject<LookupTableType> table) { table.checkConsistence(); assertEquals("Wrong oid", "44444444-4444-4444-4444-000000001111", table.getOid()); assertPropertyValue(table, "name", PrismTestUtil.createPolyString("first lookup")); assertPropertyDefinition(table, "name", PolyStringType.COMPLEX_TYPE, 0, 1); assertPropertyValue(table, "description", "description of lookup table"); assertPropertyDefinition(table, "description", DOMUtil.XSD_STRING, 0, 1); PrismContainer<LookupTableRowType> tableContainer = table.findContainer(LookupTableType.F_ROW); assertEquals("wrong number of rows", 2, tableContainer.size()); assertRow(tableContainer.getValue(0), "first key", "first value", PrismTestUtil.createPolyStringType("first label"), XmlTypeConverter.createXMLGregorianCalendar("2013-05-07T10:38:21.350+02:00")); assertRow(tableContainer.getValue(1), "2 key", "2 value", PrismTestUtil.createPolyStringType("second ľábeľ", "second label"), XmlTypeConverter.createXMLGregorianCalendar("2013-05-07T10:40:21.350+02:00")); } private void assertRow(PrismContainerValue<LookupTableRowType> tableContainerValue, String key, String value, PolyStringType label, XMLGregorianCalendar lastChangeTimestamp) { LookupTableRowType row = tableContainerValue.asContainerable(); assertEquals("wrong key", key, row.getKey()); assertEquals("wrong value", value, row.getValue()); assertEquals("wrong label", label, row.getLabel()); assertEquals("wrong lastChangeTimestamp", lastChangeTimestamp, row.getLastChangeTimestamp()); } private void assertPropertyDefinition(PrismContainer<?> container, String propName, QName xsdType, int minOccurs, int maxOccurs) { QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); PrismAsserts.assertPropertyDefinition(container, propQName, xsdType, minOccurs, maxOccurs); } public static void assertPropertyValue(PrismContainer<?> container, String propName, Object propValue) { QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); PrismAsserts.assertPropertyValue(container, propQName, propValue); } }