Skip to content

Commit

Permalink
improving report param attributes serialization..
Browse files Browse the repository at this point in the history
enabling check on cached changes in shadow
  • Loading branch information
katkav committed Apr 16, 2015
1 parent a4d1ffb commit fbf28de
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 72 deletions.
Expand Up @@ -16,10 +16,35 @@

package com.evolveum.midpoint.web.page.admin.reports;

import com.evolveum.midpoint.prism.PrismObject;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule;
import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.prism.query.EqualFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.SubstringFilter;
import com.evolveum.midpoint.report.api.ReportConstants;
//import com.evolveum.midpoint.report.impl.ReportConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.task.api.Task;
Expand All @@ -36,32 +61,11 @@
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.page.admin.configuration.PageAdminConfiguration;
import com.evolveum.midpoint.web.page.admin.reports.component.RunReportPopupPanel;
import com.evolveum.midpoint.web.page.admin.reports.dto.JasperReportParameterDto;
import com.evolveum.midpoint.web.page.admin.reports.dto.ReportSearchDto;
import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDto;
import com.evolveum.midpoint.web.page.admin.users.component.AssignablePopupContent;
import com.evolveum.midpoint.web.page.admin.users.component.AssignableRolePopupContent;
import com.evolveum.midpoint.web.session.ReportsStorage;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import java.io.Serializable;
import java.util.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType;

