Skip to content

Commit

Permalink
missing natural key annotator (improvement from check for mappingtype…
Browse files Browse the repository at this point in the history
…/name only)
  • Loading branch information
1azyman committed Apr 13, 2024
1 parent fbd66d1 commit 8e93a15
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
package com.evolveum.midpoint.studio.impl.lang.annotation;

import com.evolveum.midpoint.prism.ComplexTypeDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.studio.util.MidPointUtils;
import com.evolveum.midpoint.studio.util.PsiUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType;
import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.lang.annotation.Annotator;
import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.xml.XmlTag;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;

import javax.xml.namespace.QName;
import java.util.List;

public class MappingAnnotator implements Annotator, MidPointAnnotator {

private static final String MESSAGE =
"Mapping doesn't have name defined.";
public class MissingNaturalKeyAnnotator implements Annotator, MidPointAnnotator {

@Override
public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder holder) {
Expand All @@ -26,29 +24,32 @@ public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder hold
return;
}

XmlTag mapping = getMappingTypeTag(element);
if (mapping == null) {
if (!(element instanceof XmlTag tag)) {
return;
}

XmlTag name = MidPointUtils.findSubTag(mapping, MappingType.F_NAME);
if (name != null && StringUtils.isNotEmpty(name.getValue().getText())) {
QName type = PsiUtils.getTagXsdType(tag);
if (type == null) {
return;
}

createTagAnnotations(mapping, holder, HighlightSeverity.WARNING, MESSAGE, null);
}

private XmlTag getMappingTypeTag(PsiElement element) {
if (!(element instanceof XmlTag tag)) {
return null;
PrismContext ctx = MidPointUtils.DEFAULT_PRISM_CONTEXT;
ComplexTypeDefinition def = ctx.getSchemaRegistry().findComplexTypeDefinitionByType(type);
if (def == null) {
return;
}

QName type = PsiUtils.getTagXsdType(tag);
if (type == null || !MappingType.COMPLEX_TYPE.equals(type)) {
return null;
List<QName> naturalKeys = def.getNaturalKey();
if (naturalKeys == null || naturalKeys.isEmpty()) {
return;
}

return tag;
for (QName key : naturalKeys) {
XmlTag subTag = MidPointUtils.findSubTag(tag, key);
if (subTag == null) {
createTagAnnotations(tag, holder, HighlightSeverity.WARNING,
"Missing key natural key constituent: " + key.getLocalPart(), null);
}
}
}
}
2 changes: 1 addition & 1 deletion studio-idea-plugin/src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@
<annotator language="XML"
implementationClass="com.evolveum.midpoint.studio.impl.lang.intention.ProtectedStringAnnotatorIntention"/>
<annotator language="XML"
implementationClass="com.evolveum.midpoint.studio.impl.lang.annotation.MappingAnnotator"/>
implementationClass="com.evolveum.midpoint.studio.impl.lang.annotation.MissingNaturalKeyAnnotator"/>

<completion.contributor language="XML"
implementationClass="com.evolveum.midpoint.studio.impl.lang.codeInsight.MidPointCompletionContributor"/>
Expand Down

0 comments on commit 8e93a15

Please sign in to comment.