/*
* 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.processor;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.assertEquals;
import java.io.IOException;
import java.util.Collection;
import com.evolveum.midpoint.prism.PrismContainerDefinitionImpl;
import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl;
import com.evolveum.midpoint.prism.schema.PrismSchemaImpl;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
import org.testng.AssertJUnit;
import javax.xml.namespace.QName;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.schema.PrismSchema;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.schema.MidPointPrismContextFactory;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
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.CredentialsType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;
public class SchemaProcessorTest {
private static final String SCHEMA_NS = "http://foo.com/xml/ns/schema";
@BeforeSuite
public void setup() throws SchemaException, SAXException, IOException {
PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX);
PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY);
}
@Test
public void testAccessList() throws Exception {
String filename = "src/test/resources/processor/resource-schema-complex.xsd";
Document schemaDom = DOMUtil.parseFile(filename);
ResourceSchema schema = ResourceSchemaImpl.parse(DOMUtil.getFirstChildElement(schemaDom), filename, PrismTestUtil.getPrismContext());
final String defaultNS = "http://midpoint.evolveum.com/xml/ns/public/resource/instances/ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2";
final String icfNS = "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3";
ObjectClassComplexTypeDefinition objectDef = schema.findObjectClassDefinition(new QName(defaultNS, "AccountObjectClass"));
assertNotNull("AccountObjectClass definition not found", objectDef);
ResourceAttributeDefinition attrDef = objectDef.findAttributeDefinition(new QName(icfNS, "uid"));
AssertJUnit.assertTrue("uid readability", attrDef.canRead());
AssertJUnit.assertFalse("uid updateability", attrDef.canModify());
AssertJUnit.assertFalse("uid createability", attrDef.canAdd());
attrDef = objectDef.findAttributeDefinition(new QName(defaultNS, "title"));
AssertJUnit.assertTrue(attrDef.canRead());
AssertJUnit.assertTrue(attrDef.canModify());
AssertJUnit.assertTrue(attrDef.canAdd());
attrDef = objectDef.findAttributeDefinition(new QName(defaultNS, "photo"));
AssertJUnit.assertFalse(attrDef.canRead());
AssertJUnit.assertTrue(attrDef.canModify());
AssertJUnit.assertTrue(attrDef.canAdd());
}
@Test
public void testRoundTripGeneric() throws SchemaException {
// GIVEN
PrismSchemaImpl schema = new PrismSchemaImpl(SCHEMA_NS, PrismTestUtil.getPrismContext());
// Ordinary property
schema.createPropertyDefinition("number1", DOMUtil.XSD_INT);
// Property container
PrismContainerDefinitionImpl containerDefinition = schema.createPropertyContainerDefinition("ContainerType");
// ... in it ordinary property
containerDefinition.createPropertyDefinition("login", DOMUtil.XSD_STRING);
// ... and local property with a type from another schema
containerDefinition.createPropertyDefinition("password", ProtectedStringType.COMPLEX_TYPE);
// ... property reference
containerDefinition.createPropertyDefinition(SchemaConstants.C_CREDENTIALS, CredentialsType.COMPLEX_TYPE);
// ... read-only int property
PrismPropertyDefinition counterProperty = containerDefinition.createPropertyDefinition("counter", DOMUtil.XSD_INT);
((PrismPropertyDefinitionImpl) counterProperty).setReadOnly();
System.out.println("Generic schema before serializing to XSD: ");
System.out.println(schema.debugDump());
System.out.println();
// WHEN
Document xsd = schema.serializeToXsd();
String stringXmlSchema = DOMUtil.serializeDOMToString(xsd);
System.out.println("Generic schema after serializing to XSD: ");
System.out.println(stringXmlSchema);
System.out.println();
Document parsedXsd = DOMUtil.parseDocument(stringXmlSchema);
PrismSchema newSchema = PrismSchemaImpl.parse(DOMUtil.getFirstChildElement(parsedXsd), true, "serialized schema", PrismTestUtil.getPrismContext());
System.out.println("Generic schema after parsing from XSD: ");
System.out.println(newSchema.debugDump());
System.out.println();
// THEN
PrismPropertyDefinition number1def = newSchema.findItemDefinitionByElementName(new QName(SCHEMA_NS,"number1"), PrismPropertyDefinition.class);
assertEquals(new QName(SCHEMA_NS,"number1"),number1def.getName());
assertEquals(DOMUtil.XSD_INT,number1def.getTypeName());
PrismContainerDefinition newContainerDef = schema.findContainerDefinitionByType(new QName(SCHEMA_NS,"ContainerType"));
assertEquals(new QName(SCHEMA_NS,"ContainerType"),newContainerDef.getTypeName());
PrismPropertyDefinition loginDef = newContainerDef.findPropertyDefinition(new QName(SCHEMA_NS,"login"));
assertEquals(new QName(SCHEMA_NS,"login"), loginDef.getName());
assertEquals(DOMUtil.XSD_STRING, loginDef.getTypeName());
assertTrue("Read flag is wrong",loginDef.canRead());
assertTrue("Create flag is wrong",loginDef.canAdd());
assertTrue("Update flag is wrong",loginDef.canModify());
PrismPropertyDefinition passwdDef = newContainerDef.findPropertyDefinition(new QName(SCHEMA_NS,"password"));
assertEquals(new QName(SCHEMA_NS,"password"), passwdDef.getName());
assertEquals(ProtectedStringType.COMPLEX_TYPE, passwdDef.getTypeName());
PrismPropertyDefinition credDef = newContainerDef.findPropertyDefinition(new QName(SchemaConstants.NS_C,"credentials"));
assertEquals(new QName(SchemaConstants.NS_C,"credentials"), credDef.getName());
assertEquals(new QName(SchemaConstants.NS_C,"CredentialsType"), credDef.getTypeName());
PrismPropertyDefinition countDef = newContainerDef.findPropertyDefinition(new QName(SCHEMA_NS,"counter"));
assertEquals(new QName(SCHEMA_NS,"counter"), countDef.getName());
assertEquals(DOMUtil.XSD_INT, countDef.getTypeName());
assertTrue("Read flag is wrong",countDef.canRead());
assertFalse("Create flag is wrong",countDef.canAdd());
assertFalse("Update flag is wrong",countDef.canModify());
}
@Test
public void testRoundTripResource() throws SchemaException {
// GIVEN
ResourceSchemaImpl schema = new ResourceSchemaImpl(SCHEMA_NS, PrismTestUtil.getPrismContext());
// Property container
ObjectClassComplexTypeDefinitionImpl containerDefinition = (ObjectClassComplexTypeDefinitionImpl) schema.createObjectClassDefinition("AccountObjectClass");
containerDefinition.setKind(ShadowKindType.ACCOUNT);
containerDefinition.setDefaultInAKind(true);
containerDefinition.setNativeObjectClass("ACCOUNT");
// ... in it ordinary attribute - an identifier
ResourceAttributeDefinitionImpl xloginDef = containerDefinition.createAttributeDefinition("login", DOMUtil.XSD_STRING);
containerDefinition.addPrimaryIdentifier(xloginDef);
xloginDef.setNativeAttributeName("LOGIN");
containerDefinition.setDisplayNameAttribute(xloginDef.getName());
// ... and local property with a type from another schema
ResourceAttributeDefinitionImpl xpasswdDef = containerDefinition.createAttributeDefinition("password", ProtectedStringType.COMPLEX_TYPE);
xpasswdDef.setNativeAttributeName("PASSWORD");
// ... property reference
// TODO this is not a ResourceAttributeDefinition, it cannot be placed here!
//containerDefinition.createAttributeDefinition(SchemaConstants.C_CREDENTIALS, SchemaConstants.C_CREDENTIALS_TYPE);
// ... ignored attribute
ResourceAttributeDefinitionImpl xSepDef = containerDefinition.createAttributeDefinition("sep", DOMUtil.XSD_STRING);
xSepDef.setIgnored(true);
System.out.println("Resource schema before serializing to XSD: ");
System.out.println(schema.debugDump());
System.out.println();
// WHEN
Document xsd = schema.serializeToXsd();
String stringXmlSchema = DOMUtil.serializeDOMToString(xsd);
System.out.println("Resource schema after serializing to XSD: ");
System.out.println(stringXmlSchema);
System.out.println();
Document parsedXsd = DOMUtil.parseDocument(stringXmlSchema);
ResourceSchema newSchema = ResourceSchemaImpl.parse(DOMUtil.getFirstChildElement(parsedXsd), "serialized schema", PrismTestUtil.getPrismContext());
System.out.println("Resource schema after parsing from XSD: ");
System.out.println(newSchema.debugDump());
System.out.println();
// THEN
ObjectClassComplexTypeDefinition newObjectClassDef = newSchema.findObjectClassDefinition(new QName(SCHEMA_NS,"AccountObjectClass"));
assertEquals(new QName(SCHEMA_NS,"AccountObjectClass"),newObjectClassDef.getTypeName());
assertEquals(ShadowKindType.ACCOUNT, newObjectClassDef.getKind());
assertTrue(newObjectClassDef.isDefaultInAKind());
PrismPropertyDefinition loginDef = newObjectClassDef.findPropertyDefinition(new QName(SCHEMA_NS,"login"));
assertEquals(new QName(SCHEMA_NS,"login"), loginDef.getName());
assertEquals(DOMUtil.XSD_STRING, loginDef.getTypeName());
assertFalse(loginDef.isIgnored());
PrismPropertyDefinition passwdDef = newObjectClassDef.findPropertyDefinition(new QName(SCHEMA_NS,"password"));
assertEquals(new QName(SCHEMA_NS,"password"), passwdDef.getName());
assertEquals(ProtectedStringType.COMPLEX_TYPE, passwdDef.getTypeName());
assertFalse(passwdDef.isIgnored());
// PrismContainerDefinition credDef = newObjectClassDef.findContainerDefinition(new QName(SchemaConstants.NS_C,"credentials"));
// assertEquals(new QName(SchemaConstants.NS_C,"credentials"), credDef.getName());
// assertEquals(new QName(SchemaConstants.NS_C,"CredentialsType"), credDef.getTypeName());
// assertFalse(credDef.isIgnored());
PrismPropertyDefinition sepDef = newObjectClassDef.findPropertyDefinition(new QName(SCHEMA_NS,"sep"));
assertEquals(new QName(SCHEMA_NS,"sep"), sepDef.getName());
assertEquals(DOMUtil.XSD_STRING, sepDef.getTypeName());
assertTrue(sepDef.isIgnored());
}
}