/**
* @author lazyman
Expand Down Expand Up @@ -251,7 +255,7 @@ private void reportTypeFilterPerformed(AjaxRequestTarget target, String oid){
}

// @Override
protected void runReportPerformed(AjaxRequestTarget target, ReportType report, List<ReportParameterType> paramsMap){
protected void runReportPerformed(AjaxRequestTarget target, ReportType report, PrismContainer<ReportParameterType> paramContainer){

ModalWindow window = (ModalWindow) get(MODAL_ID_RUN_REPORT);
window.close(target);
Expand All @@ -261,7 +265,8 @@ protected void runReportPerformed(AjaxRequestTarget target, ReportType report, L
try {

Task task = createSimpleTask(OPERATION_RUN_REPORT);
getReportManager().runReport(report.asPrismObject(), paramsMap, task, result);

getReportManager().runReport(report.asPrismObject(), paramContainer, task, result);
} catch (Exception ex) {
result.recordFatalError(ex);
} finally {
Expand Down Expand Up @@ -357,7 +362,7 @@ private void initRunReportModal() {
window.setContent(new RunReportPopupPanel(window.getContentId()){

@Override
protected void runConfirmPerformed(AjaxRequestTarget target, ReportType reportType, List<ReportParameterType> params){
protected void runConfirmPerformed(AjaxRequestTarget target, ReportType reportType, PrismContainer<ReportParameterType> params){
runReportPerformed(target, reportType, params);
}
});
Expand Down
Expand Up @@ -4,7 +4,9 @@
import java.util.List;

import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import org.apache.cxf.aegis.type.XMLTypeCreator;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
Expand All @@ -17,8 +19,15 @@
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;

import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.prism.xml.XsdTypeMapper;
import com.evolveum.midpoint.report.api.ReportConstants;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -171,20 +180,29 @@ private Component createTypedInputPanel(String componentId, final IModel<JasperR
private void runConfirmPerformed(AjaxRequestTarget target, IModel<ReportDto> model, List<JasperReportParameterDto> params){
ReportDto reportDto = model.getObject();

List<ReportParameterType> reportParams = new ArrayList<ReportParameterType>();
// List<ReportParameterType> reportParams = new ArrayList<ReportParameterType>();
PrismContainerDefinition<ReportParameterType> paramContainterDef = getPrismContext().getSchemaRegistry().findContainerDefinitionByElementName(ReportConstants.REPORT_PARAMS_PROPERTY_NAME);
PrismContainer<ReportParameterType> paramContainer = paramContainterDef.instantiate();
try {

ReportParameterType reportParam = new ReportParameterType();
PrismContainerValue<ReportParameterType> reportParamValue = reportParam.asPrismContainerValue();
reportParamValue.revive(getPrismContext());
paramContainer.add(reportParamValue);
for (JasperReportParameterDto paramDto : params){
ReportParameterType parameterType = new ReportParameterType();
parameterType.setName(paramDto.getName());
parameterType.setType(paramDto.getTypeAsString());
String value = null;
QName typeName = null;
if (XmlTypeConverter.canConvert(paramDto.getType())){
value = XmlTypeConverter.toXmlTextContent(paramDto.getValue(), null);
} else{
value = getPrismContext().serializeAnyData(paramDto.getValue(), SchemaConstants.C_REPORT_PARAM_VALUE, PrismContext.LANG_XML);
typeName = XsdTypeMapper.toXsdType(paramDto.getType());
} else {
typeName = getPrismContext().getBeanConverter().determineTypeForClass(paramDto.getType());
}
parameterType.setValue(value);
reportParams.add(parameterType);
PrismPropertyDefinition def = new PrismPropertyDefinition<>(new QName(ReportConstants.NS_EXTENSION, paramDto.getName()), typeName, getPrismContext());
def.setDynamic(true);
def.setRuntimeSchema(true);
PrismProperty prop = def.instantiate();
prop.addRealValue(paramDto.getValue());
reportParamValue.add(prop);
//setPropertyRealValue(new QName(ReportConstants.NS_EXTENSION, paramDto.getName()), paramDto.getValue(), getPrismContext());
}
} catch (SchemaException | ClassNotFoundException e) {
OperationResult result = new OperationResult("Parameters serialization");
Expand All @@ -193,7 +211,7 @@ private void runConfirmPerformed(AjaxRequestTarget target, IModel<ReportDto> mod
return;
}

runConfirmPerformed(target, reportDto.getObject().asObjectable(), reportParams);
runConfirmPerformed(target, reportDto.getObject().asObjectable(), paramContainer);


}
Expand All @@ -203,7 +221,7 @@ private PrismContext getPrismContext(){
}

protected void runConfirmPerformed(AjaxRequestTarget target, ReportType reportType2,
List<ReportParameterType> paramsMap) {}
PrismContainer<ReportParameterType> reportParam) {}
private static class EmptyOnBlurAjaxFormUpdatingBehaviour extends AjaxFormComponentUpdatingBehavior {

public EmptyOnBlurAjaxFormUpdatingBehaviour() {
Expand Down
Expand Up @@ -10650,10 +10650,14 @@
</xsd:complexType>

<xsd:complexType name="ReportParameterType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="type" type="xsd:string"/>
<xsd:element name="value" type="xsd:string"/>
<xsd:annotation>
<xsd:appinfo>
<a:container/>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax">
</xsd:any>
</xsd:sequence>
</xsd:complexType>

Expand Down
Expand Up @@ -36,6 +36,7 @@
<xsd:annotation>
<xsd:appinfo>
<a:minOccurs>0</a:minOccurs>
<a:maxOccurs>1</a:maxOccurs>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
Expand Down
@@ -1,4 +1,4 @@
package com.evolveum.midpoint.report.impl;
package com.evolveum.midpoint.report.api;

import javax.xml.namespace.QName;

Expand Down
Expand Up @@ -16,6 +16,7 @@

package com.evolveum.midpoint.report.api;

import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
Expand Down Expand Up @@ -44,7 +45,7 @@ public interface ReportManager {
* @param report
* @param parentResult describes report which has to be created
*/
void runReport(PrismObject<ReportType> object, List<ReportParameterType> params, Task task, OperationResult parentResult);
void runReport(PrismObject<ReportType> object, PrismContainer<ReportParameterType> params, Task task, OperationResult parentResult);

