/*
* Copyright (c) 2004-2011 Marco Maccaferri 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:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.repository.hibernate.internal.ui;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.namespace.QName;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipsetrader.repository.hibernate.HibernateRepository;
import org.eclipsetrader.repository.hibernate.internal.Activator;
import org.eclipsetrader.repository.hibernate.internal.RepositoryDefinition;
public class RepositoryWizard extends Wizard implements INewWizard {
private Shell shell;
private DatabaseSelectionPage databaseSelectionPage;
private RepositoryDetailsPage repositoryDetailsPage;
public RepositoryWizard() {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
*/
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
shell = workbench.getActiveWorkbenchWindow().getShell();
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#addPages()
*/
@Override
public void addPages() {
setWindowTitle("Hibernate Repository");
addPage(databaseSelectionPage = new DatabaseSelectionPage());
addPage(repositoryDetailsPage = new RepositoryDetailsPage() {
@Override
protected void doSettingsValidation() {
RepositoryDefinition repository = getDefinition();
HibernateRepository hibernateRepository = new HibernateRepository(repository);
try {
hibernateRepository.startUp(new NullProgressMonitor());
MessageDialog.openInformation(getShell(), "EclipseTrader", "Database created or updated successfully!");
} catch (Exception e) {
Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "Error validating repository", e);
Activator.log(status);
ErrorDialog.openError(getShell(), "EclipseTrader", "Database not created or update failed.", status);
}
hibernateRepository.shutDown(new NullProgressMonitor());
}
});
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
*/
@Override
public IWizardPage getNextPage(IWizardPage page) {
if (page == databaseSelectionPage) {
DatabaseElement element = databaseSelectionPage.getSelection();
repositoryDetailsPage.setDefaultName(element.getLabel());
repositoryDetailsPage.setDefaultSchema(element.getSchema());
repositoryDetailsPage.setDefaultUrl(element.getUrl());
}
return super.getNextPage(page);
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#performFinish()
*/
@Override
public boolean performFinish() {
List<RepositoryDefinition> list = new ArrayList<RepositoryDefinition>();
File file = Activator.getDefault().getStateLocation().append(Activator.REPOSITORIES_FILE).toFile();
try {
if (file.exists()) {
JAXBContext jaxbContext = JAXBContext.newInstance(RepositoryDefinition[].class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent event) {
Status status = new Status(IStatus.WARNING, Activator.PLUGIN_ID, 0, "Error validating XML: " + event.getMessage(), null); //$NON-NLS-1$
Activator.getDefault().getLog().log(status);
return true;
}
});
JAXBElement<RepositoryDefinition[]> element = unmarshaller.unmarshal(new StreamSource(file), RepositoryDefinition[].class);
list.addAll(Arrays.asList(element.getValue()));
}
} catch (Exception e) {
Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "Error reading repository configuration", e); //$NON-NLS-1$
Activator.getDefault().getLog().log(status);
}
RepositoryDefinition repository = getDefinition();
list.add(repository);
try {
JAXBContext jaxbContext = JAXBContext.newInstance(RepositoryDefinition[].class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent event) {
Status status = new Status(IStatus.WARNING, Activator.PLUGIN_ID, 0, "Error validating XML: " + event.getMessage(), null); //$NON-NLS-1$
Activator.getDefault().getLog().log(status);
return true;
}
});
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_ENCODING, System.getProperty("file.encoding")); //$NON-NLS-1$
JAXBElement<RepositoryDefinition[]> element = new JAXBElement<RepositoryDefinition[]>(new QName("list"), RepositoryDefinition[].class, list.toArray(new RepositoryDefinition[list.size()]));
marshaller.marshal(element, new FileWriter(file));
} catch (Exception e) {
Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "Error writing repository configuration", e); //$NON-NLS-1$
Activator.getDefault().getLog().log(status);
}
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
if (MessageDialog.openQuestion(shell, "EclipseTrader", "The workbench must be restarted for the changes to take effect.\r\nRestart the workbench now ?")) {
PlatformUI.getWorkbench().restart();
}
}
});
return true;
}
RepositoryDefinition getDefinition() {
RepositoryDefinition repository = new RepositoryDefinition();
repository.setDatabaseDriver(databaseSelectionPage.getDriver());
repository.setDialect(databaseSelectionPage.getDialect());
repository.setSchema(repositoryDetailsPage.getSchema());
repository.setLabel(repositoryDetailsPage.getLabel());
repository.setUrl(repositoryDetailsPage.getUrl());
repository.setUser(repositoryDetailsPage.getUserName());
repository.setPassword(repositoryDetailsPage.getPassword());
return repository;
}
}