001 //$Header: $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 037 package org.deegree.portal.portlet.modules.wfs.actions.portlets; 038 039 import java.sql.Connection; 040 import java.sql.Driver; 041 import java.sql.DriverManager; 042 import java.sql.ResultSet; 043 import java.sql.SQLException; 044 import java.sql.Statement; 045 import java.util.ArrayList; 046 import java.util.List; 047 048 import javax.servlet.ServletContext; 049 import javax.servlet.http.HttpServletRequest; 050 051 import org.apache.jetspeed.portal.Portlet; 052 import org.apache.turbine.util.RunData; 053 import org.deegree.framework.log.ILogger; 054 import org.deegree.framework.log.LoggerFactory; 055 import org.deegree.framework.util.StringTools; 056 import org.deegree.portal.PortalException; 057 import org.deegree.portal.portlet.modules.actions.IGeoPortalPortletPerform; 058 059 /** 060 * Removes a number of Features (listed by their ID). 061 * 062 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 063 * @author last edited by: $Author:$ 064 * 065 * @version $Revision:$, $Date:$ 066 */ 067 public class RemoveAnnotationPerform extends IGeoPortalPortletPerform { 068 069 private static final ILogger LOG = LoggerFactory.getLogger( RemoveAnnotationPerform.class ); 070 071 /** 072 * 073 * Creates an instance of a RemoveAnnotationPerform. 074 * 075 * @param request 076 * @param portlet 077 * @param servletContext 078 */ 079 public RemoveAnnotationPerform( HttpServletRequest request, Portlet portlet, ServletContext servletContext ) { 080 super( request, portlet, servletContext ); 081 } 082 083 /** 084 * Builds up the portlet. 085 * 086 * @param data 087 * @throws PortalException 088 */ 089 public void buildNormalContext( RunData data ) 090 throws PortalException { 091 super.buildNormalContext(); 092 093 if ( getInitParam( "driver" ) != null ) { 094 095 LOG.logDebug( "Build dataset table for annotations objects." ); 096 097 Connection con = createConnection(); 098 String sql = getInitParam( "SQLDisplayStatement" ); 099 LOG.logDebug( "Clean DB Object SQL: " + sql ); 100 sql = createSelectionStatement( data, sql ); 101 102 List<List<Object>> result; 103 104 try { 105 result = createTable( con, sql ); 106 LOG.logDebug( "Built dataset table for annotations objects: " + result ); 107 108 con.close(); 109 } catch ( SQLException e ) { 110 e.printStackTrace(); 111 throw new PortalException( e.getMessage() ); 112 } 113 request.setAttribute( "DB_OBJECTS", result ); 114 } 115 116 request.setAttribute( "TITLE", getInitParam( "title" ) ); 117 118 } 119 120 /** 121 * Creates the SQL select statement. The sql script is taken from the initial parameter 122 * 'SQLDisplayStatement'. Username is automotically inserted, if there is a '$USERNAME' 123 * placeholder. 124 * 125 * @param data 126 * the RunData 127 * @param sql 128 * the original sql script 129 * @return the changed sql script 130 */ 131 private String createSelectionStatement( RunData data, String sql ) { 132 String username = data.getUser().getUserName(); 133 sql = sql.replaceAll( "'", "\"" ); 134 sql = sql.replace( "$USERNAME", "'" + username + "'" ); 135 LOG.logDebug( "Populated DB Object SQL : " + sql ); 136 return sql; 137 } 138 139 /** 140 * Creates a pseudo-table of results. The results are held in a list of lists. The first list 141 * has the strings describing the column names (or labels, if the use of 'as' - like in selece 142 * id as 'Identifier' has been made. 143 * 144 * @param con 145 * the connection 146 * @param sql 147 * the sql statement 148 * @return a List containing Lists of results 149 * @throws SQLException 150 */ 151 private List<List<Object>> createTable( Connection con, String sql ) 152 throws SQLException { 153 154 Statement stm = con.createStatement(); 155 stm.execute( sql ); 156 ResultSet rSet = stm.getResultSet(); 157 158 List<List<Object>> rows = new ArrayList<List<Object>>(); 159 160 int colCount = rSet.getMetaData().getColumnCount(); 161 LOG.logDebug( "Creating dataset table for annotations objects: " + colCount ); 162 163 while ( rSet.next() ) { 164 List<Object> cols = new ArrayList<Object>(); 165 166 for ( int i = 0; i < colCount; i++ ) { 167 cols.add( rSet.getObject( i + 1 ) ); 168 } 169 rows.add( cols ); 170 } 171 172 if ( rows.size() > 0 ) { 173 // if anything found, put headers in the list 174 List<Object> cols = new ArrayList<Object>( colCount ); 175 for ( int i = 0; i < colCount; i++ ) { 176 cols.add( rSet.getMetaData().getColumnLabel( i + 1 ) ); 177 } 178 rows.add( 0, cols ); 179 } 180 stm.close(); 181 return rows; 182 } 183 184 /** 185 * Executes a delete statement. 186 * 187 * @param data 188 * the RunData 189 * @throws PortalException 190 * if something evil happened 191 */ 192 public void doDeletetransaction( RunData data ) 193 throws PortalException { 194 195 if ( getInitParam( "driver" ) != null ) { 196 // let us hope and say, there's a driver 197 Connection con = createConnection(); 198 try { 199 String s = parameter.get( "OBJECTID" ); 200 String[] featureIds = StringTools.toArray( s, ",;", true ); 201 if ( featureIds == null ) { 202 LOG.logDebug( "No 'objectId' parameter in the request. Skipping..." ); 203 return; 204 } 205 for ( String id : featureIds ) { 206 String sql = createDeleteSQL( data, id ); 207 System.out.println( sql ); 208 deleteObject( con, sql ); 209 } 210 211 } catch ( SQLException e ) { 212 e.printStackTrace(); 213 throw new PortalException( e.getMessage() ); 214 } finally { 215 try { 216 con.close(); 217 } catch ( Exception e ) { 218 e.printStackTrace(); 219 } 220 } 221 } 222 } 223 224 /** 225 * Creates a delete statement based on the initial parameter 'SQLDeleteStatement' on the RunData 226 * containing the user name and on the id of the data object to be deleted. 227 * 228 * @param data 229 * the RunData object 230 * @param id 231 * the id of the dataset 232 * @return a sql with proper user name, and data set id 233 */ 234 private String createDeleteSQL( RunData data, String id ) { 235 236 String sql = getInitParam( "SQLDeleteStatement" ); 237 if ( data.getUser() == null ) { 238 throw new IllegalArgumentException( "RunData object has null user." ); 239 } 240 241 String username = data.getUser().getUserName(); 242 LOG.logDebug( "Preparing deletion of object id '" + id + "' for user: '" + username + "'" ); 243 244 sql = sql.replace( "$USERNAME", "'" + username + "'" ); 245 sql = sql.replace( "$OBJECT_ID", "'" + id + "'" ); 246 247 LOG.logDebug( "Create SQL for deleting: " + sql ); 248 249 return sql; 250 } 251 252 /** 253 * 254 * @param con 255 * @param sql 256 * @throws SQLException 257 */ 258 private void deleteObject( Connection con, String sql ) 259 throws SQLException { 260 Statement stmt = con.createStatement(); 261 stmt.execute( sql ); 262 con.commit(); 263 } 264 265 /** 266 * 267 * @return the Connection 268 * @throws PortalException 269 */ 270 private Connection createConnection() 271 throws PortalException { 272 273 Connection con = null; 274 275 String url = getInitParam( "url" ); 276 String driver = getInitParam( "driver" ); 277 String user = getInitParam( "user" ); 278 String password = getInitParam( "password" ); 279 280 con = initConnection( url, driver, user, password ); 281 282 return con; 283 } 284 285 /** 286 * 287 * @param url 288 * @param driver 289 * @param user 290 * @param password 291 * @return the Connection 292 * @throws PortalException 293 */ 294 private Connection initConnection( String url, String driver, String user, String password ) 295 throws PortalException { 296 LOG.logDebug( "connecting database for insert ... " ); 297 298 Connection con = null; 299 300 try { 301 Driver drv = (Driver) Class.forName( driver ).newInstance(); 302 DriverManager.registerDriver( drv ); 303 LOG.logDebug( "initializing connection with " + drv + " " + url + " " + user + " " + password ); 304 305 con = DriverManager.getConnection( url, user, password ); 306 } catch ( SQLException e ) { 307 LOG.logError( "could not establish database connection: " + url, e ); 308 throw new PortalException( "could not establish database connection: " + url, e ); 309 } catch ( Exception e ) { 310 LOG.logError( "could not initialize driver class: " + driver, e ); 311 throw new PortalException( "could not initialize driver class: " + driver, e ); 312 } 313 return con; 314 } 315 }