/** * 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.environments; import com.francetelecom.clara.cloud.core.service.exception.ObjectNotFoundException; import com.francetelecom.clara.cloud.presentation.designer.panels.DesignerArchitectureMatrixPanel; import com.francetelecom.clara.cloud.presentation.tools.FieldFeedbackDecorator; import com.francetelecom.clara.cloud.services.dto.EnvironmentDetailsDto; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.bean.validation.PropertyValidator; 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.panel.GenericPanel; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.util.time.Duration; import org.apache.wicket.util.visit.IVisit; import org.apache.wicket.util.visit.IVisitor; import org.slf4j.LoggerFactory; import java.text.SimpleDateFormat; /** * Created by IntelliJ IDEA. * User: Thomas Escalle - tawe8231 * Entity : FT/OLNC/RD/MAPS/MEP/MSE * Date: 08/08/11 */ public class EnvironmentDetailsPanel extends GenericPanel<EnvironmentDetailsDto> { /** * serialUID */ private static final long serialVersionUID = -4295463812796975308L; /** * logger */ private static final transient org.slf4j.Logger logger = LoggerFactory.getLogger(EnvironmentDetailsPanel.class); private SelectedEnvironmentPage parentPage; private EnvironmentPercentPanel<EnvironmentDetailsDto> envProgressBarPanel; private EnvironmentActionPanel<EnvironmentDetailsDto> envActions; private Label envErrorMsgLabel; // private Label internalNameLabel; private Form<EnvironmentDetailsDto> envDetailForm; DesignerArchitectureMatrixPanel envArchitecturePanel; private WebMarkupContainer buttonContainer; private AjaxLink cancelButton; private AjaxLink editButton; private AjaxButton updateButton; private TextArea<String> comment; private boolean edit = false; private boolean isAllStatusMessageVisible = false; private WebMarkupContainer refreshContainer; private EnvironmentOverallsPanel environmentOverallsPanel; private Duration ajaxRefreshPeriod = Duration.milliseconds(10000); public EnvironmentDetailsPanel(String id, IModel<EnvironmentDetailsDto> model) { super(id, model); } /** * construct panel elements */ protected void initComponents() { logger.debug("initComponents"); logger.debug("selected environment name : " + (getModelObject()!= null ? getModelObject().getUid() : "(not set)")); setOutputMarkupId(true); refreshContainer = new WebMarkupContainer("refresh"); initEnvTitle(); initEnvOwner(); initEnvActionsProgressBar(); initEnvActionsButtons(); initEnvErrorMessages(); initEnvInternalName(); initEnvCreationDate(); initEnvOveralls(); initEnvArchitectureMatrix(); initEnvComment(); add(refreshContainer); // add selfUpdaing behaviors on wanted components addBehaviorSelfUpdating(); } private void initEnvTitle() { Label envTitleLabel = new Label("envTitle", getString("portal.environment.details.title", new Model<Object[]>(new Object[]{ getModelObject().getLabel() }))); add(envTitleLabel); } private void initEnvOwner() { Label ownerLabel = new Label("env-owner", getModelObject().getOwnerName()); refreshContainer.add(ownerLabel); } private void initEnvActionsProgressBar() { envProgressBarPanel = new EnvironmentPercentPanel<>("env-status-progressbar", getModel()); envProgressBarPanel.setOutputMarkupId(true); refreshContainer.add(envProgressBarPanel); } private void initEnvActionsButtons() { envActions = new EnvironmentActionPanel<>("env-status-actions", getModel()); envActions.setOutputMarkupId(true); refreshContainer.add(envActions); } private void initEnvErrorMessages() { String envErrorMsg = getModelObject().getStatusMessage(); AjaxLink showHideEllipsis = new AjaxLink("env-status-link") { @Override public void onClick(AjaxRequestTarget target) { if (!isAllStatusMessageVisible) { target.appendJavaScript("document.getElementById('"+envErrorMsgLabel.getMarkupId()+"').removeAttribute('style',0);"); isAllStatusMessageVisible = true; } else { envErrorMsgLabel.add(new AttributeModifier("style",new Model<String>("max-height:50px"))); isAllStatusMessageVisible = false; } target.add(envErrorMsgLabel); } }; add(showHideEllipsis); if ("".equals(envErrorMsg) || envErrorMsg == null) { envErrorMsgLabel = new Label("env-activation-error", new Model(getString("portal.environment.details.activation.nostatus.msg"))); } else { envErrorMsgLabel = new Label("env-activation-error", getModelObject().getStatusMessage()); } envErrorMsgLabel.setOutputMarkupId(true); envErrorMsgLabel.add(new AttributeModifier("title", new Model<String>(envErrorMsg))); envErrorMsgLabel.add(new AttributeModifier("style",new Model<String>("max-height:50px"))); showHideEllipsis.add(envErrorMsgLabel); refreshContainer.add(showHideEllipsis); } private void initEnvInternalName() { String internalName = getModelObject().getInternalName(); internalNameLabel = new Label("env-internal-name", internalName); internalNameLabel.setOutputMarkupId(true); refreshContainer.add(internalNameLabel); } private void initEnvCreationDate() { SimpleDateFormat sdf = new SimpleDateFormat(); sdf.applyPattern(getString("portal.environment.creation.date.format")); Label creationDateLabel; creationDateLabel = new Label("env-creation-date", sdf.format(getModelObject().getCreationDate())); refreshContainer.add(creationDateLabel); } private void initEnvOveralls() { environmentOverallsPanel = new EnvironmentOverallsPanel("env-overalls", getModelObject()); environmentOverallsPanel.setOutputMarkupId(true); refreshContainer.add(environmentOverallsPanel); } private void initEnvArchitectureMatrix() { envArchitecturePanel = new DesignerArchitectureMatrixPanel("env-design", (SelectedEnvironmentPage)getPage(), getModelObject(), true, false); add(envArchitecturePanel); } private void initEnvComment() { envDetailForm = new Form<>("envDetailForm", new CompoundPropertyModel<EnvironmentDetailsDto>(getModel())); comment = new TextArea<>("comment"); comment.setEnabled(false); comment.add(new PropertyValidator<>()); envDetailForm.add(comment); createButtons(); manageButtonsVisibility(); add(envDetailForm); } private void addBehaviorSelfUpdating() { refreshContainer.add(new AjaxSelfUpdatingTimerBehavior(ajaxRefreshPeriod) { @Override protected void onPostProcessTarget(AjaxRequestTarget target) { updateEnvDetailsPanel(target); } }); } public void updateEnvDetailsPanel(AjaxRequestTarget target) { EnvironmentDetailsDto selectedEnvDto; try { selectedEnvDto = parentPage.getManageEnvironment().findEnvironmentDetails(getModelObject().getUid()); } catch (ObjectNotFoundException e) { logger.warn("Environment with uid " + getModelObject().getUid() + " does not exist"); return; } setModelObject(selectedEnvDto); envActions.setModelObject(selectedEnvDto); envActions.modelChanged(); envProgressBarPanel.setModelObject(selectedEnvDto); envProgressBarPanel.modelChanged(); String message = selectedEnvDto.getStatusMessage(); if ("".equals(message) || message == null) { envErrorMsgLabel.setDefaultModel(new Model<String>(getString("portal.environment.details.activation.nostatus.msg"))); } else { envErrorMsgLabel.setDefaultModel(new Model<String>(message)); } envErrorMsgLabel.add(new AttributeModifier("title", new Model<String>(selectedEnvDto.getStatusMessage()))); internalNameLabel.setDefaultModel(new Model<String>(selectedEnvDto.getInternalName())); environmentOverallsPanel.setDefaultModel(new Model<EnvironmentDetailsDto>(selectedEnvDto)); envArchitecturePanel.setEnvDetailsDto(selectedEnvDto); envArchitecturePanel.updateTable(); target.add(internalNameLabel); //test target.add(environmentOverallsPanel); target.add(envActions); target.add(envProgressBarPanel); target.add(envErrorMsgLabel); target.add(envArchitecturePanel); } @Override protected void onModelChanged() { super.onModelChanged(); } private void createButtons() { buttonContainer = new WebMarkupContainer("buttonContainer"); editButton = new AjaxLink("releaseModifyLink") { @Override public void onClick(AjaxRequestTarget target) { applyModificationOnComponents(true, target); } }; cancelButton = new AjaxLink("releaseCancelLink") { @Override public void onClick(AjaxRequestTarget target) { applyModificationOnComponents(false, target); } }; updateButton = new AjaxButton("releaseUpdateLink") { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { parentPage.getManageEnvironment().update(EnvironmentDetailsPanel.this.getModelObject()); applyModificationOnComponents(false, target); target.add(form); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { applyModificationOnComponents(true, target); target.add(form); } }; cancelButton.add(new Label("cancelLabel", new Model(getString("portal.action.cancel")))); editButton.add(new Label("modifyLabel", new Model(getString("portal.action.modify")))); updateButton.add(new Label("updateLabel", new Model(getString("portal.action.update")))); buttonContainer.add(cancelButton); buttonContainer.add(editButton); buttonContainer.add(updateButton); buttonContainer.setOutputMarkupId(true); buttonContainer.setVisible(getModelObject().isEditable()); envDetailForm.add(buttonContainer); } private void applyModificationOnComponents(boolean edit, AjaxRequestTarget target) { this.edit = edit; manageButtonsVisibility(); comment.setEnabled(edit); target.add(comment); target.add(buttonContainer); } private void manageButtonsVisibility() { cancelButton.setVisible(edit); updateButton.setVisible(edit); editButton.setVisible(!edit); } @Override protected void onInitialize() { this.parentPage = (SelectedEnvironmentPage) getPage(); initComponents(); envDetailForm.visitChildren(FormComponent.class, new IVisitor<Component, Void>() { @Override public void component(Component object, IVisit<Void> visit) { object.add(new FieldFeedbackDecorator()); visit.dontGoDeeper(); } }); super.onInitialize(); } }