diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index 162cf61ee4a..5dd893f6e9a 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -1030,6 +1030,9 @@ public List> fetchChanges(ResourceType resourceType, InternalMonitor.recordShadowOtherOperation(); RefinedObjectClassDefinition refinedObjectClassDefinition = determineObjectClassDefinition(objectClass, resourceType); + if (refinedObjectClassDefinition == null) { + throw new SchemaException("Unknown object class "+objectClass+" in "+resourceType); + } ConnectorInstance connector = getConnectorInstance(resourceType, parentResult); List> changes = null; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java index 41a75a2cb86..3595c15f4e7 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java @@ -77,6 +77,7 @@ import org.identityconnectors.framework.common.objects.OperationalAttributes; import org.identityconnectors.framework.common.objects.QualifiedUid; import org.identityconnectors.framework.common.objects.ResultsHandler; +import org.identityconnectors.framework.common.objects.Schema; import org.identityconnectors.framework.common.objects.ScriptContext; import org.identityconnectors.framework.common.objects.SearchResult; import org.identityconnectors.framework.common.objects.SortKey; @@ -471,6 +472,10 @@ public void initialize(ResourceSchema resourceSchema, Collection capabil this.resourceSchema = resourceSchema; this.capabilities = capabilities; this.caseIgnoreAttributeNames = caseIgnoreAttributeNames; + + if (resourceSchema != null) { + legacySchema = isLegacySchema(resourceSchema); + } if (resourceSchema == null || capabilities == null) { try { @@ -621,15 +626,9 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects // New instance of midPoint schema object resourceSchema = new ResourceSchema(getSchemaNamespace(), prismContext); - Set objectClassInfoSet = icfSchema.getObjectClassInfo(); - for (ObjectClassInfo objectClassInfo : objectClassInfoSet) { - if (objectClassInfo.is(ObjectClass.ACCOUNT_NAME) || objectClassInfo.is(ObjectClass.GROUP_NAME)) { - legacySchema = true; - LOGGER.trace("This is legacy schema"); - break; - } - } + legacySchema = isLegacySchema(icfSchema); + Set objectClassInfoSet = icfSchema.getObjectClassInfo(); // Let's convert every objectclass in the ICF schema ... for (ObjectClassInfo objectClassInfo : objectClassInfoSet) { @@ -902,6 +901,23 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects } + private boolean isLegacySchema(Schema icfSchema) { + Set objectClassInfoSet = icfSchema.getObjectClassInfo(); + for (ObjectClassInfo objectClassInfo : objectClassInfoSet) { + if (objectClassInfo.is(ObjectClass.ACCOUNT_NAME) || objectClassInfo.is(ObjectClass.GROUP_NAME)) { + LOGGER.trace("This is legacy schema"); + return true; + } + } + return false; + } + + private boolean isLegacySchema(ResourceSchema resourceSchema) { + ComplexTypeDefinition accountObjectClass = resourceSchema.findComplexTypeDefinition( + new QName(getSchemaNamespace(), ConnectorFactoryIcfImpl.ACCOUNT_OBJECT_CLASS_LOCAL_NAME)); + return accountObjectClass != null; + } + private boolean shouldBeGenerated(List generateObjectClasses, QName objectClassXsdName) { if (generateObjectClasses == null || generateObjectClasses.isEmpty()){ diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestConnectorDiscovery.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestConnectorDiscovery.java index 013dbfc7329..77f44e1341b 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestConnectorDiscovery.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestConnectorDiscovery.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * 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. @@ -55,7 +55,7 @@ @DirtiesContext public class TestConnectorDiscovery extends AbstractIntegrationTest { - private static final String LDAP_CONNECTOR_TYPE = "org.identityconnectors.ldap.LdapConnector"; + private static final String LDAP_CONNECTOR_TYPE = "com.evolveum.polygon.connector.ldap.LdapConnector"; @Autowired private ProvisioningService provisioningService; @@ -120,9 +120,10 @@ public void testListConnectors() throws Exception{ @Test public void testSearchConnectorSimple() throws SchemaException{ - TestUtil.displayTestTile("testSearchConnectorSimple"); + final String TEST_NAME = "testSearchConnectorSimple"; + TestUtil.displayTestTile(TEST_NAME); OperationResult result = new OperationResult(TestConnectorDiscovery.class.getName() - + ".testSearchConnector"); + + "." + TEST_NAME); PrismObject ldapConnector = findConnectorByType(LDAP_CONNECTOR_TYPE, result); assertEquals("Type does not match", LDAP_CONNECTOR_TYPE, ldapConnector.asObjectable().getConnectorType()); @@ -136,16 +137,6 @@ public void testSearchConnectorAnd() throws SchemaException{ + ".testSearchConnector"); Document doc = DOMUtil.getDocument(); -// Element filter = QueryUtil -// .createAndFilter( -// doc, -// QueryUtil.createEqualFilter(doc, null, SchemaConstants.C_CONNECTOR_FRAMEWORK, -// ConnectorFactoryIcfImpl.ICF_FRAMEWORK_URI), -// QueryUtil.createEqualFilter(doc, null, SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE, -// LDAP_CONNECTOR_TYPE)); -// -// QueryType query = new QueryType(); -// query.setFilter(filter); AndFilter filter = AndFilter.createAnd( EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_FRAMEWORK, ConnectorType.class, prismContext, null, ConnectorFactoryIcfImpl.ICF_FRAMEWORK_URI), EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE, ConnectorType.class, prismContext, null, LDAP_CONNECTOR_TYPE)); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJNegative.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJNegative.java index 22ec797341c..ef58a60cd95 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJNegative.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJNegative.java @@ -266,7 +266,7 @@ public void test121SearchAccounts() throws SchemaException, ObjectNotFoundExcept + "." + TEST_NAME); final String resourceNamespace = ResourceTypeUtil.getResourceNamespace(resource); - QName objectClass = new QName(resourceNamespace, "AccountObjectClass"); + QName objectClass = new QName(resourceNamespace, OBJECT_CLASS_INETORGPERSON_NAME); ObjectQuery query = ObjectQueryUtil.createResourceAndAccountQuery(resource.getOid(), objectClass, prismContext); @@ -296,7 +296,7 @@ public void test122SearchAccountsIterative() throws SchemaException, ObjectNotFo + "." + TEST_NAME); final String resourceNamespace = ResourceTypeUtil.getResourceNamespace(resource); - QName objectClass = new QName(resourceNamespace, "AccountObjectClass"); + QName objectClass = new QName(resourceNamespace, OBJECT_CLASS_INETORGPERSON_NAME); ObjectQuery query = ObjectQueryUtil.createResourceAndAccountQuery(resource.getOid(), objectClass, prismContext); @@ -546,7 +546,7 @@ public void test521SearchAccounts() throws SchemaException, ObjectNotFoundExcept + "." + TEST_NAME); final String resourceNamespace = ResourceTypeUtil.getResourceNamespace(resource); - QName objectClass = new QName(resourceNamespace, "AccountObjectClass"); + QName objectClass = new QName(resourceNamespace, OBJECT_CLASS_INETORGPERSON_NAME); ObjectQuery query = ObjectQueryUtil.createResourceAndAccountQuery(resource.getOid(), objectClass, prismContext); @@ -575,7 +575,7 @@ public void test522SearchAccountsIterative() throws SchemaException, ObjectNotFo + "." + TEST_NAME); final String resourceNamespace = ResourceTypeUtil.getResourceNamespace(resource); - QName objectClass = new QName(resourceNamespace, "AccountObjectClass"); + QName objectClass = new QName(resourceNamespace, OBJECT_CLASS_INETORGPERSON_NAME); ObjectQuery query = ObjectQueryUtil.createResourceAndAccountQuery(resource.getOid(), objectClass, prismContext); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestSynchronization.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestSynchronization.java index 38e6766566e..a62521a86c0 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestSynchronization.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestSynchronization.java @@ -117,7 +117,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti // let provisioning discover the connectors provisioningService.postInit(initResult); - resourceType = addResourceFromFile(FILENAME_RESOURCE_OPENDJ, "org.identityconnectors.ldap.LdapConnector", initResult).asObjectable(); + resourceType = addResourceFromFile(FILENAME_RESOURCE_OPENDJ, AbstractOpenDJTest.LDAP_CONNECTOR_TYPE, initResult).asObjectable(); //it is needed to declare the task owner, so we add the user admin to the reposiotry repoAddObjectFromFile(FILENAME_USER_ADMIN, UserType.class, initResult); @@ -189,7 +189,7 @@ public void test100SyncAddWill() throws Exception { addOperation.getResultCode()); // WHEN - provisioningService.synchronize(resourceType.getOid(), ProvisioningTestUtil.getDefaultAccountObjectClass(resourceType), + provisioningService.synchronize(resourceType.getOid(), AbstractOpenDJTest.RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS, syncTask, result); // THEN diff --git a/provisioning/provisioning-impl/src/test/resources/object/resource-opendj-initialized.xml b/provisioning/provisioning-impl/src/test/resources/object/resource-opendj-initialized.xml index 1d09396932c..dbdb07a47bf 100644 --- a/provisioning/provisioning-impl/src/test/resources/object/resource-opendj-initialized.xml +++ b/provisioning/provisioning-impl/src/test/resources/object/resource-opendj-initialized.xml @@ -1,6 +1,6 @@ - + 10389 localhost - dc=example,dc=com - cn=directory manager - secret - uid - ds-pwp-account-disabled + dc=example,dc=com + cn=directory manager + secret + auto + entryUUID + ds-pwp-account-disabled @@ -68,6 +70,10 @@ -1 -1 + + + false + @@ -91,14 +97,14 @@ - + icfs:uid icfs:name icfs:name - __GROUP__ + groupsOfUniqueNames @@ -115,14 +121,14 @@ - + icfs:uid icfs:name icfs:name - __ACCOUNT__ + inetOrgPerson @@ -195,7 +201,7 @@ default Default Account true - ri:AccountObjectClass + ri:inetOrgPerson ri:group LDAP Group Membership @@ -211,7 +217,7 @@ entitlement ldapGroup LDAP Group - ri:GroupObjectClass + ri:groupsOfUniqueNames diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/DummyResourceContoller.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/DummyResourceContoller.java index d9fb850bc7a..8853f3d960a 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/DummyResourceContoller.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/DummyResourceContoller.java @@ -255,7 +255,11 @@ public void assertDummyResourceSchemaSanity(ResourceSchema resourceSchema, Resou public void assertDummyResourceSchemaSanityExtended(ResourceSchema resourceSchema, ResourceType resourceType) { assertDummyResourceSchemaSanity(resourceSchema, resourceType); - ObjectClassComplexTypeDefinition accountDef = resourceSchema.findDefaultObjectClassDefinition(ShadowKindType.ACCOUNT); + ObjectClassComplexTypeDefinition accountDef = resourceSchema.findDefaultObjectClassDefinition(ShadowKindType.ACCOUNT); + assertNotNull("No default account definition", accountDef); + ObjectClassComplexTypeDefinition accountObjectClassDef = resourceSchema.findObjectClassDefinition(SchemaTestConstants.ICF_ACCOUNT_OBJECT_CLASS_LOCAL_NAME); + assertNotNull("No AccountObjectClass definition", accountObjectClassDef); + assertTrue("Default account definition is not same as AccountObjectClass", accountDef == accountObjectClassDef); assertEquals("Unexpected number of defnitions", 17, accountDef.getDefinitions().size()); ResourceAttributeDefinition treasureDef = accountDef.findAttributeDefinition(DUMMY_ACCOUNT_ATTRIBUTE_TREASURE_NAME); assertFalse("Treasure IS returned by default and should not be", treasureDef.isReturnedByDefault());