package com.evolveum.midpoint.report.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.QName;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.PrismReference;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
public class MidPointAbstractDataSource implements JRDataSource{
List<PrismObject<? extends ObjectType>> resultList = null;
Iterator<PrismObject<? extends ObjectType>> iterator = null;
PrismObject<? extends ObjectType> currentObject = null;
@Override
public boolean next() throws JRException {
// TODO Auto-generated method stub
boolean hasNext = false;
if (this.iterator != null) {
hasNext = this.iterator.hasNext();
if (hasNext) {
this.currentObject = iterator.next();
}
}
return hasNext;
}
@Override
public Object getFieldValue(JRField jrField) throws JRException {
// TODO Auto-generated method stub
String fieldName = jrField.getName();
if (fieldName.equals("oid")){
return currentObject.getOid();
}
Item i = currentObject.findItem(new QName(fieldName));
if (i == null){
return null;
}
if (i instanceof PrismProperty){
if (i.isSingleValue()){
return ((PrismProperty) i).getRealValue();
}
return ((PrismProperty) i).getRealValues();
} else if (i instanceof PrismReference){
if (i.isSingleValue()){
return ((PrismReference) i).getValue().asReferencable();
}
List<Referencable> refs = new ArrayList<Referencable>();
for (PrismReferenceValue refVal : ((PrismReference) i).getValues()){
refs.add(refVal.asReferencable());
}
return refs;
} else if (i instanceof PrismContainer){
if (i.isSingleValue()){
return ((PrismContainer) i).getValue().asContainerable();
}
List<Containerable> containers = new ArrayList<Containerable>();
for (Object pcv : i.getValues()){
if (pcv instanceof PrismContainerValue){
containers.add(((PrismContainerValue) pcv).asContainerable());
}
}
return containers;
} else
throw new JRException("Could not get value of the fileld: " + fieldName);
}
}