/*
* Copyright (c) 2010-2014 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.prism.query;
import javax.xml.namespace.QName;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.marshaller.QueryConvertor;
import com.evolveum.midpoint.prism.xnode.MapXNode;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.prism.xml.ns._public.query_3.PagingType;
import com.evolveum.prism.xml.ns._public.query_3.QueryType;
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;
/**
* This is mostly legacy converter between JAXB/DOM representation of queries and filter and the native prism
* representation. It is used only by the code that has to deal with JAXB/DOM (such as JAX-WS web service).
*
* @author Katka Valalikova
* @author Radovan Semancik
*
*/
public class QueryJaxbConvertor {
public static ObjectQuery createTypeObjectQuery(QueryType queryType, PrismContext prismContext) throws SchemaException{
if (queryType == null){
return null;
}
if (queryType.getFilter() == null){
return null;
}
if (queryType.getFilter().containsFilterClause()){
MapXNode mapXnode = queryType.getFilter().getFilterClauseXNode();
QName type = mapXnode.getParsedPrimitiveValue(QueryConvertor.ELEMENT_TYPE, DOMUtil.XSD_QNAME);
if (type == null){
throw new SchemaException("Query does not countain type filter. Cannot by parse.");
}
Class clazz = prismContext.getSchemaRegistry().determineCompileTimeClass(type);
if (clazz == null){
PrismObjectDefinition objDef = prismContext.getSchemaRegistry().findObjectDefinitionByType(type);
if (objDef != null){
clazz = objDef.getCompileTimeClass();
}
}
if (clazz == null){
throw new SchemaException("Type defined in query is not valid. " + type);
}
return createObjectQuery(clazz, queryType, prismContext);
}
return null;
}
public static <O extends Objectable> ObjectQuery createObjectQuery(Class<O> clazz, QueryType queryType, PrismContext prismContext)
throws SchemaException {
if (queryType == null) {
return null;
}
return createObjectQueryInternal(clazz, queryType.getFilter(), queryType.getPaging(), prismContext);
}
public static <O extends Objectable> ObjectQuery createObjectQuery(Class<O> clazz, SearchFilterType filterType, PrismContext prismContext)
throws SchemaException {
return createObjectQueryInternal(clazz, filterType, null, prismContext);
}
public static <O extends Objectable> ObjectFilter createObjectFilter(Class<O> clazz, SearchFilterType filterType, PrismContext prismContext)
throws SchemaException {
ObjectQuery query = createObjectQueryInternal(clazz, filterType, null, prismContext);
if (query == null) {
return null;
} else {
return query.getFilter();
}
}
public static <O extends Objectable> ObjectFilter createObjectFilter(PrismObjectDefinition<O> objectDefinition, SearchFilterType filterType, PrismContext prismContext)
throws SchemaException {
ObjectQuery query = createObjectQueryInternal(objectDefinition, filterType, null, prismContext);
if (query == null) {
return null;
} else {
return query.getFilter();
}
}
public static <O extends Containerable> ObjectQuery createObjectQueryInternal(Class<O> clazz, SearchFilterType filterType, PagingType pagingType, PrismContext prismContext)
throws SchemaException {
PrismContainerDefinition<O> objDef = prismContext.getSchemaRegistry().findContainerDefinitionByCompileTimeClass(clazz);
if (objDef == null) {
throw new SchemaException("cannot find obj/container definition for class "+clazz);
}
return createObjectQueryInternal(objDef, filterType, pagingType, prismContext);
}
public static <O extends Containerable> ObjectQuery createObjectQueryInternal(PrismContainerDefinition<O> objDef, SearchFilterType filterType, PagingType pagingType, PrismContext prismContext)
throws SchemaException {
try {
ObjectQuery query = new ObjectQuery();
if (filterType != null && filterType.containsFilterClause()) {
MapXNode rootFilter = filterType.getFilterClauseXNode();
ObjectFilter filter = QueryConvertor.parseFilter(rootFilter, objDef);
query.setFilter(filter);
}
if (pagingType != null) {
ObjectPaging paging = PagingConvertor.createObjectPaging(pagingType);
query.setPaging(paging);
}
return query;
} catch (SchemaException ex) {
throw new SchemaException("Failed to convert query. Reason: " + ex.getMessage(), ex);
}
}
public static QueryType createQueryType(ObjectQuery query, PrismContext prismContext) throws SchemaException{
ObjectFilter filter = query.getFilter();
QueryType queryType = new QueryType();
if (filter != null){
SearchFilterType filterType = new SearchFilterType();
MapXNode filterXNode = QueryConvertor.serializeFilter(filter, prismContext);
filterType.setFilterClauseXNode(filterXNode);
queryType.setFilter(filterType);
}
queryType.setPaging(PagingConvertor.createPagingType(query.getPaging()));
return queryType;
}
}