/*
* 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.repo.sql.testing;
import com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import java.util.Arrays;
import java.util.List;
/**
* This class provides simple validation for data stored in database. It does various selects and asserts data quality.
* Validation occurs only when H2 is used and dropIfExists=true, only during tests.
*
* @author lazyman
*/
public class DBValidator {
public static <T extends ObjectType> void validateOwners(Class<T> type, SqlRepositoryConfiguration config,
SessionFactory factory) {
if (!config.isUsingH2() || !config.isDropIfExists()) {
return;
}
Session session = factory.openSession();
try {
session.beginTransaction();
validate("select e.owner_oid, e.eName from m_object_ext_string e where e.ownerType is null",
"extension string are null", session);
validate("select e.owner_oid, e.eName from m_object_ext_poly e where e.ownerType is null",
"extension poly are null", session);
validate("select e.owner_oid, e.eName from m_object_ext_long e where e.ownerType is null",
"extension long are null", session);
validate("select e.owner_oid, e.eName from m_object_ext_date e where e.ownerType is null",
"extension date are null", session);
validate("select e.owner_oid, e.eName from m_object_ext_reference e where e.ownerType is null",
"extension reference are null", session);
if (FocusType.class.isAssignableFrom(type)) {
validate("select a.owner_oid, a.id from m_assignment a where a.assignmentOwner is null",
"assignment owners are null", session);
validate("select e.anyContainer_owner_owner_oid, e.anyContainer_owner_id, e.eName from m_assignment_ext_string e where e.extensionType is null",
"assignment extension string are null", session);
validate("select e.anyContainer_owner_owner_oid, e.anyContainer_owner_id, e.eName from m_assignment_ext_poly e where e.extensionType is null",
"assignment extension poly are null", session);
validate("select e.anyContainer_owner_owner_oid, e.anyContainer_owner_id, e.eName from m_assignment_ext_long e where e.extensionType is null",
"assignment extension long are null", session);
validate("select e.anyContainer_owner_owner_oid, e.anyContainer_owner_id, e.eName from m_assignment_ext_date e where e.extensionType is null",
"assignment extension date are null", session);
validate("select e.anyContainer_owner_owner_oid, e.anyContainer_owner_id, e.eName from m_assignment_ext_reference e where e.extensionType is null",
"assignment extension reference are null", session);
}
} finally {
if (session != null) {
session.close();
}
}
}
private static final void validate(String sql, String message, Session session) {
Query query = session.createSQLQuery(sql);
List nullAssignments = query.list();
if (!nullAssignments.isEmpty()) {
throw new SystemException(message + Arrays.deepToString(nullAssignments.toArray()));
}
}
}