/*
* Copyright (c) 2010-2017 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.parser;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.prism.xnode.RootXNode;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;
import org.testng.annotations.Test;
import org.w3c.dom.Element;
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import java.io.File;
import java.util.List;
import static com.evolveum.midpoint.schema.TestConstants.*;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
/**
* @author semancik
*
*/
public class TestParseForm extends AbstractObjectParserTest<FormType> {
@Override
protected File getFile() {
return getFile("form");
}
@Test
public void testParseToXNode() throws Exception {
PrismContext prismContext = PrismTestUtil.getPrismContext();
RootXNode node = prismContext.parserFor(getFile()).parseToXNode();
System.out.println("Parsed to XNode:");
System.out.println(node.debugDump());
System.out.println("XML -> XNode -> XML:\n" + prismContext.xmlSerializer().serialize(node));
System.out.println("XML -> XNode -> JSON:\n" + prismContext.jsonSerializer().serialize(node));
System.out.println("XML -> XNode -> YAML:\n" + prismContext.yamlSerializer().serialize(node));
}
@Test
public void testParseFileAsPCV() throws Exception {
displayTestTitle("testParseFileAsPCV");
processParsingsPCV(null, null);
}
@Test
public void testParseFileAsPO() throws Exception {
displayTestTitle("testParseFileAsPO");
processParsingsPO(null, null, true);
}
@Test
@SuppressWarnings("Duplicates")
public void testParseRoundTripAsPCV() throws Exception{
displayTestTitle("testParseRoundTripAsPCV");
processParsingsPCV(v -> getPrismContext().serializerFor(language).serialize(v), "s0");
processParsingsPCV(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serialize(v), "s1");
processParsingsPCV(v -> getPrismContext().serializerFor(language).root(SchemaConstantsGenerated.C_SYSTEM_CONFIGURATION).serialize(v), "s2"); // misleading item name
processParsingsPCV(v -> getPrismContext().serializerFor(language).serializeRealValue(v.asContainerable()), "s3");
processParsingsPCV(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asContainerable()), "s4");
}
@Test
@SuppressWarnings("Duplicates")
public void testParseRoundTripAsPO() throws Exception{
displayTestTitle("testParseRoundTripAsPO");
processParsingsPO(v -> getPrismContext().serializerFor(language).serialize(v), "s0", true);
processParsingsPO(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serialize(v), "s1", false);
processParsingsPO(v -> getPrismContext().serializerFor(language).root(SchemaConstantsGenerated.C_SYSTEM_CONFIGURATION).serialize(v), "s2", false); // misleading item name
processParsingsPO(v -> getPrismContext().serializerFor(language).serializeRealValue(v.asObjectable()), "s3", false);
processParsingsPO(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asObjectable()), "s4", false);
}
private void processParsingsPCV(SerializingFunction<PrismContainerValue<FormType>> serializer, String serId) throws Exception {
processParsings(FormType.class, null, FormType.COMPLEX_TYPE, null, serializer, serId);
}
private void processParsingsPO(SerializingFunction<PrismObject<FormType>> serializer, String serId, boolean checkItemName) throws Exception {
processObjectParsings(FormType.class, FormType.COMPLEX_TYPE, serializer, serId, checkItemName);
}
@Override
protected void assertPrismContainerValueLocal(PrismContainerValue<FormType> value) throws SchemaException {
PrismObject form = value.asContainerable().asPrismObject();
form.checkConsistence();
assertFormPrism(form, false);
assertFormJaxb(value.asContainerable(), false);
}
@Override
protected void assertPrismObjectLocal(PrismObject<FormType> form) throws SchemaException {
assertFormPrism(form, true);
assertFormJaxb(form.asObjectable(), true);
form.checkConsistence(true, true);
}
private void assertFormPrism(PrismObject<FormType> form, boolean isObject) {
if (isObject) {
assertEquals("Wrong oid", "2f9b9299-6f45-498f-bc8e-8d17c6b93b20", form.getOid());
}
PrismObjectDefinition<FormType> usedDefinition = form.getDefinition();
assertNotNull("No form definition", usedDefinition);
PrismAsserts.assertObjectDefinition(usedDefinition, new QName(SchemaConstantsGenerated.NS_COMMON, "form"),
FormType.COMPLEX_TYPE, FormType.class);
assertEquals("Wrong class in form", FormType.class, form.getCompileTimeClass());
FormType formType = form.asObjectable();
assertNotNull("asObjectable resulted in null", formType);
assertPropertyValue(form, "name", PrismTestUtil.createPolyString("form1"));
assertPropertyDefinition(form, "name", PolyStringType.COMPLEX_TYPE, 0, 1);
PrismProperty<FormDefinitionType> formDefinition = form.findProperty(FormType.F_FORM_DEFINITION);
assertNotNull("no formDefinition property", formDefinition);
}
private void assertFormJaxb(FormType form, boolean isObject) throws SchemaException {
assertEquals("Wrong name", PrismTestUtil.createPolyStringType("form1"), form.getName());
FormDefinitionType formDefinition = form.getFormDefinition();
assertNotNull("no formDefinition value", formDefinition);
assertEquals("Wrong formDefinition/display/label", "some label", formDefinition.getDisplay().getLabel());
assertEquals("Wrong formDefinition/display/tooltip", "some tooltip", formDefinition.getDisplay().getTooltip());
FormItemsType formItems = formDefinition.getFormItems();
assertNotNull("no formItems", formItems);
assertEquals("wrong # of form items", 3, formItems.getFormItem().size());
assertFormItem(formItems, "main list", 0, SchemaConstantsGenerated.C_FORM_FIELD, FormFieldType.class, "FamilyName");
assertFormItem(formItems, "main list", 1, SchemaConstantsGenerated.C_FORM_FIELD_GROUP, FormFieldGroupType.class, "Address");
assertFormItem(formItems, "main list", 2, SchemaConstantsGenerated.C_FORM_FIELD, FormFieldType.class, "Email");
FormItemsType itemsInGroup1 = ((FormFieldGroupType) formItems.getFormItem().get(1).getValue()).getFormItems();
assertFormItem(itemsInGroup1, "group", 0, SchemaConstantsGenerated.C_FORM_FIELD, FormFieldType.class, "City");
assertFormItem(itemsInGroup1, "group", 1, SchemaConstantsGenerated.C_FORM_FIELD, FormFieldType.class, "Country");
}
private void assertFormItem(FormItemsType formItems, String context, int index, QName elementName, Class<? extends AbstractFormItemType> clazz,
String name) {
String ctx = "Problem in " + context + ", item #" + index + ": ";
JAXBElement<? extends AbstractFormItemType> itemElement = formItems.getFormItem().get(index);
assertTrue(ctx+"Unexpected item name: "+itemElement.getName()+", expected: "+elementName, elementName.equals(itemElement.getName()));
assertEquals(ctx+"Wrong class", clazz, itemElement.getValue().getClass());
assertEquals(ctx+"Wrong name", name, itemElement.getValue().getName());
}
}