/**
* todo comments [lazyman]
Expand Down
Expand Up @@ -48,19 +48,24 @@
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.parser.QueryConvertor;
import com.evolveum.midpoint.prism.parser.XNodeSerializer;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.util.RawTypeUtil;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.prism.xnode.PrimitiveXNode;
import com.evolveum.midpoint.prism.xnode.XNode;
import com.evolveum.midpoint.report.api.ReportConstants;
import com.evolveum.midpoint.report.api.ReportService;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
Expand Down Expand Up @@ -154,23 +159,33 @@ public TaskRunResult run(Task task) {
ReportType parentReport = objectResolver.resolve(task.getObjectRef(), ReportType.class, null, "resolving report", result);
Map<String, Object> parameters = completeReport(parentReport, result);

PrismProperty<ReportParameterType> reportParams = task.getExtensionProperty(ReportConstants.REPORT_PARAMS_PROPERTY_NAME);
PrismContainer<ReportParameterType> reportParams = (PrismContainer) task.getExtensionItem(ReportConstants.REPORT_PARAMS_PROPERTY_NAME);
if (reportParams != null){
List<PrismPropertyValue<ReportParameterType>> reportParamsValues = reportParams.getValues();

for (PrismPropertyValue<ReportParameterType> paramValue : reportParamsValues){
ReportParameterType val = paramValue.getValue();
Class clazz = Class.forName(val.getType());
Object value = null;
if (XmlTypeConverter.canConvert(clazz)){
value = XmlTypeConverter.toJavaValue(val.getValue(), clazz);
} else {
XNode xnode = prismContext.getParserDom().parse(val.getValue());
value = prismContext.getBeanConverter().unmarshall(xnode, clazz);

}
parameters.put(val.getName(), value);
PrismContainerValue<ReportParameterType> reportParamsValues = reportParams.getValue();
List<Item<?,?>> items = reportParamsValues.getItems();
for (Item item : items){
PrismProperty pp = (PrismProperty) item;
Object value = pp.getRealValue();
String paramName = ItemPath.getName(pp.getPath().lastNamed()).getLocalPart();
parameters.put(paramName, value);
}



//
// for (PrismPropertyValue<ReportParameterType> paramValue : getV){
// ReportParameterType val = paramValue.getValue();
// Class clazz = Class.forName(val.getType());
// Object value = null;
// if (XmlTypeConverter.canConvert(clazz)){
// value = XmlTypeConverter.toJavaValue(val.getValue(), clazz);
// } else {
// XNode xnode = prismContext.getParserDom().parse(val.getValue());
// value = prismContext.getBeanConverter().unmarshall(xnode, clazz);
//
// }

// }
}


Expand Down
Expand Up @@ -53,6 +53,7 @@
import com.evolveum.midpoint.model.api.hooks.ReadHook;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismProperty;
Expand Down Expand Up @@ -157,18 +158,18 @@ private boolean isRaw(Collection<SelectorOptions<GetOperationOptions>> options)
*/

@Override
public void runReport(PrismObject<ReportType> object, List<ReportParameterType> params, Task task, OperationResult parentResult) {
public void runReport(PrismObject<ReportType> object, PrismContainer<ReportParameterType> paramContainer, Task task, OperationResult parentResult) {
task.setHandlerUri(ReportCreateTaskHandler.REPORT_CREATE_TASK_URI);
task.setObjectRef(object.getOid(), ReportType.COMPLEX_TYPE);
try {
if (params != null && !params.isEmpty()){
PrismPropertyDefinition propertyDef = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(ReportConstants.REPORT_PARAMS_PROPERTY_NAME);
PrismProperty<ReportParameterType> paramProperty = propertyDef.instantiate();
for (ReportParameterType reportParam : params){
paramProperty.addRealValue(reportParam);
}
if (paramContainer != null && !paramContainer.isEmpty()){
// PrismContainerDefinition<ReportParameterType> propertyDef = prismContext.getSchemaRegistry().findContainerDefinitionByElementName(ReportConstants.REPORT_PARAMS_PROPERTY_NAME);
// PrismContainer<ReportParameterType> container = propertyDef.instantiate();
// for (ReportParameterType reportParam : params){
// container.add(reportParam.asPrismContainerValue());
// }

task.addExtensionProperty(paramProperty);
task.setExtensionContainer(paramContainer);

}
} catch (SchemaException e) {
Expand Down
Expand Up @@ -1628,9 +1628,9 @@ private ShadowType checkNormalizedShadowBasic(String accountOid, String name, bo
assertNotNull(name + "'s account must contain reference on the resource", resourceAccount.getResourceRef());
assertEquals(resourceTypeOpenDjrepo.getOid(), resourceAccount.getResourceRef().getOid());

// if (modify){
// assertNull(name + "'s account must not have object change", resourceAccount.getObjectChange());
// }
if (modify){
assertNull(name + "'s account must not have object change", resourceAccount.getObjectChange());
}

return resourceAccount;
// assertNotNull("Identifier in the angelica's account after discovery must not be null.",ResourceObjectShadowUtil.getAttributesContainer(faieldAccount).getIdentifier().getRealValue());
Expand Down

0 comments on commit fbf28de

Please sign in to comment.