/*******************************************************************************
* 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.descriptor;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.Vector;
import javax.swing.Icon;
import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContext;
import org.eclipse.persistence.tools.workbench.framework.resources.StringRepository;
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.DescriptorCreationFailureContainer;
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.DescriptorCreationFailureEvent;
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWDescriptor;
import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.common.StatusDialog;
import org.eclipse.persistence.tools.workbench.uitools.cell.AbstractCellRendererAdapter;
import org.eclipse.persistence.tools.workbench.uitools.cell.CellRendererAdapter;
import org.eclipse.persistence.tools.workbench.utility.ClassTools;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;
/**
* Display the errors encountered while attempting to create descriptors
* from classes
*/
public class DescriptorCreationFailuresDialog extends StatusDialog {
private final DescriptorCreationFailureContainer failures;
public DescriptorCreationFailuresDialog(DescriptorCreationFailureContainer failures, WorkbenchContext context) {
super(context.buildExpandedResourceRepositoryContext(UiDescriptorBundle.class),
buildStatus(failures),
"ERROR_CREATING_DESCRIPTORS_TITLE",
"XML_PROJECTS_DONT_SUPPORT_INTERFACE_DESCRIPTORS_MESSAGE",
"dialog.descriptorsNotCreated");
this.failures = failures;
}
private static Collection buildStatus(DescriptorCreationFailureContainer failures) {
SortedSet failuresSet = CollectionTools.sortedSet(failures.failureEvents(), new Comparator() {
public int compare(Object object1, Object object2) {
DescriptorCreationFailureEvent event1 = (DescriptorCreationFailureEvent) object1;
DescriptorCreationFailureEvent event2 = (DescriptorCreationFailureEvent) object2;
return event1.getClassName().compareTo(event2.getClassName());
}
});
Collection statusList = new Vector(failuresSet.size());
// Iterator through all the failures
for (Iterator iter = failuresSet.iterator(); iter.hasNext(); ) {
// Retrieve the failure
DescriptorCreationFailureEvent event = (DescriptorCreationFailureEvent) iter.next();
Error error = new Error(event);
// Add the status to list
StatusDialog.Status status = StatusDialog.createStatus(event.getClassName(), Collections.singletonList(error));
statusList.add(status);
}
return statusList;
}
protected CellRendererAdapter buildNodeRenderer(Object value) {
if (value instanceof String)
return new ClassNameCellRendererAdapter();
if (value instanceof Error)
return new ErrorCellRendererAdapter();
return super.buildNodeRenderer(value);
}
//remove the descriptors before returning from the dialog
protected boolean preConfirm() {
Iterator failureEvents = this.failures.failureEvents();
while (failureEvents.hasNext()){
DescriptorCreationFailureEvent event = (DescriptorCreationFailureEvent) failureEvents.next();
Object source = event.getSource();
if (source instanceof MWDescriptor) {
((MWDescriptor) source).getProject().removeDescriptor((MWDescriptor) source);
}
} return super.preConfirm();
}
protected class ClassNameCellRendererAdapter extends AbstractCellRendererAdapter {
public Icon buildIcon(Object value) {
return resourceRepository().getIcon("class.public");
}
public String buildText(Object value) {
String className = (String) value;
if (className.indexOf(".") == -1) {
return className + " " + resourceRepository().getString("DEFAULT_PACKAGE");
}
return ClassTools.shortNameForClassNamed(className) + " (" + ClassTools.packageNameForClassNamed(className) + ")";
}
}
private static class Error {
private String errorMessage;
private final DescriptorCreationFailureEvent event;
Error(DescriptorCreationFailureEvent event) {
super();
this.event = event;
}
private String buildErrorMessage(StringRepository repository) {
return repository.getString(this.event.getResourceStringKey());
}
public String getErrorMessage(StringRepository repository) {
if (this.errorMessage == null) {
this.errorMessage = buildErrorMessage(repository);
}
return this.errorMessage;
}
}
private class ErrorCellRendererAdapter extends AbstractCellRendererAdapter {
public Icon buildIcon(Object value) {
return resourceRepository().getIcon("error");
}
public String buildText(Object value) {
return ((Error) value).getErrorMessage(resourceRepository());
}
}
}