/*
* Copyright (c) 2010-2014 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.testing.longtest;
import com.evolveum.midpoint.model.test.AbstractModelIntegrationTest;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.Test;
/**
* @author lazyman
*/
@ContextConfiguration(locations = {"classpath:ctx-longtest-test-main.xml"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class TestOrgHierarchy extends AbstractModelIntegrationTest {
private static final Trace LOGGER = TraceManager.getTrace(TestOrgHierarchy.class);
private static final String SYSTEM_CONFIGURATION_FILENAME = COMMON_DIR_PATH + "/system-configuration.xml";
private static final String SYSTEM_CONFIGURATION_OID = SystemObjectsType.SYSTEM_CONFIGURATION.value();
private static final String USER_ADMINISTRATOR_FILENAME = COMMON_DIR_PATH + "/user-administrator.xml";
private static final String USER_ADMINISTRATOR_OID = SystemObjectsType.USER_ADMINISTRATOR.value();
private static final String USER_ADMINISTRATOR_USERNAME = "administrator";
private static final String ROLE_SUPERUSER_FILENAME = COMMON_DIR_PATH + "/role-superuser.xml";
private static final String ROLE_SUPERUSER_OID = "00000000-0000-0000-0000-000000000004";
//222 org. units, 2160 users
// private static final int[] TREE_LEVELS = {2, 5, 7, 2};
// private static final int[] TREE_LEVELS_USER = {5, 5, 20, 5};
//1378 org. units, 13286 users
// private static final int[] TREE_LEVELS = {2, 8, 5, 16};
// private static final int[] TREE_LEVELS_USER = {3, 5, 5, 10};
//98 org. units, 886 users
// private static final int[] TREE_LEVELS = {2, 8, 5};
// private static final int[] TREE_LEVELS_USER = {3, 5, 10};
//18 org. units, 86 users
private static final int[] TREE_LEVELS = {2, 8};
private static final int[] TREE_LEVELS_USER = {3, 5};
private int count = 0;
@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);
modelService.postInit(initResult);
// System Configuration and administrator
repoAddObjectFromFile(SYSTEM_CONFIGURATION_FILENAME, initResult);
PrismObject<UserType> userAdministrator = repoAddObjectFromFile(USER_ADMINISTRATOR_FILENAME, initResult);
repoAddObjectFromFile(ROLE_SUPERUSER_FILENAME, initResult);
login(userAdministrator);
// Resources
assumeAssignmentPolicy(AssignmentPolicyEnforcementType.RELATIVE);
}
@Test
public void test100ImportOrgStructure() throws Exception {
OperationResult opResult = new OperationResult("===[ addOrgStruct ]===");
loadOrgStructure(null, TREE_LEVELS, TREE_LEVELS_USER, "", opResult);
opResult.computeStatusIfUnknown();
TestUtil.assertSuccess(opResult);
}
private void loadOrgStructure(String parentOid, int[] TREE_SIZE, int[] USER_SIZE, String oidPrefix,
OperationResult result) throws Exception {
if (TREE_SIZE.length == 0) {
return;
}
for (int i = 0; i < TREE_SIZE[0]; i++) {
String newOidPrefix = (TREE_SIZE[0] - i) + "a" + oidPrefix;
PrismObject<OrgType> org = createOrg(parentOid, i, newOidPrefix);
LOGGER.info("Creating {}, total {}", org, count);
String oid = repositoryService.addObject(org, null, result);
count++;
for (int u = 0; u < USER_SIZE[0]; u++) {
PrismObject<UserType> user = createUser(oid, i, u, newOidPrefix);
LOGGER.info("Creating {}, total {}", user, count);
repositoryService.addObject(user, null, result);
count++;
}
loadOrgStructure(oid, ArrayUtils.remove(TREE_SIZE, 0), ArrayUtils.remove(USER_SIZE, 0),
newOidPrefix + i, result);
}
}
private PrismObject<UserType> createUser(String parentOid, int i, int u, String oidPrefix)
throws Exception {
UserType user = new UserType();
user.setOid("1" + createOid(u, oidPrefix + i));
user.setName(createPolyStringType("u" + oidPrefix + i + u));
user.setFullName(createPolyStringType("fu" + oidPrefix + i + u));
user.setFamilyName(createPolyStringType("fa" + oidPrefix + i + u));
user.setGivenName(createPolyStringType("gi" + oidPrefix + i + u));
if (parentOid != null) {
ObjectReferenceType ref = new ObjectReferenceType();
ref.setOid(parentOid);
ref.setType(OrgType.COMPLEX_TYPE);
user.getParentOrgRef().add(ref);
}
prismContext.adopt(user);
return user.asPrismContainer();
}
private PrismObject<OrgType> createOrg(String parentOid, int i, String oidPrefix)
throws Exception {
OrgType org = new OrgType();
org.setOid("2" + createOid(i, oidPrefix));
org.setDisplayName(createPolyStringType("o" + oidPrefix + i));
org.setName(createPolyStringType("o" + oidPrefix + i));
if (parentOid != null) {
ObjectReferenceType ref = new ObjectReferenceType();
ref.setOid(parentOid);
ref.setType(OrgType.COMPLEX_TYPE);
org.getParentOrgRef().add(ref);
}
prismContext.adopt(org);
return org.asPrismContainer();
}
private String createOid(int i, String oidPrefix) {
String oid = StringUtils.rightPad(oidPrefix + Integer.toString(i), 31, 'a');
StringBuilder sb = new StringBuilder();
sb.append(oid.substring(0, 7));
sb.append('-');
sb.append(oid.substring(7, 11));
sb.append('-');
sb.append(oid.substring(11, 15));
sb.append('-');
sb.append(oid.substring(15, 19));
sb.append('-');
sb.append(oid.substring(19, 31));
return sb.toString();
}
}