/**
* 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.core.service.ManageApplication;
import com.francetelecom.clara.cloud.core.service.ManageApplicationRelease;
import com.francetelecom.clara.cloud.core.service.exception.DuplicateApplicationReleaseException;
import com.francetelecom.clara.cloud.core.service.exception.InvalidReleaseException;
import com.francetelecom.clara.cloud.core.service.exception.ObjectNotFoundException;
import com.francetelecom.clara.cloud.coremodel.Application;
import com.francetelecom.clara.cloud.coremodel.ApplicationRelease;
import com.francetelecom.clara.cloud.deployment.logical.service.ManageLogicalDeployment;
import com.francetelecom.clara.cloud.presentation.applications.SelectedAppPage;
import com.francetelecom.clara.cloud.presentation.common.ReleaseFieldsetPanel;
import com.francetelecom.clara.cloud.presentation.designer.pages.DesignerHelperPage;
import com.francetelecom.clara.cloud.presentation.designer.pages.DesignerPage;
import com.francetelecom.clara.cloud.presentation.tools.BusinessExceptionHandler;
import com.francetelecom.clara.cloud.presentation.tools.FieldFeedbackDecorator;
import com.francetelecom.clara.cloud.presentation.tools.WicketSession;
import org.apache.wicket.Component;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
import org.slf4j.LoggerFactory;
import java.net.URL;
/**
* ReleaseCreatePanel
*
* panel used to create an application release
*
* Last update : $LastChangedDate$
* Last author : $Author$
*
* @version : $Revision$
*/
public class ReleaseCreatePanel extends Panel {
/**
* serialUID
*/
private static final long serialVersionUID = -650534211762690554L;
/**
* logger
*/
private static final transient org.slf4j.Logger logger = LoggerFactory.getLogger(ReleaseCreatePanel.class);
@SpringBean
private ManageLogicalDeployment mangeLogicalDeployment;
private final ManageApplication manageApplication;
private final ManageApplicationRelease manageApplicationRelease;
private final Application app;
private final DesignerHelperPage parentPage;
private Form<ApplicationRelease> releaseForm;
private ReleaseFieldsetPanel releaseFieldsetPanel;
public ReleaseCreatePanel(String id, Application app, ManageApplication manageApplication,
ManageApplicationRelease manageApplicationRelease,DesignerHelperPage parentPage) {
super(id);
this.manageApplication = manageApplication;
this.manageApplicationRelease = manageApplicationRelease;
this.app = app;
this.parentPage = parentPage;
initComponents();
}
private void initComponents() {
createReleaseForm();
}
private void createReleaseForm() {
ApplicationRelease release = new ApplicationRelease();
if (app != null) {
release.setApplication(app);
}
releaseForm = new Form<>("releaseForm", new CompoundPropertyModel<ApplicationRelease>(release));
// if no app is selected then show the drop down
boolean showSelectedApp = (app == null);
releaseFieldsetPanel = new ReleaseFieldsetPanel("releaseFieldsetPanel", parentPage, app,
manageApplication, manageApplicationRelease, showSelectedApp);
releaseForm.add(releaseFieldsetPanel);
createFormButtons(releaseForm, releaseFieldsetPanel);
add(releaseForm);
}
private void createFormButtons(Form<ApplicationRelease> applicationReleaseForm, final ReleaseFieldsetPanel releaseFieldsetPanel) {
// Add first release button
AjaxButton addButton = new AjaxButton("addReleaseButton") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
addReleaseCreation(form, target, releaseFieldsetPanel);
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.add(form);
}
};
addButton.setOutputMarkupId(true);
applicationReleaseForm.add(addButton);
// Cancel release add / update button
AjaxButton cancelButton = new AjaxButton("cancelReleaseButton") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
if (getPage() instanceof SelectedAppPage) {
((SelectedAppPage) getPage()).cancelReleaseCreation(target);
} else {
((ReleasesPage) getPage()).cancelReleaseCreation(target);
}
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.add(form);
}
};
cancelButton.setOutputMarkupId(true);
cancelButton.setDefaultFormProcessing(false);
applicationReleaseForm.add(cancelButton);
}
public void addReleaseCreation(Form<?> form, AjaxRequestTarget target, ReleaseFieldsetPanel releaseFieldsetPanel) {
PageParameters params = new PageParameters();
ApplicationRelease releaseDisconnected = (ApplicationRelease) form.getModelObject();
params.set("appUid", releaseDisconnected.getApplication().getUID());
String releaseUid;
String action = "create application release";
String middlewareProfile = releaseFieldsetPanel.getCurrentMiddlewareProfile();
boolean shouldFork = releaseFieldsetPanel.shouldFork();
String applicationUid = releaseDisconnected.getApplication().getUID();
String appReleaseAuthor = WicketSession.get().getPaasUser().getSsoId().getValue();
String appReleaseVersion = releaseDisconnected.getReleaseVersion();
String appReleaseDescription = releaseDisconnected.getDescription();
URL appReleaseVersionControlUrl = releaseDisconnected.getVersionControlUrl();
action += " uid="+ applicationUid
+" appReleaseAuthor=" +appReleaseAuthor
+" appReleaseVersion=" +appReleaseVersion
+" middlewareProfile=" +middlewareProfile
+" appReleaseDescription=" +appReleaseDescription;
logger.info(action);
try {
releaseUid = manageApplicationRelease.createApplicationRelease(
applicationUid, appReleaseAuthor, appReleaseVersion,
appReleaseDescription, appReleaseVersionControlUrl,
middlewareProfile);
params.set("releaseUid", releaseUid);
} catch (ObjectNotFoundException e) {
logger.warn("Error (objectNotFound) while {} : {}", action, e.getMessage());
BusinessExceptionHandler.addError(target, parentPage.getFeedbackPanel(), e);
return;
} catch (DuplicateApplicationReleaseException e) {
logger.warn("Error (DuplicateApplicationReleaseException) while {} : {}", action, e.getMessage());
BusinessExceptionHandler.addError(target, parentPage.getFeedbackPanel(), e);
return;
}
if (shouldFork) {
try {
ApplicationRelease appReleaseToClone = releaseFieldsetPanel.getAppRelease();
action += " cloning " + appReleaseToClone.toString();
mangeLogicalDeployment.cloneLogicalDeployment(appReleaseToClone.getUID(), releaseUid);
} catch (InvalidReleaseException e) {
logger.warn("Error (InvalidReleaseException) while {} : {}", action, e.getMessage());
BusinessExceptionHandler.addError(target, parentPage.getFeedbackPanel(), e);
return;
}
}
String successMsg = getString("portal.release.creation.successful",
new Model<Object[]>(new Object[] { releaseDisconnected.getApplication().getLabel(),
releaseDisconnected.getReleaseVersion() }));
try {
action = "going to result page (designer)";
DesignerPage designerPage = new DesignerPage(params);
Session.get().info(successMsg);
setResponsePage(designerPage);
} catch (Throwable e) {
logger.error("Exception while " + action + ":" + e.getMessage(), e);
}
}
@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();
}
}