diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index ecc1a9742d6..3cd7d5e04e1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -44,6 +44,7 @@ import org.w3c.dom.Element; import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; /** * @author lazyman @@ -111,8 +112,9 @@ public T getValue() { // Do the most stupid thing possible. Assume string value. And there will be no definition. value = (T) ((Element)rawElement).getTextContent(); } else if (rawElement instanceof PrimitiveXNode){ - try{ - value = (T) ((PrimitiveXNode) rawElement).getParsedValue(DOMUtil.XSD_STRING); + try { + QName type = rawElement.getTypeQName() != null ? rawElement.getTypeQName() : DOMUtil.XSD_STRING; + value = (T) ((PrimitiveXNode) rawElement).getParsedValueWithoutRecording(type); } catch (SchemaException ex){ throw new IllegalStateException("Cannot fetch value from raw element. " + ex.getMessage(), ex); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java index 7c22c028360..4540b4307ce 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java @@ -98,10 +98,7 @@ private Element serializeInternal(RootXNode rootxnode) throws SchemaException { } XNode subnode = rootxnode.getSubnode(); if (subnode instanceof PrimitiveXNode){ - serializePrimitiveElement((PrimitiveXNode)subnode, topElement, rootElementName); - -// String val = ((PrimitiveXNode) subnode).getStringValue(); -// topElement.setTextContent(val); + serializePrimitiveElementOrAttribute((PrimitiveXNode) subnode, topElement, rootElementName, false); return DOMUtil.getFirstChildElement(topElement); } if (!(subnode instanceof MapXNode)) { @@ -152,9 +149,9 @@ private void serializeSubnode(XNode xsubnode, Element parentElement, QName eleme } else if (xsubnode instanceof PrimitiveXNode) { PrimitiveXNode xprim = (PrimitiveXNode)xsubnode; if (xprim.isAttribute()) { - serializePrimitiveAttribute(xprim, parentElement, elementName); + serializePrimitiveElementOrAttribute(xprim, parentElement, elementName, true); } else { - serializePrimitiveElement(xprim, parentElement, elementName); + serializePrimitiveElementOrAttribute(xprim, parentElement, elementName, false); } } else if (xsubnode instanceof ListXNode) { ListXNode xlist = (ListXNode)xsubnode; @@ -168,99 +165,111 @@ private void serializeSubnode(XNode xsubnode, Element parentElement, QName eleme } } - private void serializePrimitiveAttribute(PrimitiveXNode xprim, Element parentElement, QName attributeName) { - QName typeQName = xprim.getTypeQName(); - if (typeQName == null){ - //TODO FIXME temporary hack..what if the attribute does not have type specified? can we assume that it is sting? - //for now enought -// typeQName = DOMUtil.XSD_STRING; -// xprim.setTypeQName(typeQName); - String value = xprim.getStringValue(); - parentElement.setAttribute(attributeName.getLocalPart(), value); - return; - } - if (typeQName.equals(DOMUtil.XSD_QNAME)) { - QName value = (QName) xprim.getValue(); - try { - DOMUtil.setQNameAttribute(parentElement, attributeName.getLocalPart(), value); - } catch (DOMException e) { - throw new DOMException(e.code, e.getMessage() + "; setting attribute "+attributeName.getLocalPart()+" in element "+DOMUtil.getQName(parentElement)+" to QName value "+value); - } - } else { - String value = xprim.getFormattedValue(); - parentElement.setAttribute(attributeName.getLocalPart(), value); - } - } - public Element serializeXPrimitiveToElement(PrimitiveXNode xprim, QName elementName) throws SchemaException { initialize(); Element parent = DOMUtil.createElement(doc, new QName("fake","fake")); - serializePrimitiveElement(xprim, parent, elementName); + serializePrimitiveElementOrAttribute(xprim, parent, elementName, false); return DOMUtil.getFirstChildElement(parent); } - private void serializePrimitiveElement(PrimitiveXNode xprim, Element parentElement, QName elementName) throws SchemaException { + private void serializePrimitiveElementOrAttribute(PrimitiveXNode xprim, Element parentElement, QName elementOrAttributeName, boolean asAttribute) throws SchemaException { QName typeQName = xprim.getTypeQName(); - if (typeQName == null) { + + // if typeQName is not explicitly specified, we try to determine it from parsed value + // TODO it should be considered whether not to set typeQName when parsing the value! + if (typeQName == null && xprim.isParsed()) { + Object v = xprim.getValue(); + if (v != null) { + typeQName = XsdTypeMapper.toXsdType(v.getClass()); + } + } + + if (typeQName == null) { if (com.evolveum.midpoint.prism.PrismContext.isAllowSchemalessSerialization()) { // We cannot correctly serialize without a type. But this is needed // sometimes. So just default to string String stringValue = xprim.getStringValue(); if (stringValue != null) { - Element element; - try { - element = createElement(elementName); - } catch (DOMException e) { - throw new DOMException(e.code, e.getMessage() + "; creating element "+elementName+" in element "+DOMUtil.getQName(parentElement)); - } - parentElement.appendChild(element); - element.setTextContent(stringValue); + // there's an ugly thing here: if serializing values that are unparsed, and if they + // + if (asAttribute) { + parentElement.setAttribute(elementOrAttributeName.getLocalPart(), stringValue); + } else { + Element element; + try { + element = createElement(elementOrAttributeName); + } catch (DOMException e) { + throw new DOMException(e.code, e.getMessage() + "; creating element "+elementOrAttributeName+" in element "+DOMUtil.getQName(parentElement)); + } + parentElement.appendChild(element); + element.setTextContent(stringValue); + } } + return; } else { - throw new IllegalStateException("No type for primitive element "+elementName+", cannot serialize (schemaless serialization is disabled)"); - } - } else if (typeQName.equals(ItemPath.XSD_TYPE)) { - ItemPath itemPath = (ItemPath)xprim.getValue(); - if (itemPath != null){ - XPathHolder holder = new XPathHolder(itemPath); - Element element = holder.toElement(elementName, parentElement.getOwnerDocument()); - parentElement.appendChild(element); - } - } else { - Element element; - try { - element = createElement(elementName); - } catch (DOMException e) { - throw new DOMException(e.code, e.getMessage() + "; creating element "+elementName+" in element "+DOMUtil.getQName(parentElement)); - } - parentElement.appendChild(element); - - //TODO: refactor after suporting types, qnames and other values without ns declared... - if (xprim.isExplicitTypeDeclaration()) { - if (StringUtils.isBlank(typeQName.getNamespaceURI())) { - typeQName = XsdTypeMapper.determineQNameWithNs(typeQName); - } - if (typeQName != null) { - DOMUtil.setXsiType(element, typeQName); - } + throw new IllegalStateException("No type for primitive element "+elementOrAttributeName+", cannot serialize (schemaless serialization is disabled)"); } - - if (typeQName.equals(DOMUtil.XSD_QNAME)) { - QName value = (QName) xprim.getValue(); - DOMUtil.setQNameValue(element, value); - } else { - String value; - // TODO eliminate this if at all possible ... we should not provide raw value here -// if (xprim.isParsed()) { - value = xprim.getGuessedFormattedValue(); -// } else { -// value = xprim.getStringValue(); -// } - element.setTextContent(value); - } } + + // typeName != null after this point + + if (StringUtils.isBlank(typeQName.getNamespaceURI())) { + typeQName = XsdTypeMapper.determineQNameWithNs(typeQName); + } + + Element element = null; + + if (typeQName.equals(ItemPath.XSD_TYPE)) { + ItemPath itemPath = (ItemPath)xprim.getValue(); + if (itemPath != null) { + if (asAttribute) { + throw new UnsupportedOperationException("Serializing ItemPath as an attribute is not supported yet"); + } + XPathHolder holder = new XPathHolder(itemPath); + element = holder.toElement(elementOrAttributeName, parentElement.getOwnerDocument()); + parentElement.appendChild(element); + } + + } else { + // not an ItemType + + if (!asAttribute) { + try { + element = createElement(elementOrAttributeName); + } catch (DOMException e) { + throw new DOMException(e.code, e.getMessage() + "; creating element "+elementOrAttributeName+" in element "+DOMUtil.getQName(parentElement)); + } + parentElement.appendChild(element); + } + + if (typeQName.equals(DOMUtil.XSD_QNAME)) { + QName value = (QName) xprim.getParsedValueWithoutRecording(typeQName); + if (asAttribute) { + try { + DOMUtil.setQNameAttribute(parentElement, elementOrAttributeName.getLocalPart(), value); + } catch (DOMException e) { + throw new DOMException(e.code, e.getMessage() + "; setting attribute "+elementOrAttributeName.getLocalPart()+" in element "+DOMUtil.getQName(parentElement)+" to QName value "+value); + } + } else { + DOMUtil.setQNameValue(element, value); + } + } else { + // not ItemType nor QName + String value = xprim.getGuessedFormattedValue(); + + if (asAttribute) { + parentElement.setAttribute(elementOrAttributeName.getLocalPart(), value); + } else { + element.setTextContent(value); + } + } + + } + if (!asAttribute && xprim.isExplicitTypeDeclaration()) { + DOMUtil.setXsiType(element, typeQName); + } } - + private void serializeSchema(SchemaXNode xschema, Element parentElement) { Element schemaElement = xschema.getSchemaElement(); if (schemaElement == null){ diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java index 7b7c0db5d1f..3fc620496eb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java @@ -430,7 +430,7 @@ private T unmarshalSearchFilterType(MapXNode xmap, } catch (InstantiationException|IllegalAccessException e) { throw new SystemException("Cannot instantiate " + beanClass + ": " + e.getMessage(), e); } - filterType.parseFromXNode(xmap); + filterType.parseFromXNode(xmap, prismContext); return filterType; } @@ -438,7 +438,7 @@ private MapXNode marshalSearchFilterType(SearchFilterType value) throws SchemaEx if (value == null) { return null; } - return value.serializeToXNode(prismContext); + return value.serializeToXNode(); } private Type getTypeArgument(Type origType, String desc) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java index 90eaecd1f3d..1baab1df301 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java @@ -26,7 +26,6 @@ import com.evolveum.midpoint.prism.query.ExpressionWrapper; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; -import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; @@ -43,7 +42,6 @@ import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismReference; import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.parser.util.XNodeProcessorUtil; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.EqualFilter; @@ -59,7 +57,6 @@ import com.evolveum.midpoint.prism.query.TypeFilter; import com.evolveum.midpoint.prism.query.ValueFilter; import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.prism.xnode.ListXNode; import com.evolveum.midpoint.prism.xnode.MapXNode; @@ -156,7 +153,7 @@ public static ObjectQuery parseQuery(MapXNode xmap, Prism public static ObjectFilter parseFilter(XNode xnode, PrismContext prismContext) throws SchemaException { Validate.notNull(prismContext); MapXNode xmap = toMap(xnode); - return parseFilterContainer(xmap, null, prismContext); + return parseFilterContainer(xmap, null, false, prismContext); } public static ObjectFilter parseFilter(MapXNode xmap, PrismObjectDefinition objDef) throws SchemaException { @@ -164,7 +161,7 @@ public static ObjectFilter parseFilter(MapXNode xmap, Pri if (xmap == null) { return null; } - return parseFilterContainer(xmap, objDef, objDef.getPrismContext()); + return parseFilterContainer(xmap, objDef, false, objDef.getPrismContext()); } public static ObjectFilter parseFilter(SearchFilterType filter, Class clazz, PrismContext prismContext) throws SchemaException { @@ -177,52 +174,52 @@ public static ObjectFilter parseFilter(SearchFilterType f public static ObjectFilter parseFilter(SearchFilterType filter, PrismObjectDefinition objDef) throws SchemaException { Validate.notNull(objDef); - return parseFilter(filter.getFilterClauseXNode(objDef.getPrismContext()), objDef); + return parseFilter(filter.getFilterClauseXNode(), objDef); } // beware, pcd may be null private static ObjectFilter parseFilterContainer(MapXNode xmap, PrismContainerDefinition pcd, - PrismContext prismContext) throws SchemaException { + boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { Validate.notNull(prismContext); Entry entry = xmap.getSingleEntryThatDoesNotMatch(SearchFilterType.F_DESCRIPTION); QName filterQName = entry.getKey(); XNode xsubnode = entry.getValue(); - return parseFilterContainer(xsubnode, filterQName, pcd, prismContext); + return parseFilterContainer(xsubnode, filterQName, pcd, preliminaryParsingOnly, prismContext); } private static ObjectFilter parseFilterContainer(XNode xsubnode, QName filterQName, - PrismContainerDefinition pcd, PrismContext prismContext) throws SchemaException { + PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { if (QNameUtil.match(filterQName, KEY_FILTER_AND)) { - return parseAndFilter(xsubnode, pcd, prismContext); + return parseAndFilter(xsubnode, pcd, preliminaryParsingOnly, prismContext); } if (QNameUtil.match(filterQName, KEY_FILTER_OR)) { - return parseOrFilter(xsubnode, pcd, prismContext); + return parseOrFilter(xsubnode, pcd, preliminaryParsingOnly, prismContext); } if (QNameUtil.match(filterQName, KEY_FILTER_NOT)) { - return parseNotFilter(xsubnode, pcd, prismContext); + return parseNotFilter(xsubnode, pcd, preliminaryParsingOnly, prismContext); } if (QNameUtil.match(filterQName, KEY_FILTER_EQUAL)) { - return parseEqualFilter(xsubnode, pcd, prismContext); + return parseEqualFilter(xsubnode, pcd, preliminaryParsingOnly, prismContext); } if (QNameUtil.match(filterQName, KEY_FILTER_REF)) { - return parseRefFilter(xsubnode, pcd); + return parseRefFilter(xsubnode, pcd, preliminaryParsingOnly, prismContext); } if (QNameUtil.match(filterQName, KEY_FILTER_SUBSTRING)) { - return parseSubstringFilter(xsubnode, pcd, prismContext); + return parseSubstringFilter(xsubnode, pcd, preliminaryParsingOnly, prismContext); } if (QNameUtil.match(filterQName, KEY_FILTER_ORG)) { - return parseOrgFilter(xsubnode, pcd); + return parseOrgFilter(xsubnode, pcd, preliminaryParsingOnly, prismContext); } if (QNameUtil.match(filterQName, KEY_FILTER_TYPE)) { - return parseTypeFilter(xsubnode, pcd); + return parseTypeFilter(xsubnode, pcd, preliminaryParsingOnly, prismContext); } throw new UnsupportedOperationException("Unsupported query filter " + filterQName); @@ -230,52 +227,62 @@ private static ObjectFilter parseFilterContainer(XNode } private static AndFilter parseAndFilter(XNode xnode, PrismContainerDefinition pcd, - PrismContext prismContext) throws SchemaException { + boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { - List subfilters = parseLogicalFilter(xnode, pcd, prismContext); - return AndFilter.createAnd(subfilters); + List subfilters = parseLogicalFilter(xnode, pcd, preliminaryParsingOnly, prismContext); + if (preliminaryParsingOnly) { + return null; + } else { + return AndFilter.createAnd(subfilters); + } } private static List parseLogicalFilter(XNode xnode, - PrismContainerDefinition pcd, PrismContext prismContext) throws SchemaException { + PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { List subfilters = new ArrayList(); MapXNode xmap = toMap(xnode); for (Entry entry : xmap.entrySet()) { if (entry.getValue() instanceof ListXNode){ Iterator subNodes = ((ListXNode) entry.getValue()).iterator(); while (subNodes.hasNext()){ - ObjectFilter subFilter = parseFilterContainer(subNodes.next(), entry.getKey(), pcd, prismContext); - subfilters.add(subFilter); + ObjectFilter subFilter = parseFilterContainer(subNodes.next(), entry.getKey(), pcd, preliminaryParsingOnly, prismContext); + if (!preliminaryParsingOnly) { + subfilters.add(subFilter); + } } } else{ - ObjectFilter subfilter = parseFilterContainer(entry.getValue(), entry.getKey(), pcd, prismContext); - subfilters.add(subfilter); + ObjectFilter subfilter = parseFilterContainer(entry.getValue(), entry.getKey(), pcd, preliminaryParsingOnly, prismContext); + if (!preliminaryParsingOnly) { + subfilters.add(subfilter); + } } } return subfilters; } private static OrFilter parseOrFilter(XNode xnode, PrismContainerDefinition pcd, - PrismContext prismContext) throws SchemaException { - List subfilters = parseLogicalFilter(xnode, pcd, prismContext); -// new ArrayList(); -// MapXNode xmap = toMap(xnode); -// for (Entry entry : xmap.entrySet()) { -// ObjectFilter subfilter = parseFilterContainer(entry.getValue(), entry.getKey(), pcd, prismContext); -// subfilters.add(subfilter); -// } - return OrFilter.createOr(subfilters); + boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { + List subfilters = parseLogicalFilter(xnode, pcd, preliminaryParsingOnly, prismContext); + if (preliminaryParsingOnly) { + return null; + } else { + return OrFilter.createOr(subfilters); + } } private static NotFilter parseNotFilter(XNode xnode, PrismContainerDefinition pcd, - PrismContext prismContext) throws SchemaException { + boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { MapXNode xmap = toMap(xnode); Entry entry = singleSubEntry(xmap, "not"); - ObjectFilter subfilter = parseFilterContainer(entry.getValue(), entry.getKey(), pcd, prismContext); - return NotFilter.createNot(subfilter); + ObjectFilter subfilter = parseFilterContainer(entry.getValue(), entry.getKey(), pcd, preliminaryParsingOnly, prismContext); + if (preliminaryParsingOnly) { + return null; + } else { + return NotFilter.createNot(subfilter); + } } - private static EqualFilter> parseEqualFilter(XNode xnode, PrismContainerDefinition pcd, PrismContext prismContext) throws SchemaException{ + private static EqualFilter> parseEqualFilter(XNode xnode, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ LOGGER.trace("Start to parse EQUALS filter"); MapXNode xmap = toMap(xnode); ItemPath itemPath = getPath(xmap, prismContext); @@ -292,8 +299,6 @@ private static EqualFilter EqualFilter expressionEntry = xmap.getSingleEntryThatDoesNotMatch( KEY_FILTER_EQUAL_VALUE, KEY_FILTER_EQUAL_MATCHING, KEY_FILTER_EQUAL_PATH); if (expressionEntry != null) { - ExpressionWrapper expressionWrapper = new ExpressionWrapper(); PrismPropertyValue expressionPropertyValue = prismContext.getXnodeProcessor().parsePrismPropertyFromGlobalXNodeValue(expressionEntry); - expressionWrapper.setExpression(expressionPropertyValue.getValue()); - return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, expressionWrapper); + if (preliminaryParsingOnly) { + return null; + } else { + ExpressionWrapper expressionWrapper = new ExpressionWrapper(); + expressionWrapper.setExpression(expressionPropertyValue.getValue()); + return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, expressionWrapper); + } } else { - return EqualFilter.createNullEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule); + if (preliminaryParsingOnly) { + return null; + } else { + return EqualFilter.createNullEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule); + } } - } } - private static TypeFilter parseTypeFilter(XNode xnode, PrismContainerDefinition pcd) throws SchemaException{ + private static TypeFilter parseTypeFilter(XNode xnode, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ MapXNode xmap = toMap(xnode); QName type = xmap.getParsedPrimitiveValue(KEY_FILTER_TYPE_TYPE, DOMUtil.XSD_QNAME); XNode subXFilter = xmap.get(KEY_FILTER_TYPE_FILTER); ObjectFilter subFilter = null; - if (subXFilter != null){ - PrismContext prismContext = null; - if (pcd != null && pcd.getPrismContext() != null){ - prismContext = pcd.getPrismContext(); - } + if (subXFilter != null) { subFilter = parseFilter(subXFilter, prismContext); } - - return new TypeFilter(type, subFilter); - + + if (preliminaryParsingOnly) { + return null; + } else { + return new TypeFilter(type, subFilter); + } } - private static RefFilter parseRefFilter(XNode xnode, PrismContainerDefinition pcd) throws SchemaException{ + private static RefFilter parseRefFilter(XNode xnode, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ MapXNode xmap = toMap(xnode); - ItemPath itemPath = getPath(xmap, pcd.getPrismContext()); + ItemPath itemPath = getPath(xmap, prismContext); if (itemPath == null || itemPath.isEmpty()){ throw new SchemaException("Cannot convert query, because query does not contain property path."); @@ -367,7 +383,12 @@ private static RefFilter parseRefFilter(XNode xnode, P XNode valueXnode = xmap.get(KEY_FILTER_EQUAL_VALUE); - Item item = pcd.getPrismContext().getXnodeProcessor().parseItem(valueXnode, itemName, itemDefinition); + Item item = prismContext.getXnodeProcessor().parseItem(valueXnode, itemName, itemDefinition); + + if (preliminaryParsingOnly) { + return null; + } + PrismReference ref = (PrismReference)item; if (item.getValues().size() < 1 ) { @@ -375,12 +396,12 @@ private static RefFilter parseRefFilter(XNode xnode, P } ExpressionWrapper expressionWrapper = null; - // TODO + // TODO implement expressions - don't forget preliminary mode! return RefFilter.createReferenceEqual(itemPath, ref, expressionWrapper); } - private static SubstringFilter parseSubstringFilter(XNode xnode, PrismContainerDefinition pcd, PrismContext prismContext) + private static SubstringFilter parseSubstringFilter(XNode xnode, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { MapXNode xmap = toMap(xnode); ItemPath itemPath = getPath(xmap, pcd.getPrismContext()); @@ -412,15 +433,19 @@ private static SubstringFilter parseSubstringFilter(XN anchorEnd = false; } - return SubstringFilter.createSubstring(itemPath, (PrismProperty) item, matchingRule, anchorStart, anchorEnd); + if (preliminaryParsingOnly) { + return null; + } else { + return SubstringFilter.createSubstring(itemPath, (PrismProperty) item, matchingRule, anchorStart, anchorEnd); + } } - private static OrgFilter parseOrgFilter(XNode xnode, PrismContainerDefinition pcd) throws SchemaException { + private static OrgFilter parseOrgFilter(XNode xnode, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { MapXNode xmap = toMap(xnode); XNode xorgrefnode = xmap.get(KEY_FILTER_ORG_REF); if (xorgrefnode == null) { - throw new SchemaException("No organization refenrence defined in the search query."); + throw new SchemaException("No organization reference defined in the search query."); } MapXNode xorgrefmap = toMap(xorgrefnode); String orgOid = xorgrefmap.getParsedPrimitiveValue(KEY_FILTER_ORG_REF_OID, DOMUtil.XSD_STRING); @@ -456,7 +481,11 @@ private static OrgFilter parseOrgFilter(XNode xnode, P // + ") depth, can't translate it to scope SUBTREE/ONE_LEVEL"); // } - return OrgFilter.createOrg(orgOid, scope); + if (preliminaryParsingOnly) { + return null; + } else { + return OrgFilter.createOrg(orgOid, scope); + } } private static Entry singleSubEntry(MapXNode xmap, String filterName) throws SchemaException { @@ -538,7 +567,7 @@ private static ItemDefinition locateItemDefinition(XNo public static SearchFilterType createSearchFilterType(ObjectFilter filter, PrismContext prismContext) throws SchemaException { MapXNode xnode = serializeFilter(filter, prismContext); - return SearchFilterType.createFromXNode(xnode); + return SearchFilterType.createFromXNode(xnode, prismContext); } public static MapXNode serializeFilter(ObjectFilter filter, PrismContext prismContext) throws SchemaException{ @@ -742,5 +771,15 @@ public static void revive (ObjectFilter filter, final PrismContext prismContext) // } } - + /** + * Tries to parse as much from filter as possible, without knowing the definition of object(s) to which the + * filter will be applied. It is used mainly to parse path specifications, in order to avoid namespace loss + * when serializing raw (unparsed) paths and QNames - see MID-1969. + * + * @param xfilter + * @param prismContext + */ + public static void parseFilterPreliminarily(MapXNode xfilter, PrismContext prismContext) throws SchemaException { + parseFilterContainer(xfilter, null, true, prismContext); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java index 1b200e18f0c..e41be4c35c6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java @@ -789,7 +789,7 @@ private SearchFilterType parseFilter(XNode xnode) throws SchemaException { //System.out.println("Empty filter. Skipping parsing."); return null; } - return SearchFilterType.createFromXNode(xnode); + return SearchFilterType.createFromXNode(xnode, prismContext); } private Class qnameToClass(QName type){ diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeSerializer.java index 2e3348efc84..269b101886b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeSerializer.java @@ -297,7 +297,7 @@ private XNode serializeReferenceValue(PrismReferenceValue value, PrismReferenceD } SearchFilterType filter = value.getFilter(); if (filter != null) { - XNode xsubnode = filter.serializeToXNode(value.getPrismContext()); + XNode xsubnode = filter.serializeToXNode(); xmap.put(createReferenceQName(XNode.KEY_REFERENCE_FILTER, namespace), xsubnode); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java index c3a72787bc3..ffca3cba76f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java @@ -215,13 +215,11 @@ public String toString() { @Override public PrismContext getPrismContext() { - // TODO Auto-generated method stub return getDefinition().getPrismContext(); } @Override public ItemPath getPath() { - // TODO Auto-generated method stub return getFullPath(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/QueryJaxbConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/QueryJaxbConvertor.java index 0ffe700bb52..1e805a407d6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/QueryJaxbConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/QueryJaxbConvertor.java @@ -94,7 +94,7 @@ public static ObjectQuery createObjectQueryInternal(Prism ObjectQuery query = new ObjectQuery(); if (filterNotEmpty) { - MapXNode rootFilter = filterType.getFilterClauseXNode(prismContext); + MapXNode rootFilter = filterType.getFilterClauseXNode(); ObjectFilter filter = QueryConvertor.parseFilter(rootFilter, objDef); query.setFilter(filter); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java index 43a0267ef49..8575ab2e6c2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java @@ -214,7 +214,8 @@ public static void displayQuery(ObjectQuery query) { } } - public static void displayQueryType(QueryType queryType) { - LOGGER.info(DOMUtil.serializeDOMToString(queryType.getFilter().getFilterClause())); + public static void displayQueryType(QueryType queryType) throws SchemaException { + //LOGGER.info(DOMUtil.serializeDOMToString(queryType.getFilter().getFilterClause())); + LOGGER.info(queryType.getFilter().getFilterClauseXNode().debugDump()); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java index 4d853eaa432..b2dd9d2b240 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java @@ -417,77 +417,59 @@ public static PrismReference getReference(PrismContainerValue parent, QName fiel } } - public static void setReferenceFilterElement(PrismReferenceValue rval, Element filterElement) { - DomParser parser = getDomParser(rval); - try { - if (filterElement == null || DOMUtil.isEmpty(filterElement)){ - return; - } - MapXNode filterXNode = parser.parseElementAsMap(filterElement); - SearchFilterType filter = new SearchFilterType(); - filter.parseFromXNode(filterXNode); - rval.setFilter(filter); - } catch (SchemaException e) { - throw new SystemException("Error parsing filter: "+e.getMessage(),e); - } - } +// public static void setReferenceFilterElement(PrismReferenceValue rval, Element filterElement) { +// DomParser parser = getDomParser(rval); +// try { +// if (filterElement == null || DOMUtil.isEmpty(filterElement)){ +// return; +// } +// MapXNode filterXNode = parser.parseElementAsMap(filterElement); +// SearchFilterType filter = new SearchFilterType(); +// filter.parseFromXNode(filterXNode); +// rval.setFilter(filter); +// } catch (SchemaException e) { +// throw new SystemException("Error parsing filter: "+e.getMessage(),e); +// } +// } public static void setReferenceFilterClauseXNode(PrismReferenceValue rval, SearchFilterType filterType) { - if (filterType == null) { - return; - } - MapXNode filterClause = null; - try { - filterClause = filterType.getFilterClauseXNode(rval.getPrismContext()); - } catch (SchemaException e) { - throw new SystemException("Error serializing filter: "+e.getMessage(),e); - } - if (filterClause == null || filterClause.isEmpty()) { - return; + if (filterType != null) { + rval.setFilter(filterType.clone()); + } else { + rval.setFilter(null); } - SearchFilterType filter = new SearchFilterType(); - filter.setFilterClauseXNode((MapXNode) filterClause.clone()); - rval.setFilter(filter); } - public static Element getReferenceFilterElement(PrismReferenceValue rval) { - SearchFilterType filter = rval.getFilter(); - if (filter == null) { - return null; - } - Element filterElement; - PrismContext prismContext = rval.getPrismContext(); - // We have to work even if prismContext is null. This is needed for - // equals and hashcode and similar methods. - DomParser parser = getDomParser(rval); - try { - MapXNode filterXmap = filter.serializeToXNode(prismContext); - if (filterXmap.size() != 1) { - // This is supposed to be a map with just a single entry. This is an internal error - throw new IllegalArgumentException("Unexpected map in filter processing, it has "+filterXmap.size()+" entries"); - } - Entry entry = filterXmap.entrySet().iterator().next(); - filterElement = parser.serializeXMapToElement((MapXNode) entry.getValue(), entry.getKey()); - } catch (SchemaException e) { - throw new SystemException("Error serializing filter: "+e.getMessage(),e); - } - return filterElement; - } +// public static Element getReferenceFilterElement(PrismReferenceValue rval) { +// SearchFilterType filter = rval.getFilter(); +// if (filter == null) { +// return null; +// } +// Element filterElement; +// PrismContext prismContext = rval.getPrismContext(); +// // We have to work even if prismContext is null. This is needed for +// // equals and hashcode and similar methods. +// DomParser parser = getDomParser(rval); +// try { +// MapXNode filterXmap = filter.serializeToXNode(); +// if (filterXmap.size() != 1) { +// // This is supposed to be a map with just a single entry. This is an internal error +// throw new IllegalArgumentException("Unexpected map in filter processing, it has "+filterXmap.size()+" entries"); +// } +// Entry entry = filterXmap.entrySet().iterator().next(); +// filterElement = parser.serializeXMapToElement((MapXNode) entry.getValue(), entry.getKey()); +// } catch (SchemaException e) { +// throw new SystemException("Error serializing filter: "+e.getMessage(),e); +// } +// return filterElement; +// } public static MapXNode getReferenceFilterClauseXNode(PrismReferenceValue rval) { SearchFilterType filter = rval.getFilter(); - PrismContext prismContext = rval.getPrismContext(); - // We have to work even if prismContext is null. This is needed for - // equals and hashcode and similar methods. - if (filter == null || !filter.containsFilterClause()) { return null; } - try { - return (MapXNode) filter.getFilterClauseXNode(prismContext).clone(); - } catch (SchemaException e) { - throw new SystemException("Error serializing filter: "+e.getMessage(),e); - } + return filter.getFilterClauseXNode(); } private static DomParser getDomParser(PrismValue pval) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java index 605a7fd37f0..b93bdf45fbe 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java @@ -107,24 +107,17 @@ public boolean isEmpty() { } /** - * Returns formatted parsed value without actually changing node state from UNPARSED to PARSED + * Returns parsed value without actually changing node state from UNPARSED to PARSED * (if node is originally unparsed). * - * Useful e.g. to serialize nodes that have a type declaration but were not parsed yet. - * - * Experimental. Should be thought through yet. - * - * @return properly formatted value + * Useful when we are not sure about the type name and do not want to record parsed + * value based on wrong type name. */ - public String getGuessedFormattedValue() throws SchemaException { - if (getTypeQName() == null) { - throw new IllegalStateException("Cannot fetch formatted value if type definition is not set"); - } + public T getParsedValueWithoutRecording(QName typeName) throws SchemaException { if (isParsed()) { - return getFormattedValue(); + return value; } else { - T value = valueParser.parse(getTypeQName()); - return formatValue(value); + return valueParser.parse(typeName); } } @@ -133,16 +126,36 @@ public String getGuessedFormattedValue() throws SchemaException { * to its type definition. Works properly only if definition is set. */ public String getFormattedValue() { - if (getTypeQName() == null) { - throw new IllegalStateException("Cannot fetch formatted value if type definition is not set"); - } +// if (getTypeQName() == null) { +// throw new IllegalStateException("Cannot fetch formatted value if type definition is not set"); +// } if (!isParsed()) { throw new IllegalStateException("Cannot fetch formatted value if the xnode is not parsed"); } - T value = getValue(); return formatValue(value); } + /** + * Returns formatted parsed value without actually changing node state from UNPARSED to PARSED + * (if node is originally unparsed). + * + * Useful e.g. to serialize nodes that have a type declaration but were not parsed yet. + * + * Experimental. Should be thought through yet. + * + * @return properly formatted value + */ + public String getGuessedFormattedValue() throws SchemaException { + if (isParsed()) { + return getFormattedValue(); + } + if (getTypeQName() == null) { + throw new IllegalStateException("Cannot fetch formatted value if type definition is not set"); + } + T value = valueParser.parse(getTypeQName()); + return formatValue(value); + } + private String formatValue(T value) { if (value instanceof PolyString) { return ((PolyString) value).getOrig(); diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java index 72d9a65c718..51a3cdb91fc 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java @@ -33,9 +33,7 @@ import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAnyElement; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.datatype.Duration; import javax.xml.datatype.XMLGregorianCalendar; @@ -43,14 +41,9 @@ import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.Revivable; import com.evolveum.midpoint.prism.parser.DomParser; -import com.evolveum.midpoint.prism.parser.PrismBeanConverter; import com.evolveum.midpoint.prism.parser.QueryConvertor; -import com.evolveum.midpoint.prism.parser.XNodeSerializer; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xjc.PrismForJAXBUtil; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.prism.xnode.XNode; @@ -77,16 +70,13 @@ // BTW, the order is the following: description, filterClause }) -public class SearchFilterType implements Serializable, Cloneable, Equals, HashCode, DebugDumpable, Revivable +public class SearchFilterType implements Serializable, Cloneable, Equals, HashCode, DebugDumpable { private final static long serialVersionUID = 201303040000L; @XmlElement protected String description; - // we annotate the getter instead to use it, not accessing directly this field - protected Element filterClause; - // this one is not exposed via JAXB protected MapXNode filterClauseXNode; // single-subnode map node (key = filter element qname, value = contents) @@ -117,8 +107,6 @@ public SearchFilterType(final SearchFilterType o) { if (o == null) { throw new NullPointerException("Cannot create a copy of 'SearchFilterType' from 'null'."); } - // CWildcardTypeInfo: org.w3c.dom.Element - this.filterClause = o.filterClause == null ? null : (Element) o.filterClause.cloneNode(true); this.filterClauseXNode = (MapXNode) o.filterClauseXNode.clone(); } @@ -130,77 +118,42 @@ public void setDescription(String description) { this.description = description; } - /** - * Gets the value of the filter property. JAXB method. Only for JAXB compatibility. Do not use directly. - * - * @return - * possible object is - * {@link Element } - * - */ - @XmlAnyElement - public Element getFilterClause() { - if (filterClauseXNode != null) { - try { - DomParser domParser = PrismUtil.getDomParser(null); - return domParser.serializeSingleElementMapToElement(filterClauseXNode); // TODO: beware, there can be nodes with unparsed values! - } catch (SchemaException e) { - throw new RuntimeException(e.getMessage(), e); - } - } else { - return filterClause; - } - } - public boolean containsFilterClause() { - return filterClause != null || (filterClauseXNode != null && !filterClauseXNode.isEmpty()); + return filterClauseXNode != null && !filterClauseXNode.isEmpty(); } - - /** - * Sets the value of the filter property. JAXB method. Only for JAXB compatibility. Do not use directly. - * - * @param element - * allowed object is - * {@link Element } - * - */ - public void setFilterClause(Element element) { - // This method CANNOT parse the element to filter yet. The element may not be complete - // at this stage. We must do the on-demand parsing instead - this.filterClause = element; - this.filterClauseXNode = null; - } - public void setFilterClauseXNode(MapXNode filterClauseXNode) { this.filterClauseXNode = filterClauseXNode; - filterClause = null; } + @Deprecated // use the version without prismContext instead public MapXNode getFilterClauseXNode(PrismContext prismContext) throws SchemaException { - if (this.filterClause == null && this.filterClauseXNode == null) { + return getFilterClauseXNode(); + } + + public MapXNode getFilterClauseXNode() { + if (this.filterClauseXNode == null) { return null; - } else if (this.filterClause == null) { - return (MapXNode) this.filterClauseXNode.clone(); } else { - DomParser domParser; - if (prismContext != null) { - domParser = prismContext.getParserDom(); - } else { - domParser = PrismUtil.getDomParser(null); - } - return domParser.parseElementAsMap(filterClause); + return (MapXNode) this.filterClauseXNode.clone(); + } + } + + public Element getFilterClauseAsElement() throws SchemaException { + if (filterClauseXNode == null) { + return null; } + DomParser domParser = PrismUtil.getDomParser(null); + return domParser.serializeSingleElementMapToElement(filterClauseXNode); } - public static SearchFilterType createFromXNode(XNode xnode) throws SchemaException { + public static SearchFilterType createFromXNode(XNode xnode, PrismContext prismContext) throws SchemaException { SearchFilterType filter = new SearchFilterType(); - filter.parseFromXNode(xnode); + filter.parseFromXNode(xnode, prismContext); return filter; } - public void parseFromXNode(XNode xnode) throws SchemaException { - this.filterClause = null; + public void parseFromXNode(XNode xnode, PrismContext prismContext) throws SchemaException { if (xnode == null || xnode.isEmpty()) { this.filterClauseXNode = null; this.description = null; @@ -228,12 +181,12 @@ public void parseFromXNode(XNode xnode) throws SchemaException { throw new SchemaException("Filter clause has more than one item: " + xfilter); } this.filterClauseXNode = xfilter; + QueryConvertor.parseFilterPreliminarily(xfilter, prismContext); } } - // beware, prismContext may be null - public MapXNode serializeToXNode(PrismContext prismContext) throws SchemaException { - MapXNode xmap = getFilterClauseXNode(prismContext); + public MapXNode serializeToXNode() throws SchemaException { + MapXNode xmap = getFilterClauseXNode(); if (description == null) { return xmap; } else { @@ -247,15 +200,6 @@ public MapXNode serializeToXNode(PrismContext prismContext) throws SchemaExcepti } } - @Override - public void revive(PrismContext prismContext) throws SchemaException { - if (filterClause != null) { - DomParser domParser = prismContext.getParserDom(); - filterClauseXNode = domParser.parseElementAsMap(filterClause); - filterClause = null; - } - } - /** * Generates a String representation of the contents of this type. * This is an extension method, produced by the 'ts' xjc plugin @@ -269,8 +213,8 @@ public String toString() { public int hashCode(ObjectLocator locator, HashCodeStrategy strategy) { int currentHashCode = 1; { - Element theFilter; - theFilter = this.filterClause; + MapXNode theFilter; + theFilter = this.filterClauseXNode; currentHashCode = strategy.hashCode(LocatorUtils.property(locator, "filter", theFilter), currentHashCode, theFilter); } return currentHashCode; @@ -289,17 +233,7 @@ public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Obje return true; } final SearchFilterType that = ((SearchFilterType) object); - { - Element lhsFilter; - lhsFilter = this.filterClause; - Element rhsFilter; - rhsFilter = that.filterClause; - if (!strategy.equals(LocatorUtils.property(thisLocator, "filter", lhsFilter), LocatorUtils.property(thatLocator, "filter", rhsFilter), lhsFilter, rhsFilter)) { - return false; - } - - } - + if (filterClauseXNode == null) { if (that.filterClauseXNode != null) return false; @@ -710,18 +644,12 @@ private static Serializable copyOf(final Serializable serializable) { */ @Override public SearchFilterType clone() { - try { - { - // CC-XJC Version 2.0 Build 2011-09-16T18:27:24+0000 - final SearchFilterType clone = ((SearchFilterType) super.clone()); - // CWildcardTypeInfo: org.w3c.dom.Element - clone.filterClause = ((this.filterClause == null)?null:((this.filterClause == null)?null:((Element) this.filterClause.cloneNode(true)))); - return clone; - } - } catch (CloneNotSupportedException e) { - // Please report this at https://apps.sourceforge.net/mantisbt/ccxjc/ - throw new AssertionError(e); + final SearchFilterType clone = new SearchFilterType(); + clone.description = this.description; + if (this.filterClauseXNode != null) { + clone.filterClauseXNode = (MapXNode) this.filterClauseXNode.clone(); } + return clone; } @Override @@ -738,15 +666,10 @@ public String debugDump(int indent) { sb.append("\n"); DebugUtil.debugDumpWithLabel(sb, "description", description, indent + 1); } - if (filterClause != null) { - sb.append("\n"); - DebugUtil.debugDumpWithLabel(sb, "filterClause", filterClause.toString(), indent + 1); - } if (filterClauseXNode != null) { sb.append("\n"); DebugUtil.debugDumpWithLabel(sb, "filterClauseXNode", (DebugDumpable) filterClauseXNode, indent + 1); } return sb.toString(); } - } diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java index a830b947b72..f00e3397e5d 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java @@ -36,10 +36,7 @@ public class RawType implements Serializable, Cloneable, Equals, Revivable { */ /** - * Unparsed value. It is set either on RawType instance construction - * or gradually constructed when parsing via JAXB (see ContentList class). - * - * Note that its type QName is coupled with the "type" attribute. + * Unparsed value. It is set on RawType instance construction. */ private XNode xnode; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryConvertors.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryConvertors.java index 548387cf741..13c3fbcd037 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryConvertors.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryConvertors.java @@ -26,6 +26,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.parser.DomParser; +import com.evolveum.midpoint.prism.util.PrismUtil; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Element; @@ -97,8 +99,9 @@ public void testFilterUserNameJaxb() throws Exception { QueryType convertedQueryType = toQueryType(query); System.out.println("Re-converted query type"); System.out.println(convertedQueryType.debugDump()); - - Element filterClauseElement = convertedQueryType.getFilter().getFilterClause(); + + Element filterClauseElement = convertedQueryType.getFilter().getFilterClauseAsElement(); + System.out.println("Serialized filter (JAXB->DOM)"); System.out.println(DOMUtil.serializeDOMToString(filterClauseElement)); @@ -139,7 +142,7 @@ public void testFilterUserAndJaxb() throws Exception { System.out.println(convertedQueryType.debugDump()); SearchFilterType convertedFilterType = convertedQueryType.getFilter(); - MapXNode xFilter = convertedFilterType.serializeToXNode(getPrismContext()); + MapXNode xFilter = convertedFilterType.serializeToXNode(); PrismAsserts.assertSize(xFilter, 1); PrismAsserts.assertSubnode(xFilter, AndFilter.ELEMENT_NAME, MapXNode.class); MapXNode xandmap = (MapXNode) xFilter.get(AndFilter.ELEMENT_NAME); @@ -148,7 +151,7 @@ public void testFilterUserAndJaxb() throws Exception { ListXNode xequalsList = (ListXNode) xandmap.get(EqualFilter.ELEMENT_NAME); PrismAsserts.assertSize(xequalsList, 2); - Element filterClauseElement = convertedFilterType.getFilterClause(); + Element filterClauseElement = convertedFilterType.getFilterClauseAsElement(); System.out.println("Serialized filter (JAXB->DOM)"); System.out.println(DOMUtil.serializeDOMToString(filterClauseElement)); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java index b69919ae3a7..17d23855778 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java @@ -168,14 +168,14 @@ public void visit(ObjectFilter filter) { filter.accept(visitor); } - public static String dump(QueryType query) { + public static String dump(QueryType query) throws SchemaException { if (query == null) { return "null"; } StringBuilder sb = new StringBuilder("Query("); sb.append(query.getDescription()).append("):\n"); - if (query.getFilter() != null && query.getFilter().getFilterClause() != null) - sb.append(DOMUtil.serializeDOMToString(query.getFilter().getFilterClause())); + if (query.getFilter() != null && query.getFilter().containsFilterClause()) + sb.append(DOMUtil.serializeDOMToString(query.getFilter().getFilterClauseAsElement())); else sb.append("(no filter)"); return sb.toString(); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SchemaDebugUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SchemaDebugUtil.java index b064877da9e..7b4471feba1 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SchemaDebugUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SchemaDebugUtil.java @@ -545,26 +545,26 @@ public static String prettyPrint(ObjectListType list) { return sb.toString(); } - public static String prettyPrint(QueryType query) { - - if (query == null) { - return "null"; - } - - SearchFilterType filterType = query.getFilter(); - Element filter = null; - if (filterType != null) { - filter = filterType.getFilterClause(); - } - - StringBuilder sb = new StringBuilder("Query("); - - prettyPrintFilter(sb, filter); - - sb.append(")"); - - return sb.toString(); - } +// public static String prettyPrint(QueryType query) { +// +// if (query == null) { +// return "null"; +// } +// +// SearchFilterType filterType = query.getFilter(); +// Element filter = null; +// if (filterType != null) { +// filter = filterType.getFilterClause(); +// } +// +// StringBuilder sb = new StringBuilder("Query("); +// +// prettyPrintFilter(sb, filter); +// +// sb.append(")"); +// +// return sb.toString(); +// } private static void prettyPrintFilter(StringBuilder sb, Element filter) { diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java index 75be2169ce5..bf1cab24c3a 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java @@ -25,9 +25,14 @@ import java.util.List; import javax.xml.bind.JAXBException; +import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.xnode.MapXNode; +import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.testng.AssertJUnit; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; @@ -143,9 +148,9 @@ public void testUserConstruction() throws JAXBException, SchemaException { // accountRef/account ObjectReferenceType accountRefType = new ObjectReferenceType(); accountRefType.setOid(USER_ACCOUNT_REF_1_OID); - Element filterElement = createFilter(); + MapXNode filterElement = createFilter(); SearchFilterType filter = new SearchFilterType(); - filter.setFilterClause(filterElement); + filter.setFilterClauseXNode(filterElement); accountRefType.setFilter(filter); userType.getLinkRef().add(accountRefType); @@ -211,9 +216,9 @@ public void testUserConstructionBeforeAdopt() throws Exception { ObjectReferenceType accountRefType = new ObjectReferenceType(); accountRefType.setOid(USER_ACCOUNT_REF_1_OID); - Element filterElement = createFilter(); + MapXNode filterElement = createFilter(); SearchFilterType filter = new SearchFilterType(); - filter.setFilterClause(filterElement); + filter.setFilterClauseXNode(filterElement); accountRefType.setFilter(filter); userType.getLinkRef().add(accountRefType); @@ -529,17 +534,17 @@ private void checkExtension(ExtensionType extension, String sourceDescription) t stringProperty.setRealValue("fifteen men on a dead man chest"); } - private Element createFilter(){ - Document doc = DOMUtil.getDocument(); - Element filterElement = doc.createElementNS(SchemaConstantsGenerated.NS_QUERY, "equal"); - Element path = doc.createElementNS(SchemaConstantsGenerated.NS_QUERY, "path"); - path.setTextContent("name"); - filterElement.appendChild(path); - - Element value = doc.createElementNS(SchemaConstantsGenerated.NS_QUERY, "value"); - path.setTextContent("čučoriedka"); - filterElement.appendChild(value); - return filterElement; + private MapXNode createFilter(){ + + MapXNode filter = new MapXNode(); + MapXNode equalsElement = (MapXNode) filter.put(new QName(SchemaConstantsGenerated.NS_QUERY, "equal"), new MapXNode()); + + PrimitiveXNode pathElement = new PrimitiveXNode<>(new ItemPathType(new ItemPath(new QName("name")))); + equalsElement.put(new QName(SchemaConstantsGenerated.NS_QUERY, "path"), pathElement); + + PrimitiveXNode valueElement = new PrimitiveXNode<>("čučoriedka"); + equalsElement.put(new QName(SchemaConstantsGenerated.NS_QUERY, "value"), valueElement); + return filter; } } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java index e39f90f8f0b..d488ad34c4c 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java @@ -24,12 +24,17 @@ import com.evolveum.midpoint.prism.parser.DomParser; import com.evolveum.midpoint.prism.parser.QueryConvertor; import com.evolveum.midpoint.prism.parser.XNodeProcessor; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.path.ItemPathSegment; +import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ExpressionWrapper; import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.JaxbTestUtil; import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.schema.constants.MidPointConstants; @@ -54,6 +59,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.XmlSchemaType; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.RawType; import com.evolveum.prism.xml.ns._public.types_3.SchemaDefinitionType; @@ -381,6 +387,9 @@ private void assertResource(PrismObject resource, boolean checkCon } private void assertResourcePrism(PrismObject resource, boolean isSimple) throws SchemaException { + + PrismContext prismContext = PrismTestUtil.getPrismContext(); + assertEquals("Wrong oid (prism)", RESOURCE_OID, resource.getOid()); // assertEquals("Wrong version", "42", resource.getVersion()); PrismObjectDefinition resourceDefinition = resource.getDefinition(); @@ -406,8 +415,17 @@ private void assertResourcePrism(PrismObject resource, boolean isS assertEquals("Wrong type in connectorRef value", ConnectorType.COMPLEX_TYPE, connectorRefVal.getTargetType()); SearchFilterType filter = connectorRefVal.getFilter(); assertNotNull("No filter in connectorRef value", filter); - - PrismContainer configurationContainer = resource.findContainer(ResourceType.F_CONNECTOR_CONFIGURATION); + if (!isSimple) { + ObjectFilter objectFilter = QueryConvertor.parseFilter(filter, ConnectorType.class, prismContext); + assertTrue("Wrong kind of filter: " + objectFilter, objectFilter instanceof EqualFilter); + EqualFilter equalFilter = (EqualFilter) objectFilter; + ItemPath path = equalFilter.getPath(); // should be extension/x:extConnType + assertPathEquals("Wrong filter path", new ItemPath(new QName("extension"), new QName("http://x/", "extConnType")), path); + PrismPropertyValue filterValue = (PrismPropertyValue) equalFilter.getValues().get(0); + assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((String) filterValue.getValue()).trim()); + } + + PrismContainer configurationContainer = resource.findContainer(ResourceType.F_CONNECTOR_CONFIGURATION); assertContainerDefinition(configurationContainer, "configuration", ConnectorConfigurationType.COMPLEX_TYPE, 1, 1); PrismContainerValue configContainerValue = configurationContainer.getValue(); List> configItems = configContainerValue.getItems(); @@ -445,22 +463,47 @@ private void assertResourcePrism(PrismObject resource, boolean isS System.out.println("\nCorrelation filter"); System.out.println(correlationFilterType.debugDump()); - PrismContext prismContext = PrismTestUtil.getPrismContext(); - - ObjectFilter objectFilter = QueryConvertor.parseFilter(correlationFilterType.serializeToXNode(prismContext), prismContext); + ObjectFilter objectFilter = QueryConvertor.parseFilter(correlationFilterType.serializeToXNode(), prismContext); PrismAsserts.assertAssignableFrom(EqualFilter.class, objectFilter); EqualFilter equalsFilter = (EqualFilter)objectFilter; equalsFilter.getFullPath(); assertNull("Unexpected values in correlation expression", equalsFilter.getValues()); ExpressionWrapper expression = equalsFilter.getExpression(); assertNotNull("No expressions in correlation expression", expression); + + ExpressionType expressionType = (ExpressionType) expression.getExpression(); + assertEquals("Wrong number of expression evaluators in correlation expression", 1, expressionType.getExpressionEvaluator().size()); + ItemPathType itemPathType = (ItemPathType) expressionType.getExpressionEvaluator().get(0).getValue(); + // $account/c:attributes/my:yyy + assertPathEquals("path in correlation expression", + new ItemPath( + new NameItemPathSegment(new QName("account"), true), + new NameItemPathSegment(new QName(SchemaConstantsGenerated.NS_COMMON, "attributes")), + new NameItemPathSegment(new QName("http://myself.me/schemas/whatever", "yyy")) + ), itemPathType.getItemPath()); //PrismAsserts.assertAllParsedNodes(expression); // TODO } } - - private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) { + + + // quite strict version of path comparison + private void assertPathEquals(String message, ItemPath expected, ItemPath actual) { + assertEquals(message + ": wrong path size", expected.size(), actual.size()); + for (int i = 0; i < expected.size(); i++) { + ItemPathSegment expectedSegment = expected.getSegments().get(i); + ItemPathSegment actualSegment = actual.getSegments().get(i); + assertEquals(message + ": wrong path segment", expectedSegment, actualSegment); + if (expectedSegment instanceof NameItemPathSegment) { + // default equals uses QNameUtil.match, not QName.equals + assertEquals(message + ": wrong path segment #" + (i+1) + " content", ((NameItemPathSegment) expectedSegment).getName(), + ((NameItemPathSegment) actualSegment).getName()); // maybe this is too strict (compares prefixes as well) + } + } + } + + private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) throws SchemaException { assertEquals("Wrong oid (JAXB)", RESOURCE_OID, resourceType.getOid()); assertEquals("Wrong name (JAXB)", PrismTestUtil.createPolyStringType("Embedded Test OpenDJ"), resourceType.getName()); String expectedNamespace = RESOURCE_NAMESPACE; @@ -474,7 +517,7 @@ private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) { assertEquals("Wrong type in connectorRef (JAXB)", ConnectorType.COMPLEX_TYPE, connectorRef.getType()); SearchFilterType filter = connectorRef.getFilter(); assertNotNull("No filter in connectorRef (JAXB)", filter); - Element filterElement = filter.getFilterClause(); + MapXNode filterElement = filter.getFilterClauseXNode(); assertNotNull("No filter element in connectorRef (JAXB)", filterElement); XmlSchemaType xmlSchemaType = resourceType.getSchema(); @@ -495,20 +538,33 @@ private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) { String name = accountType.getIntent(); assertNotNull("Account type without a name", name); assertNotNull("Account type "+name+" does not have an objectClass", accountType.getObjectClass()); - boolean found = false; + boolean foundDescription = false; + boolean foundDepartmentNumber = false; for (ResourceAttributeDefinitionType attributeDefinitionType : accountType.getAttribute()) { if ("description".equals(attributeDefinitionType.getRef().getLocalPart())) { - found = true; + foundDescription = true; MappingType outbound = attributeDefinitionType.getOutbound(); JAXBElement valueEvaluator = outbound.getExpression().getExpressionEvaluator().get(0); - System.out.println("value evaluator = " + valueEvaluator); - assertNotNull("no expression evaluator", valueEvaluator); - assertEquals("wrong expression evaluator element name", SchemaConstantsGenerated.C_VALUE, valueEvaluator.getName()); - //assertEquals("wrong expression evaluator declared type", RawType.class, valueEvaluator.getDeclaredType()); - assertEquals("wrong expression evaluator actual type", RawType.class, valueEvaluator.getValue().getClass()); + System.out.println("value evaluator for description = " + valueEvaluator); + assertNotNull("no expression evaluator for description", valueEvaluator); + assertEquals("wrong expression evaluator element name for description", SchemaConstantsGenerated.C_VALUE, valueEvaluator.getName()); + assertEquals("wrong expression evaluator actual type for description", RawType.class, valueEvaluator.getValue().getClass()); + } else if ("departmentNumber".equals(attributeDefinitionType.getRef().getLocalPart())) { + foundDepartmentNumber = true; + MappingType outbound = attributeDefinitionType.getOutbound(); + MappingSourceDeclarationType source = outbound.getSource().get(0); + System.out.println("source for departmentNumber = " + source); + assertNotNull("no source for outbound mapping for departmentNumber", source); + //$user/extension/z:dept + ItemPath expected = new ItemPath( + new NameItemPathSegment(new QName("user"), true), + new NameItemPathSegment(new QName("extension")), + new NameItemPathSegment(new QName("http://z/", "dept"))); + assertPathEquals("source for departmentNubmer", expected, source.getPath().getItemPath()); } } - assertTrue("ri:description attribute was not found", found); + assertTrue("ri:description attribute was not found", foundDescription); + assertTrue("ri:departmentNumber attribute was not found", foundDepartmentNumber); } // checking element in fetch result diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java index 6ed415401ed..a27c6678246 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java @@ -26,6 +26,9 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.parser.DomParser; +import com.evolveum.midpoint.prism.util.PrismUtil; +import com.evolveum.midpoint.prism.xnode.MapXNode; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Element; @@ -178,7 +181,7 @@ public void testParseUserRoundTrip() throws Exception{ } - void assertUser(PrismObject user) { + void assertUser(PrismObject user) throws SchemaException { user.checkConsistence(); assertUserPrism(user); assertUserJaxb(user.asObjectable()); @@ -277,7 +280,7 @@ private void assertFilter(String message, SearchFilterType filter) { assertNotNull("No "+message+" filter", filter); } - private void assertUserJaxb(UserType userType) { + private void assertUserJaxb(UserType userType) throws SchemaException { assertEquals("Wrong name", PrismTestUtil.createPolyStringType("jack"), userType.getName()); assertEquals("Wrong fullName (orig)", "Jack Sparrow", userType.getFullName().getOrig()); assertEquals("Wrong fullName (norm)", "jack sparrow", userType.getFullName().getNorm()); @@ -307,7 +310,7 @@ private void assertUserJaxb(UserType userType) { assertEquals("Wrong ref3 type (jaxb)", ShadowType.COMPLEX_TYPE, ref3.getType()); SearchFilterType ref3Filter = ref3.getFilter(); assertNotNull("No ref3 filter (jaxb,class)", ref3Filter); - assertFilterElement("ref filter (jaxb)", ref3Filter.getFilterClause()); + assertFilterElement("ref filter (jaxb)", ref3Filter.getFilterClauseAsElement()); } private void assertPropertyDefinition(PrismContainer container, String propName, QName xsdType, int minOccurs, diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java index cef21cd8dbf..4cb1e6c518e 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java @@ -25,8 +25,10 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.parser.DomParser; import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.prism.util.PrismUtil; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Element; @@ -130,7 +132,7 @@ public void testAccountFilter() throws Exception { System.out.println(convertedQueryType.debugDump()); SearchFilterType convertedFilterType = convertedQueryType.getFilter(); - MapXNode xFilter = convertedFilterType.serializeToXNode(getPrismContext()); + MapXNode xFilter = convertedFilterType.serializeToXNode(); PrismAsserts.assertSize(xFilter, 1); PrismAsserts.assertSubnode(xFilter, AndFilter.ELEMENT_NAME, MapXNode.class); MapXNode xandmap = (MapXNode) xFilter.get(AndFilter.ELEMENT_NAME); @@ -139,7 +141,7 @@ public void testAccountFilter() throws Exception { ListXNode xequalsList = (ListXNode) xandmap.get(EqualFilter.ELEMENT_NAME); PrismAsserts.assertSize(xequalsList, 2); - Element filterClauseElement = convertedFilterType.getFilterClause(); + Element filterClauseElement = convertedFilterType.getFilterClauseAsElement(); System.out.println("Serialized filter (JAXB->DOM)"); System.out.println(DOMUtil.serializeDOMToString(filterClauseElement)); @@ -157,7 +159,7 @@ public void testAccountFilter() throws Exception { DomAsserts.assertTextContent(secondValueElement, "someName"); } - @Test + @Test public void testAccountQueryAttributesAndResource() throws Exception { displayTestTitle("testAccountQueryAttributesAndResource"); @@ -181,7 +183,7 @@ public void testAccountQueryAttributesAndResource() throws Exception { PrismAsserts.assertEqualsFilterValue((EqualFilter) second, "uid=jbond,ou=People,dc=example,dc=com"); QueryType convertedQueryType = toQueryType(query); - LOGGER.info(DOMUtil.serializeDOMToString(convertedQueryType.getFilter().getFilterClause())); + LOGGER.info(DOMUtil.serializeDOMToString(convertedQueryType.getFilter().getFilterClauseAsElement())); // TODO: add some asserts } @@ -219,7 +221,7 @@ public void testAccountQueryCompositeOr() throws Exception { assertRefFilterValue((RefFilter) forth, "d0db5be9-cb93-401f-b6c1-86ffffe4cd5e"); QueryType convertedQueryType = toQueryType(query); - LOGGER.info(DOMUtil.serializeDOMToString(convertedQueryType.getFilter().getFilterClause())); + LOGGER.info(DOMUtil.serializeDOMToString(convertedQueryType.getFilter().getFilterClauseAsElement())); // TODO: add some asserts } @@ -370,7 +372,7 @@ public void testUserQuery() throws Exception { System.out.println("QUERY Pretty print: " + query.toString()); QueryType convertedQueryType = QueryJaxbConvertor.createQueryType(query, getPrismContext()); - LOGGER.info(DOMUtil.serializeDOMToString(convertedQueryType.getFilter().getFilterClause())); + LOGGER.info(DOMUtil.serializeDOMToString(convertedQueryType.getFilter().getFilterClauseAsElement())); } catch (SchemaException ex) { LOGGER.error("Error while converting query: {}", ex.getMessage(), ex); throw ex; diff --git a/infra/schema/src/test/resources/common/resource-opendj.xml b/infra/schema/src/test/resources/common/resource-opendj.xml index 9c207774057..0121a4cd71d 100644 --- a/infra/schema/src/test/resources/common/resource-opendj.xml +++ b/infra/schema/src/test/resources/common/resource-opendj.xml @@ -58,7 +58,7 @@ ...a filter description... - connectorType + extension/x:extConnType org.identityconnectors.ldap.LdapConnector @@ -516,7 +516,7 @@ This is now the only account type that midPoint can work with. --> true - $user/organizationalUnit + $user/extension/z:dept @@ -623,22 +623,14 @@ This is now the only account type that midPoint can work with. --> --> - Correlation expression is a search query. - Following search queury will look for users that have "name" - equal to the "uid" attribute of the account. Simply speaking, - it will look for match in usernames in the IDM and the resource. - The correlation rule always looks for users, so it will not match - any other object type. + ... c:name - - + + + $account/c:attributes/my:yyy + diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandlerImplTest.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandlerImplTest.java index 2d43e2c4d84..2ef6bbe83ea 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandlerImplTest.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandlerImplTest.java @@ -114,7 +114,7 @@ public void testEvaluateExpression() throws Exception { ObjectSynchronizationType synchronization = resourceType.getSynchronization().getObjectSynchronization().get(0); for (ConditionalSearchFilterType filter : synchronization.getCorrelation()){ - MapXNode clauseXNode = filter.getFilterClauseXNode(PrismTestUtil.getPrismContext()); + MapXNode clauseXNode = filter.getFilterClauseXNode(); // key = q:equal, value = map (path + expression) XNode expressionNode = ((MapXNode) clauseXNode.getSingleSubEntry("filter value").getValue()).get(new QName(SchemaConstants.NS_C, "expression")); diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/ModelClientUtil.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/ModelClientUtil.java index 0d817c90df8..dc554ae7da2 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/ModelClientUtil.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/ModelClientUtil.java @@ -89,12 +89,12 @@ public static ItemPathType createItemPathType(String stringPath) { return itemPathType; } - public static SearchFilterType parseSearchFilterType(String filterClauseAsXml) throws IOException, SAXException { - Element filterClauseAsElement = parseElement(filterClauseAsXml); - SearchFilterType searchFilterType = new SearchFilterType(); - searchFilterType.setFilterClause(filterClauseAsElement); - return searchFilterType; - } +// public static SearchFilterType parseSearchFilterType(String filterClauseAsXml) throws IOException, SAXException { +// Element filterClauseAsElement = parseElement(filterClauseAsXml); +// SearchFilterType searchFilterType = new SearchFilterType(); +// searchFilterType.setFilterClause(filterClauseAsElement); +// return searchFilterType; +// } public static PolyStringType createPolyStringType(String string, Document doc) { PolyStringType polyStringType = new PolyStringType(); diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java index 11f76948a75..491e9cb8974 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java @@ -554,7 +554,7 @@ private void checkOpenDjResource(ResourceType resource, String source) throws Sc assertFalse("Resource from " + source + " has no OID in connectorRef", StringUtils.isBlank(connectorRefType.getOid())); assertNotNull("Resource from " + source + " has null description in connectorRef", connectorRefType.getDescription()); assertNotNull("Resource from " + source + " has null filter in connectorRef", connectorRefType.getFilter()); - assertNotNull("Resource from " + source + " has null filter element in connectorRef", connectorRefType.getFilter().getFilterClause()); + assertNotNull("Resource from " + source + " has null filter element in connectorRef", connectorRefType.getFilter().getFilterClauseXNode()); assertNotNull("Resource from " + source + " has null configuration", resource.getConnectorConfiguration()); assertNotNull("Resource from " + source + " has null schema", resource.getSchema()); checkOpenDjSchema(resource, source);