1 31 32 package org.opencms.db.oracle; 33 34 import org.opencms.db.CmsDbContext; 35 import org.opencms.db.CmsDbEntryAlreadyExistsException; 36 import org.opencms.db.CmsDbEntryNotFoundException; 37 import org.opencms.db.CmsDbIoException; 38 import org.opencms.db.CmsDbSqlException; 39 import org.opencms.db.generic.CmsSqlManager; 40 import org.opencms.db.generic.Messages; 41 import org.opencms.file.CmsDataAccessException; 42 import org.opencms.file.CmsUser; 43 import org.opencms.i18n.CmsMessageContainer; 44 import org.opencms.main.CmsLog; 45 import org.opencms.main.OpenCms; 46 import org.opencms.security.CmsPasswordEncryptionException; 47 import org.opencms.util.CmsUUID; 48 49 import java.io.IOException ; 50 import java.io.OutputStream ; 51 import java.sql.Blob ; 52 import java.sql.Connection ; 53 import java.sql.PreparedStatement ; 54 import java.sql.ResultSet ; 55 import java.sql.SQLException ; 56 import java.util.Map ; 57 58 import org.apache.commons.dbcp.DelegatingResultSet; 59 import org.apache.commons.logging.Log; 60 61 71 public class CmsUserDriver extends org.opencms.db.generic.CmsUserDriver { 72 73 74 private static final Log LOG = CmsLog.getLog(CmsUserDriver.class); 75 76 86 public static OutputStream getOutputStreamFromBlob(ResultSet res, String name) throws SQLException { 87 88 int todo = 0; 89 92 Blob blob = res.getBlob(name); 93 try { 94 blob.truncate(0); 96 return blob.setBinaryStream(0L); 97 } catch (SQLException e) { 98 ((oracle.sql.BLOB)blob).trim(0); 100 return ((oracle.sql.BLOB)blob).getBinaryOutputStream(); 101 } 102 } 103 104 107 public CmsUser createUser( 108 CmsDbContext dbc, 109 String name, 110 String password, 111 String description, 112 String firstname, 113 String lastname, 114 String email, 115 long lastlogin, 116 int flags, 117 Map additionalInfos, 118 String address, 119 int type) throws CmsDataAccessException, CmsPasswordEncryptionException { 120 121 CmsUUID id = new CmsUUID(); 122 PreparedStatement stmt = null; 123 Connection conn = null; 124 125 if (existsUser(dbc, name, type, null)) { 126 CmsMessageContainer message = Messages.get().container(Messages.ERR_USER_WITH_NAME_ALREADY_EXISTS_1, name); 127 if (LOG.isErrorEnabled()) { 128 LOG.error(message.key()); 129 } 130 throw new CmsDbEntryAlreadyExistsException(message); 131 } 132 133 try { 134 conn = m_sqlManager.getConnection(dbc); 135 136 stmt = m_sqlManager.getPreparedStatement(conn, "C_ORACLE_USERS_ADD"); 138 stmt.setString(1, id.toString()); 139 stmt.setString(2, name); 140 stmt.setString(3, OpenCms.getPasswordHandler().digest(password)); 141 stmt.setString(4, m_sqlManager.validateEmpty(description)); 142 stmt.setString(5, m_sqlManager.validateEmpty(firstname)); 143 stmt.setString(6, m_sqlManager.validateEmpty(lastname)); 144 stmt.setString(7, m_sqlManager.validateEmpty(email)); 145 stmt.setLong(8, lastlogin); 146 stmt.setInt(9, flags); 147 stmt.setString(10, m_sqlManager.validateEmpty(address)); 148 stmt.setInt(11, type); 149 stmt.executeUpdate(); 150 stmt.close(); 151 stmt = null; 152 153 internalWriteUserInfo(dbc, id, additionalInfos, null); 154 155 } catch (SQLException e) { 156 throw new CmsDbSqlException(org.opencms.db.generic.Messages.get().container( 157 org.opencms.db.generic.Messages.ERR_GENERIC_SQL_1, 158 CmsDbSqlException.getErrorQuery(stmt)), e); 159 } finally { 160 m_sqlManager.closeAll(dbc, conn, stmt, null); 161 } 162 163 return readUser(dbc, id); 164 } 165 166 169 public CmsUser importUser( 170 CmsDbContext dbc, 171 CmsUUID id, 172 String name, 173 String password, 174 String description, 175 String firstname, 176 String lastname, 177 String email, 178 long lastlogin, 179 int flags, 180 Map additionalInfos, 181 String address, 182 int type, 183 Object reservedParam) throws CmsDataAccessException { 184 185 PreparedStatement stmt = null; 186 Connection conn = null; 187 188 if (existsUser(dbc, name, type, reservedParam)) { 189 CmsMessageContainer message = Messages.get().container(Messages.ERR_USER_WITH_NAME_ALREADY_EXISTS_1, name); 190 if (LOG.isErrorEnabled()) { 191 LOG.error(message.key()); 192 } 193 throw new CmsDbEntryAlreadyExistsException(message); 194 } 195 196 try { 197 if (reservedParam == null) { 198 conn = m_sqlManager.getConnection(dbc); 200 } else { 201 conn = m_sqlManager.getConnection(dbc, ((Integer )reservedParam).intValue()); 203 } 204 205 stmt = m_sqlManager.getPreparedStatement(conn, "C_ORACLE_USERS_ADD"); 207 stmt.setString(1, id.toString()); 208 stmt.setString(2, name); 209 stmt.setString(3, m_sqlManager.validateEmpty(password)); stmt.setString(4, m_sqlManager.validateEmpty(description)); 211 stmt.setString(5, m_sqlManager.validateEmpty(firstname)); 212 stmt.setString(6, m_sqlManager.validateEmpty(lastname)); 213 stmt.setString(7, m_sqlManager.validateEmpty(email)); 214 stmt.setLong(8, lastlogin); 215 stmt.setInt(9, flags); 216 stmt.setString(10, m_sqlManager.validateEmpty(address)); 217 stmt.setInt(11, type); 218 stmt.executeUpdate(); 219 stmt.close(); 220 stmt = null; 221 222 internalWriteUserInfo(dbc, id, additionalInfos, reservedParam); 223 224 } catch (SQLException e) { 225 throw new CmsDbSqlException(org.opencms.db.generic.Messages.get().container( 226 org.opencms.db.generic.Messages.ERR_GENERIC_SQL_1, 227 CmsDbSqlException.getErrorQuery(stmt)), e); 228 } finally { 229 m_sqlManager.closeAll(dbc, conn, stmt, null); 230 } 231 return readUser(dbc, id); 232 } 233 234 237 public org.opencms.db.generic.CmsSqlManager initSqlManager(String classname) { 238 239 return CmsSqlManager.getInstance(classname); 240 } 241 242 245 public void writeUser(CmsDbContext dbc, CmsUser user) throws CmsDataAccessException { 246 247 PreparedStatement stmt = null; 248 Connection conn = null; 249 250 try { 251 252 conn = m_sqlManager.getConnection(dbc); 254 255 stmt = m_sqlManager.getPreparedStatement(conn, "C_ORACLE_USERS_WRITE"); 257 stmt.setString(1, m_sqlManager.validateEmpty(user.getDescription())); 258 stmt.setString(2, m_sqlManager.validateEmpty(user.getFirstname())); 259 stmt.setString(3, m_sqlManager.validateEmpty(user.getLastname())); 260 stmt.setString(4, m_sqlManager.validateEmpty(user.getEmail())); 261 stmt.setLong(5, user.getLastlogin()); 262 stmt.setInt(6, user.getFlags()); 263 stmt.setString(7, m_sqlManager.validateEmpty(user.getAddress())); 264 stmt.setInt(8, user.getType()); 265 stmt.setString(9, user.getId().toString()); 266 stmt.executeUpdate(); 267 stmt.close(); 268 stmt = null; 269 270 internalWriteUserInfo(dbc, user.getId(), user.getAdditionalInfo(), null); 271 272 } catch (SQLException e) { 273 throw new CmsDbSqlException(org.opencms.db.generic.Messages.get().container( 274 org.opencms.db.generic.Messages.ERR_GENERIC_SQL_1, 275 CmsDbSqlException.getErrorQuery(stmt)), e); 276 } finally { 277 m_sqlManager.closeAll(dbc, conn, stmt, null); 278 } 279 } 280 281 291 private void internalWriteUserInfo(CmsDbContext dbc, CmsUUID userId, Map additionalInfo, Object reservedParam) 292 throws CmsDataAccessException { 293 294 PreparedStatement stmt = null; 295 PreparedStatement commit = null; 296 PreparedStatement rollback = null; 297 ResultSet res = null; 298 Connection conn = null; 299 300 boolean wasInTransaction = false; 301 302 try { 303 304 byte[] value = internalSerializeAdditionalUserInfo(additionalInfo); 306 307 if (reservedParam == null) { 309 conn = m_sqlManager.getConnection(dbc); 311 } else { 312 conn = m_sqlManager.getConnection(dbc, ((Integer )reservedParam).intValue()); 314 } 315 316 wasInTransaction = !conn.getAutoCommit(); 317 if (!wasInTransaction) { 318 conn.setAutoCommit(false); 319 } 320 321 stmt = m_sqlManager.getPreparedStatement(conn, "C_ORACLE_USERS_UPDATEINFO"); 323 stmt.setString(1, userId.toString()); 324 res = ((DelegatingResultSet)stmt.executeQuery()).getInnermostDelegate(); 325 if (!res.next()) { 326 throw new CmsDbEntryNotFoundException(Messages.get().container(Messages.ERR_NO_USER_WITH_ID_1, userId)); 327 } 328 329 OutputStream output = getOutputStreamFromBlob(res, "USER_INFO"); 331 output.write(value); 332 output.close(); 333 value = null; 334 335 if (!wasInTransaction) { 336 commit = m_sqlManager.getPreparedStatement(conn, "C_COMMIT"); 337 commit.execute(); 338 m_sqlManager.closeAll(dbc, null, commit, null); 339 } 340 341 m_sqlManager.closeAll(dbc, null, stmt, res); 342 343 commit = null; 344 stmt = null; 345 res = null; 346 347 if (!wasInTransaction) { 348 conn.setAutoCommit(true); 349 } 350 351 } catch (SQLException e) { 352 throw new CmsDbSqlException(org.opencms.db.generic.Messages.get().container( 353 org.opencms.db.generic.Messages.ERR_GENERIC_SQL_1, 354 CmsDbSqlException.getErrorQuery(stmt)), e); 355 } catch (IOException e) { 356 throw new CmsDbIoException(Messages.get().container(Messages.ERR_SERIALIZING_USER_DATA_1, userId), e); 357 } finally { 358 359 if (res != null) { 360 try { 361 res.close(); 362 } catch (SQLException exc) { 363 } 365 } 366 if (commit != null) { 367 try { 368 commit.close(); 369 } catch (SQLException exc) { 370 } 372 } 373 374 if (!wasInTransaction) { 375 if (stmt != null) { 376 try { 377 rollback = m_sqlManager.getPreparedStatement(conn, "C_ROLLBACK"); 378 rollback.execute(); 379 rollback.close(); 380 } catch (SQLException se) { 381 } 383 try { 384 stmt.close(); 385 } catch (SQLException exc) { 386 } 388 } 389 if (conn != null) { 390 try { 391 conn.setAutoCommit(true); 392 conn.close(); 393 } catch (SQLException se) { 394 } 396 } 397 } 398 } 399 } 400 } | Popular Tags |