/*
* DataReceiver.java
*
* Created on November 5, 2006, 3:43 PM
*
*/
package ika.geoimport;
import ika.geo.*;
import ika.table.Table;
/**
* DataReceiver receives imported GeoObjects from a GeoImporter and is
* responsible for storing the data.
* GeoObjects are stored in a destination GeoSet that must be provided by derived
* classes.
* It stores passed attribute Tables if the destination GeoSet is a GeoMap.
* @author Bernhard Jenny, Institute of Cartography, ETH Zurich
*/
abstract public class DataReceiver {
private boolean showMessageOnError = true;
private boolean hasReceivedError = false;
/**
* Creates a new instance of DataReceiver.
* @param destGeoSet The GeoSet that will receive all imported GeoObjects.
*/
public DataReceiver() {
}
/**
* Derived classes must provide a GeoSet to store the imported GeoObjects.
*/
abstract protected GeoSet getDestinationGeoSet();
/**
* Add a GeoObject.
*/
public void add(GeoObject geoObject) {
if (geoObject instanceof GeoSet) {
this.add((GeoSet) geoObject);
} else if (geoObject instanceof GeoImage) {
this.add((GeoImage) geoObject);
}
}
/**
* Add a GeoSet.
*/
public boolean add(GeoSet geoSet) {
GeoSet destGeoSet = this.getDestinationGeoSet();
if (destGeoSet == null || geoSet == null || geoSet.getNumberOfChildren() < 1) {
return false;
}
destGeoSet.add(geoSet);
return true;
}
/**
* Add a GeoImage.
*/
public boolean add(GeoImage geoImage) {
GeoSet destGeoSet = this.getDestinationGeoSet();
if (destGeoSet == null || geoImage == null) {
return false;
}
destGeoSet.add(geoImage);
return true;
}
/**
* Add a TableLink, which usually has references to a Table and a GeoSet.
* DataReceiver does not store the Table, derived classes can overwrite
* this method and take care of this.
*/
public boolean add(ika.table.TableLink tableLink) {
GeoSet destGeoSet = this.getDestinationGeoSet();
if (tableLink == null || destGeoSet == null) {
return false; // make sure GeoSetChangedListeners are only informed after all
// changes are made.
}
MapEventTrigger mem = new MapEventTrigger(destGeoSet);
try {
GeoSet geoSet = tableLink.getGeoSet();
if (geoSet != null && geoSet.getNumberOfChildren() == 0) {
return false;
}
if (geoSet != null) {
destGeoSet.add(geoSet);
}
// store the attribute tables
Table table = tableLink.getTable();
if (table != null && destGeoSet instanceof ika.geo.GeoMap) {
ika.geo.GeoMap map = (ika.geo.GeoMap) destGeoSet;
map.tableAdd(table);
map.tableLinkAdd(tableLink);
}
return true;
} catch (Exception e) {
return false;
} finally {
mem.inform(new MapEvent(true, true, false));
}
}
public void error(Exception exc, java.net.URL url) {
hasReceivedError |= true;
// display a dialog with an error message.
if (showMessageOnError) {
String message;
if (url == null) {
message = "The data could not be imported.";
} else if ("file".equalsIgnoreCase(url.getProtocol())) {
message = "The file at \"" + url.getFile() + "\" could not be imported.";
} else {
message = "The data at \"" + url.toExternalForm() + "\" could not be imported.";
}
ika.utils.ErrorDialog.showErrorDialog(message, "Import Error", exc, null);
}
if (exc != null) {
exc.printStackTrace();
}
}
public boolean isShowMessageOnError() {
return showMessageOnError;
}
public void setShowMessageOnError(boolean showMessageOnError) {
this.showMessageOnError = showMessageOnError;
}
public boolean hasReceivedError() {
return hasReceivedError;
}
public void setHasReceivedError(boolean hasReceivedError) {
this.hasReceivedError = hasReceivedError;
}
}