001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/io/datastore/sde/SDEDeleteHandler.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2006 by: M.O.S.S. Computer Grafik Systeme GmbH
006 Hohenbrunner Weg 13
007 D-82024 Taufkirchen
008 http://www.moss.de/
009
010 This library is free software; you can redistribute it and/or
011 modify it under the terms of the GNU Lesser General Public
012 License as published by the Free Software Foundation; either
013 version 2.1 of the License, or (at your option) any later version.
014
015 This library is distributed in the hope that it will be useful,
016 but WITHOUT ANY WARRANTY; without even the implied warranty of
017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
018 Lesser General Public License for more details.
019
020 You should have received a copy of the GNU Lesser General Public
021 License along with this library; if not, write to the Free Software
022 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
023
024 ---------------------------------------------------------------------------*/
025 package org.deegree.io.datastore.sde;
026
027 import org.deegree.framework.log.ILogger;
028 import org.deegree.framework.log.LoggerFactory;
029 import org.deegree.io.datastore.DatastoreException;
030 import org.deegree.io.datastore.FeatureId;
031 import org.deegree.io.datastore.schema.MappedFeatureType;
032 import org.deegree.io.datastore.schema.content.MappingField;
033 import org.deegree.io.datastore.sql.TableAliasGenerator;
034 import org.deegree.io.sdeapi.SDEConnection;
035 import org.deegree.model.filterencoding.Filter;
036
037 import com.esri.sde.sdk.client.SeDelete;
038 import com.esri.sde.sdk.client.SeObjectId;
039 import com.esri.sde.sdk.client.SeState;
040
041 /**
042 * Handler for <code>Delete</code> operations contained in <code>Transaction</code> requests.
043 *
044 * @author <a href="mailto:cpollmann@moss.de">Christoph Pollmann</a>
045 * @author last edited by: $Author: rbezema $
046 *
047 * @version $Revision: 12183 $, $Date: 2008-06-05 11:17:23 +0200 (Do, 05. Jun 2008) $
048 */
049 public class SDEDeleteHandler extends AbstractSDERequestHandler {
050
051 private static final ILogger LOG = LoggerFactory.getLogger( SDEDeleteHandler.class );
052
053 /**
054 * Creates a new <code>DeleteHandler</code> from the given parameters.
055 *
056 * @param dsTa
057 * @param aliasGenerator
058 * @param conn
059 */
060 SDEDeleteHandler( SDETransaction dsTa, TableAliasGenerator aliasGenerator, SDEConnection conn ) {
061 super( dsTa.getDatastore(), aliasGenerator, conn );
062 }
063
064 /**
065 * Deletes the features from the datastore that are matched by the given filter and type.
066 *
067 * @param mappedFeatureType
068 * @param filter
069 * @return number of deleted feature instances
070 * @throws DatastoreException
071 */
072 int performDelete( MappedFeatureType mappedFeatureType, Filter filter )
073 throws DatastoreException {
074
075 FeatureId[] fids = determineAffectedFIDs( mappedFeatureType, filter );
076 try {
077 for ( int i = 0; i < fids.length; i++ ) {
078 SeDelete deleter = deleteFeature( mappedFeatureType, fids[i] );
079 deleter.execute();
080 }
081 } catch ( Exception e ) {
082 LOG.logDebug( "delete error occured", e );
083 throw new DatastoreException( "delete error occured", e );
084 }
085 // return count of featureids deleted.
086 return fids.length;
087 }
088
089 /**
090 * Deletes the feature with the given feature id.
091 *
092 * @param mappedFeatureType
093 * @param fid
094 * @throws DatastoreException
095 */
096 private SeDelete deleteFeature( MappedFeatureType mappedFeatureType, FeatureId fid )
097 throws Exception {
098
099 LOG.logDebug( "Deleting feature with id '" + fid + "' and type '" + mappedFeatureType.getName() + "'..." );
100
101 // delete feature type table
102 SeDelete deleter = new SeDelete( conn.getConnection() );
103 String table = mappedFeatureType.getTable();
104 StringBuffer where = buildFIDWhereClause( fid );
105 deleter.fromTable( table, where.toString() );
106 deleter.setState( conn.getState().getId(), new SeObjectId( SeState.SE_NULL_STATE_ID ),
107 SeState.SE_STATE_DIFF_NOCHECK );
108 return deleter;
109
110 }
111
112 /**
113 * @param fid
114 */
115 private StringBuffer buildFIDWhereClause( FeatureId fid ) {
116 StringBuffer where = new StringBuffer();
117 MappingField[] fidFields = fid.getFidDefinition().getIdFields();
118 for ( int i = 0; i < fidFields.length; i++ ) {
119 if ( 0 != i ) {
120 where.append( " AND " );
121 }
122 where.append( fidFields[i].getField() );
123 where.append( "='" );
124 where.append( fid.getValue( i ).toString() );
125 where.append( "'" );
126 }
127 return where;
128 }
129 }