/* Copyright (c) 2001 - 2008 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer;
import static org.geoserver.importer.ImportStatus.*;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogBuilder;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.ProjectionPolicy;
import org.geotools.data.DataAccess;
import org.geotools.util.logging.Logging;
import org.opengis.feature.type.Name;
/**
* <p>Tries to import all of the feature types in a datastore, provides the ability
* to observe the process and to stop it prematurely.</p>
* <p>It is advised to run it into its own thread</p>
*/
public class FeatureTypeImporter implements Runnable {
static final Logger LOGGER = Logging.getLogger(FeatureTypeImporter.class);
DataStoreInfo storeInfo;
String defaultSRS;
Catalog catalog;
ImportSummary summary;
boolean cancelled;
public FeatureTypeImporter(DataStoreInfo store, String defaultSRS, Catalog catalog, boolean workspaceNew, boolean storeNew) {
this.storeInfo = store;
this.defaultSRS = defaultSRS;
this.catalog = catalog;
this.summary = new ImportSummary(storeInfo.getName(), workspaceNew, storeNew);
}
public String getProject() {
return storeInfo.getName();
}
public void run() {
DataAccess da = null;
try {
NamespaceInfo namespace = catalog.getNamespaceByPrefix(storeInfo.getWorkspace().getName());
// prepare
CatalogBuilder builder = new CatalogBuilder(catalog);
da = storeInfo.getDataStore(null);
StyleGenerator styles = new StyleGenerator(catalog);
// cast necessary due to some classpath oddity/geoapi issue, the compiler
// complained about getNames() returning a List<Object>...
List<Name> names = da.getNames();
summary.setTotalLayers(names.size());
for (Name name : names) {
// start information
String layerName = name.getLocalPart();
summary.newLayer(layerName);
LayerInfo layer = null;
try {
builder.setStore(storeInfo);
FeatureTypeInfo featureType = builder.buildFeatureType(name);
builder.lookupSRS(featureType, true);
builder.setupBounds(featureType);
layer = builder.buildLayer(featureType);
layer.setDefaultStyle(styles.getStyle(featureType));
ImportStatus status = SUCCESS;
if(cancelled)
return;
// if we have a default
if (layer.getResource().getSRS() == null && layer.getResource().getNativeCRS() != null
&& defaultSRS != null) {
layer.getResource().setSRS(defaultSRS);
layer.getResource().setProjectionPolicy(ProjectionPolicy.REPROJECT_TO_DECLARED);
status = DEFAULTED_SRS;
}
// handler common error conditions
if (catalog.getFeatureTypeByName(namespace, layerName) != null) {
status = DUPLICATE;
} else if (layer.getResource().getSRS() == null && defaultSRS == null) {
status = MISSING_SRS;
} else if (layer.getResource().getLatLonBoundingBox() == null) {
status = MISSING_BBOX;
} else {
// try to save the layer
catalog.add(featureType);
try {
catalog.add(layer);
} catch(Exception e) {
// will be caught by the external try/catch, here we just try to undo
// the feature type saving (transactions, where are thou)
catalog.remove(featureType);
throw e;
}
}
summary.completeLayer(layerName, layer, status);
} catch (Exception e) {
e.printStackTrace();
summary.completeLayer(layerName, layer, e);
}
if(cancelled)
return;
}
summary.end();
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Import process failed", e);
summary.end(e);
} finally {
if(da != null)
da.dispose();
}
}
public ImportSummary getSummary() {
return summary;
}
public void cancel() {
this.cancelled = true;
}
}