blob: ed9e79be20799ebd739dc48916841bc931dbfae5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.syncope.client.enduser.panels;
import org.apache.syncope.client.enduser.SyncopeWebApplication;
import org.apache.syncope.client.enduser.layout.UserFormLayoutInfo;
import org.apache.syncope.client.enduser.panels.captcha.CaptchaPanel;
import org.apache.syncope.client.ui.commons.panels.CardPanel;
import org.apache.syncope.client.ui.commons.wizards.any.UserWrapper;
import org.apache.syncope.common.lib.Attr;
import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.syncope.common.lib.to.GroupableRelatableTO;
import org.apache.syncope.common.lib.to.UserTO;
import org.apache.wicket.PageReference;
import java.util.List;
import org.apache.syncope.client.enduser.commons.EnduserConstants;
import org.apache.syncope.client.enduser.panels.any.DerAttrs;
import org.apache.syncope.client.enduser.panels.any.Details;
import org.apache.syncope.client.enduser.panels.any.Groups;
import org.apache.syncope.client.enduser.panels.any.PlainAttrs;
import org.apache.syncope.client.enduser.panels.any.Resources;
import org.apache.syncope.client.enduser.panels.any.VirAttrs;
public abstract class AnyFormPanel extends AbstractAnyFormPanel<UserWrapper> {
private static final long serialVersionUID = -2720486919461006370L;
protected final List<String> anyTypeClasses;
protected CaptchaPanel<Void> captcha;
protected UserFormLayoutInfo formLayoutInfo;
public AnyFormPanel(final String id,
final UserTO anyTO,
final List<String> anyTypeClasses,
final UserFormLayoutInfo formLayoutInfo,
final PageReference pageReference) {
super(id, new UserWrapper(anyTO), pageReference);
this.formLayoutInfo = formLayoutInfo;
this.anyTypeClasses = anyTypeClasses;
}
@SuppressWarnings("unchecked")
public AnyFormPanel(final String id,
final UserWrapper wrapper,
final List<String> anyTypeClasses,
final UserFormLayoutInfo formLayoutInfo,
final PageReference pageReference) {
super(id, wrapper, pageReference);
this.formLayoutInfo = formLayoutInfo;
this.anyTypeClasses = anyTypeClasses;
}
protected Details<UserTO> addOptionalDetailsPanel(final UserWrapper modelObject) {
Details<UserTO> details = new Details<>(EnduserConstants.CONTENT_PANEL, modelObject, false, true, pageRef);
details.setOutputMarkupId(true);
return details;
}
@Override
protected void buildLayout(final UserWrapper modelObject) {
form.add(new CardPanel.Builder<>()
.setName("details")
.setComponent(addOptionalDetailsPanel(modelObject))
.isVisible(formLayoutInfo.isDetailsManagement()).build("userDetailsPanelCard"));
Groups groups = new Groups(EnduserConstants.CONTENT_PANEL, modelObject, false);
setOutputMarkupId(true);
form.add(new CardPanel.Builder<Groups>()
.setName("groups")
.setComponent(groups)
.isVisible(formLayoutInfo.isGroups()).build("groupsPanelCard"));
PlainAttrs plainAttrs = new PlainAttrs(EnduserConstants.CONTENT_PANEL,
modelObject, anyTypeClasses, formLayoutInfo.getWhichPlainAttrs());
plainAttrs.setOutputMarkupId(true);
form.add(new CardPanel.Builder<PlainAttrs>()
.setName("attributes.plain")
.setComponent(plainAttrs)
.isVisible(formLayoutInfo.isPlainAttrs() && plainAttrs.isPanelVisible()).build("plainAttrsPanelCard"));
DerAttrs derAttrs = new DerAttrs(EnduserConstants.CONTENT_PANEL,
modelObject, anyTypeClasses, formLayoutInfo.getWhichDerAttrs());
derAttrs.setOutputMarkupId(true);
form.add(new CardPanel.Builder<DerAttrs>()
.setName("attributes.derived")
.setComponent(derAttrs)
.isVisible(formLayoutInfo.isVirAttrs() && derAttrs.isPanelVisible()).build("derAttrsPanelCard"));
VirAttrs virAttrs = new VirAttrs(EnduserConstants.CONTENT_PANEL,
modelObject, anyTypeClasses, formLayoutInfo.getWhichVirAttrs());
virAttrs.setOutputMarkupId(true);
form.add(new CardPanel.Builder<VirAttrs>()
.setName("attributes.virtual")
.setComponent(virAttrs)
.isVisible(formLayoutInfo.isVirAttrs() && virAttrs.isPanelVisible()).build("virAttrsPanelCard"));
Resources resources = new Resources(EnduserConstants.CONTENT_PANEL, modelObject);
resources.setOutputMarkupId(true);
form.add(new CardPanel.Builder<Resources>()
.setName("resources")
.setComponent(resources)
.isVisible(formLayoutInfo.isResources()).build("resourcesPanelCard"));
// add captcha
captcha = new CaptchaPanel<>(EnduserConstants.CONTENT_PANEL);
captcha.setOutputMarkupPlaceholderTag(true);
form.add(new CardPanel.Builder<CaptchaPanel<Void>>()
.setName("captcha")
.setComponent(captcha)
.isVisible(SyncopeWebApplication.get().isCaptchaEnabled()).build("captchaPanelCard"));
}
protected void fixPlainAndVirAttrs(final AnyTO updated, final AnyTO original) {
// re-add to the updated object any missing plain or virtual attribute (compared to original): this to cope with
// form layout, which might have not included some plain or virtual attributes
for (Attr plainAttr : original.getPlainAttrs()) {
if (!updated.getPlainAttr(plainAttr.getSchema()).isPresent()) {
updated.getPlainAttrs().add(plainAttr);
}
}
for (Attr virAttr : original.getVirAttrs()) {
if (!updated.getVirAttr(virAttr.getSchema()).isPresent()) {
updated.getVirAttrs().add(virAttr);
}
}
if (updated instanceof GroupableRelatableTO && original instanceof GroupableRelatableTO) {
GroupableRelatableTO.class
.cast(original).getMemberships().forEach(oMemb -> {
GroupableRelatableTO.class
.cast(updated).getMembership(oMemb.getGroupKey()).ifPresent(uMemb -> {
oMemb.getPlainAttrs()
.stream().
filter(attr -> !uMemb.getPlainAttr(attr.getSchema()).isPresent()).
forEach(attr -> uMemb.getPlainAttrs().add(attr));
oMemb.getVirAttrs()
.stream().
filter(attr -> !uMemb.getVirAttr(attr.getSchema()).isPresent()).
forEach(attr -> uMemb.getVirAttrs().add(attr));
}
);
});
}
// remove from the updated object any plain or virtual attribute without values, thus triggering for removal in
// the generated patch
updated.getPlainAttrs().removeIf(attr -> attr.getValues().isEmpty());
updated.getVirAttrs().removeIf(attr -> attr.getValues().isEmpty());
if (updated instanceof GroupableRelatableTO) {
GroupableRelatableTO.class.cast(updated).getMemberships().forEach(memb -> {
memb.getPlainAttrs().removeIf(attr -> attr.getValues().isEmpty());
memb.getVirAttrs().removeIf(attr -> attr.getValues().isEmpty());
});
}
}
}