blob: 1f2b18b653bd1f8e16ca34f84aa156d104522df7 [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.pages;
import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
import java.io.Serializable;
import org.apache.syncope.client.console.SyncopeConsoleSession;
import org.apache.syncope.client.console.panels.Realm;
import org.apache.syncope.client.console.panels.RealmChoicePanel;
import org.apache.syncope.client.console.panels.RealmChoicePanel.ChosenRealm;
import org.apache.syncope.client.console.rest.RealmRestClient;
import org.apache.syncope.client.console.tasks.TemplatesTogglePanel;
import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
import org.apache.syncope.client.console.wizards.any.ResultPage;
import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
import org.apache.syncope.client.ui.commons.Constants;
import org.apache.syncope.client.ui.commons.pages.BaseWebPage;
import org.apache.syncope.client.ui.commons.panels.WizardModalPanel;
import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.syncope.common.lib.to.ProvisioningResult;
import org.apache.syncope.common.lib.to.RealmTO;
import org.apache.syncope.common.lib.to.TemplatableTO;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
public class Realms extends BasePage {
private static final long serialVersionUID = -1100228004207271270L;
private final TemplatesTogglePanel templates;
private final RealmChoicePanel realmChoicePanel;
private final WebMarkupContainer content;
private final BaseModal<RealmTO> modal;
private final BaseModal<Serializable> templateModal;
public Realms(final PageParameters parameters) {
super(parameters);
templates = new TemplatesTogglePanel(BaseModal.CONTENT_ID, this, getPageReference()) {
private static final long serialVersionUID = 4828350561653999922L;
@Override
protected Serializable onApplyInternal(
final TemplatableTO targetObject, final String type, final AnyTO anyTO) {
targetObject.getTemplates().put(type, anyTO);
RealmRestClient.update(RealmTO.class.cast(targetObject));
return targetObject;
}
};
body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class));
content = new WebMarkupContainer("content");
realmChoicePanel = new RealmChoicePanel("realmChoicePanel", getPageReference());
realmChoicePanel.setOutputMarkupId(true);
content.add(realmChoicePanel);
content.add(new Label("body", "Root realm"));
content.setOutputMarkupId(true);
body.add(content);
modal = new BaseModal<>("modal");
modal.size(Modal.Size.Large);
content.add(modal);
content.add(templates);
templateModal = new BaseModal<>("templateModal") {
private static final long serialVersionUID = 5787433530654262016L;
@Override
protected void onConfigure() {
super.onConfigure();
setFooterVisible(false);
}
};
templateModal.size(Modal.Size.Large);
content.add(templateModal);
modal.setWindowClosedCallback(target -> {
target.add(realmChoicePanel.reloadRealmTree(target));
target.add(content);
modal.show(false);
});
templateModal.setWindowClosedCallback(target -> {
target.add(content);
templateModal.show(false);
});
updateRealmContent(realmChoicePanel.getCurrentRealm(), parameters.get("selectedIndex").toInt(0));
}
@Override
public void onEvent(final IEvent<?> event) {
super.onEvent(event);
if (event.getPayload() instanceof ChosenRealm) {
@SuppressWarnings("unchecked")
ChosenRealm<RealmTO> choosenRealm = ChosenRealm.class.cast(event.getPayload());
updateRealmContent(choosenRealm.getObj(), 0);
choosenRealm.getTarget().add(content);
} else if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
AjaxWizard.NewItemEvent<?> newItemEvent = AjaxWizard.NewItemEvent.class.cast(event.getPayload());
WizardModalPanel<?> modalPanel = newItemEvent.getModalPanel();
if (event.getPayload() instanceof AjaxWizard.NewItemActionEvent && modalPanel != null) {
final IModel<Serializable> model = new CompoundPropertyModel<>(modalPanel.getItem());
templateModal.setFormModel(model);
templateModal.header(newItemEvent.getResourceModel());
newItemEvent.getTarget().ifPresent(t -> t.add(templateModal.setContent(modalPanel)));
templateModal.show(true);
} else if (event.getPayload() instanceof AjaxWizard.NewItemCancelEvent) {
if (newItemEvent.getTarget().isPresent()) {
templateModal.close(newItemEvent.getTarget().get());
}
} else if (event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
if (newItemEvent.getTarget().isPresent()) {
((BasePage) getPage()).getNotificationPanel().refresh(newItemEvent.getTarget().get());
templateModal.close(newItemEvent.getTarget().get());
}
}
}
}
private WebMarkupContainer updateRealmContent(final RealmTO realmTO, final int selectedIndex) {
if (realmTO == null) {
return content;
}
content.addOrReplace(new Realm("body", realmTO, Realms.this.getPageReference(), selectedIndex) {
private static final long serialVersionUID = 8221398624379357183L;
@Override
protected void onClickTemplate(final AjaxRequestTarget target) {
templates.setTargetObject(realmTO);
templates.toggle(target, true);
}
@Override
protected void setWindowClosedReloadCallback(final BaseModal<?> modal) {
modal.setWindowClosedCallback(target -> {
if (modal.getContent() instanceof ResultPage) {
Serializable result = ResultPage.class.cast(modal.getContent()).getResult();
RealmTO newRealmTO = RealmTO.class.cast(ProvisioningResult.class.cast(result).getEntity());
// reload realmChoicePanel label too - SYNCOPE-1151
target.add(realmChoicePanel.reloadRealmTree(target, Model.of(newRealmTO)));
realmChoicePanel.setCurrentRealm(newRealmTO);
send(Realms.this, Broadcast.DEPTH, new ChosenRealm<>(newRealmTO, target));
} else {
target.add(realmChoicePanel.reloadRealmTree(target));
}
target.add(content);
modal.show(false);
});
}
@Override
protected void onClickCreate(final AjaxRequestTarget target) {
this.wizardBuilder.setParentPath(realmChoicePanel.getCurrentRealm().getFullPath());
send(this, Broadcast.EXACT, new AjaxWizard.NewItemActionEvent<RealmTO>(new RealmTO(), target) {
@Override
public String getEventDescription() {
return "realm.new";
}
});
}
@Override
protected void onClickEdit(final AjaxRequestTarget target, final RealmTO realmTO) {
this.wizardBuilder.setParentPath(realmTO.getFullPath());
send(this, Broadcast.EXACT, new AjaxWizard.EditItemActionEvent<RealmTO>(realmTO, target) {
@Override
public String getEventDescription() {
return "realm.edit";
}
});
}
@Override
protected void onClickDelete(final AjaxRequestTarget target, final RealmTO realmTO) {
try {
if (realmTO.getKey() == null) {
throw new Exception("Root realm cannot be deleted");
}
RealmRestClient.delete(realmTO.getFullPath());
RealmTO parent = realmChoicePanel.moveToParentRealm(realmTO.getKey());
target.add(realmChoicePanel.reloadRealmTree(target));
SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
updateRealmContent(parent, selectedIndex);
target.add(content);
} catch (Exception e) {
LOG.error("While deleting realm", e);
// Escape line breaks
SyncopeConsoleSession.get().error(e.getMessage().replace("\n", " "));
}
((BaseWebPage) Realms.this.getPage()).getNotificationPanel().refresh(target);
}
});
return content;
}
public RealmChoicePanel getRealmChoicePanel() {
return realmChoicePanel;
}
}