Skip to content

Commit

Permalink
Reports - support for parameter properties & autocomplete
Browse files Browse the repository at this point in the history
  • Loading branch information
martin-lizner committed Oct 2, 2015
1 parent 1e2e073 commit 98dd8f7
Show file tree
Hide file tree
Showing 12 changed files with 167 additions and 132 deletions.
2 changes: 1 addition & 1 deletion config/initial-objects/090-report-audit.xml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion config/initial-objects/100-report-reconciliation.xml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion config/initial-objects/110-report-user-list.xml

Large diffs are not rendered by default.

Expand Up @@ -201,16 +201,19 @@ private List<IColumn<JasperReportParameterDto, String>> initParameterColumns() {
columns.add(column);

//name editing column
columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterName", "name", true));
columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterName", null, "name", true));

//class editing column
columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterClass", "typeAsString", true));
columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterClass", null, "typeAsString", true));

//property:key editing column
columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterProperty", "key", "propertyKey", false));

//property:path editing column
columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterPropertyPath", "propertyPath", false));
//property:label editing column
columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterProperty", "label", "propertyLabel", false));

//property:targetType editing column
columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterTargetType", "propertyTargetType", false));
columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterProperty", "targetType", "propertyTargetType", false));

CheckBoxColumn forPrompting = new CheckBoxColumn<JasperReportParameterDto>(
createStringResource("JasperReportConfigurationPanel.forPrompting"), "forPrompting") {
Expand All @@ -229,9 +232,9 @@ public void populateItem(Item<ICellPopulator<JasperReportParameterDto>> cellItem
return columns;
}

private EditableLinkColumn<JasperReportParameterDto> buildEditableLinkColumn(String resource, String property, final Boolean mandatory) {
private EditableLinkColumn<JasperReportParameterDto> buildEditableLinkColumn(String resource, String resourceParam, String property, final Boolean mandatory) {
return new EditableLinkColumn<JasperReportParameterDto>(
createStringResource(resource), property) {
createStringResource(resource, resourceParam), property) {

@Override
protected Component createInputPanel(String componentId, final IModel<JasperReportParameterDto> model) {
Expand Down
Expand Up @@ -118,11 +118,9 @@ public class RunReportPopupPanel extends SimplePanel<ReportDto> {
private IModel<ReportDto> reportModel;
private ReportType reportType;


public void setReportType(ReportType reportType) {
this.reportType = reportType;


if (getParametersTable() != null) {
replace(createTablePanel());
}
Expand Down Expand Up @@ -158,8 +156,8 @@ protected ReportDto load() {
return new ReportDto(reportType, true);
}
};
ISortableDataProvider<JasperReportParameterDto, String> provider = new ListDataProvider<>(this,

ISortableDataProvider<JasperReportParameterDto, String> provider = new ListDataProvider<>(this,
new PropertyModel<List<JasperReportParameterDto>>(reportModel, "jasperReportDto.parameters"));
TablePanel table = new TablePanel<>(ID_PARAMETERS_TABLE, provider, initParameterColumns());
table.setOutputMarkupId(true);
Expand Down Expand Up @@ -219,7 +217,7 @@ public void populateItem(Item<ICellPopulator<JasperReportParameterDto>> cellItem
return columns;
}

private Component createTypedInputPanel(String componentId, IModel<JasperReportParameterDto> model, String expression) {
private Component createTypedInputPanel(String componentId, IModel<JasperReportParameterDto> model, String expression) {
JasperReportParameterDto param = model.getObject();
param.setEditing(true);

Expand All @@ -229,7 +227,7 @@ private Component createTypedInputPanel(String componentId, IModel<JasperReport
Class type = null;

final LookupTableType lookup = createLookupTable(param);

try {
type = param.getType();
} catch (ClassNotFoundException e) {
Expand All @@ -245,22 +243,23 @@ private Component createTypedInputPanel(String componentId, IModel<JasperReport
// } else if ("resourceName".equals(param.getName())) { // hardcoded for Reconc report
// panel = new DropDownChoicePanel(componentId, new PropertyModel(model, expression),
// createResourceListModel(), new ChoiceRenderer<String>(), false);
} else if (lookup != null){
panel = new AutoCompleteTextPanel<String>(componentId, new LookupPropertyModel<String>(model, expression,
} else if (lookup != null) {
panel = new AutoCompleteTextPanel<String>(componentId, new LookupPropertyModel<String>(model, expression,
lookup), String.class) {

@Override
public Iterator<String> getIterator(String input) {
return prepareAutoCompleteList(input, lookup).iterator();
}
};
} else if ("stringAttributeName".equals(param.getName())) { // hardcoded for User report
panel = new DropDownChoicePanel(componentId, new PropertyModel(model, expression),
createUserAttributeListModel(String.class), new ChoiceRenderer<String>(), false);
} else if ("polyStringAttributeName".equals(param.getName())) { // hardcoded for User report
panel = new DropDownChoicePanel(componentId, new PropertyModel(model, expression),
createUserAttributeListModel(PolyString.class), new ChoiceRenderer<String>(), false);
} else {
@Override
public Iterator<String> getIterator(String input) {
return prepareAutoCompleteList(input, lookup).iterator();
}
};
} /*
else if ("stringAttributeName".equals(param.getName())) { // hardcoded for User report
panel = new DropDownChoicePanel(componentId, new PropertyModel(model, expression),
createUserAttributeListModel(String.class), new ChoiceRenderer<String>(), false);
} else if ("polyStringAttributeName".equals(param.getName())) { // hardcoded for User report
panel = new DropDownChoicePanel(componentId, new PropertyModel(model, expression),
createUserAttributeListModel(PolyString.class), new ChoiceRenderer<String>(), false);
} */ else {
panel = new TextPanel<String>(componentId, new PropertyModel<String>(model, expression));
}
List<FormComponent> components = panel.getFormComponents();
Expand All @@ -277,115 +276,133 @@ public Iterator<String> getIterator(String input) {
return panel;

}

private <T extends ObjectType> LookupTableType createLookupTable(JasperReportParameterDto param) {
ItemPath path = null;

JRPropertiesMap properties = param.getProperties();

if (properties == null){
return null;
}

String pPath = properties.getProperty("path");
if (pPath != null){
path = new ItemPath(pPath);
}

String pTargetType = properties.getProperty("targetType");
Class<T> targetType = null;
if (pTargetType != null){
try {
targetType = (Class<T>) Class.forName(pTargetType);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if (path != null && targetType != null){
OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCES);
ItemPath label = null;
ItemPath key = null;

JRPropertiesMap properties = param.getProperties();

if (properties == null) {
return null;
}

String pLabel = properties.getProperty("label");
if (pLabel != null) {
label = new ItemPath(pLabel);
}
String pKey = properties.getProperty("key");
if (pKey != null) {
key = new ItemPath(pKey);
}

String pTargetType = properties.getProperty("targetType");
Class<T> targetType = null;
if (pTargetType != null) {
try {
targetType = (Class<T>) Class.forName(pTargetType);
} catch (ClassNotFoundException e) {
error("Error while creating lookup table for input parameter: " + param.getName() + ", " + e.getClass().getSimpleName() + " (" + e.getMessage() + ")");
//e.printStackTrace();
}
}

if (label != null && targetType != null) {
OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCES);
Task task = createSimpleTask(OPERATION_LOAD_RESOURCES);

Collection<PrismObject<T>> objects;
try {
objects = modelService.searchObjects(targetType, new ObjectQuery(), SelectorOptions.createCollection(GetOperationOptions.createNoFetch()), task, result);

LookupTableType lookup = new LookupTableType();

for (PrismObject<T> o : objects){
PrismProperty item = o.findProperty(path);
//TODO: TODO TODO e.g. support not only for property, but also ref, continer..
if (item == null || item.isEmpty()){
continue;
}

//TODO support for single/multivalue value
if (!item.isSingleValue()){
continue;
}

Object realValue = item.getRealValue();

// TODO: take definition into account
QName typeName = item.getDefinition().getTypeName();


//TODO ros.setValue() ???? use value which will be used in the filter?? get the name of the parameter used for filter from properties map (key)
LookupTableRowType row = new LookupTableRowType();
if (realValue instanceof PolyString){
row.setKey(WebMiscUtil.getOrigStringFromPoly((PolyString) realValue));
row.setLabel(new PolyStringType((PolyString)realValue));
} else if (realValue instanceof PolyStringType){
row.setKey(WebMiscUtil.getOrigStringFromPoly((PolyStringType) realValue));
row.setLabel((PolyStringType)realValue);
} else if (realValue instanceof String){
row.setKey((String) realValue);
row.setLabel(new PolyStringType((String)realValue));
} else {
row.setKey(realValue.toString());
row.setLabel(new PolyStringType(realValue.toString()));
}

lookup.getRow().add(row);
}

return lookup;
} catch (SchemaException | ObjectNotFoundException | SecurityViolationException
| CommunicationException | ConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}



Collection<PrismObject<T>> objects;
try {
objects = modelService.searchObjects(targetType, new ObjectQuery(), SelectorOptions.createCollection(GetOperationOptions.createNoFetch()), task, result);

LookupTableType lookup = new LookupTableType();

for (PrismObject<T> o : objects) {
Object realKeyValue = null;
PrismProperty labelItem = o.findProperty(label);

//TODO: e.g. support not only for property, but also ref, container..
if (labelItem == null || labelItem.isEmpty()) {
continue;
}
PrismProperty keyItem = o.findProperty(key);
if ("oid".equals(pKey)) {
realKeyValue = o.getOid();
}
if (realKeyValue == null && (keyItem == null || keyItem.isEmpty())) {
continue;
}

//TODO: support for single/multivalue value
if (!labelItem.isSingleValue()) {
continue;
}

Object realLabelValue = labelItem.getRealValue();
realKeyValue = (realKeyValue == null) ? keyItem.getRealValue() : realKeyValue;

// TODO: take definition into account
QName typeName = labelItem.getDefinition().getTypeName();

LookupTableRowType row = new LookupTableRowType();

if (realKeyValue != null) {
row.setKey(convertObjectToPolyStringType(realKeyValue).getOrig());
} else {
throw new SchemaException("Cannot create lookup table with null key for label: " + realLabelValue);
}

row.setLabel(convertObjectToPolyStringType(realLabelValue));

lookup.getRow().add(row);
}

return lookup;
} catch (SchemaException | ObjectNotFoundException | SecurityViolationException | CommunicationException | ConfigurationException e) {
error("Error while creating lookup table for input parameter: " + param.getName() + ", " + e.getClass().getSimpleName() + " (" + e.getMessage() + ")");
//e.printStackTrace();
}

}
return null;
}
return null;
}

private PolyStringType convertObjectToPolyStringType(Object o) {
if (o instanceof PolyString) {
return new PolyStringType((PolyString) o);
} else if (o instanceof PolyStringType) {
return (PolyStringType) o;
} else if (o instanceof String) {
return new PolyStringType((String) o);
} else {
return new PolyStringType(o.toString());
}
}

private List<String> prepareAutoCompleteList(String input, LookupTableType lookupTable){
private List<String> prepareAutoCompleteList(String input, LookupTableType lookupTable) {
List<String> values = new ArrayList<>();

if(lookupTable == null){
if (lookupTable == null) {
return values;
}

List<LookupTableRowType> rows = lookupTable.getRow();

if(input == null || input.isEmpty()){
for(LookupTableRowType row: rows){
if (input == null || input.isEmpty()) {
for (LookupTableRowType row : rows) {
values.add(WebMiscUtil.getOrigStringFromPoly(row.getLabel()));

if(values.size() > 10){
if (values.size() > 10) {
return values;
}
}
} else {
for(LookupTableRowType row: rows){
if(WebMiscUtil.getOrigStringFromPoly(row.getLabel()).startsWith(input)){
for (LookupTableRowType row : rows) {
if (WebMiscUtil.getOrigStringFromPoly(row.getLabel()).startsWith(input)) {
values.add(WebMiscUtil.getOrigStringFromPoly(row.getLabel()));
}

if(values.size() > 10){
if (values.size() > 10) {
return values;
}
}
Expand Down
Expand Up @@ -78,7 +78,7 @@ private void initFileds(boolean onlyForPromptingParams){
p.setNestedType(parameter.getNestedType());
}

if (parameter.hasProperties()){
if (parameter.hasProperties()){
p.setProperties(parameter.getPropertiesMap());
}
parameters.add(p);
Expand Down
Expand Up @@ -98,19 +98,34 @@ public JRPropertiesMap getProperties() {
return (clearedMap.isEmpty()) ? null : clearedMap;
}

public String getPropertyPath() {
public String getPropertyLabel() {
if (properties != null) {
return properties.getProperty("path");
return properties.getProperty("label");
} else {
return null;
}
}

public void setPropertyPath(String val) {
public void setPropertyLabel(String val) {
if (properties == null) {
properties = new JRPropertiesMap();
}
properties.setProperty("path", val);
properties.setProperty("label", val);
}

public String getPropertyKey() {
if (properties != null) {
return properties.getProperty("key");
} else {
return null;
}
}

public void setPropertyKey(String val) {
if (properties == null) {
properties = new JRPropertiesMap();
}
properties.setProperty("key", val);
}

public String getPropertyTargetType() {
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

0 comments on commit 98dd8f7

Please sign in to comment.