/**
* 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.releases;
import com.francetelecom.clara.cloud.commons.BusinessException;
import com.francetelecom.clara.cloud.core.service.ManageApplicationRelease;
import com.francetelecom.clara.cloud.core.service.exception.ObjectNotFoundException;
import com.francetelecom.clara.cloud.coremodel.ApplicationRelease;
import com.francetelecom.clara.cloud.presentation.applications.SelectedAppPage;
import com.francetelecom.clara.cloud.presentation.common.BreadcrumbsUpdateEvent;
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.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: Thomas Escalle - tawe8231
* Entity : FT/OLNC/RD/MAPS/MEP/MSE
* Date: 24/08/11
*/
public class ReleaseInformationPanel extends GenericPanel<ApplicationRelease> {
private static final long serialVersionUID = 7576874782887382667L;
private PageParameters params;
private boolean edit = false;
private Form<ApplicationRelease> releaseForm;
private ManageApplicationRelease manageApplicationRelease;
private WebMarkupContainer buttonContainer;
private AjaxLink<Void> cancelButton;
private AjaxLink<Void> editButton;
private AjaxLink<ApplicationRelease> deleteButton;
private AjaxSubmitLink updateButton;
private SelectedReleasePage parentPage;
private boolean canBeDeleted = false;
private TextField<String> version;
private TextArea<String> description;
private TextField<String> middlewareProfileVersion;
public ReleaseInformationPanel(String id, IModel<ApplicationRelease> model, PageParameters params, ManageApplicationRelease manageApplicationRelease, SelectedReleasePage parentPage) {
super(id, model);
this.params = params;
this.manageApplicationRelease = manageApplicationRelease;
this.parentPage = parentPage;
if (params.getNamedKeys().contains("edit")) {
this.edit = params.get("edit").toBoolean();
}
Label releaseLabel = new Label("releaseLabel", new StringResourceModel("portal.release.information.title", new Model(new String[]{model.getObject().getApplication().getLabel()+ " - "+model.getObject().getReleaseVersion()})));
add(releaseLabel);
createEditShowInformationComponent(model);
}
private void createEditShowInformationComponent(IModel<ApplicationRelease> model) {
releaseForm = new Form<>("releaseForm");
releaseForm.setDefaultModel(new CompoundPropertyModel<ApplicationRelease>(model));
version = new TextField<>("releaseVersion");
version.setLabel(new StringResourceModel("portal.release.version.label",null));
version.add(new PropertyValidator<>());
releaseForm.add(version);
description = new TextArea<>("description");
description.setLabel(new StringResourceModel("portal.release.description.label", null));
description.add(new PropertyValidator<>());
releaseForm.add(description);
middlewareProfileVersion = new TextField<>("middlewareProfileVersion");
middlewareProfileVersion.setLabel(new StringResourceModel("portal.release.middlewareProfileVersion.label", null));
middlewareProfileVersion.setEnabled(false);
middlewareProfileVersion.add(new PropertyValidator<>());
releaseForm.add(middlewareProfileVersion);
add(releaseForm);
createButtons();
manageButtonsVisibility();
updateEditableInput();
}
private void createButtons() {
buttonContainer = new WebMarkupContainer("buttonContainer");
editButton = new AjaxLink<Void>("releaseModifyLink") {
@Override
public void onClick(AjaxRequestTarget target) {
setEditable(true, target);
}
};
cancelButton = new AjaxLink<Void>("releaseCancelLink") {
@Override
public void onClick(AjaxRequestTarget target) {
setEditable(false, target);
}
};
deleteButton = new AjaxLink<ApplicationRelease>("releaseDeleteLink", getModel()) {
@Override
public void onClick(AjaxRequestTarget target) {
try {
manageApplicationRelease.deleteApplicationRelease(getModelObject().getUID());
} catch (ObjectNotFoundException e) {
BusinessExceptionHandler handler = new BusinessExceptionHandler(parentPage);
handler.error(e);
target.add(parentPage.getFeedbackPanel());
} catch (BusinessException e) {
BusinessExceptionHandler handler = new BusinessExceptionHandler(parentPage);
handler.error(e);
target.add(parentPage.getFeedbackPanel());
}
if (params.getNamedKeys().contains("releaseUid")) {
params.remove("releaseUid");
}
if (params.getNamedKeys().contains("edit")) {
params.remove("edit");
}
if (params.getNamedKeys().contains("step")) {
params.remove("step");
}
setResponsePage(SelectedAppPage.class, params);
}
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
String releaseLabel = getModelObject().getApplication().getLabel() + " - " + getModelObject().getReleaseVersion();
attributes.getAjaxCallListeners().add(new DeleteConfirmationDecorator(getString("portal.release.action.delete.confirm", new Model<String[]>(new String[]{ releaseLabel }))));
}
};
updateButton = new AjaxSubmitLink("releaseUpdateLink") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
try {
ApplicationRelease applicationRelease = manageApplicationRelease.updateApplicationRelease((ApplicationRelease) form.getModelObject());
form.setDefaultModel(new CompoundPropertyModel<ApplicationRelease>(applicationRelease));
target.add(form);
} catch (ObjectNotFoundException e) {
BusinessExceptionHandler handler = new BusinessExceptionHandler(parentPage);
handler.error(e);
target.add(parentPage.getFeedbackPanel());
}
setEditable(false, target);
List<BreadcrumbsItem> bci = ((SelectedReleasePage) getPage()).getBreadcrumbsItems();
BreadcrumbsItem updatedItem = bci.get(2);
ApplicationRelease updatedRelease = releaseForm.getModelObject();
updatedItem.setName(updatedRelease.getReleaseVersion());
bci.remove(2);
bci.add(updatedItem);
send(getPage(), Broadcast.BREADTH, new BreadcrumbsUpdateEvent(bci, target));
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
setEditable(true, target);
}
};
cancelButton.add(new Label("cancelLabel", new StringResourceModel("portal.release.action.cancel",null)));
editButton.add(new Label("modifyLabel", new StringResourceModel("portal.release.action.modify",null)));
deleteButton.add(new Label("deleteLabel", new StringResourceModel("portal.release.action.delete",null)));
updateButton.add(new Label("updateLabel", new StringResourceModel("portal.release.action.update",null)));
buttonContainer.add(cancelButton);
buttonContainer.add(editButton);
buttonContainer.add(deleteButton);
buttonContainer.add(updateButton);
buttonContainer.setOutputMarkupId(true);
releaseForm.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(getModelObject().getApplication().isEditable());
}
}
private void updateEditableInput() {
version.setEnabled(edit);
description.setEnabled(edit);
}
public void setEditable(boolean editable, AjaxRequestTarget target) {
setEditable(editable);
target.add(buttonContainer);
target.add(releaseForm);
}
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();
}
@Override
protected void onInitialize() {
releaseForm.visitChildren(FormComponent.class, new IVisitor<Component, Void>() {
@Override
public void component(Component object, IVisit<Void> visit) {
object.add(new FieldFeedbackDecorator());
visit.dontGoDeeper();
}
});
super.onInitialize();
}
}