-
Notifications
You must be signed in to change notification settings - Fork 188
/
SchemaRegistry.java
146 lines (102 loc) · 5.49 KB
/
SchemaRegistry.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
* 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 com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.xml.DynamicNamespacePrefixMapper;
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.prism.xml.ns._public.types_3.ObjectType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.xml.sax.SAXException;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
/**
* @author mederly
*/
public interface SchemaRegistry extends DebugDumpable, GlobalDefinitionsStore {
DynamicNamespacePrefixMapper getNamespacePrefixMapper();
PrismContext getPrismContext();
String getDefaultNamespace();
void initialize() throws SAXException, IOException, SchemaException;
javax.xml.validation.Schema getJavaxSchema();
PrismSchema getSchema(String namespace);
Collection<PrismSchema> getSchemas();
Collection<SchemaDescription> getSchemaDescriptions();
Collection<Package> getCompileTimePackages();
<T extends Containerable> ItemDefinition locateItemDefinition(@NotNull QName itemName,
@Nullable ComplexTypeDefinition complexTypeDefinition,
@Nullable Function<QName, ItemDefinition> dynamicDefinitionResolver) throws SchemaException;
// TODO fix this temporary and inefficient implementation
QName resolveUnqualifiedTypeName(QName type) throws SchemaException;
QName qualifyTypeName(QName typeName) throws SchemaException;
// current implementation tries to find all references to the child CTD and select those that are able to resolve path of 'rest'
// fails on ambiguity
// it's a bit fragile, as adding new references to child CTD in future may break existing code
ComplexTypeDefinition determineParentDefinition(@NotNull ComplexTypeDefinition child, @NotNull ItemPath rest);
PrismObjectDefinition determineReferencedObjectDefinition(QName targetTypeName, ItemPath rest);
Class<? extends ObjectType> getCompileTimeClassForObjectType(QName objectType);
ItemDefinition findItemDefinitionByElementName(QName elementName, @Nullable List<String> ignoredNamespaces);
<T> Class<T> determineCompileTimeClass(QName typeName);
<T> Class<T> getCompileTimeClass(QName xsdType);
PrismSchema findSchemaByCompileTimeClass(Class<?> compileTimeClass);
/**
* Tries to determine type name for any class (primitive, complex one).
* Does not use schemas (TODO explanation)
* @param clazz
* @return
*/
QName determineTypeForClass(Class<?> clazz);
/**
* This method will try to locate the appropriate object definition and apply it.
* @param container
* @param type
*/
<C extends Containerable> void applyDefinition(PrismContainer<C> container, Class<C> type) throws SchemaException;
<C extends Containerable> void applyDefinition(PrismContainer<C> prismObject, Class<C> type, boolean force) throws SchemaException;
<T extends Objectable> void applyDefinition(ObjectDelta<T> objectDelta, Class<T> type, boolean force) throws SchemaException;
<C extends Containerable, O extends Objectable> void applyDefinition(PrismContainerValue<C> prismContainerValue,
Class<O> type,
ItemPath path, boolean force) throws SchemaException;
<C extends Containerable> void applyDefinition(PrismContainerValue<C> prismContainerValue, QName typeName,
ItemPath path, boolean force) throws SchemaException;
<T extends ItemDefinition> T findItemDefinitionByFullPath(Class<? extends Objectable> objectClass, Class<T> defClass,
QName... itemNames)
throws SchemaException;
PrismSchema findSchemaByNamespace(String namespaceURI);
SchemaDescription findSchemaDescriptionByNamespace(String namespaceURI);
PrismSchema findSchemaByPrefix(String prefix);
SchemaDescription findSchemaDescriptionByPrefix(String prefix);
PrismObjectDefinition determineDefinitionFromClass(Class type);
boolean hasImplicitTypeDefinition(QName elementName, QName typeName);
ItemDefinition resolveGlobalItemDefinition(QName elementQName) throws SchemaException;
ItemDefinition resolveGlobalItemDefinition(QName elementQName, PrismContainerDefinition<?> containerDefinition) throws SchemaException;
ItemDefinition resolveGlobalItemDefinition(QName itemName, @Nullable ComplexTypeDefinition complexTypeDefinition) throws SchemaException;
@Deprecated // use methods from PrismContext
<T extends Objectable> PrismObject<T> instantiate(Class<T> compileTimeClass) throws SchemaException;
// Takes XSD types into account as well
Class<?> determineClassForType(QName type);
// Takes XSD types into account as well
Class<?> determineClassForItemDefinition(ItemDefinition<?> itemDefinition);
<ID extends ItemDefinition> ID selectMoreSpecific(ID def1, ID def2)
throws SchemaException;
boolean isAssignableFrom(QName superType, QName subType);
}