KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > opencms > db > oracle > CmsUserDriver


1 /*
2  * File : $Source: /usr/local/cvs/opencms/src/org/opencms/db/oracle/CmsUserDriver.java,v $
3  * Date : $Date: 2006/03/27 14:53:05 $
4  * Version: $Revision: 1.55 $
5  *
6  * This library is part of OpenCms -
7  * the Open Source Content Mananagement System
8  *
9  * Copyright (c) 2005 Alkacon Software GmbH (http://www.alkacon.com)
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
20  *
21  * For further information about Alkacon Software GmbH, please see the
22  * company website: http://www.alkacon.com
23  *
24  * For further information about OpenCms, please see the
25  * project website: http://www.opencms.org
26  *
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30  */

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 JavaDoc;
50 import java.io.OutputStream JavaDoc;
51 import java.sql.Blob JavaDoc;
52 import java.sql.Connection JavaDoc;
53 import java.sql.PreparedStatement JavaDoc;
54 import java.sql.ResultSet JavaDoc;
55 import java.sql.SQLException JavaDoc;
56 import java.util.Map JavaDoc;
57
58 import org.apache.commons.dbcp.DelegatingResultSet;
59 import org.apache.commons.logging.Log;
60
61 /**
62  * Oracle implementation of the user driver methods.<p>
63  *
64  * @author Thomas Weckert
65  * @author Carsten Weinholz
66  *
67  * @version $Revision: 1.55 $
68  *
69  * @since 6.0.0
70  */

71 public class CmsUserDriver extends org.opencms.db.generic.CmsUserDriver {
72
73     /** The log object for this class. */
74     private static final Log LOG = CmsLog.getLog(CmsUserDriver.class);
75
76     /**
77      * Generates an Output stream that writes to a blob, also truncating the existing blob if required.<p>
78      *
79      * Apparently Oracle requires some non-standard handling here.<p>
80      *
81      * @param res the result set where the blob is located in
82      * @param name the name of the database column where the blob is located
83      * @return an Output stream from a blob
84      * @throws SQLException if something goes wring
85      */

86     public static OutputStream JavaDoc getOutputStreamFromBlob(ResultSet JavaDoc res, String JavaDoc name) throws SQLException JavaDoc {
87
88         int todo = 0;
89         // TODO: perform blob check only once and store Oracle version in a static private member
90
// TODO: best do this during system startup / db init phase once
91

92         Blob JavaDoc blob = res.getBlob(name);
93         try {
94             // jdbc standard
95
blob.truncate(0);
96             return blob.setBinaryStream(0L);
97         } catch (SQLException JavaDoc e) {
98             // oracle 9 & 8 (if using the same jdbc driver as provided by oracle9: ojdbc14.jar)
99
((oracle.sql.BLOB)blob).trim(0);
100             return ((oracle.sql.BLOB)blob).getBinaryOutputStream();
101         }
102     }
103
104     /**
105      * @see org.opencms.db.I_CmsUserDriver#createUser(org.opencms.db.CmsDbContext, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, long, int, java.util.Map, java.lang.String, int)
106      */

107     public CmsUser createUser(
108         CmsDbContext dbc,
109         String JavaDoc name,
110         String JavaDoc password,
111         String JavaDoc description,
112         String JavaDoc firstname,
113         String JavaDoc lastname,
114         String JavaDoc email,
115         long lastlogin,
116         int flags,
117         Map JavaDoc additionalInfos,
118         String JavaDoc address,
119         int type) throws CmsDataAccessException, CmsPasswordEncryptionException {
120
121         CmsUUID id = new CmsUUID();
122         PreparedStatement JavaDoc stmt = null;
123         Connection JavaDoc 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             // write data to database
137
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 JavaDoc 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     /**
167      * @see org.opencms.db.I_CmsUserDriver#importUser(org.opencms.db.CmsDbContext, org.opencms.util.CmsUUID, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, long, int, java.util.Map, java.lang.String, int, java.lang.Object)
168      */

169     public CmsUser importUser(
170         CmsDbContext dbc,
171         CmsUUID id,
172         String JavaDoc name,
173         String JavaDoc password,
174         String JavaDoc description,
175         String JavaDoc firstname,
176         String JavaDoc lastname,
177         String JavaDoc email,
178         long lastlogin,
179         int flags,
180         Map JavaDoc additionalInfos,
181         String JavaDoc address,
182         int type,
183         Object JavaDoc reservedParam) throws CmsDataAccessException {
184
185         PreparedStatement JavaDoc stmt = null;
186         Connection JavaDoc 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                 // get a JDBC connection from the OpenCms standard {online|offline|backup} pools
199
conn = m_sqlManager.getConnection(dbc);
200             } else {
201                 // get a JDBC connection from the reserved JDBC pools
202
conn = m_sqlManager.getConnection(dbc, ((Integer JavaDoc)reservedParam).intValue());
203             }
204
205             // write data to database
206
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)); // imported passwords are already encrypted
210
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 JavaDoc 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     /**
235      * @see org.opencms.db.I_CmsUserDriver#initSqlManager(String)
236      */

