[midPoint] Search filters in IDM Model WS Interface
Pavol Mederly
mederly at evolveum.com
Thu Nov 5 21:01:58 CET 2015
Hello Samu,
because midPoint uses multiple formats for data serialization (XML,
JSON, YAML - although the support for latter two is not fully finished
yet), we don't rely on JAXB any more. We treat some data structures
(mainly in the prism module) in quite a custom way. This causes some
slight issues when trying to cooperate with JAXB serialization, namely,
when interfacing via Web Services.
So, to answer your questions: The weird setFilterClause method and its
"Element" parameter is one of these issues.
One of the methods how to create queries can be seen in the
model-client-sample:
// WARNING: in a real case make sure that the username is properly
escaped before putting it in XML SearchFilterType filter =
ModelClientUtil.parseSearchFilterType( "<equal
xmlns='http://prism.evolveum.com/xml/ns/public/query-3'
xmlns:c='http://midpoint.evolveum.com/xml/ns/public/common/common-3' >"
+ "<path>c:name</path>" + "<value>" + username + "</value>" + "</equal>"
); QueryType query = new QueryType(); query.setFilter(filter);
I tried to take your sample and make it working - it can be done in the
following way:
QueryType query = new QueryType(); SearchFilterType filter = new
SearchFilterType(); PropertyComplexValueFilterClauseType fc = new
PropertyComplexValueFilterClauseType(); ItemPathType path = new
ItemPathType(); path.setValue("declare namespace
c=\"http://midpoint.evolveum.com/xml/ns/public/common/common-3\";
c:name"); fc.setPath(path); fc.setValue(username); ObjectFactory factory
= new ObjectFactory(); JAXBElement<PropertyComplexValueFilterClauseType>
equal = factory.createEqual(fc); JAXBContext jaxbContext =
JAXBContext.newInstance("com.evolveum.midpoint.xml.ns._public.common.api_types_3:"
+ "com.evolveum.midpoint.xml.ns._public.common.common_3:" +
"com.evolveum.prism.xml.ns._public.annotation_3:" +
"com.evolveum.prism.xml.ns._public.query_3:" +
"com.evolveum.prism.xml.ns._public.types_3:"); Marshaller marshaller =
jaxbContext.createMarshaller(); DOMResult result = new DOMResult();
marshaller.marshal(equal, result); filter.setFilterClause(((Document)
result.getNode()).getDocumentElement()); query.setFilter(filter);
(Of course, you can pre-create and cache jaxbContext or marshaller in
order to avoid creating them each time.)
Best regards,
Pavol
On 3. 11. 2015 16:12, Samu Viitanen wrote:
> Afternoon,
>
> I am having issues with the following code
>
> QueryType query = new QueryType();
>
> ObjectFactory factory = new ObjectFactory();
>
> SearchFilterType filter = factory.createSearchFilterType();
> PropertyComplexValueFilterClauseType fc =
> factory.createPropertyComplexValueFilterClauseType();
> ItemPathType path = new ItemPathType();
> path.setValue("c:name");
> fc.setPath(path);
> fc.setValue("queryvalue");
> filter.setFilterClause(??????);
>
> query.setFilter(filter);
>
> I noticed that SearchFilterType.setFilterClause only accepts
> org.w3c.dom.Element as a parameter. Is this intentional? If so, are
> there tools to create these dom elements? I was just wondering since
> there are plenty of ways to create the filter clauses, but I just dont
> seem to get my head around how I could actually set the filter clause.
>
> Sorry for the stupid question.
>
> BR
>
> Samu Viitanen
>
>
> _______________________________________________
> midPoint mailing list
> midPoint at lists.evolveum.com
> http://lists.evolveum.com/mailman/listinfo/midpoint
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.evolveum.com/pipermail/midpoint/attachments/20151105/78d553ba/attachment.htm>
More information about the midPoint
mailing list