Skip to content

Commit

Permalink
Merge branch 'refs/heads/master' into feature/native-associations
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Apr 16, 2024
2 parents 31e65ae + a8e223f commit 0cb60c8
Show file tree
Hide file tree
Showing 20 changed files with 408 additions and 93 deletions.
Original file line number Diff line number Diff line change
@@ -1,24 +1,36 @@
/*
* Copyright (c) 2010-2013 Evolveum and contributors
* Copyright (c) 2010-2024 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.prism.crypto;

public class EncryptionException extends Exception {
import com.evolveum.midpoint.util.LocalizableMessage;
import com.evolveum.midpoint.util.exception.CommonException;

public class EncryptionException extends CommonException {

private static final long serialVersionUID = 8289563205061329615L;

public EncryptionException(String message) {
super(message);
}

public EncryptionException(String message, Throwable throwable) {
super(message, throwable);
public EncryptionException(LocalizableMessage userFriendlyMessage) {
super(userFriendlyMessage);
}

public EncryptionException(Throwable cause) {
super(cause);
}

public EncryptionException(String message, Throwable cause) {
super(message, cause);
}

public EncryptionException(Throwable throwable) {
super(throwable);
@Override
public String getErrorTypeMessage() {
return "Encryption error";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,31 @@

import com.evolveum.axiom.lang.antlr.AxiomQueryError;

import com.evolveum.midpoint.prism.ItemDefinition;

import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Map;

public interface AxiomQueryLangService {

List<AxiomQueryError> validate(String query);
@Deprecated
default List<AxiomQueryError> validate(String query) {
return validate(null, query);
}


@Deprecated
default Map<String, String> queryCompletion(String query) {
return queryCompletion(null, query);
}

List<AxiomQueryError> validate(@Nullable ItemDefinition<?> rootItem, String query);

Map<String, String> queryCompletion(String query);
// FIXME: Return value should be more structured, e.g item definition, filter definition (with help text?)
// type definition?
// Something like suggested text, documentation for suggestion?
Map<String, String> queryCompletion(@Nullable ItemDefinition<?> rootItem, String query);

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@
package com.evolveum.midpoint.prism.query;

import com.evolveum.midpoint.prism.PrismNamespaceContext;
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;

public interface PrismQuerySerialization {

PrismNamespaceContext namespaceContext();

String filterText();

SearchFilterType toSearchFilterType();

class NotSupportedException extends Exception {

private static final long serialVersionUID = -5393426442630191647L;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import com.evolveum.midpoint.prism.xnode.*;

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
Expand All @@ -23,10 +26,6 @@
import com.evolveum.midpoint.prism.binding.PlainStructured;
import com.evolveum.midpoint.prism.binding.StructuredEqualsStrategy;
import com.evolveum.midpoint.prism.binding.StructuredHashCodeStrategy;
import com.evolveum.midpoint.prism.xnode.MapXNode;
import com.evolveum.midpoint.prism.xnode.PrimitiveXNode;
import com.evolveum.midpoint.prism.xnode.RootXNode;
import com.evolveum.midpoint.prism.xnode.XNode;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.DebugUtil;
Expand Down Expand Up @@ -74,9 +73,18 @@ public SearchFilterType(final SearchFilterType o) {
super();
Objects.requireNonNull(o, "Cannot create a copy of 'SearchFilterType' from 'null'.");
this.description = o.description;
this.text = o.text;
this.filterClauseXNode = o.filterClauseXNode.clone();
}

public SearchFilterType(String text, PrismNamespaceContext namespaceContext) {
super();
this.text = text;
var xnodeFactory = PrismContext.get().xnodeFactory();
var textNode = xnodeFactory.primitive(text);
filterClauseXNode = xnodeFactory.map(namespaceContext, F_TEXT, textNode);
}

public String getDescription() {
return description;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,8 @@ public ExternalDataType clone() {
public void accept(JaxbVisitor visitor) {
visitor.visit(this);
}

public boolean isEmpty() {
return key == null && provider == null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1280,7 +1280,7 @@ private <ID extends ItemDefinition> ID determineItemDefinition(QName itemName, @
// This allows the caller to treat removed definition differently, if desired. See MID-7939.
return (ID) new RemovedItemDefinition<>(itemName);
}
throw new SchemaException("No definition for item " + itemName + " in " + getParent());
throw new SchemaException("No definition for item " + itemName + " in " + getParent() + "; type: " + ctd);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,12 +282,19 @@ private void writePrimitiveWithType(PrimitiveXNodeImpl<?> xprim, Element parentE
} else {
// not ItemType nor QName
String value = xprim.getGuessedFormattedValue();
String fixedValue = SerializationOptions.isEscapeInvalidCharacters(serializationOptions) ?
DOMUtil.escapeInvalidXmlCharsIfPresent(value) : value;
if (asAttribute) {
DOMUtil.setAttributeValue(parentElement, elementOrAttributeName.getLocalPart(), fixedValue);

if (QNameUtil.match(elementOrAttributeName, DOMUtil.SCRIPT_CODE_ELEMENT_NAME)
&& DOMUtil.containsHTML(value)) {
DOMUtil.setElementTextContentWithCDATAPrefix(element, value);
} else {
DOMUtil.setElementTextContent(element, fixedValue);

String fixedValue = SerializationOptions.isEscapeInvalidCharacters(serializationOptions) ?
DOMUtil.escapeInvalidXmlCharsIfPresent(value) : value;
if (asAttribute) {
DOMUtil.setAttributeValue(parentElement, elementOrAttributeName.getLocalPart(), fixedValue);
} else {
DOMUtil.setElementTextContent(element, fixedValue);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,13 @@
public class AxiomQueryCompletionVisitor extends AxiomQueryParserBaseVisitor<Object> {
private final SchemaRegistry schemaRegistry;
private ParseTree lastSeparator = null;
private ParseTree lastType = null;
private QName lastType = null;

public AxiomQueryCompletionVisitor(PrismContext prismContext) {
public AxiomQueryCompletionVisitor(ItemDefinition<?> rootDef, PrismContext prismContext) {
schemaRegistry = prismContext.getSchemaRegistry();
if (rootDef != null) {
lastType = rootDef.getTypeName();
}
}

@Override
Expand All @@ -51,11 +54,12 @@ public Object visitErrorNode(ErrorNode node) {

@Override
public Object visitItemComponent(AxiomQueryParser.ItemComponentContext ctx) {

if (schemaRegistry.findTypeDefinitionByType(new QName(ctx.getText())) != null) {
lastType = ctx;
// FIXME: Is this correct? This is actually also executed for item paths
var maybeQName = new QName(ctx.getText());
var maybeType = schemaRegistry.findTypeDefinitionByType(maybeQName);
if (maybeType != null) {
lastType = maybeType.getTypeName();
}

return super.visitItemComponent(ctx);
}

Expand Down Expand Up @@ -187,8 +191,7 @@ private Map<String, String> getFilters(@NotNull String stringItemPath) {
private QName defineObjectType() {
if (lastType == null) {
return new QName("UserType");
} else {
return new QName(lastType.getText());
}
return lastType;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

import com.evolveum.axiom.lang.antlr.AxiomQueryError;
import com.evolveum.axiom.lang.antlr.AxiomQuerySource;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.query.AxiomQueryLangService;

import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Map;

Expand All @@ -18,20 +21,20 @@ public AxiomQueryLangServiceImpl(PrismContext prismContext) {
this.prismContext = prismContext;
}

public List<AxiomQueryError> validate(String query) {
AxiomQueryValidationVisitor axiomQueryValidationVisitor = new AxiomQueryValidationVisitor(this.prismContext);
public List<AxiomQueryError> validate(@Nullable ItemDefinition<?> rootItem, String query) {
AxiomQueryValidationVisitor axiomQueryValidationVisitor = new AxiomQueryValidationVisitor(rootItem, this.prismContext);
AxiomQuerySource axiomQuerySource = AxiomQuerySource.from(query);
axiomQuerySource.root().accept(axiomQueryValidationVisitor);
axiomQueryValidationVisitor.errorList.addAll(axiomQuerySource.getSyntaxError());
return axiomQueryValidationVisitor.errorList;
}

public Map<String, String> queryCompletion(String query) {
public Map<String, String> queryCompletion(@Nullable ItemDefinition<?> rootItem, String query) {

if (query.isEmpty()) query = " ";

AxiomQuerySource axiomQuerySource = AxiomQuerySource.from(query);
AxiomQueryCompletionVisitor axiomQueryCompletionVisitor = new AxiomQueryCompletionVisitor(this.prismContext);
AxiomQueryCompletionVisitor axiomQueryCompletionVisitor = new AxiomQueryCompletionVisitor(rootItem, this.prismContext);
axiomQueryCompletionVisitor.visit(axiomQuerySource.root());
return axiomQueryCompletionVisitor.generateSuggestion();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.evolveum.midpoint.prism.schema.SchemaRegistry;

import org.antlr.v4.runtime.ParserRuleContext;
import org.jetbrains.annotations.Nullable;

import javax.xml.namespace.QName;
import java.util.ArrayList;
Expand All @@ -24,8 +25,16 @@ public class AxiomQueryValidationVisitor extends AxiomQueryParserBaseVisitor<Obj
private TypeDefinition typeDefinition;
private ItemDefinition<?> itemDefinition;

public AxiomQueryValidationVisitor(PrismContext prismContext) {
public AxiomQueryValidationVisitor(@Nullable ItemDefinition<?> rootItem, PrismContext prismContext) {
schemaRegistry = prismContext.getSchemaRegistry();
if (rootItem != null) {
itemDefinition = rootItem;
}
if (itemDefinition != null && itemDefinition.getTypeName() != null) {


typeDefinition = schemaRegistry.findTypeDefinitionByType(itemDefinition.getTypeName());
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,17 @@ protected ObjectFilter create(QueryParsingContext.Local context, QName matchingR
@Override
protected ObjectFilter create(QueryParsingContext.Local context, QName matchingRule,
SubfilterOrValueContext subfilterOrValue) throws SchemaException {

if (subfilterOrValue.expression() != null) {
var expression = parseExpression(subfilterOrValue.expression());
return InOidFilterImpl.createInOid(false, expression);
}
if (isVariablePath(subfilterOrValue.singleValue())) {
var rightPath = path(context.itemDef(), subfilterOrValue.singleValue().path());
var expression = parseExpression(rightPath);
return InOidFilterImpl.createInOid(false, expression);
}

return InOidFilterImpl.createInOid(requireLiterals(String.class, filterName, subfilterOrValue));
}
})
Expand All @@ -475,6 +486,18 @@ protected ObjectFilter create(QueryParsingContext.Local context, QName matchingR
@Override
protected ObjectFilter create(QueryParsingContext.Local context, QName matchingRule,
SubfilterOrValueContext subfilterOrValue) throws SchemaException {

if (subfilterOrValue.expression() != null) {
var expression = parseExpression(subfilterOrValue.expression());
return InOidFilterImpl.createInOid(true, expression);
}
if (isVariablePath(subfilterOrValue.singleValue())) {
var rightPath = path(context.itemDef(), subfilterOrValue.singleValue().path());
var expression = parseExpression(rightPath);
return InOidFilterImpl.createInOid(true, expression);
}


return InOidFilterImpl.createOwnerHasOidIn(requireLiterals(String.class, filterName, subfilterOrValue));
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@
import java.util.Map;

import com.evolveum.axiom.concepts.Builder;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismNamespaceContext;
import com.evolveum.midpoint.prism.impl.marshaller.QueryConverterImpl;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.PrismQueryExpressionFactory;
import com.evolveum.midpoint.prism.query.PrismQuerySerialization;
import com.evolveum.midpoint.prism.query.PrismQuerySerialization.NotSupportedException;
import com.evolveum.midpoint.prism.query.PrismQuerySerializer;
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;

public class PrismQuerySerializerImpl implements PrismQuerySerializer {

Expand Down Expand Up @@ -56,7 +60,10 @@ public PrismNamespaceContext namespaceContext() {
return prefixes;
}


@Override
public SearchFilterType toSearchFilterType() {
return new SearchFilterType(filterText(), namespaceContext());
}
}


Expand Down

0 comments on commit 0cb60c8

Please sign in to comment.