package com.vividsolutions.jump.workbench.datasource;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import org.apache.log4j.Logger;
import com.vividsolutions.jts.util.Assert;
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.model.StandardCategoryNames;
import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
import com.vividsolutions.jump.workbench.plugin.PlugInContext;
import com.vividsolutions.jump.workbench.plugin.ThreadedBasePlugIn;
import com.vividsolutions.jump.workbench.ui.GUIUtil;
import com.vividsolutions.jump.workbench.ui.WorkbenchFrame;
import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn;
public abstract class AbstractLoadDatasetPlugIn extends AbstractLoadSaveDatasetPlugIn {
public void run(TaskMonitor monitor, PlugInContext context)
throws Exception {
//Seamus Thomas Carroll [mailto:carrolls@cpsc.ucalgary.ca]
//was concerned when he noticed that #getDataSourceQueries
//was being called twice. So call it once only. [Jon Aquino 2004-02-05]
Assert.isTrue(!getDataSourceQueries().isEmpty());
boolean exceptionsEncountered = false;
for (Iterator i = getDataSourceQueries().iterator(); i.hasNext();) {
DataSourceQuery dataSourceQuery = (DataSourceQuery) i.next();
ArrayList exceptions = new ArrayList();
Assert.isTrue(dataSourceQuery.getDataSource().isReadable());
monitor.report(I18N.get("datasource.LoadDatasetPlugIn.loading")+" " + dataSourceQuery.toString() + "...");
Connection connection = dataSourceQuery.getDataSource()
.getConnection();
try {
FeatureCollection dataset = dataSourceQuery.getDataSource().installCoordinateSystem(
connection.executeQuery(dataSourceQuery.getQuery(),
exceptions,
monitor),
CoordinateSystemRegistry.instance(
context.getWorkbenchContext().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);
}
}
if (exceptionsEncountered) {
context.getWorkbenchFrame().warnUser(I18N.get("datasource.LoadDatasetPlugIn.problems-were-encountered"));
}
}
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>");
}
private String chooseCategory(PlugInContext context) {
return context.getLayerNamePanel().getSelectedCategories().isEmpty()
? StandardCategoryNames.WORKING
: context.getLayerNamePanel().getSelectedCategories().iterator().next()
.toString();
}
public static MultiEnableCheck createEnableCheck(
final WorkbenchContext workbenchContext) {
EnableCheckFactory checkFactory = new EnableCheckFactory(workbenchContext);
return new MultiEnableCheck().add(checkFactory.createWindowWithLayerManagerMustBeActiveCheck());
}
}