//$HeadURL: svn+ssh://lbuesching@svn.wald.intevation.de/deegree/base/trunk/resources/eclipse/files_template.xml $
/*----------------------------------------------------------------------------
This file is part of deegree, http://deegree.org/
Copyright (C) 2001-2012 by:
- Department of Geography, University of Bonn -
and
- lat/lon GmbH -
This library is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free
Software Foundation; either version 2.1 of the License, or (at your option)
any later version.
This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information:
lat/lon GmbH
Aennchenstr. 19, 53177 Bonn
Germany
http://lat-lon.de/
Department of Geography, University of Bonn
Prof. Dr. Klaus Greve
Postfach 1147, 53001 Bonn
Germany
http://www.geographie.uni-bonn.de/deegree/
e-mail: info@deegree.org
----------------------------------------------------------------------------*/
package org.deegree.igeo.dataadapter.database.sqlserver;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.igeo.dataadapter.database.AbstractDatabaseLoader;
import org.deegree.igeo.mapmodel.DatabaseDatasource;
import org.deegree.model.crs.CoordinateSystem;
import org.deegree.model.crs.GeoTransformer;
import org.deegree.model.spatialschema.Envelope;
import org.deegree.model.spatialschema.GeometryFactory;
import org.deegree.model.spatialschema.JTSAdapter;
import org.deegree.model.spatialschema.WKTAdapter;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.io.WKBReader;
/**
* TODO add class documentation here
*
* @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz</a>
* @author last edited by: $Author: lyn $
*
* @version $Revision: $, $Date: $
*/
public class SqlServerDataLoader extends AbstractDatabaseLoader {
private static final ILogger LOG = LoggerFactory.getLogger( SqlServerDataLoader.class );
public SqlServerDataLoader( DatabaseDatasource datasource ) {
super( datasource );
}
@Override
protected Object handleGeometryValue( Object value, CoordinateSystem crs )
throws Exception {
WKBReader reader = new WKBReader();
Geometry geom = reader.read( (byte[]) value );
return JTSAdapter.wrap( geom );
}
@Override
protected PreparedStatement createPreparedStatement( DatabaseDatasource datasource, Envelope envelope,
Connection conn )
throws Exception {
CoordinateSystem coordinateSystem = envelope.getCoordinateSystem();
String nativeCRS = datasource.getNativeCoordinateSystem().getLocalName();
String envCRS = nativeCRS;
if ( coordinateSystem != null ) {
envCRS = coordinateSystem.getLocalName();
}
// use the bbox operator (&&) to filter using the spatial index
if ( !( nativeCRS.equals( envCRS ) ) ) {
GeoTransformer gt = new GeoTransformer( nativeCRS );
envelope = gt.transform( envelope, coordinateSystem );
}
String query = datasource.getGeometryFieldName() + ".STIntersects( geometry::STGeomFromText(?, " + nativeCRS
+ ") ) = 1";
String completeQuery;
String sqlTemplate = datasource.getSqlTemplate();
Pattern p = Pattern.compile( "\\s*select\\s+[*]\\s+from\\s+([a-zA-Z_0-9.]+)\\s*", Pattern.CASE_INSENSITIVE );
Matcher m = p.matcher( sqlTemplate );
if ( m.find() ) {
String tableNamePattern = m.group( 1 );
ResultSet columns = conn.getMetaData().getColumns( null, null, tableNamePattern, "%" );
String cols = "";
boolean isFirst = true;
while ( columns.next() ) {
String columnName = columns.getString( "COLUMN_NAME" );
if ( datasource.getGeometryFieldName().equalsIgnoreCase( columnName ) ) {
columnName = columnName + ".STAsBinary() as " + columnName;
}
if ( !isFirst ) {
cols += ",";
}
cols += columnName;
isFirst = false;
}
if ( cols.length() > 0 ) {
sqlTemplate = sqlTemplate.replace( "*", cols );
}
}
if ( sqlTemplate.trim().toUpperCase().endsWith( " WHERE" ) ) {
LOG.logDebug( "performed SQL: ", sqlTemplate );
completeQuery = sqlTemplate + query;
} else if ( sqlTemplate.trim().toUpperCase().indexOf( " WHERE " ) < 0 ) {
LOG.logDebug( "performed SQL: ", sqlTemplate + " WHERE " + query );
completeQuery = sqlTemplate + " WHERE " + query;
} else {
LOG.logDebug( "performed SQL: ", sqlTemplate + " AND " + query );
completeQuery = sqlTemplate + " AND " + query;
}
PreparedStatement stmt = conn.prepareStatement( completeQuery );
LOG.logInfo( completeQuery );
String queryEnv = WKTAdapter.export( GeometryFactory.createSurface( envelope,
datasource.getNativeCoordinateSystem() ) ).toString();
stmt.setString( 1, queryEnv );
LOG.logInfo( queryEnv );
stmt.setMaxRows( maxFeatures );
return stmt;
}
}