/* * 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.repo.sql; import java.util.Set; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.repo.sql.data.common.any.RAnyConverter; import com.evolveum.midpoint.repo.sql.data.common.any.RAnyValue; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.BeforeAfterType; 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.midpoint.xml.ns._public.common.common_3.UserType; import org.hibernate.Session; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.testng.AssertJUnit; import org.testng.annotations.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.XMLConstants; import javax.xml.namespace.QName; /** * @author lazyman */ @ContextConfiguration(locations = {"../../../../../ctx-test.xml"}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) public class RAnyConverterStaticTest extends BaseSQLRepoTest { private static final Trace LOGGER = TraceManager.getTrace(RAnyConverterStaticTest.class); private static final String NS_P = "http://example.com/p"; private static final String NS_T = PrismConstants.NS_TYPES; private static final String NS_FOO_RESOURCE = "http://example.com/foo"; @Test public void testExtensionPolyString() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "polyType"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); Element poly = DOMUtil.createElement(DOMUtil.getDocument(), valueName); Element orig = DOMUtil.createElement(poly.getOwnerDocument(), new QName(NS_T, "orig")); orig.setTextContent("Foo_Bar"); Element norm = DOMUtil.createElement(poly.getOwnerDocument(), new QName(NS_T, "norm")); norm.setTextContent("foo bar"); poly.appendChild(orig); poly.appendChild(norm); Object realValue = RAnyConverter.getRealRepoValue(def, poly); AssertJUnit.assertEquals(new PolyString("Foo_Bar", "foo bar"), realValue); session.close(); } @Test public void testExtensionInteger() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "intType"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); Element value = DOMUtil.createElement(DOMUtil.getDocument(), valueName); value.setTextContent("123"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals(123L, realValue); session.close(); } @Test public void testExtensionLong() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "longType"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); Element value = DOMUtil.createElement(DOMUtil.getDocument(), valueName); value.setTextContent("123"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals(123L, realValue); session.close(); } @Test public void testExtensionShort() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "shortType"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); Element value = DOMUtil.createElement(DOMUtil.getDocument(), valueName); value.setTextContent("123"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals(123L, realValue); session.close(); } @Test public void testExtensionDouble() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "doubleType"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); Element value = DOMUtil.createElement(DOMUtil.getDocument(), valueName); value.setTextContent("123.1"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals("123.1", realValue); session.close(); } @Test public void testExtensionFloat() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "floatType"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); Element value = DOMUtil.createElement(DOMUtil.getDocument(), valueName); value.setTextContent("123.1"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals("123.1", realValue); session.close(); } @Test public void testExtensionString() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "floatType"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); Element value = DOMUtil.createElement(DOMUtil.getDocument(), valueName); value.setTextContent("example"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals("example", realValue); session.close(); } @Test public void testExtensionEnum() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "enumType"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); PrismProperty item = (PrismProperty) def.instantiate(); item.setValue(new PrismPropertyValue(BeforeAfterType.AFTER)); ((ItemDefinitionImpl) def).setName(valueName); RAnyConverter converter = new RAnyConverter(prismContext); Set<RAnyValue> values = converter.convertToRValue(item, false); AssertJUnit.assertEquals("Expected only one enum value, but was " + values.size(), 1, values.size()); RAnyValue value = values.iterator().next(); AssertJUnit.assertEquals("after", value.getValue()); session.close(); } @Test public void testExtensionDecimal() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "decimalType"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); Element value = DOMUtil.createElement(DOMUtil.getDocument(), valueName); value.setTextContent("1234"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals("1234", realValue); session.close(); } @Test public void testExtensionClob() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_P, "locations"); ItemDefinition def = getDefinition(GenericObjectType.class, new ItemPath(ObjectType.F_EXTENSION, valueName)); AssertJUnit.assertNotNull(def); Document document = DOMUtil.getDocument(); Element value = DOMUtil.createElement(document, valueName); Element location = DOMUtil.createElement(document, new QName(NS_P, "location")); value.appendChild(location); location.setAttribute("key", "heaven"); location.setTextContent("somewhere above"); Object realValue = RAnyConverter.getRealRepoValue(def, value); //asserting simple dom document = DOMUtil.parseDocument((String) realValue); Element root = document.getDocumentElement(); AssertJUnit.assertNotNull(root); AssertJUnit.assertEquals("locations", root.getLocalName()); AssertJUnit.assertEquals(NS_P, root.getNamespaceURI()); AssertJUnit.assertEquals(1, DOMUtil.listChildElements(root).size()); location = DOMUtil.listChildElements(root).get(0); AssertJUnit.assertNotNull(location); AssertJUnit.assertEquals("location", location.getLocalName()); AssertJUnit.assertEquals(NS_P, location.getNamespaceURI()); AssertJUnit.assertEquals(0, DOMUtil.listChildElements(location).size()); AssertJUnit.assertEquals("heaven", location.getAttribute("key")); AssertJUnit.assertEquals("somewhere above", location.getTextContent()); session.close(); } @Test public void testAttributesString() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_FOO_RESOURCE, "uid"); ItemDefinition def = getDefinition(GenericObjectType.class, valueName); AssertJUnit.assertNull(def); Element value = createAttributeValue(valueName, "xsd:string", "some uid"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals("some uid", realValue); session.close(); } @Test public void testAttributesDouble() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_FOO_RESOURCE, "uid"); ItemDefinition def = getDefinition(GenericObjectType.class, valueName); AssertJUnit.assertNull(def); Element value = createAttributeValue(valueName, "xsd:double", "123.1"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals("123.1", realValue); session.close(); } private Element createAttributeValue(QName valueName, String xsdType, String textContent) { Element value = DOMUtil.createElement(DOMUtil.getDocument(), valueName); value.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:xsd", XMLConstants.W3C_XML_SCHEMA_NS_URI); value.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:type", xsdType); value.setTextContent(textContent); return value; } @Test public void testAttributesLong() throws Exception { Session session = getFactory().openSession(); QName valueName = new QName(NS_FOO_RESOURCE, "uid"); ItemDefinition def = getDefinition(GenericObjectType.class, valueName); AssertJUnit.assertNull(def); Element value = createAttributeValue(valueName, "xsd:long", "123"); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals(123L, realValue); session.close(); } @Test public void testUserFullnamePolyString() throws Exception { Session session = getFactory().openSession(); ItemDefinition def = getDefinition(UserType.class, UserType.F_FULL_NAME); AssertJUnit.assertNotNull("Definition not found for " + UserType.F_FULL_NAME, def); Element value = DOMUtil.createElement(DOMUtil.getDocument(), UserType.F_FULL_NAME); Element orig = DOMUtil.createElement(value.getOwnerDocument(), new QName(NS_T, "orig")); orig.setTextContent("john example"); Element norm = DOMUtil.createElement(value.getOwnerDocument(), new QName(NS_T, "norm")); norm.setTextContent("john example"); value.appendChild(orig); value.appendChild(norm); Object realValue = RAnyConverter.getRealRepoValue(def, value); AssertJUnit.assertEquals(new PolyString("john example", "john example"), realValue); session.close(); } private <T extends ObjectType> ItemDefinition getDefinition(Class<T> type, QName name) { return getDefinition(type, new ItemPath(name)); } private <T extends ObjectType> ItemDefinition getDefinition(Class<T> type, ItemPath path) { SchemaRegistry registry = prismContext.getSchemaRegistry(); PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(type); return objectDef.findItemDefinition(path); } private Element createExtensionPath() { Document document = DOMUtil.getDocument(); Element extension = DOMUtil.createElement(document, DeltaConvertor.PATH_ELEMENT_NAME); extension.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:c", SchemaConstantsGenerated.NS_COMMON); extension.setTextContent("c:extension"); return extension; } }