blob: 3071cba9cb46a71ceedefc067d22e8dba05e1bbb [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.status;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.client.console.SyncopeConsoleSession;
import org.apache.syncope.client.ui.commons.Constants;
import org.apache.syncope.client.console.commons.RealmsUtils;
import org.apache.syncope.client.console.pages.BasePage;
import org.apache.syncope.client.console.panels.MultilevelPanel;
import org.apache.syncope.client.console.rest.ImplementationRestClient;
import org.apache.syncope.client.console.rest.RealmRestClient;
import org.apache.syncope.client.console.rest.ReconciliationRestClient;
import org.apache.syncope.client.console.wicket.markup.html.form.AjaxSearchFieldPanel;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.to.EntityTO;
import org.apache.syncope.common.lib.to.ProvisioningTaskTO;
import org.apache.syncope.common.lib.to.PullTaskTO;
import org.apache.syncope.common.lib.to.PushTaskTO;
import org.apache.syncope.common.lib.types.IdMImplementationType;
import org.apache.syncope.common.lib.to.RealmTO;
import org.apache.syncope.common.lib.types.MatchingRule;
import org.apache.syncope.common.lib.types.UnmatchingRule;
import org.apache.syncope.common.rest.api.beans.ReconQuery;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.util.ListModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ReconTaskPanel extends MultilevelPanel.SecondLevel {
private static final long serialVersionUID = 5870444905957760434L;
protected static final Logger LOG = LoggerFactory.getLogger(ReconTaskPanel.class);
private final IModel<List<String>> pullActions = new LoadableDetachableModel<>() {
private static final long serialVersionUID = 5275935387613157437L;
@Override
protected List<String> load() {
return ImplementationRestClient.list(IdMImplementationType.PULL_ACTIONS).stream().
map(EntityTO::getKey).sorted().collect(Collectors.toList());
}
};
private final IModel<List<String>> pushActions = new LoadableDetachableModel<>() {
private static final long serialVersionUID = 5275935387613157437L;
@Override
protected List<String> load() {
return ImplementationRestClient.list(IdMImplementationType.PUSH_ACTIONS).stream().
map(EntityTO::getKey).sorted().collect(Collectors.toList());
}
};
public ReconTaskPanel(
final String resource,
final ProvisioningTaskTO taskTO,
final String anyType,
final String anyKey,
final boolean isOnSyncope,
final MultilevelPanel multiLevelPanelRef,
final PageReference pageRef) {
this(resource, taskTO, anyType, anyKey, null, isOnSyncope, multiLevelPanelRef, pageRef);
}
public ReconTaskPanel(
final String resource,
final ProvisioningTaskTO taskTO,
final String anyType,
final String anyKey,
final String fiql,
final boolean isOnSyncope,
final MultilevelPanel multiLevelPanelRef,
final PageReference pageRef) {
Form<ProvisioningTaskTO> form = new Form<>("form", new CompoundPropertyModel<>(taskTO));
add(form);
if (taskTO instanceof PushTaskTO) {
form.add(new Label("realm", ""));
form.add(new Label("remediation", ""));
} else {
boolean isSearchEnabled = RealmsUtils.isSearchEnabled();
AutoCompleteSettings settings = new AutoCompleteSettings();
settings.setShowCompleteListOnFocusGain(!isSearchEnabled);
settings.setShowListOnEmptyInput(!isSearchEnabled);
AjaxSearchFieldPanel realm = new AjaxSearchFieldPanel(
"realm", "destinationRealm", new PropertyModel<>(taskTO, "destinationRealm"), settings) {
private static final long serialVersionUID = -6390474600233486704L;
@Override
protected Iterator<String> getChoices(final String input) {
return (RealmsUtils.checkInput(input)
? (isSearchEnabled
? RealmRestClient.search(RealmsUtils.buildQuery(input)).getResult()
: RealmRestClient.list())
: List.<RealmTO>of()).stream().
sorted(Comparator.comparing(RealmTO::getName)).
map(RealmTO::getFullPath).collect(Collectors.toList()).iterator();
}
};
realm.addRequiredLabel();
realm.setOutputMarkupId(true);
// add a default destination realm if missing in the task
if (StringUtils.isBlank(PullTaskTO.class.cast(taskTO).getDestinationRealm())) {
realm.getField().setModelObject(SyncopeConstants.ROOT_REALM);
}
if (isOnSyncope) {
realm.setEnabled(false);
}
form.add(realm);
form.add(new AjaxCheckBoxPanel(
"remediation", "remediation", new PropertyModel<>(taskTO, "remediation"), false));
}
AjaxPalettePanel<String> actions = new AjaxPalettePanel.Builder<String>().
setAllowMoveAll(true).setAllowOrder(true).
build("actions",
new PropertyModel<>(taskTO, "actions"),
new ListModel<>(taskTO instanceof PushTaskTO
? pushActions.getObject() : pullActions.getObject()));
actions.setOutputMarkupId(true);
form.add(actions);
AjaxDropDownChoicePanel<MatchingRule> matchingRule = new AjaxDropDownChoicePanel<>(
"matchingRule", "matchingRule", new PropertyModel<>(taskTO, "matchingRule"), false);
matchingRule.setChoices(List.of(MatchingRule.values()));
form.add(matchingRule);
AjaxDropDownChoicePanel<UnmatchingRule> unmatchingRule = new AjaxDropDownChoicePanel<>(
"unmatchingRule", "unmatchingRule", new PropertyModel<>(taskTO, "unmatchingRule"),
false);
unmatchingRule.setChoices(List.of(UnmatchingRule.values()));
form.add(unmatchingRule);
taskTO.setPerformCreate(true);
AjaxCheckBoxPanel performCreate = new AjaxCheckBoxPanel(
"performCreate", "performCreate", new PropertyModel<>(taskTO, "performCreate"), false);
form.add(performCreate);
taskTO.setPerformUpdate(true);
AjaxCheckBoxPanel performUpdate = new AjaxCheckBoxPanel(
"performUpdate", "performUpdate", new PropertyModel<>(taskTO, "performUpdate"), false);
form.add(performUpdate);
taskTO.setPerformDelete(true);
AjaxCheckBoxPanel performDelete = new AjaxCheckBoxPanel(
"performDelete", "performDelete", new PropertyModel<>(taskTO, "performDelete"), false);
form.add(performDelete);
taskTO.setSyncStatus(true);
AjaxCheckBoxPanel syncStatus = new AjaxCheckBoxPanel(
"syncStatus", "syncStatus", new PropertyModel<>(taskTO, "syncStatus"), false);
form.add(syncStatus);
form.add(new AjaxSubmitLink("reconcile") {
private static final long serialVersionUID = -817438685948164787L;
@Override
protected void onSubmit(final AjaxRequestTarget target) {
ReconQuery reconQuery = new ReconQuery.Builder(anyType, resource).anyKey(anyKey).fiql(fiql).build();
try {
if (taskTO instanceof PushTaskTO) {
ReconciliationRestClient.push(reconQuery, (PushTaskTO) form.getModelObject());
} else {
ReconciliationRestClient.pull(reconQuery, (PullTaskTO) form.getModelObject());
}
SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
} catch (Exception e) {
LOG.error("While attempting reconciliation using query {} on {}",
reconQuery, form.getModelObject(), e);
SyncopeConsoleSession.get().onException(e);
}
multiLevelPanelRef.prev(target);
((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
}
});
}
}