Skip to content

Commit

Permalink
SchemaRegistry.getAllSubTypesByTypeDefinition
Browse files Browse the repository at this point in the history
  • Loading branch information
domko17 committed Dec 23, 2023
1 parent 3c44baa commit 79e8c76
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ <ID extends ItemDefinition> ComparisonResult compareDefinitions(@NotNull ID def1

ItemDefinition<?> createAdHocDefinition(QName elementName, QName typeName, int minOccurs, int maxOccurs);

List<TypeDefinition> getAllSubTypesByClassType(@NotNull List<Class<?>> typeClasses);
List<TypeDefinition> getAllSubTypesByTypeDefinition(List<TypeDefinition> typeClasses);

interface InvalidationListener {
void invalidate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public List<String> generateSuggestion() {
// value for @type || . type
if (findNode(ctx).getChild(0).getText().equals(FilterNames.META_TYPE) || ctx.getText().equals(FilterNames.TYPE.getLocalPart())) {
TypeDefinition typeDefinition = schemaRegistry.findTypeDefinitionByType(new QName(lastType.getText()));
suggestions = schemaRegistry.getAllSubTypesByClassType(List.of(typeDefinition.getCompileTimeClass())).stream().map(item -> item.getTypeName().getLocalPart()).toList();
suggestions = schemaRegistry.getAllSubTypesByTypeDefinition(List.of(typeDefinition)).stream().map(item -> item.getTypeName().getLocalPart()).toList();
}
// value for @path
if (findNode(ctx).getChild(0).getText().equals(FilterNames.META_PATH)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ private TypeDefinition checkType(ParserRuleContext ctx) {
);
} else {
if (this.typeDefinition == null) this.typeDefinition = typeDefinition;
List<TypeDefinition> objectTypes = schemaRegistry.getAllSubTypesByClassType(List.of(this.typeDefinition.getCompileTimeClass()));
List<TypeDefinition> objectTypes = schemaRegistry.getAllSubTypesByTypeDefinition(List.of(this.typeDefinition));

if (!objectTypes.contains(this.typeDefinition) && !objectTypes.contains(typeDefinition)) {
errorList.add(new AxiomQueryError(null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1790,27 +1790,49 @@ public void registerStaticNamespace(String ns, String prefix, boolean declaredBy
getNamespacePrefixMapper().registerPrefix(ns, prefix, declaredByDefault);
}

public List<TypeDefinition> getAllSubTypesByClassType(@NotNull List<Class<?>> typeClasses) {
List<TypeDefinition> subTypes = new ArrayList<>();
List<Class<?>> subTypeClasses = new ArrayList<>();
public List<TypeDefinition> getAllSubTypesByTypeDefinition(List<TypeDefinition> typeDefinitions) {
TypeDefinition typeDefinition;
List<TypeDefinition> subTypesAll = new ArrayList<>();
List<TypeDefinition> subTypes = new ArrayList<>();

// find subtypes for ObjectType
List<TypeDefinition> objectSubTypes = new ArrayList<>();
PrismObjectDefinition<?> objectTypeDefinition = findObjectDefinitionByType(prismContext.getDefaultReferenceTargetType());
objectSubTypes.addAll(findTypeDefinitionByCompileTimeClass(objectTypeDefinition.getCompileTimeClass(), TypeDefinition.class).getStaticSubTypes());
subTypes.addAll(objectSubTypes);

for (Class<?> typeClass : typeClasses) {
typeDefinition = findTypeDefinitionByCompileTimeClass(typeClass, TypeDefinition.class);
while (!objectSubTypes.isEmpty()) {
objectSubTypes.clear();

for (TypeDefinition td : subTypes) {
objectSubTypes.addAll(td.getStaticSubTypes().stream().toList());
}

if (typeDefinition != null ) {
subTypes.addAll(typeDefinition.getStaticSubTypes().stream().toList());
subTypeClasses.addAll(typeDefinition.getStaticSubTypes().stream()
.map(TypeDefinition::getCompileTimeClass)
.toList());
subTypesAll.addAll(subTypes);
subTypes.clear();
subTypes.addAll(objectSubTypes);
}

objectSubTypes.addAll(subTypesAll);
subTypesAll.clear();
subTypes.clear();

// find subtypes for other type
for (TypeDefinition td : typeDefinitions) {
if (objectSubTypes.contains(td)) {
subTypesAll.addAll(objectSubTypes);
} else {
typeDefinition = findTypeDefinitionByCompileTimeClass(td.getCompileTimeClass(), TypeDefinition.class);
subTypesAll.addAll(typeDefinition.getStaticSubTypes());
subTypes.addAll(typeDefinition.getStaticSubTypes());
}
}

if (!subTypeClasses.isEmpty()) {
subTypes.addAll(getAllSubTypesByClassType(subTypeClasses));
if (!subTypes.isEmpty()) {
subTypesAll.addAll(getAllSubTypesByTypeDefinition(subTypes));
}

return subTypes;
return subTypesAll;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ public static PrismContextImpl constructPrismContext(File extraSchema) throws Sc
prefixMapper.registerPrefix(PrismInternalTestUtil.NS_WEAPONS, PrismInternalTestUtil.NS_WEAPONS_PREFIX, false);
schemaRegistry.setValueMetadataTypeName(FOO_VALUE_METADATA_TYPE_QNAME);
PrismContextImpl prismContext = PrismContextImpl.create(schemaRegistry);
prismContext.setDefaultReferenceTargetType(OBJECT_TYPE_QNAME);
prismContext.setObjectsElementName(new QName("http://midpoint.evolveum.com/xml/ns/public/common/common-3", "objects"));
return prismContext;
}
Expand Down

0 comments on commit 79e8c76

Please sign in to comment.