package org.openjump.core.ui.plugin.file;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import org.openjump.core.ui.plugin.file.open.ChooseProjectPanel;
import org.openjump.core.ui.swing.wizard.AbstractWizardGroup;
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.coordsys.CoordinateSystemRegistry;
import com.vividsolutions.jump.feature.FeatureCollection;
import com.vividsolutions.jump.io.datasource.Connection;
import com.vividsolutions.jump.io.datasource.DataSourceQuery;
import com.vividsolutions.jump.task.TaskMonitor;
import com.vividsolutions.jump.util.CollectionUtil;
import com.vividsolutions.jump.util.StringUtil;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.datasource.DataSourceQueryChooser;
import com.vividsolutions.jump.workbench.model.StandardCategoryNames;
import com.vividsolutions.jump.workbench.plugin.PlugInContext;
import com.vividsolutions.jump.workbench.ui.GUIUtil;
import com.vividsolutions.jump.workbench.ui.WorkbenchFrame;
import com.vividsolutions.jump.workbench.ui.images.IconLoader;
import com.vividsolutions.jump.workbench.ui.wizard.WizardDialog;
public class DataSourceQueryChooserOpenWizard extends AbstractWizardGroup {
public static final String KEY = DataSourceQueryChooserOpenWizard.class.getName();
private DataSourceQueryChooser chooser;
private WorkbenchContext workbenchContext;
private ChooseProjectPanel chooseProjectPanel;
public DataSourceQueryChooserOpenWizard(WorkbenchContext workbenchContext,
DataSourceQueryChooser chooser) {
super(chooser.toString(), IconLoader.icon("Table.gif"), chooser.getClass()
.getName());
this.workbenchContext = workbenchContext;
this.chooser = chooser;
}
public void initialize(WorkbenchContext workbenchContext, WizardDialog dialog) {
removeAllPanels();
ComponentWizardPanel componentPanel = new ComponentWizardPanel(
chooser.toString(), chooser.getClass().getName(), chooser.getComponent());
chooseProjectPanel = new ChooseProjectPanel(workbenchContext,
componentPanel.getID());
addPanel(chooseProjectPanel);
addPanel(componentPanel);
}
public String getFirstId() {
String firstId = super.getFirstId();
if (!chooseProjectPanel.hasActiveTaskFrame()
&& chooseProjectPanel.hasTaskFrames()) {
chooseProjectPanel.setNextID(firstId);
return chooseProjectPanel.getID();
} else {
return firstId;
}
}
public void run(WizardDialog dialog, TaskMonitor monitor) {
if (chooser.isInputValid()) {
chooseProjectPanel.activateSelectedProject();
PlugInContext context = workbenchContext.createPlugInContext();
Collection dataSourceQueries = chooser.getDataSourceQueries();
if (!dataSourceQueries.isEmpty()) {
boolean exceptionsEncountered = false;
for (Iterator i = dataSourceQueries.iterator(); i.hasNext();) {
DataSourceQuery dataSourceQuery = (DataSourceQuery)i.next();
ArrayList exceptions = new ArrayList();
if (dataSourceQuery.getDataSource().isReadable()) {
monitor.report("Loading " + dataSourceQuery.toString() + "...");
Connection connection = dataSourceQuery.getDataSource()
.getConnection();
try {
FeatureCollection dataset = dataSourceQuery.getDataSource()
.installCoordinateSystem(
connection.executeQuery(dataSourceQuery.getQuery(),
exceptions, monitor),
CoordinateSystemRegistry.instance(workbenchContext.getBlackboard()));
if (dataset != null) {
context.getLayerManager().addLayer(chooseCategory(context),
dataSourceQuery.toString(), dataset).setDataSourceQuery(
dataSourceQuery).setFeatureCollectionModified(false);
}
} finally {
connection.close();
}
if (!exceptions.isEmpty()) {
if (!exceptionsEncountered) {
context.getOutputFrame().createNewDocument();
exceptionsEncountered = true;
}
reportExceptions(exceptions, dataSourceQuery, context);
}
} else {
context.getWorkbenchFrame().warnUser(
I18N.get("datasource.LoadDatasetPlugIn.query-not-readable"));
}
}
if (exceptionsEncountered) {
context.getWorkbenchFrame().warnUser(
I18N.get("datasource.LoadDatasetPlugIn.problems-were-encountered"));
}
} else {
context.getWorkbenchFrame().warnUser(
I18N.get(KEY + ".no-queries-found"));
}
}
}
private String chooseCategory(PlugInContext context) {
return context.getLayerNamePanel().getSelectedCategories().isEmpty() ? StandardCategoryNames.WORKING
: context.getLayerNamePanel()
.getSelectedCategories()
.iterator()
.next()
.toString();
}
private void reportExceptions(ArrayList exceptions,
DataSourceQuery dataSourceQuery, PlugInContext context) {
context.getOutputFrame()
.addHeader(
1,
exceptions.size()
+ " "
+ I18N.get("datasource.LoadDatasetPlugIn.problem")
+ StringUtil.s(exceptions.size())
+ " "
+ I18N.get("datasource.LoadDatasetPlugIn.loading")
+ " "
+ dataSourceQuery.toString()
+ "."
+ ((exceptions.size() > 10) ? I18N.get("datasource.LoadDatasetPlugIn.first-and-last-five")
: ""));
context.getOutputFrame().addText(
I18N.get("datasource.LoadDatasetPlugIn.see-view-log"));
context.getOutputFrame().append("<ul>");
Collection exceptionsToReport = exceptions.size() <= 10 ? exceptions
: CollectionUtil.concatenate(Arrays.asList(new Collection[] {
exceptions.subList(0, 5),
exceptions.subList(exceptions.size() - 5, exceptions.size())
}));
for (Iterator j = exceptionsToReport.iterator(); j.hasNext();) {
Exception exception = (Exception)j.next();
context.getWorkbenchFrame().log(StringUtil.stackTrace(exception));
context.getOutputFrame().append("<li>");
context.getOutputFrame().append(
GUIUtil.escapeHTML(WorkbenchFrame.toMessage(exception), true, true));
context.getOutputFrame().append("</li>");
}
context.getOutputFrame().append("</ul>");
}
}