/*******************************************************************************
* Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.schema;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.Frame;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import javax.swing.JOptionPane;
import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContext;
import org.eclipse.persistence.tools.workbench.framework.resources.DefaultResourceRepository;
import org.eclipse.persistence.tools.workbench.framework.resources.ResourceRepository;
import org.eclipse.persistence.tools.workbench.framework.ui.dialog.WaitDialog;
import org.eclipse.persistence.tools.workbench.mappingsmodel.resource.ResourceException;
import org.eclipse.persistence.tools.workbench.mappingsmodel.resource.ResourceSpecification;
import org.eclipse.persistence.tools.workbench.mappingsmodel.schema.MWXmlSchema;
import org.eclipse.persistence.tools.workbench.uitools.LabelArea;
import org.eclipse.persistence.tools.workbench.utility.string.StringTools;
final class SchemaDialogUtilities
{
private static ResourceRepository resourceRepository;
private static ResourceRepository resourceRepository() {
if (resourceRepository == null) {
resourceRepository = buildResourceRepository();
}
return resourceRepository;
}
private static ResourceRepository buildResourceRepository() {
return new DefaultResourceRepository(UiSchemaResourceBundle.class);
}
static void showUrlLoadFailure(Component parentComponent, String schemaName, ResourceException re, ResourceSpecification rs) {
showUrlLoadFailure(parentComponent, schemaName, re, rs.getSourceKey(), rs.getLocation());
}
static void showUrlLoadFailure(Component parentComponent, String schemaName, ResourceException re, String resourceType, String resourceName) {
String errorTitle = resourceRepository().getString("URL_LOAD_ERROR.TITLE");
String errorCode = re.getCode();
String errorMessage = resourceRepository().getString("URL_LOAD_ERROR.MESSAGE", schemaName);
errorMessage += StringTools.CR;
errorMessage += resourceRepository().getString("URL_LOAD_ERROR." + resourceType + "." + errorCode,
new Object[] {resourceName});
JOptionPane.showMessageDialog(parentComponent, errorMessage, errorTitle, JOptionPane.WARNING_MESSAGE);
}
/**
* This is placed here for 9.0.4 XDK support. XSDExceptions are thrown in XDK versions
* beyond 9.0.4.
*/
static void showSchemaLoadFailure(Component parentComponent, String schemaName) {
showSchemaLoadFailure(parentComponent, schemaName, null);
}
/**
* This is placed here for 9.0.4 XDK support. RuntimeExceptions were the only exceptions
* thrown for v. 9.0.4.
*/
static void showSchemaLoadFailure(Component parentComponent, String schemaName, RuntimeException ex) {
showSchemaLoadFailure(parentComponent, schemaName, (Exception) ex);
}
/**
* This is placed here for 9.0.4 XDK support. Internally we treat XSDExceptions the same
* as RuntimeExceptions, but we're leaving room for better treatment of XSDExceptions.
*/
private static void showSchemaLoadFailure(Component parentComponent, String schemaName, Exception ex) {
String errorTitle = resourceRepository().getString("SCHEMA_LOAD_ERROR.TITLE");
String exceptionMessage = ex.getLocalizedMessage();
String errorMessage = resourceRepository().getString("SCHEMA_LOAD_ERROR.MESSAGE", StringTools.CR, schemaName, exceptionMessage);
LabelArea label = new LabelArea(errorMessage);
JOptionPane.showMessageDialog(parentComponent, label, errorTitle, JOptionPane.WARNING_MESSAGE);
}
static void reloadSchemas(WorkbenchContext context, Iterator schemasIterator) {
Thread thread = new Thread(new ReloadAllSchemasRunnable(context, schemasIterator), "XML Schema Importation");
thread.setPriority(Thread.NORM_PRIORITY - (Thread.NORM_PRIORITY - Thread.MIN_PRIORITY) /2);
thread.start();
}
private static class ReloadAllSchemasRunnable implements Runnable {
private WorkbenchContext context;
private WaitDialog waitDialog;
private Iterator schemasIterator;
private MWXmlSchema[] currentSchema;
ReloadAllSchemasRunnable(WorkbenchContext context, Iterator schemasIterator) {
super();
initialize(context, schemasIterator);
}
private void initialize(WorkbenchContext context, Iterator schemasIterator) {
this.currentSchema = new MWXmlSchema[1];
this.context = context;
this.schemasIterator = schemasIterator;
this.waitDialog = new WaitDialog(
(Frame) context.getCurrentWindow(),
context.getApplicationContext().getResourceRepository().getIcon("file.xml.large"),
resourceRepository().getString("IMPORT_SCHEMA_DIALOG.WAIT_DIALOG.TITLE"),
resourceRepository().getString("IMPORT_SCHEMA_DIALOG.WAIT_DIALOG.DESCRIPTION", "")
);
}
private void showWaitCursor() {
EventQueue.invokeLater(new Runnable() {
public void run() {
context.getCurrentWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
});
}
private void hideWaitCursor() {
EventQueue.invokeLater(new Runnable() {
public void run() {
context.getCurrentWindow().setCursor(Cursor.getDefaultCursor());
}
});
}
private void updateMessage() throws InvocationTargetException, InterruptedException {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
String text = resourceRepository().getString("IMPORT_SCHEMA_DIALOG.WAIT_DIALOG.DESCRIPTION", currentSchema[0].getName());
waitDialog.setMessage(text);
}
});
}
private Runnable buildWaitDialogLauncher() {
return new Runnable() {
public void run() {
ReloadAllSchemasRunnable.this.waitDialog.setVisible(true);
}
};
}
public void run() {
try {
if (currentSchema[0] == null)
showWaitCursor();
EventQueue.invokeLater(this.buildWaitDialogLauncher());
while (schemasIterator.hasNext()) {
currentSchema[0] = (MWXmlSchema) schemasIterator.next();
updateMessage();
currentSchema[0].reload();
}
waitDialog.dispose();
}
catch (InvocationTargetException exception) {
waitDialog.dispose();
// we're probably in trouble if we get here...
throw new RuntimeException(exception);
}
catch (InterruptedException exception) {
waitDialog.dispose();
// we're probably in trouble if we get here...
throw new RuntimeException(exception);
}
catch (final ResourceException re) {
waitDialog.dispose();
EventQueue.invokeLater(new Runnable() {
public void run() {
SchemaDialogUtilities.showUrlLoadFailure(context.getCurrentWindow(), currentSchema[0].getName(), re, currentSchema[0].getSchemaSource());
}
});
// Continue with the next schema to reload
run();
}
// In XDK version 9.0.4 only RuntimeExceptons are thrown
catch (final RuntimeException re) {
waitDialog.dispose();
EventQueue.invokeLater(new Runnable() {
public void run() {
SchemaDialogUtilities.showSchemaLoadFailure(context.getCurrentWindow(), currentSchema[0].getName(), re);
}
});
// Continue with the next schema to reload
run();
}
hideWaitCursor();
}
}
}