/**
* 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.commons.AuthorizationException;
import com.francetelecom.clara.cloud.commons.BusinessException;
import com.francetelecom.clara.cloud.core.service.ManageApplication;
import com.francetelecom.clara.cloud.core.service.exception.*;
import com.francetelecom.clara.cloud.coremodel.Application;
import com.francetelecom.clara.cloud.coremodel.ApplicationRelease;
import com.francetelecom.clara.cloud.coremodel.SSOId;
import com.francetelecom.clara.cloud.presentation.HomePage;
import com.francetelecom.clara.cloud.presentation.common.Breadcrumbs;
import com.francetelecom.clara.cloud.presentation.common.NavigationMenuFirstLevel;
import com.francetelecom.clara.cloud.presentation.common.WicketUtils;
import com.francetelecom.clara.cloud.presentation.designer.pages.DesignerHelperPage;
import com.francetelecom.clara.cloud.presentation.designer.pages.DesignerPage;
import com.francetelecom.clara.cloud.presentation.models.FirstApplicationReleaseInfos;
import com.francetelecom.clara.cloud.presentation.tools.BreadcrumbsItem;
import com.francetelecom.clara.cloud.presentation.tools.BusinessExceptionHandler;
import com.francetelecom.clara.cloud.presentation.tools.WicketSession;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
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.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.LoggerFactory;
import org.wicketstuff.annotation.mount.MountPath;
import java.net.URL;
import java.util.*;
/**
* ApplicationsPage
* <p>
* panel used to create an application release
* <p>
* Last update : $LastChangedDate$ Last author : $Author$
*
* @version : $Revision$
*/
@MountPath("/applications")
@AuthorizeInstantiation({"ROLE_USER","ROLE_ADMIN"})
public class ApplicationsPage extends DesignerHelperPage {
private static final long serialVersionUID = -1549651870557920802L;
private static final transient org.slf4j.Logger logger = LoggerFactory.getLogger(ApplicationsPage.class);
public static SSOId[] toSSOIdsArray(String membersStr) {
membersStr = membersStr.replaceAll("\\s+", " ").trim();
String[] members = membersStr == null ? new String[0] : membersStr.split(" ");
SSOId[] ssoIds = new SSOId[members.length];
for (int i = 0; i < members.length; i++) {
ssoIds[i] = new SSOId(members[i]);
}
return ssoIds;
}
public static Set<SSOId> toSSOIdsSet(String membersStr) {
membersStr = membersStr.replaceAll("\\s+", " ").trim();
String[] members = membersStr == null ? new String[0] : membersStr.split(" ");
Set<SSOId> ssoIds = new HashSet<>();
for (int i = 0; i < members.length; i++) {
ssoIds.add(new SSOId(members[i]));
}
return ssoIds;
}
@SpringBean
private ManageApplication manageApplication;
private WebMarkupContainer container;
private final PageParameters params = new PageParameters();
private ApplicationCreatePanel appCreatePanel;
AjaxLink newApp;
WebMarkupContainer buttonContainer;
ApplicationsTablePanel appsTablePanel;
FeedbackPanel feedback;
public ApplicationsPage(PageParameters params) {
super(params);
initComponents();
}
private void initComponents() {
setPagetitle();
createFirstLevelNavigation();
createBreadCrumbs();
createGlobalFeedbackPanel();
createEmptyAppFormPanel();
createNewAppButton();
createAppsTable();
}
private void createFirstLevelNavigation() {
NavigationMenuFirstLevel navFirstLvl = new NavigationMenuFirstLevel();
add(navFirstLvl);
}
private void setPagetitle() {
/* set head page title to display in browser title bar */
add(new Label("head_page_title", WicketUtils.getStringResourceModel(this, "portal.design.web.title.applications.home")));
}
private void createBreadCrumbs() {
List<BreadcrumbsItem> breadcrumbsItems = new ArrayList<BreadcrumbsItem>();
breadcrumbsItems.add(new BreadcrumbsItem(HomePage.class, "portal.design.breadcrumbs.homepage", null, false));
breadcrumbsItems.add(new BreadcrumbsItem(this.getClass(), params, "portal.design.breadcrumbs.applications.home", null, true));
Breadcrumbs breadcrumbs = new Breadcrumbs("breadcrumbs", breadcrumbsItems);
add(breadcrumbs);
}
private void createGlobalFeedbackPanel() {
feedback = new FeedbackPanel("feedback");
feedback.setOutputMarkupId(true);
add(feedback);
}
private void createEmptyAppFormPanel() {
container = new WebMarkupContainer("createAppContainer");
container.setOutputMarkupId(true);
container.setOutputMarkupPlaceholderTag(true);
container.add(new EmptyPanel("appCreateForm"));
add(container);
}
private void createNewAppButton() {
buttonContainer = new WebMarkupContainer("buttonContainer");
buttonContainer.setOutputMarkupId(true);
// create link
newApp = new AjaxLink("newAppLink") {
private static final long serialVersionUID = 4466738576333544274L;
@Override
public void onClick(AjaxRequestTarget target) {
appCreatePanel = new ApplicationCreatePanel("appCreateForm", manageApplicationRelease);
// container.remove("appCreateForm");
// container.add(appCreatePanel);
container.replace(appCreatePanel);
target.add(container);
this.setVisible(false);
target.add(buttonContainer);
}
};
newApp.setMarkupId("newAppLink");
buttonContainer.add(newApp);
add(buttonContainer);
}
private void createAppsTable() {
appsTablePanel = new ApplicationsTablePanel("appsTablePanel");
appsTablePanel.setOutputMarkupId(true);
add(appsTablePanel);
}
public void addFirstApplicationCreation(Form<?> form, AjaxRequestTarget target, ApplicationRelease appRelease, String currentMiddlewareProfile) {
String action = "create first application ";
FirstApplicationReleaseInfos appFirstApplicationReleaseInfos = (FirstApplicationReleaseInfos) form.getModelObject();
String appUid;
try {
String applicationCode = appFirstApplicationReleaseInfos.getAppCode();
String applicationLabel = appFirstApplicationReleaseInfos.getAppLabel();
String applicationDescription = appFirstApplicationReleaseInfos.getAppDescription();
Boolean applicationPublic = appFirstApplicationReleaseInfos.getAppPublic();
SSOId[] members = toSSOIdsArray(appFirstApplicationReleaseInfos.getMembers());
action += " appCode=" + applicationCode + " appLabel=" + applicationLabel + " appDescription=" + applicationDescription + " appPublic="
+ applicationPublic + " users=" + Arrays.toString(members);
logger.info(action);
if(applicationPublic.booleanValue()) {
appUid = manageApplication.createPublicApplication(applicationCode, applicationLabel, applicationDescription, null, members);
} else {
appUid = manageApplication.createPrivateApplication(applicationCode, applicationLabel, applicationDescription, null, members);
}
params.set("appUid", appUid);
} catch (DuplicateApplicationException e) {
logger.warn("Error (DuplicateApplicationException) while {} : {}", action, e.getMessage());
BusinessExceptionHandler.addError(target, feedback, e);
return;
} catch (PaasUserNotFoundException e) {
logger.warn("Error (PaasUserNotFoundException) while {} : {}", action, e.getMessage());
BusinessExceptionHandler.addError(target, feedback, e);
return;
} catch (AuthorizationException e) {
logger.warn("Error (AuthorizationException) while {} : {}", action, e.getMessage());
BusinessExceptionHandler.addError(target, feedback, new BusinessException(getString("portal.application.notmember")));
return;
}
String releaseUid;
try {
action = "create first application release";
String releaseUser = WicketSession.get().getPaasUser().getSsoId().getValue();
String releaseVersion = appFirstApplicationReleaseInfos.getReleaseVersion();
String releaseDescription = appFirstApplicationReleaseInfos.getDescription();
URL releaseVersionControlUrl = appFirstApplicationReleaseInfos.getVersionControlUrl();
action += " releaseUser=" + releaseUser + " releaseVersion=" + releaseVersion + " releaseMiddlewareProfile=" + currentMiddlewareProfile
+ " releaseDescription=" + releaseDescription;
logger.info(action);
// Creates and persists release
releaseUid = manageApplicationRelease.createApplicationRelease(appUid, releaseUser, releaseVersion, releaseDescription,
releaseVersionControlUrl, currentMiddlewareProfile);
params.set("releaseUid", releaseUid);
} catch (ObjectNotFoundException e) {
BusinessExceptionHandler.addError(target, feedback, e);
return;
} catch (DuplicateApplicationReleaseException e) {
BusinessExceptionHandler.addError(target, feedback, e);
return;
}
try {
if (appCreatePanel.shouldFork()) {
action += " cloning " + appRelease.toString();
manageLogicalDeployment.cloneLogicalDeployment(appRelease.getUID(), releaseUid);
}
} catch (InvalidReleaseException e) {
logger.warn("Error (InvalidReleaseException) while {} : {}", action, e.getMessage());
BusinessExceptionHandler.addError(target, feedback, e);
return;
}
String successMsg = getString("portal.application.creation.successful",
new Model<Object[]>(
new Object[] { appFirstApplicationReleaseInfos.getAppLabel(), appFirstApplicationReleaseInfos.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);
}
}
public void cancelFirstApplicationCreation(AjaxRequestTarget target) {
resetPage(target);
}
private void resetPage(AjaxRequestTarget target) {
newApp.setVisible(true);
target.add(buttonContainer);
container.replace(new EmptyPanel("appCreateForm"));
target.add(container);
}
public void deleteApplication(AjaxRequestTarget target, Application app) {
try {
manageApplication.deleteApplication(app.getUID());
target.add(appsTablePanel);
} catch (ObjectNotFoundException e) {
BusinessExceptionHandler handler = new BusinessExceptionHandler(feedback);
handler.error(e);
}
}
public ManageApplication getManageApplication() {
return manageApplication;
}
// We need this method for wicket tester
@Override
public PageParameters getPageParameters() {
return params;
}
@Override
public FeedbackPanel getFeedbackPanel() {
return this.feedback;
}
public boolean isApplicationLabelUnique(String appLabel) {
try {
return manageApplication.isApplicationLabelUnique(appLabel);
} catch (BusinessException e) {
BusinessExceptionHandler handler = new BusinessExceptionHandler(feedback);
handler.error(e);
return false;
}
}
}