/*******************************************************************************
* Copyright (c) 2013 AGETO Service GmbH and others.
* All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Gunnar Wagenknecht - initial API and implementation
*******************************************************************************/
package org.eclipse.gyrex.admin.ui.logback.internal;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.gyrex.admin.ui.internal.widgets.NonBlockingMessageDialogs;
import org.eclipse.gyrex.admin.ui.logback.configuration.wizard.AppenderConfigurationWizardAdapter;
import org.eclipse.gyrex.admin.ui.logback.configuration.wizard.AppenderConfigurationWizardSession;
import org.eclipse.gyrex.logback.config.model.Appender;
import org.eclipse.gyrex.logback.config.model.LogbackConfig;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A wizard for updating/creating appenders.
*/
public class AddEditAppenderWizard extends Wizard {
private static final Logger LOG = LoggerFactory.getLogger(AddEditAppenderWizard.class);
private static final IWizardPage[] NO_PAGES = new IWizardPage[0];
private final Map<String, AppenderConfigurationWizardSession> sessionsByAppenderTypeId = new HashMap<String, AppenderConfigurationWizardSession>(2);
private final LogbackConfig logbackConfig;
private final Appender appender;
private final AppenderWizardPage appenderTypeWizardPage;
private AppenderConfigurationWizardSession currentSession;
public AddEditAppenderWizard(final LogbackConfig logbackConfig, final Appender appender) {
this.logbackConfig = logbackConfig;
this.appender = appender;
appenderTypeWizardPage = new AppenderWizardPage(appender);
// force previous and next buttons (we don't know about potential job type pages)
setForcePreviousAndNextButtons(true);
}
@Override
public void addPages() {
addPage(appenderTypeWizardPage);
}
@Override
public boolean canFinish() {
return appenderTypeWizardPage.isPageComplete() && (currentSession != null) && currentSession.canFinish();
}
void clearCurrentAppenderConfigurationSession() {
currentSession = null;
getContainer().showPage(appenderTypeWizardPage);
}
@Override
public IWizardPage getNextPage(final IWizardPage page) {
// REMINDER: this logic is inverted in #getPreviousPage
// the flow is as follows
// first: appenderTypeWizardPage (if available)
// 2-..: job type specific pages
final IWizardPage[] sessionPages = null != currentSession ? currentSession.getPages() : NO_PAGES;
if (page == appenderTypeWizardPage) {
if (sessionPages.length > 0)
// show first job type page after scheduleEntryPage
return sessionPages[0];
else
// no next page
return null;
}
// find the current job type page
for (int i = 0; i < sessionPages.length; i++) {
if (page == sessionPages[i]) {
if ((i + 1) < sessionPages.length)
// show next job type page
return sessionPages[i + 1];
else
// no next page
return null;
}
}
// no next page
return null;
}
@Override
public IWizardPage getPreviousPage(final IWizardPage page) {
// REMINDER: this logic is inverted in #getPreviousPage
// the flow is as follows
// first: appenderTypeWizardPage
// 2-..: job type specific pages
final IWizardPage[] sessionPages = null != currentSession ? currentSession.getPages() : NO_PAGES;
if (page == appenderTypeWizardPage)
// no previous page for the first page
return null;
// find the current job type page
for (int i = sessionPages.length - 1; i >= 0; i--) {
if (page == sessionPages[i]) {
if ((i - 1) >= 0)
// show previous job type page
return sessionPages[i - 1];
else
// previous page is appenderTypeWizardPage if not in edit mode
return isEditMode() ? null : appenderTypeWizardPage;
}
}
// no previous page
return null;
}
public LogbackConfig getSchedule() {
return logbackConfig;
}
public Appender getScheduleEntry() {
return appender;
}
void initializeCurrentAppenderConfigurationSession(final String id, final String name, final AppenderConfigurationWizardAdapter wizardAdapter) {
if (!sessionsByAppenderTypeId.containsKey(id)) {
final AppenderConfigurationWizardSession session = new AppenderConfigurationWizardSession(id, name);
session.setAppender(appender);
sessionsByAppenderTypeId.put(id, session);
}
final AppenderConfigurationWizardSession session = sessionsByAppenderTypeId.get(id);
if (session == currentSession)
// nothing changed
return;
// lazy initialize pages
if (null == session.getPages()) {
final IWizardPage[] pages = wizardAdapter != null ? wizardAdapter.createPages(session) : new IWizardPage[0];
if (pages != null) {
session.setPages(pages);
for (final IWizardPage page : pages) {
addPage(page);
}
} else {
LOG.debug("No pages returned for job type {} (adapter {})", id, wizardAdapter);
session.setPages(NO_PAGES);
}
}
currentSession = session;
if (null != getContainer().getCurrentPage()) {
getContainer().updateButtons();
}
}
public final boolean isEditMode() {
return appender != null;
}
@Override
public boolean performFinish() {
try {
return true;
} catch (final Exception | LinkageError | AssertionError e) {
// handle error
LOG.debug("Error adding appender. ", e);
NonBlockingMessageDialogs.openError(getShell(), "Error Updating Appender", "Unable to update appender. " + e.getMessage(), null);
return false;
}
}
}