in client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java [103:280]
public BeanPanel(
final String id,
final IModel<T> bean,
final Map<String, Pair<AbstractFiqlSearchConditionBuilder<?, ?, ?>, List<SearchClause>>> sCondWrapper,
final PageReference pageRef,
final String... excluded) {
super(id, bean);
setOutputMarkupId(true);
this.sCondWrapper = sCondWrapper;
this.excluded = new ArrayList<>(List.of(excluded));
this.excluded.add("serialVersionUID");
this.excluded.add("class");
LoadableDetachableModel<List<Field>> model = new LoadableDetachableModel<>() {
private static final long serialVersionUID = 5275935387613157437L;
@Override
protected List<Field> load() {
List<Field> result = new ArrayList<>();
if (BeanPanel.this.getDefaultModelObject() != null) {
ReflectionUtils.doWithFields(
BeanPanel.this.getDefaultModelObject().getClass(),
result::add,
field -> !field.isSynthetic() && !BeanPanel.this.excluded.contains(field.getName()));
}
return result;
}
};
add(new ListView<>("propView", model) {
private static final long serialVersionUID = 9101744072914090143L;
private void setRequired(final ListItem<Field> item, final boolean required) {
if (required) {
Fragment fragment = new Fragment("required", "requiredFragment", this);
fragment.add(new Label("requiredLabel", "*"));
item.replace(fragment);
}
}
private void setDescription(final ListItem<Field> item, final String description) {
Fragment fragment = new Fragment("description", "descriptionFragment", this);
fragment.add(new Label("descriptionLabel", Model.of()).add(new PopoverBehavior(
Model.of(),
Model.of(description),
new PopoverConfig().withPlacement(TooltipConfig.Placement.right)) {
private static final long serialVersionUID = -7867802555691605021L;
@Override
protected String createRelAttribute() {
return "description";
}
}).setRenderBodyOnly(false));
item.replace(fragment);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
protected void populateItem(final ListItem<Field> item) {
item.add(new Fragment("required", "emptyFragment", this));
item.add(new Fragment("description", "emptyFragment", this));
Field field = item.getModelObject();
item.add(new Label("fieldName", new ResourceModel(field.getName(), field.getName())));
Panel panel;
SearchCondition scondAnnot = field.getAnnotation(SearchCondition.class);
if (scondAnnot != null) {
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(bean.getObject());
String fiql = (String) wrapper.getPropertyValue(field.getName());
List<SearchClause> clauses = Optional.ofNullable(fiql).
map(f -> SearchUtils.getSearchClauses(f.replaceAll(
SearchUtils.getTypeConditionPattern(scondAnnot.type()).pattern(), ""))).
orElseGet(ArrayList::new);
AbstractFiqlSearchConditionBuilder<?, ?, ?> builder;
switch (scondAnnot.type()) {
case "USER":
panel = new UserSearchPanel.Builder(
new ListModel<>(clauses), pageRef).required(false).build("value");
builder = SyncopeClient.getUserSearchConditionBuilder();
break;
case "GROUP":
panel = new GroupSearchPanel.Builder(
new ListModel<>(clauses), pageRef).required(false).build("value");
builder = SyncopeClient.getGroupSearchConditionBuilder();
break;
default:
panel = new AnyObjectSearchPanel.Builder(
scondAnnot.type(),
new ListModel<>(clauses), pageRef).required(false).build("value");
builder = SyncopeClient.getAnyObjectSearchConditionBuilder(scondAnnot.type());
}
Optional.ofNullable(BeanPanel.this.sCondWrapper).
ifPresent(scw -> scw.put(field.getName(), Pair.of(builder, clauses)));
} else if (List.class.equals(field.getType())) {
Class<?> listItemType = field.getGenericType() instanceof ParameterizedType parameterizedType
? (Class<?>) (parameterizedType).getActualTypeArguments()[0]
: String.class;
org.apache.syncope.common.lib.Schema schema =
field.getAnnotation(org.apache.syncope.common.lib.Schema.class);
if (listItemType.equals(String.class) && schema != null) {
List<SchemaTO> choices = new ArrayList<>();
for (SchemaType type : schema.type()) {
switch (type) {
case PLAIN ->
choices.addAll(
schemaRestClient.getSchemas(SchemaType.PLAIN, schema.anyTypeKind()));
case DERIVED ->
choices.addAll(
schemaRestClient.getSchemas(SchemaType.DERIVED, schema.anyTypeKind()));
default -> {
}
}
}
panel = new AjaxPalettePanel.Builder<>().setName(field.getName()).build(
"value",
new PropertyModel<>(bean.getObject(), field.getName()),
new ListModel<>(choices.stream().map(SchemaTO::getKey).collect(Collectors.toList()))).
hideLabel();
} else if (listItemType.isEnum()) {
panel = new AjaxPalettePanel.Builder<>().setName(field.getName()).build(
"value",
new PropertyModel<>(bean.getObject(), field.getName()),
new ListModel(List.of(listItemType.getEnumConstants()))).hideLabel();
} else {
Triple<FieldPanel, Boolean, Optional<String>> single =
buildSinglePanel(bean.getObject(), field.getType(), field.getName(),
field.getAnnotation(io.swagger.v3.oas.annotations.media.Schema.class), "panel");
setRequired(item, single.getMiddle());
single.getRight().ifPresent(description -> setDescription(item, description));
panel = new MultiFieldPanel.Builder<>(
new PropertyModel<>(bean.getObject(), field.getName())).build(
"value",
field.getName(),
single.getLeft()).hideLabel();
}
} else if (Map.class.equals(field.getType())) {
panel = new AjaxGridFieldPanel(
"value", field.getName(), new PropertyModel<>(bean, field.getName()), false).hideLabel();
Optional.ofNullable(field.getAnnotation(io.swagger.v3.oas.annotations.media.Schema.class)).
ifPresent(annot -> setDescription(item, annot.description()));
} else {
Triple<FieldPanel, Boolean, Optional<String>> single =
buildSinglePanel(bean.getObject(), field.getType(), field.getName(),
field.getAnnotation(io.swagger.v3.oas.annotations.media.Schema.class), "value");
setRequired(item, single.getMiddle());
single.getRight().ifPresent(description -> setDescription(item, description));
panel = single.getLeft().hideLabel();
}
item.add(panel.setRenderBodyOnly(true));
}
}.setReuseItems(false));
}