237     public org.opencms.db.generic.CmsSqlManager initSqlManager(String JavaDoc classname) {
238
239         return CmsSqlManager.getInstance(classname);
240     }
241
242     /**
243      * @see org.opencms.db.I_CmsUserDriver#writeUser(org.opencms.db.CmsDbContext, org.opencms.file.CmsUser)
244      */

245     public void writeUser(CmsDbContext dbc, CmsUser user) throws CmsDataAccessException {
246
247         PreparedStatement JavaDoc stmt = null;
248         Connection JavaDoc conn = null;
249
250         try {
251
252             // get connection
253
conn = m_sqlManager.getConnection(dbc);
254
255             // write data to database
256
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 JavaDoc 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     /**
282      * Writes the user info as blob.<p>
283      *
284      * @param dbc the database context
285      * @param userId the user id
286      * @param additionalInfo the additional user info
287      * @param reservedParam for future use
288      *
289      * @throws CmsDataAccessException if something goes wrong
290      */

291     private void internalWriteUserInfo(CmsDbContext dbc, CmsUUID userId, Map JavaDoc additionalInfo, Object JavaDoc reservedParam)
292     throws CmsDataAccessException {
293
294         PreparedStatement JavaDoc stmt = null;
295         PreparedStatement JavaDoc commit = null;
296         PreparedStatement JavaDoc rollback = null;
297         ResultSet JavaDoc res = null;
298         Connection JavaDoc conn = null;
299
300         boolean wasInTransaction = false;
301
302         try {
303
304             // serialize the user info
305
byte[] value = internalSerializeAdditionalUserInfo(additionalInfo);
306
307             // get connection
308
if (reservedParam == null) {
309                 // get a JDBC connection from the OpenCms standard {online|offline|backup} pools
310
conn = m_sqlManager.getConnection(dbc);
311             } else {
312                 // get a JDBC connection from the reserved JDBC pools
313
conn = m_sqlManager.getConnection(dbc, ((Integer JavaDoc)reservedParam).intValue());
314             }
315
316             wasInTransaction = !conn.getAutoCommit();
317             if (!wasInTransaction) {
318                 conn.setAutoCommit(false);
319             }
320
321             // update user_info in this special way because of using blob
322
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             // write serialized user info
330
OutputStream JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc exc) {
363                     // ignore
364
}
365             }
366             if (commit != null) {
367                 try {
368                     commit.close();
369                 } catch (SQLException JavaDoc exc) {
370                     // ignore
371
}
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 JavaDoc se) {
381                         // ignore
382
}
383                     try {
384                         stmt.close();
385                     } catch (SQLException JavaDoc exc) {
386                         // ignore
387
}
388                 }
389                 if (conn != null) {
390                     try {
391                         conn.setAutoCommit(true);
392                         conn.close();
393                     } catch (SQLException JavaDoc se) {
394                         // ignore
395
}
396                 }
397             }
398         }
399     }
400 }
Popular Tags