/* * Copyright (c) 2010-2013 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 com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateMappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.xml.sax.SAXException; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import java.io.File; import java.io.IOException; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.fail; /** * @author semancik * */ public class TestParseObjectTemplate { public static final File TEST_DIR = new File("src/test/resources/object-template"); private static final File OBJECT_TEMPLATE_FILE = new File(TEST_DIR, "object-template.xml"); private static final File USER_TEMPLATE_FILE = new File(TEST_DIR, "user-template.xml"); private static final File WRONG_TEMPLATE_FILE = new File(TEST_DIR, "wrong-template.xml"); @BeforeSuite public void setup() throws SchemaException, SAXException, IOException { PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); } @Test public void testParseObjectTemplateFile() throws Exception { roundTrip("testParseObjectTemplateFile", OBJECT_TEMPLATE_FILE, new QName(SchemaConstantsGenerated.NS_COMMON, "objectTemplate")); } @Test public void testParseUserTemplateFile() throws Exception { roundTrip("testParseUserTemplateFile", USER_TEMPLATE_FILE, new QName(SchemaConstantsGenerated.NS_COMMON, "userTemplate")); } @Test public void testParseWrongTemplateFile() throws Exception { final String TEST_NAME = "testParseWrongTemplateFile"; File file = WRONG_TEMPLATE_FILE; System.out.println("===[ "+TEST_NAME+" ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN try { PrismObject<ObjectTemplateType> object = prismContext.parseObject(file); System.out.println("Parsed object - SHOULD NOT OCCUR:"); System.out.println(object.debugDump()); fail("Object was successfully parsed while it should not!"); } // THEN catch (SchemaException e) { // ok } } private void roundTrip(final String TEST_NAME, File file, QName elementName) throws Exception { System.out.println("===[ "+TEST_NAME+" ]==="); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN PrismObject<ObjectTemplateType> object = prismContext.parseObject(file); // THEN System.out.println("Parsed object:"); System.out.println(object.debugDump()); assertObjectTemplate(object, elementName); // WHEN String xml = prismContext.serializeObjectToString(object, PrismContext.LANG_XML); // THEN System.out.println("Serialized object:"); System.out.println(xml); assertSerializedObject(xml, elementName); // WHEN PrismObject<ObjectTemplateType> reparsedObject = prismContext.parseObject(xml); // THEN System.out.println("Re-parsed object:"); System.out.println(reparsedObject.debugDump()); assertObjectTemplate(reparsedObject, elementName); assertObjectTemplateInternals(reparsedObject, elementName); } private void assertObjectTemplate(PrismObject<ObjectTemplateType> object, QName elementName) { object.checkConsistence(); assertObjectTemplatePrism(object, elementName); } private void assertObjectTemplatePrism(PrismObject<ObjectTemplateType> object, QName elementName) { assertEquals("Wrong oid", "10000000-0000-0000-0000-000000000002", object.getOid()); PrismObjectDefinition<ObjectTemplateType> objectDefinition = object.getDefinition(); assertNotNull("No object definition", objectDefinition); PrismAsserts.assertObjectDefinition(objectDefinition, elementName, ObjectTemplateType.COMPLEX_TYPE, ObjectTemplateType.class); assertEquals("Wrong class", ObjectTemplateType.class, object.getCompileTimeClass()); assertEquals("Wrong object item name", elementName, object.getElementName()); ObjectTemplateType objectType = object.asObjectable(); assertNotNull("asObjectable resulted in null", objectType); assertPropertyValue(object, "name", PrismTestUtil.createPolyString("Default User Template")); assertPropertyDefinition(object, "name", PolyStringType.COMPLEX_TYPE, 0, 1); assertPropertyDefinition(object, "mapping", ObjectTemplateMappingType.COMPLEX_TYPE, 0, -1); } // checks raw values of mappings // should be called only on reparsed values in order to catch some raw-data-related serialization issues (MID-2196) private void assertObjectTemplateInternals(PrismObject<ObjectTemplateType> object, QName elementName) throws SchemaException { int assignmentValuesFound = 0; for (ObjectTemplateMappingType mappingType : object.asObjectable().getMapping()) { if (mappingType.getExpression() != null) { if (mappingType.getTarget() != null && mappingType.getTarget().getPath() != null && new ItemPath(UserType.F_ASSIGNMENT).equivalent(mappingType.getTarget().getPath().getItemPath())) { ItemDefinition assignmentDef = PrismTestUtil.getPrismContext().getSchemaRegistry() .findObjectDefinitionByCompileTimeClass(UserType.class) .findItemDefinition(UserType.F_ASSIGNMENT); for (JAXBElement evaluator : mappingType.getExpression().getExpressionEvaluator()) { if (evaluator.getValue() instanceof RawType) { RawType rawType = (RawType) evaluator.getValue(); Item assignment = rawType.getParsedItem(assignmentDef); System.out.println("assignment:\n" + assignment.debugDump()); assignmentValuesFound++; } } } } } assertEquals("wrong # of assignment values found in mapping", 2, assignmentValuesFound); } private void assertSerializedObject(String xml, QName elementName) { // TODO } 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); } public static <T> void assertPropertyValues(PrismContainer<?> container, String propName, T... expectedValues) { QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); PrismAsserts.assertPropertyValue(container, propQName, expectedValues); } }