/*
* Copyright (c) 2010-2016 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.prism.schema;
import com.evolveum.midpoint.prism.*;
import org.jetbrains.annotations.NotNull;
import javax.xml.namespace.QName;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
/**
* Used to retrieve definition from 'global definition store' - i.e. store that contains a group of related definition(s),
* sharing e.g. a common namespace. Such stores are prism schemas and schema registry itself.
*
* Note: although all of these methods are '@Nullable', we don't mark them as such, to avoid false 'may produce NPE'
* warnings for cases that will never produce nulls (like searching for known items/CTDs).
*
* @author mederly
*/
@SuppressWarnings("unused")
public interface GlobalDefinitionsStore extends DefinitionsStore {
// new API
// @Override
// GlobalDefinitionSearchContext<ItemDefinition<?>> findItemDefinition();
//
// @Override
// <T> GlobalDefinitionSearchContext<PrismPropertyDefinition<T>> findPropertyDefinition();
//
// @Override
// GlobalDefinitionSearchContext<PrismReferenceDefinition> findReferenceDefinition();
//
// @Override
// GlobalDefinitionSearchContext<PrismContainerDefinition<? extends Containerable>> findContainerDefinition();
//
// GlobalDefinitionSearchContext<PrismObjectDefinition<? extends Objectable>> findObjectDefinition();
//
// GlobalDefinitionSearchContext<ComplexTypeDefinition> findComplexTypeDefinition();
// old API
// PrismObject-related
// core methods
@NotNull
<ID extends ItemDefinition> List<ID> findItemDefinitionsByCompileTimeClass(
@NotNull Class<?> compileTimeClass, @NotNull Class<ID> definitionClass);
<ID extends ItemDefinition> ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class<ID> definitionClass);
@NotNull
<ID extends ItemDefinition> List<ID> findItemDefinitionsByElementName(@NotNull QName elementName, @NotNull Class<ID> definitionClass);
default <C extends Containerable> ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class<C> compileTimeClass) {
return findTypeDefinitionByCompileTimeClass(compileTimeClass, ComplexTypeDefinition.class);
}
<TD extends TypeDefinition> TD findTypeDefinitionByCompileTimeClass(@NotNull Class<?> compileTimeClass, @NotNull Class<TD> definitionClass);
<TD extends TypeDefinition> TD findTypeDefinitionByType(@NotNull QName typeName, @NotNull Class<TD> definitionClass);
@NotNull
<TD extends TypeDefinition> Collection<? extends TD> findTypeDefinitionsByType(@NotNull QName typeName, @NotNull Class<TD> definitionClass);
// non-core (derived) methods
@NotNull
default Collection<? extends TypeDefinition> findTypeDefinitionsByType(@NotNull QName typeName) {
return findTypeDefinitionsByType(typeName, TypeDefinition.class);
}
@NotNull
default List<ItemDefinition> findItemDefinitionsByElementName(@NotNull QName elementName) {
return findItemDefinitionsByElementName(elementName, ItemDefinition.class);
}
default <ID extends ItemDefinition> ID findItemDefinitionByElementName(@NotNull QName elementName, @NotNull Class<ID> definitionClass) {
return DefinitionStoreUtils.getOne(findItemDefinitionsByElementName(elementName, definitionClass));
}
default <ID extends ItemDefinition> ID findItemDefinitionByCompileTimeClass(
@NotNull Class<?> compileTimeClass, @NotNull Class<ID> definitionClass) {
return DefinitionStoreUtils.getOne(findItemDefinitionsByCompileTimeClass(compileTimeClass, definitionClass));
}
@SuppressWarnings("unchecked")
default <O extends Objectable> PrismObjectDefinition<O> findObjectDefinitionByCompileTimeClass(@NotNull Class<O> compileTimeClass) {
return findItemDefinitionByCompileTimeClass(compileTimeClass, PrismObjectDefinition.class);
}
@SuppressWarnings("unchecked")
default <O extends Objectable> PrismObjectDefinition<O> findObjectDefinitionByType(@NotNull QName typeName) {
return findItemDefinitionByType(typeName, PrismObjectDefinition.class);
}
@SuppressWarnings("unchecked")
default <O extends Objectable> PrismObjectDefinition<O> findObjectDefinitionByElementName(@NotNull QName elementName) {
return findItemDefinitionByElementName(elementName, PrismObjectDefinition.class);
}
// PrismContainer-related
@SuppressWarnings("unchecked")
default <C extends Containerable> PrismContainerDefinition<C> findContainerDefinitionByCompileTimeClass(@NotNull Class<C> compileTimeClass) {
return findItemDefinitionByCompileTimeClass(compileTimeClass, PrismContainerDefinition.class);
}
@SuppressWarnings("unchecked")
default <C extends Containerable> PrismContainerDefinition<C> findContainerDefinitionByType(@NotNull QName typeName) {
return findItemDefinitionByType(typeName, PrismContainerDefinition.class);
}
@SuppressWarnings("unchecked")
default <C extends Containerable> PrismContainerDefinition<C> findContainerDefinitionByElementName(@NotNull QName elementName) {
return findItemDefinitionByElementName(elementName, PrismContainerDefinition.class);
}
// PrismReference-related
default PrismReferenceDefinition findReferenceDefinitionByElementName(@NotNull QName elementName) {
return findItemDefinitionByElementName(elementName, PrismReferenceDefinition.class);
}
// PrismProperty-related
default PrismPropertyDefinition findPropertyDefinitionByElementName(@NotNull QName elementName) {
return findItemDefinitionByElementName(elementName, PrismPropertyDefinition.class);
}
// Item-related
default ItemDefinition findItemDefinitionByType(@NotNull QName typeName) {
return findItemDefinitionByType(typeName, ItemDefinition.class);
}
default ItemDefinition findItemDefinitionByElementName(@NotNull QName elementName) {
return findItemDefinitionByElementName(elementName, ItemDefinition.class);
}
@Deprecated
default <ID extends ItemDefinition> ID findItemDefinition(@NotNull String localElementName, @NotNull Class<ID> definitionClass) {
return findItemDefinitionByElementName(new QName(localElementName), definitionClass);
}
@Deprecated
default <ID extends ItemDefinition> ID findItemDefinition(@NotNull QName elementName, @NotNull Class<ID> definitionClass) {
return findItemDefinitionByElementName(elementName, definitionClass);
}
// TypeDefinition-related
default ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) {
return findTypeDefinitionByType(typeName, ComplexTypeDefinition.class);
}
default SimpleTypeDefinition findSimpleTypeDefinitionByType(@NotNull QName typeName) {
return findTypeDefinitionByType(typeName, SimpleTypeDefinition.class);
}
default TypeDefinition findTypeDefinitionByType(@NotNull QName typeName) {
return findTypeDefinitionByType(typeName, TypeDefinition.class);
}
@Deprecated default ComplexTypeDefinition findComplexTypeDefinition(@NotNull QName typeName) {
return findComplexTypeDefinitionByType(typeName);
}
}