/* * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.schema; import static org.testng.AssertJUnit.assertTrue; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.JaxbTestUtil; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.util.SchemaTestConstants; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExtensionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.GenericObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import java.io.File; import java.io.IOException; import java.util.List; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; /** * @author semancik * */ public class TestParseGenericObject { public static final File GENERIC_FILE = new File("src/test/resources/common/generic-sample-configuration.xml"); @BeforeSuite public void setup() throws SchemaException, SAXException, IOException { PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); } @Test public void testParseGenericFile() throws Exception { System.out.println("===[ testParseGenericFile ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN PrismObject<GenericObjectType> generic = prismContext.parserFor(GENERIC_FILE).xml().parse(); // THEN System.out.println("Parsed generic object:"); System.out.println(generic.debugDump()); assertGenericObject(generic); } @Test public void testParseGenericDom() throws SchemaException, DatatypeConfigurationException { System.out.println("===[ testParseGenericDom ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); Document document = DOMUtil.parseFile(GENERIC_FILE); Element resourceElement = DOMUtil.getFirstChildElement(document); // WHEN PrismObject<GenericObjectType> generic = prismContext.parserFor(resourceElement).parse(); // THEN System.out.println("Parsed generic object:"); System.out.println(generic.debugDump()); assertGenericObject(generic); } @Deprecated @Test(enabled = false) public void testPrismParseJaxb() throws JAXBException, SchemaException, SAXException, IOException, DatatypeConfigurationException { System.out.println("===[ testPrismParseJaxb ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); JaxbTestUtil jaxbProcessor = JaxbTestUtil.getInstance(); // WHEN GenericObjectType genericType = jaxbProcessor.unmarshalObject(GENERIC_FILE, GenericObjectType.class); // THEN assertGenericObject(genericType.asPrismObject()); } /** * The definition should be set properly even if the declared type is ObjectType. The Prism should determine * the actual type. * @throws DatatypeConfigurationException */ @Deprecated @Test(enabled = false) public void testPrismParseJaxbObjectType() throws JAXBException, SchemaException, SAXException, IOException, DatatypeConfigurationException { System.out.println("===[ testPrismParseJaxbObjectType ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); JaxbTestUtil jaxbProcessor = JaxbTestUtil.getInstance(); // WHEN GenericObjectType genericType = jaxbProcessor.unmarshalObject(GENERIC_FILE, GenericObjectType.class); // THEN assertGenericObject(genericType.asPrismObject()); } /** * Parsing in form of JAXBELement * @throws DatatypeConfigurationException */ @Deprecated @Test(enabled = false) public void testPrismParseJaxbElement() throws JAXBException, SchemaException, SAXException, IOException, DatatypeConfigurationException { System.out.println("===[ testPrismParseJaxbElement ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); JaxbTestUtil jaxbProcessor = JaxbTestUtil.getInstance(); // WHEN JAXBElement<GenericObjectType> jaxbElement = jaxbProcessor.unmarshalElement(GENERIC_FILE, GenericObjectType.class); GenericObjectType genericType = jaxbElement.getValue(); // THEN assertGenericObject(genericType.asPrismObject()); } /** * Parsing in form of JAXBELement, with declared ObjectType * @throws DatatypeConfigurationException */ @Deprecated @Test(enabled = false) public void testPrismParseJaxbElementObjectType() throws JAXBException, SchemaException, SAXException, IOException, DatatypeConfigurationException { System.out.println("===[ testPrismParseJaxbElementObjectType ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); JaxbTestUtil jaxbProcessor = JaxbTestUtil.getInstance(); // WHEN JAXBElement<GenericObjectType> jaxbElement = jaxbProcessor.unmarshalElement(GENERIC_FILE, GenericObjectType.class); GenericObjectType genericType = jaxbElement.getValue(); // THEN assertGenericObject(genericType.asPrismObject()); } @Test public void testParseGenericRoundtrip() throws Exception { System.out.println("===[ testParseGenericRoundtrip ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); PrismObject<GenericObjectType> generic = prismContext.parseObject(GENERIC_FILE); System.out.println("Parsed generic object:"); System.out.println(generic.debugDump()); assertGenericObject(generic); // SERIALIZE String serializedGeneric = prismContext.serializeObjectToString(generic, PrismContext.LANG_XML); System.out.println("serialized generic object:"); System.out.println(serializedGeneric); // RE-PARSE PrismObject<GenericObjectType> reparsedGeneric = prismContext.parseObject(serializedGeneric); System.out.println("Re-parsed generic object:"); System.out.println(reparsedGeneric.debugDump()); assertGenericObject(generic); ObjectDelta<GenericObjectType> objectDelta = generic.diff(reparsedGeneric); System.out.println("Delta:"); System.out.println(objectDelta.debugDump()); assertTrue("Delta is not empty", objectDelta.isEmpty()); PrismAsserts.assertEquivalent("generic object re-parsed quivalence", generic, reparsedGeneric); // // Compare schema container // // PrismContainer<?> originalSchemaContainer = resource.findContainer(ResourceType.F_SCHEMA); // PrismContainer<?> reparsedSchemaContainer = reparsedResource.findContainer(ResourceType.F_SCHEMA); } private void assertGenericObject(PrismObject<GenericObjectType> generic) throws DatatypeConfigurationException { generic.checkConsistence(); assertEquals("Wrong oid", "c0c010c0-d34d-b33f-f00d-999111111111", generic.getOid()); // assertEquals("Wrong version", "42", resource.getVersion()); PrismObjectDefinition<GenericObjectType> resourceDefinition = generic.getDefinition(); assertNotNull("No resource definition", resourceDefinition); PrismAsserts.assertObjectDefinition(resourceDefinition, new QName(SchemaConstantsGenerated.NS_COMMON, "genericObject"), GenericObjectType.COMPLEX_TYPE, GenericObjectType.class); assertEquals("Wrong class in resource", GenericObjectType.class, generic.getCompileTimeClass()); GenericObjectType genericType = generic.asObjectable(); assertNotNull("asObjectable resulted in null", genericType); assertPropertyValue(generic, "name", PrismTestUtil.createPolyString("My Sample Config Object")); assertPropertyDefinition(generic, "name", PolyStringType.COMPLEX_TYPE, 0, 1); assertPropertyValue(generic, "objectType", QNameUtil.qNameToUri( new QName(SchemaTestConstants.NS_EXTENSION, "SampleConfigType"))); assertPropertyDefinition(generic, "objectType", DOMUtil.XSD_ANYURI, 1, 1); PrismContainer<?> extensionContainer = generic.findContainer(GenericObjectType.F_EXTENSION); assertContainerDefinition(extensionContainer, "extension", ExtensionType.COMPLEX_TYPE, 0, 1); PrismContainerDefinition<?> extensionContainerDefinition = extensionContainer.getDefinition(); assertTrue("Extension container definition is NOT dynamic", extensionContainerDefinition.isDynamic()); PrismContainerValue<?> extensionContainerValue = extensionContainer.getValue(); List<Item<?,?>> extensionItems = extensionContainerValue.getItems(); assertEquals("Wrong number of extension items", 5, extensionItems.size()); // COMPLEX RUN TIME PROPERTIES...NOT SUPPORTED WITH NEW PARSERS.. // Item<?> locationsItem = extensionContainerValue.findItem(SchemaTestConstants.EXTENSION_LOCATIONS_ELEMENT); // if (!(locationsItem instanceof PrismProperty)) { // AssertJUnit.fail("Expected the extension item to be of type "+PrismProperty.class+ // "but it was of type "+locationsItem.getClass()); // } // PrismProperty<?> locationsProperty = (PrismProperty<?>)locationsItem; // assertEquals("Wrong name of <locations>", SchemaTestConstants.EXTENSION_LOCATIONS_ELEMENT, locationsProperty.getElementName()); // PrismPropertyDefinition locationsDefinition = locationsProperty.getDefinition(); // assertNotNull("No definition for <locations>", locationsDefinition); // PrismAsserts.assertDefinition(locationsDefinition, SchemaTestConstants.EXTENSION_LOCATIONS_ELEMENT, // SchemaTestConstants.EXTENSION_LOCATIONS_TYPE, 0, -1); PrismAsserts.assertPropertyValue(extensionContainerValue, SchemaTestConstants.EXTENSION_STRING_TYPE_ELEMENT, "X marks the spot"); PrismAsserts.assertPropertyValue(extensionContainerValue, SchemaTestConstants.EXTENSION_INT_TYPE_ELEMENT, 1234); PrismAsserts.assertPropertyValue(extensionContainerValue, SchemaTestConstants.EXTENSION_DOUBLE_TYPE_ELEMENT, 456.789D); PrismAsserts.assertPropertyValue(extensionContainerValue, SchemaTestConstants.EXTENSION_LONG_TYPE_ELEMENT, 567890L); XMLGregorianCalendar calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar("2002-05-30T09:10:11"); PrismAsserts.assertPropertyValue(extensionContainerValue, SchemaTestConstants.EXTENSION_DATE_TYPE_ELEMENT, calendar); } 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); } private void assertContainerDefinition(PrismContainer container, String contName, QName xsdType, int minOccurs, int maxOccurs) { QName qName = new QName(SchemaConstantsGenerated.NS_COMMON, contName); PrismAsserts.assertDefinition(container.getDefinition(), qName, xsdType, minOccurs, maxOccurs); } }