Skip to content

Commit

Permalink
Test and fix for explicit legacySchema configuration (MID-2510)
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Aug 26, 2015
1 parent 9f7999d commit f3e6104
Show file tree
Hide file tree
Showing 7 changed files with 447 additions and 10 deletions.
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2014 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.
Expand Down Expand Up @@ -54,6 +54,7 @@ public class DummyConfiguration extends AbstractConfiguration {
private boolean generateAccountDescriptionOnCreate = false; // simulates volatile behavior (on create)
private boolean generateAccountDescriptionOnUpdate = false; // simulates volatile behavior (on update)
private String[] forbiddenNames = new String[0];
private boolean useLegacySchema = true;

/**
* Defines name of the dummy resource instance. There may be several dummy resource running in
Expand Down Expand Up @@ -295,6 +296,16 @@ public void setForbiddenNames(String[] forbiddenNames) {
this.forbiddenNames = forbiddenNames.clone();
}

@ConfigurationProperty(displayMessageKey = "UI_USE_LEGACY_SCHEMA",
helpMessageKey = "UI_USE_LEGACY_SCHEMA_HELP")
public boolean getUseLegacySchema() {
return useLegacySchema;
}

public void setUseLegacySchema(boolean useLegacySchema) {
this.useLegacySchema = useLegacySchema;
}

/**
* {@inheritDoc}
*/
Expand Down
Expand Up @@ -125,8 +125,10 @@ public class DummyConnector implements PoolableConnector, AuthenticateOp, Resolv
// Marker used in logging tests
public static final String LOG_MARKER = "_M_A_R_K_E_R_";

private static final String OBJECTCLASS_ACCOUNT_NAME = "account";
private static final String OBJECTCLASS_GROUP_NAME = "group";
private static final String OBJECTCLASS_PRIVILEGE_NAME = "privilege";
/**
* Place holder for the {@link Configuration} passed into the init() method
*/
Expand Down Expand Up @@ -802,14 +804,30 @@ public Schema schema() {

SchemaBuilder builder = new SchemaBuilder(DummyConnector.class);

builder.defineObjectClass(createAccountObjectClass(configuration.getSupportActivation()));
builder.defineObjectClass(createAccountObjectClass(configuration.getSupportActivation()));
builder.defineObjectClass(createGroupObjectClass(configuration.getSupportActivation()));
builder.defineObjectClass(createPrivilegeObjectClass());

log.info("schema::end");
return builder.build();
}

private String getAccountObjectClassName() {
if (configuration.getUseLegacySchema()) {
return ObjectClass.ACCOUNT_NAME;
} else {
return OBJECTCLASS_ACCOUNT_NAME;
}
}

private String getGroupObjectClassName() {
if (configuration.getUseLegacySchema()) {
return ObjectClass.GROUP_NAME;
} else {
return OBJECTCLASS_GROUP_NAME;
}
}

private ObjectClassInfoBuilder createCommonObjectClassBuilder(String typeName,
DummyObjectClass dummyAccountObjectClass, boolean supportsActivation) {
ObjectClassInfoBuilder objClassBuilder = new ObjectClassInfoBuilder();
Expand Down Expand Up @@ -849,7 +867,7 @@ private ObjectClassInfo createAccountObjectClass(boolean supportsActivation) {
throw new ConnectorException(e.getMessage(), e);
} // DO NOT catch IllegalStateException, let it pass

ObjectClassInfoBuilder objClassBuilder = createCommonObjectClassBuilder(null, dummyAccountObjectClass, supportsActivation);
ObjectClassInfoBuilder objClassBuilder = createCommonObjectClassBuilder(getAccountObjectClassName(), dummyAccountObjectClass, supportsActivation);

// __PASSWORD__ attribute
objClassBuilder.addAttributeInfo(OperationalAttributeInfos.PASSWORD);
Expand All @@ -859,7 +877,7 @@ private ObjectClassInfo createAccountObjectClass(boolean supportsActivation) {

private ObjectClassInfo createGroupObjectClass(boolean supportsActivation) {
// __GROUP__ objectclass
ObjectClassInfoBuilder objClassBuilder = createCommonObjectClassBuilder(ObjectClass.GROUP_NAME,
ObjectClassInfoBuilder objClassBuilder = createCommonObjectClassBuilder(getGroupObjectClassName(),
resource.getGroupObjectClass(), supportsActivation);

return objClassBuilder.build();
Expand Down
Expand Up @@ -330,7 +330,7 @@ public void configure(PrismContainerValue<?> configuration, OperationResult pare
if (legacySchemaConfigProperty != null) {
legacySchema = legacySchemaConfigProperty.getRealValue();
}

LOGGER.trace("Legacy schema (config): {}", legacySchema);
}

private PrismContainerDefinition<?> getConfigurationContainerDefinition() throws SchemaException {
Expand Down Expand Up @@ -491,7 +491,7 @@ public void initialize(ResourceSchema resourceSchema, Collection<Object> capabil
this.caseIgnoreAttributeNames = caseIgnoreAttributeNames;

if (resourceSchema != null && legacySchema == null) {
legacySchema = isLegacySchema(resourceSchema);
legacySchema = detectLegacySchema(resourceSchema);
}

if (resourceSchema == null || capabilities == null) {
Expand Down Expand Up @@ -644,7 +644,10 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects
// New instance of midPoint schema object
setResourceSchema(new ResourceSchema(getSchemaNamespace(), prismContext));

legacySchema = isLegacySchema(icfSchema);
if (legacySchema == null) {
legacySchema = detectLegacySchema(icfSchema);
}
LOGGER.trace("Converting resource schema (legacy mode: {})", legacySchema);

Set<ObjectClassInfo> objectClassInfoSet = icfSchema.getObjectClassInfo();
// Let's convert every objectclass in the ICF schema ...
Expand All @@ -654,9 +657,12 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects
QName objectClassXsdName = icfNameMapper.objectClassToQname(new ObjectClass(objectClassInfo.getType()), getSchemaNamespace(), legacySchema);

if (!shouldBeGenerated(generateObjectClasses, objectClassXsdName)){
LOGGER.trace("Skipping object class {} ({})", objectClassInfo.getType(), objectClassXsdName);
continue;
}

LOGGER.trace("Convering object class {} ({})", objectClassInfo.getType(), objectClassXsdName);

// ResourceObjectDefinition is a midPpoint way how to represent an
// object class.
// The important thing here is the last "type" parameter
Expand Down Expand Up @@ -987,7 +993,7 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects

}

private boolean isLegacySchema(Schema icfSchema) {
private boolean detectLegacySchema(Schema icfSchema) {
Set<ObjectClassInfo> objectClassInfoSet = icfSchema.getObjectClassInfo();
for (ObjectClassInfo objectClassInfo : objectClassInfoSet) {
if (objectClassInfo.is(ObjectClass.ACCOUNT_NAME) || objectClassInfo.is(ObjectClass.GROUP_NAME)) {
Expand All @@ -998,7 +1004,7 @@ private boolean isLegacySchema(Schema icfSchema) {
return false;
}

private boolean isLegacySchema(ResourceSchema resourceSchema) {
private boolean detectLegacySchema(ResourceSchema resourceSchema) {
ComplexTypeDefinition accountObjectClass = resourceSchema.findComplexTypeDefinition(
new QName(getSchemaNamespace(), ConnectorFactoryIcfImpl.ACCOUNT_OBJECT_CLASS_LOCAL_NAME));
return accountObjectClass != null;
Expand Down

0 comments on commit f3e6104

Please sign in to comment.