blob: 792ffd067381370bc95c2948582333cc33e0fd22 [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.console.wizards.resources;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.client.console.panels.ProvisionAuxClassesPanel;
import org.apache.syncope.client.console.rest.ConnectorRestClient;
import org.apache.syncope.client.console.wizards.BaseAjaxWizardBuilder;
import org.apache.syncope.client.console.wizards.mapping.ItemTransformersTogglePanel;
import org.apache.syncope.client.console.wizards.mapping.JEXLTransformersTogglePanel;
import org.apache.syncope.client.ui.commons.ConnIdSpecialName;
import org.apache.syncope.client.ui.commons.Constants;
import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
import org.apache.syncope.common.lib.to.MappingTO;
import org.apache.syncope.common.lib.to.ProvisionTO;
import org.apache.syncope.common.lib.to.ResourceTO;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.wizard.WizardModel;
import org.apache.wicket.extensions.wizard.WizardModel.ICondition;
import org.apache.wicket.extensions.wizard.WizardStep;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
public class ProvisionWizardBuilder extends BaseAjaxWizardBuilder<ResourceProvision> {
private static final long serialVersionUID = 3739399543837732640L;
private final ResourceTO resourceTO;
private final String adminRealm;
protected AjaxTextFieldPanel clazz;
/**
* The object type specification step.
*/
private final class ObjectType extends WizardStep {
private static final long serialVersionUID = -1657800545799468278L;
ObjectType(final ResourceProvision resourceProvision) {
super(new ResourceModel("clazz.title", StringUtils.EMPTY),
new ResourceModel("clazz.summary", StringUtils.EMPTY), new Model<>(resourceProvision));
WebMarkupContainer container = new WebMarkupContainer("container");
container.setOutputMarkupId(true);
add(container);
clazz = new AjaxTextFieldPanel(
"clazz", "clazz", new PropertyModel<>(resourceProvision, "objectClass"));
clazz.setRequired(true);
clazz.setChoices(ConnectorRestClient.getObjectClasses(resourceTO.getConnector()));
container.add(clazz);
AjaxCheckBoxPanel ignoreCaseMatch = new AjaxCheckBoxPanel(
"ignoreCaseMatch", "ignoreCaseMatch", new PropertyModel<>(resourceProvision, "ignoreCaseMatch"));
container.add(ignoreCaseMatch);
}
}
protected void setObjectClassModelObject(final String type) {
if (clazz != null) {
if (AnyTypeKind.USER.name().equals(type)) {
clazz.setModelObject(ConnIdSpecialName.ACCOUNT);
} else if (AnyTypeKind.GROUP.name().equals(type)) {
clazz.setModelObject(ConnIdSpecialName.GROUP);
} else {
clazz.setModelObject("");
}
}
}
/**
* AuxClasses definition step.
*/
private static final class AuxClasses extends WizardStep implements ICondition {
private static final long serialVersionUID = 5315236191866427500L;
private final ResourceProvision provision;
AuxClasses(final ResourceProvision resourceProvision) {
this.provision = resourceProvision;
setTitleModel(new ResourceModel("auxClasses.title"));
setSummaryModel(new StringResourceModel("auxClasses.summary", this, new Model<>(resourceProvision)));
add(new ProvisionAuxClassesPanel("auxClasses", resourceProvision.getProvisionTO()));
}
@Override
public boolean evaluate() {
return provision.getProvisionTO() != null;
}
}
/**
* Mapping definition step.
*/
private static final class Mapping extends WizardStep {
private static final long serialVersionUID = 3454904947720856253L;
Mapping() {
setTitleModel(Model.of("Mapping"));
setSummaryModel(Model.of(StringUtils.EMPTY));
}
}
/**
* AccountLink specification step.
*/
private static final class ConnObjectLink extends WizardStep {
private static final long serialVersionUID = 2359955465172450478L;
ConnObjectLink(final ResourceProvision resourceProvision) {
super(new ResourceModel("link.title", StringUtils.EMPTY),
new ResourceModel("link.summary", StringUtils.EMPTY));
WebMarkupContainer connObjectLinkContainer = new WebMarkupContainer("connObjectLinkContainer");
connObjectLinkContainer.setOutputMarkupId(true);
add(connObjectLinkContainer);
boolean connObjectLinkEnabled = false;
if (StringUtils.isNotBlank(resourceProvision.getConnObjectLink())) {
connObjectLinkEnabled = true;
}
final AjaxCheckBoxPanel connObjectLinkCheckbox = new AjaxCheckBoxPanel(
"connObjectLinkCheckbox",
new ResourceModel("connObjectLinkCheckbox", "connObjectLinkCheckbox").getObject(),
new Model<>(connObjectLinkEnabled),
false);
connObjectLinkCheckbox.setEnabled(true);
connObjectLinkContainer.add(connObjectLinkCheckbox);
final AjaxTextFieldPanel connObjectLink = new AjaxTextFieldPanel(
"connObjectLink",
new ResourceModel("connObjectLink", "connObjectLink").getObject(),
new PropertyModel<>(resourceProvision, "connObjectLink"),
false);
connObjectLink.enableJexlHelp();
connObjectLink.setEnabled(connObjectLinkEnabled);
connObjectLinkContainer.add(connObjectLink);
connObjectLinkCheckbox.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
private static final long serialVersionUID = -1107858522700306810L;
@Override
protected void onUpdate(final AjaxRequestTarget target) {
connObjectLink.setEnabled(connObjectLinkCheckbox.getModelObject());
connObjectLink.setModelObject("");
target.add(connObjectLink);
}
});
}
}
/**
* Construct.
*
* @param resourceTO external resource to be updated.
* @param adminRealm admin realm
* @param pageRef Caller page reference.
*/
public ProvisionWizardBuilder(final ResourceTO resourceTO, final String adminRealm, final PageReference pageRef) {
super(new ResourceProvision(), pageRef);
this.resourceTO = resourceTO;
this.adminRealm = adminRealm;
}
@Override
protected WizardModel buildModelSteps(final ResourceProvision resourceProvision, final WizardModel wizardModel) {
wizardModel.add(new ObjectType(resourceProvision));
wizardModel.add(new AuxClasses(resourceProvision));
Mapping mapping = new Mapping();
mapping.setOutputMarkupId(true);
ItemTransformersTogglePanel itemTransformers = new ItemTransformersTogglePanel(mapping, pageRef);
addOuterObject(itemTransformers);
JEXLTransformersTogglePanel jexlTransformers = new JEXLTransformersTogglePanel(mapping, pageRef);
addOuterObject(jexlTransformers);
if (resourceProvision.getProvisionTO() != null && resourceProvision.getProvisionTO().getMapping() == null) {
resourceProvision.getProvisionTO().setMapping(new MappingTO());
}
mapping.add(new ResourceMappingPanel(
"mapping", resourceTO, adminRealm, resourceProvision, itemTransformers, jexlTransformers));
wizardModel.add(mapping);
wizardModel.add(new ConnObjectLink(resourceProvision));
return wizardModel;
}
@Override
protected Serializable onApplyInternal(final ResourceProvision resourceProvision) {
if (resourceProvision.getOrgUnitTO() != null) {
this.resourceTO.setOrgUnit(resourceProvision.getOrgUnitTO());
this.resourceTO.getOrgUnit().getItems().clear();
this.resourceTO.getOrgUnit().getItems().addAll(resourceProvision.getItems());
} else if (resourceProvision.getProvisionTO() != null) {
final List<ProvisionTO> provisions;
if (resourceProvision.getKey() == null) {
provisions = this.resourceTO.getProvisions().stream().
filter(object -> !resourceProvision.getAnyType().equals(object.getAnyType())).
collect(Collectors.toList());
} else {
provisions = this.resourceTO.getProvisions().stream().
filter(object -> !resourceProvision.getKey().equals(object.getKey())).
collect(Collectors.toList());
}
ProvisionTO provisionTO = resourceProvision.getProvisionTO();
provisionTO.getMapping().getItems().clear();
provisionTO.getMapping().getItems().addAll(resourceProvision.getItems());
provisions.add(provisionTO);
this.resourceTO.getProvisions().clear();
this.resourceTO.getProvisions().addAll(provisions);
}
return resourceProvision;
}
}