package com.evolveum.midpoint.report.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import javax.xml.namespace.QName;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainerValue;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRDataset;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRValueParameter;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.fill.JRFillParameter;
import com.evolveum.midpoint.audit.api.AuditEventRecord;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.report.api.ReportService;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.util.exception.CommunicationException;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.ExpressionEvaluationException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
public class MidPointLocalQueryExecutor extends MidPointQueryExecutor{
private static final Trace LOGGER = TraceManager.getTrace(MidPointLocalQueryExecutor.class);
private ObjectQuery query;
private String script;
private Class type;
private ReportService reportService;
public MidPointLocalQueryExecutor(JasperReportsContext jasperReportsContext, JRDataset dataset,
Map<String, ? extends JRValueParameter> parametersMap, ReportService reportService){
super(jasperReportsContext, dataset, parametersMap);
}
protected MidPointLocalQueryExecutor(JasperReportsContext jasperReportsContext, JRDataset dataset,
Map<String, ? extends JRValueParameter> parametersMap) {
super(jasperReportsContext, dataset, parametersMap);
//JRFillParameter fillparam = (JRFillParameter) parametersMap.get(JRParameter.REPORT_PARAMETERS_MAP);
//Map reportParams = (Map) fillparam.getValue();
reportService = (ReportService) parametersMap.get(ReportService.PARAMETER_REPORT_SERVICE).getValue();
parseQuery();
}
@Override
protected Object getParsedQuery(String query, Map<QName, Object> expressionParameters) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException {
return reportService.parseQuery(query, expressionParameters);
}
@Override
protected Collection<PrismObject<? extends ObjectType>> searchObjects(Object query, Collection<SelectorOptions<GetOperationOptions>> options) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException{
return reportService.searchObjects((ObjectQuery) query, SelectorOptions.createCollection(GetOperationOptions.createRaw()));
}
@Override
protected Collection<PrismContainerValue<? extends Containerable>>
evaluateScript(String script,
Map<QName, Object> parameters) throws SchemaException, ObjectNotFoundException,
SecurityViolationException, CommunicationException, ConfigurationException,
ExpressionEvaluationException {
return reportService.evaluateScript(script, getParameters());
}
@Override
protected Collection<AuditEventRecord> searchAuditRecords(String script, Map<QName, Object> parameters) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException {
return reportService.evaluateAuditScript(script, parameters);
}
@Override
protected JRDataSource createDataSourceFromObjects(Collection<PrismObject<? extends ObjectType>> results) {
return new MidPointDataSource(toPcvList(results));
}
private Collection<PrismContainerValue<? extends Containerable>> toPcvList(Collection<PrismObject<? extends ObjectType>> objects) {
ArrayList<PrismContainerValue<? extends Containerable>> pcvList = new ArrayList<>(objects.size());
for (PrismObject object : objects) {
pcvList.add(object.asObjectable().asPrismContainerValue());
}
return pcvList;
}
@Override
protected JRDataSource createDataSourceFromContainerValues(Collection<PrismContainerValue<? extends Containerable>> results) {
return new MidPointDataSource(results);
}
public String getScript() {
return script;
}
public ObjectQuery getQuery() {
return query;
}
public Class getType() {
return type;
}
// private Object getObjectQueryFromParameters(){
// JRParameter[] params = dataset.getParameters();
// Map<QName, Object> expressionParameters = new HashMap<QName, Object>();
// for (JRParameter param : params){
// if ("finalQuery".equals(param.getName())){
// return getParameterValue(param.getName());
// }
// }
// return null;
// }
//
// private Map<QName, Object> getParameters(){
// JRParameter[] params = dataset.getParameters();
// Map<QName, Object> expressionParameters = new HashMap<QName, Object>();
// for (JRParameter param : params){
// LOGGER.trace(((JRBaseParameter)param).getName());
// Object v = getParameterValue(param.getName());
// try{
// expressionParameters.put(new QName(param.getName()), new PrismPropertyValue(v));
// } catch (Exception e){
// //just skip properties that are not important for midpoint
// }
//
// LOGGER.trace("p.val: {}", v);
// }
// return expressionParameters;
// }
//
// private Map<QName, Object> getPromptingParameters(){
// JRParameter[] params = dataset.getParameters();
// Map<QName, Object> expressionParameters = new HashMap<QName, Object>();
// for (JRParameter param : params){
// if (param.isSystemDefined()){
// continue;
// }
// if (!param.isForPrompting()){
// continue;
// }
// LOGGER.trace(((JRBaseParameter)param).getName());
// Object v = getParameterValue(param.getName());
// try{
// expressionParameters.put(new QName(param.getName()), new PrismPropertyValue(v));
// } catch (Exception e){
// //just skip properties that are not important for midpoint
// }
//
// LOGGER.trace("p.val: {}", v);
// }
// return expressionParameters;
// }
//
// @Override
// protected void parseQuery() {
// // TODO Auto-generated method stub
//
//
//
// String s = dataset.getQuery().getText();
//
// JRBaseParameter p = (JRBaseParameter) dataset.getParameters()[0];
//
// Map<QName, Object> expressionParameters = getParameters();
// LOGGER.info("query: " + s);
// if (StringUtils.isEmpty(s)){
// query = null;
// } else {
// try {
// if (s.startsWith("<filter")){
//
// Object queryParam = getObjectQueryFromParameters();
// if (queryParam != null){
// if (queryParam instanceof String){
// s = (String) queryParam;
// } else if (queryParam instanceof ObjectQuery){
// query = (ObjectQuery) queryParam;
// }
// }
//
// if (query == null){
// query = reportService.parseQuery(s, expressionParameters);
// }
// } else if (s.startsWith("<code")){
// String normalized = s.replace("<code>", "");
// script = normalized.replace("</code>", "");
//
// }
// } catch (SchemaException | ObjectNotFoundException | ExpressionEvaluationException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
//
// }
//
// @Override
// public JRDataSource createDatasource() throws JRException {
// Collection<PrismObject<? extends ObjectType>> results = new ArrayList<>();
//
// try {
// if (query == null && script == null){
// throw new JRException("Neither query, nor script defined in the report.");
// }
//
// if (query != null){
// results = reportService.searchObjects(query, SelectorOptions.createCollection(GetOperationOptions.createRaw()));
// } else {
// if (script.contains("AuditEventRecord")){
// Collection<AuditEventRecord> audtiEventRecords = reportService.evaluateAuditScript(script, getPromptingParameters());
// return new JRBeanCollectionDataSource(audtiEventRecords);
// } else {
// results = reportService.evaluateScript(script, getParameters());
// }
// }
// } catch (SchemaException | ObjectNotFoundException | SecurityViolationException
// | CommunicationException | ConfigurationException | ExpressionEvaluationException e) {
// // TODO Auto-generated catch block
// throw new JRException(e);
// }
//
// MidPointDataSource mds = new MidPointDataSource(results);
//
// return mds;
// }
//
//
// @Override
// public void close() {
//// throw new UnsupportedOperationException("QueryExecutor.close() not supported");
// //nothing to DO
// }
//
// @Override
// public boolean cancelQuery() throws JRException {
// throw new UnsupportedOperationException("QueryExecutor.cancelQuery() not supported");
// }
//
// @Override
// protected String getParameterReplacement(String parameterName) {
// throw new UnsupportedOperationException("QueryExecutor.getParameterReplacement() not supported");
// }
}