/**
* Copyright (C) 2015 Orange
* Licensed 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 com.francetelecom.clara.cloud.presentation.applications;
import com.francetelecom.clara.cloud.core.service.exception.ApplicationNotFoundException;
import com.francetelecom.clara.cloud.core.service.exception.DuplicateApplicationException;
import com.francetelecom.clara.cloud.core.service.exception.PaasUserNotFoundException;
import com.francetelecom.clara.cloud.coremodel.Application;
import com.francetelecom.clara.cloud.coremodel.SSOId;
import com.francetelecom.clara.cloud.presentation.common.BreadcrumbsUpdateEvent;
import com.francetelecom.clara.cloud.presentation.common.WicketUtils;
import com.francetelecom.clara.cloud.presentation.resource.CacheActivatedImage;
import com.francetelecom.clara.cloud.presentation.tools.BreadcrumbsItem;
import com.francetelecom.clara.cloud.presentation.tools.BusinessExceptionHandler;
import com.francetelecom.clara.cloud.presentation.tools.DeleteConfirmationDecorator;
import com.francetelecom.clara.cloud.presentation.tools.FieldFeedbackDecorator;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.bean.validation.PropertyValidator;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.*;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.List;
/**
* ApplicationInformationPanel
* Panel which show the application informations
*
* User: Thomas Escalle - tawe8231
* Entity : FT/OLNC/RD/MAPS/MEP/MSE
* Updated : $LastChangedDate$
* @author : $Author$
* @version : $Revision$
*/
public class ApplicationInformationPanel extends Panel {
private static final long serialVersionUID = -8830804742137615642L;
private boolean edit = false;
private Form<Application> appForm;
private WebMarkupContainer buttonContainer;
private AjaxLink cancelButton;
private AjaxLink editButton;
private AjaxLink deleteButton;
private AjaxSubmitLink updateButton;
private SelectedAppPage parentPage;
private boolean canBeDeleted = false;
private TextField<String> label;
private TextField<String> code;
private TextArea<String> description;
private RadioGroup<Boolean> appVisibility;
private TextField<String> users;
// Field must match a list of members separated by spaces,
// the "central" regular expression must be the same as in SSOId class
@NotNull
@Pattern(regexp="(\\b[a-zA-Z]+[0-9]*\\b\\s*)+", message="{portal.application.members.label.javax.validation}")
private String members;
public ApplicationInformationPanel(String id, Application app, PageParameters params, SelectedAppPage parentPage) {
super(id);
this.parentPage = parentPage;
if (params.getNamedKeys().contains("edit")) {
this.edit = params.get("edit").toBoolean();
}
String applicationLabel = app.getLabel();
Label appLabel = new Label("applicationLabel",
new StringResourceModel("portal.application.information.title",
new Model<String[]>(new String[]{applicationLabel})));
add(appLabel);
createEditShowInformationComponent(app);
}
private StringResourceModel getStringResourceModel(java.lang.String key) {
// BVA fix Localizer warning : cf. https://issues.apache.org/jira/browse/WICKET-990
return new StringResourceModel(key, this, null);
}
private void createEditShowInformationComponent(Application app) {
appForm = new Form<>("appForm");
appForm.setDefaultModel(new CompoundPropertyModel<Application>(app));
label = new TextField<>("label");
label.setLabel(WicketUtils.getStringResourceModel(this, "portal.application.label.label"));
label.add(new PropertyValidator<>());
appForm.add(label);
code = new TextField<>("code");
code.setLabel(WicketUtils.getStringResourceModel(this, "portal.application.code.label"));
code.add(new PropertyValidator<>());
appForm.add(code);
appVisibility = new RadioGroup<>("isPublic");
appVisibility.add(new Radio<Boolean>("appVisibilityRadioGroup-public", new Model<>(Boolean.TRUE)));
appVisibility.add(new Radio<Boolean>("appVisibilityRadioGroup-private", new Model<>(Boolean.FALSE)));
appVisibility.add(new PropertyValidator<>());
appVisibility.setLabel(WicketUtils.getStringResourceModel(this, "portal.application.visibility.label"));
users = new TextField<>("members", new PropertyModel<String>(this, "members"));
users.add(new PropertyValidator<>());
appForm.add(users);
appForm.add(new CacheActivatedImage("membersHelp", new ResourceModel("image.help").getObject()));
appForm.add(appVisibility);
description = new TextArea<>("description");
description.setLabel(WicketUtils.getStringResourceModel(this, "portal.application.description.label"));
description.add(new PropertyValidator<>());
appForm.add(description);
add(appForm);
createButtons();
manageButtonsVisibility();
updateEditableInput();
}
private void createButtons() {
buttonContainer = new WebMarkupContainer("buttonContainer");
editButton = new AjaxLink("appModifyLink") {
@Override
public void onClick(AjaxRequestTarget target) {
setEditable(true, target);
}
};
cancelButton = new AjaxLink("appCancelLink") {
@Override
public void onClick(AjaxRequestTarget target) {
setEditable(false, target);
}
};
deleteButton = new AjaxLink("appDeleteLink") {
@Override
public void onClick(AjaxRequestTarget target) {
parentPage.deleteApplication(target, appForm.getModelObject());
setResponsePage(ApplicationsPage.class);
}
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
String applicationLabel = appForm.getModelObject().getLabel();
attributes.getAjaxCallListeners().add(new DeleteConfirmationDecorator(getString("portal.application.action.delete.confirm", new Model<String[]>(new String[]{ applicationLabel }))));
}
};
updateButton = new AjaxSubmitLink("appUpdateLink") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
try {
parentPage.updateApplication(target, (Form<Application>) form, members);
setEditable(false, target);
List<BreadcrumbsItem> bci = ((SelectedAppPage) getPage()).getBreadcrumbsItems();
BreadcrumbsItem updatedItem = bci.get(1);
updatedItem.setName(appForm.getModelObject().getLabel());
bci.remove(1);
bci.add(updatedItem);
send(getPage(), Broadcast.BREADTH, new BreadcrumbsUpdateEvent(bci, target));
} catch (ApplicationNotFoundException | DuplicateApplicationException | PaasUserNotFoundException e) {
BusinessExceptionHandler.addError(target, parentPage.getFeedbackPanel(), e);
}
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
setEditable(true, target);
}
};
cancelButton.add(new Label("cancelLabel", getStringResourceModel("portal.application.action.cancel")));
editButton.add(new Label("modifyLabel", getStringResourceModel("portal.application.action.modify")));
deleteButton.add(new Label("deleteLabel", getStringResourceModel("portal.application.action.delete")));
updateButton.add(new Label("updateLabel", getStringResourceModel("portal.application.action.update")));
buttonContainer.add(cancelButton);
buttonContainer.add(editButton);
buttonContainer.add(deleteButton);
buttonContainer.add(updateButton);
buttonContainer.setOutputMarkupId(true);
appForm.add(buttonContainer);
}
private void manageButtonsVisibility() {
if (edit) {
cancelButton.setVisible(true);
updateButton.setVisible(true);
deleteButton.setVisible(false);
editButton.setVisible(false);
} else {
cancelButton.setVisible(false);
updateButton.setVisible(false);
deleteButton.setVisible(canBeDeleted);
editButton.setVisible(appForm.getModelObject().isEditable());
}
}
private void updateEditableInput() {
label.setEnabled(edit);
description.setEnabled(edit);
code.setEnabled(edit);
appVisibility.setEnabled(edit);
users.setEnabled(edit);
}
public void setEditable(boolean editable, AjaxRequestTarget target) {
setEditable(editable);
target.add(buttonContainer);
target.add(appForm);
}
public void setEditable(boolean editable) {
this.edit = editable;
manageButtonsVisibility();
updateEditableInput();
}
public void setCanBeDeleted(boolean canBeDeleted, AjaxRequestTarget target) {
setCanBeDeleted(canBeDeleted);
target.add(buttonContainer);
}
public void setCanBeDeleted(boolean canBeDeleted) {
this.canBeDeleted = canBeDeleted;
manageButtonsVisibility();
}
public void setMembers(List<SSOId> membersList) {
members = "";
for (SSOId member : membersList) {
members += member.getValue();
members += " ";
}
}
@Override
protected void onInitialize() {
appForm.visitChildren(FormComponent.class, new IVisitor<Component, Void>() {
@Override
public void component(Component object, IVisit<Void> visit) {
object.add(new FieldFeedbackDecorator());
visit.dontGoDeeper();
}
});
super.onInitialize();
}
}