/* * 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.repo.sql.util; import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.Contract; import javax.xml.namespace.QName; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * @author lazyman */ public final class ClassMapper { private static final Map<ObjectTypes, RObjectType> types = new HashMap<>(); private ClassMapper() { } static { types.put(ObjectTypes.CONNECTOR, RObjectType.CONNECTOR); types.put(ObjectTypes.CONNECTOR_HOST, RObjectType.CONNECTOR_HOST); types.put(ObjectTypes.GENERIC_OBJECT, RObjectType.GENERIC_OBJECT); types.put(ObjectTypes.OBJECT, RObjectType.OBJECT); types.put(ObjectTypes.PASSWORD_POLICY, RObjectType.VALUE_POLICY); types.put(ObjectTypes.RESOURCE, RObjectType.RESOURCE); types.put(ObjectTypes.SHADOW, RObjectType.SHADOW); types.put(ObjectTypes.ROLE, RObjectType.ROLE); types.put(ObjectTypes.SYSTEM_CONFIGURATION, RObjectType.SYSTEM_CONFIGURATION); types.put(ObjectTypes.TASK, RObjectType.TASK); types.put(ObjectTypes.USER, RObjectType.USER); types.put(ObjectTypes.REPORT, RObjectType.REPORT); types.put(ObjectTypes.REPORT_OUTPUT, RObjectType.REPORT_OUTPUT); types.put(ObjectTypes.OBJECT_TEMPLATE, RObjectType.OBJECT_TEMPLATE); types.put(ObjectTypes.NODE, RObjectType.NODE); types.put(ObjectTypes.ORG, RObjectType.ORG); types.put(ObjectTypes.ABSTRACT_ROLE, RObjectType.ABSTRACT_ROLE); types.put(ObjectTypes.FOCUS_TYPE, RObjectType.FOCUS); types.put(ObjectTypes.SECURITY_POLICY, RObjectType.SECURITY_POLICY); types.put(ObjectTypes.LOOKUP_TABLE, RObjectType.LOOKUP_TABLE); types.put(ObjectTypes.ACCESS_CERTIFICATION_DEFINITION, RObjectType.ACCESS_CERTIFICATION_DEFINITION); types.put(ObjectTypes.ACCESS_CERTIFICATION_CAMPAIGN, RObjectType.ACCESS_CERTIFICATION_CAMPAIGN); types.put(ObjectTypes.SEQUENCE, RObjectType.SEQUENCE); types.put(ObjectTypes.SERVICE, RObjectType.SERVICE); types.put(ObjectTypes.FORM, RObjectType.FORM); types.put(ObjectTypes.CASE, RObjectType.CASE); for (ObjectTypes type : ObjectTypes.values()) { if (!types.containsKey(type)) { String message = "Not all object types are mapped by sql repo impl. Found '" + type + "' unmapped."; System.err.println(message); throw new IllegalStateException(message); } } } public static Class<? extends RObject> getHQLTypeClass(Class<? extends ObjectType> clazz) { Validate.notNull(clazz, "Class must not be null."); ObjectTypes type = ObjectTypes.getObjectType(clazz); Class<? extends RObject> hqlType = types.get(type).getClazz(); if (hqlType == null) { throw new IllegalStateException("Couldn't find DB type for '" + clazz + "'."); } return hqlType; } public static String getHQLType(Class<? extends ObjectType> clazz) { Class<? extends RObject> hqlType = getHQLTypeClass(clazz); return hqlType.getSimpleName(); } @Contract("!null -> !null; null -> null") public static RObjectType getHQLTypeForQName(QName qname) { if (qname == null) { return null; } for (Map.Entry<ObjectTypes, RObjectType> entry : types.entrySet()) { if (QNameUtil.match(entry.getKey().getTypeQName(), qname)) { return entry.getValue(); } } throw new IllegalArgumentException("Couldn't find hql type for qname " + qname); } public static Class<? extends RObject> getHqlClassForHqlName(String hqlName) { if (hqlName == null) { return null; } for (RObjectType entry : types.values()) { if (entry.getClazz().getSimpleName().equals(hqlName)) { return entry.getClazz(); } } throw new IllegalArgumentException("Couldn't find hql type for hql name " + hqlName); } public static ObjectTypes getObjectTypeForHQLType(RObjectType type) { if (type == null) { return null; } for (Map.Entry<ObjectTypes, RObjectType> entry : types.entrySet()) { if (entry.getValue().equals(type)) { return entry.getKey(); } } throw new IllegalArgumentException("Couldn't find qname for hql type " + type); } public static ObjectTypes getObjectTypeForHQLType(Class<? extends RObject> type) { if (type == null) { return null; } for (Map.Entry<ObjectTypes, RObjectType> entry : types.entrySet()) { if (entry.getValue().getClazz().equals(type)) { return entry.getKey(); } } throw new IllegalArgumentException("Couldn't find qname for hql type " + type); } public static QName getQNameForHQLType(RObjectType type) { ObjectTypes types = getObjectTypeForHQLType(type); return types == null ? null : types.getTypeQName(); } public static Collection<RObjectType> getKnownTypes() { return types.values(); } }