/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.server.localserver.query.querystore;
import Sirius.server.newuser.*;
import Sirius.server.property.*;
import Sirius.server.search.store.*;
import Sirius.server.sql.*;
import java.io.*;
import java.rmi.*;
import java.sql.*;
import java.util.*;
/**
* Der QueryServer speichert Benutzer- und Gruppensuchprofile sowie Suchergebnisse eines Benutzers in der Datenbank und
* stellt diese zur Verf\u00FCgung.*
*
* @version $Revision$, $Date$
*/
public class Store {
//~ Instance fields --------------------------------------------------------
// --------Prepared Statements ------------------------------
/** SQL-Befehl zum Speichern eines Suche-Profiles von einem User.* */
protected PreparedStatement storeUserQuery;
/** SQL-Befehl zum Speichern eines Suche-Profiles von einem User.* */
protected PreparedStatement storeUserGroupQuery;
/** SQL-Befehl zum Abfragen von QueryInfos von einem User.* */
protected PreparedStatement getUserQueryInfo;
protected PreparedStatement getFileName;
protected PreparedStatement getUserGroupQueryInfo;
protected PreparedStatement getUserGroupInfo;
/** SQL-Befehl zum Abfragen eines Suche-Profiles einer UserGroup.* */
protected PreparedStatement getUserQuery;
/** SQL-Befehl zum Abfragen eines Suche-Profiles einer UserGroup.* */
protected PreparedStatement getUserGroupQuery;
/** SQL-Befehl, loescht Such-Profil eines Users.* */
protected PreparedStatement deleteUserQuery;
/** SQL-Befehl, loescht Such-Profil eines Users.* */
protected PreparedStatement deleteUserQueryGroupAssoc;
/** SQL-Befehl, aktualisiert Suchergebnis eines Users.* */
protected PreparedStatement updateUserQuery;
protected PreparedStatement getUserGroupId;
// -----------------------------------------
/** SQL-Befehl, ermittelt die groesste store.* */
protected PreparedStatement maxId;
/** Serverkonfiguration.* */
protected ServerProperties properties;
protected File qsd;
private final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(this.getClass());
//~ Constructors -----------------------------------------------------------
// ---------------------------------------------------------------
/**
* Konstruktor.
*
* @param con Connection zur Datenbank, bekommt der QueryServer vom LocalServer uebergeben
* @param properties ServerKonfiguration, bekommt der QueryServer vom LocalServer uebergeben*
*/
public Store(final Connection con, final ServerProperties properties) {
try {
storeUserQuery = con.prepareStatement(
"INSERT INTO cs_query_store (id, user_id,name, file_name) VALUES (?,?,?,?)"); // NOI18N
storeUserGroupQuery = con.prepareStatement(
"INSERT INTO cs_query_store_ug_assoc (ug_id, domainname, query_store_id, permission) VALUES (?,(select distinct id from cs_domain where name = ?),?,1)"); // NOI18N
getUserQueryInfo = con.prepareStatement("SELECT * FROM cs_query_store WHERE user_id = ?"); // NOI18N
getUserGroupInfo = con.prepareStatement(
"SELECT ug_id,query_store_id FROM cs_query_store_ug_assoc,cs_query_store WHERE user_id = ? and cs_query_store.id = cs_query_store_ug_assoc.query_store_id"); // NOI18N
getUserGroupQueryInfo = con.prepareStatement(
"SELECT qs.id, qs.name,qs.file_name FROM cs_query_store_ug_assoc qsa, cs_query_store qs WHERE qsa.ug_id = ? and qs.id = qsa.query_store_id"); // NOI18N
getUserQuery = con.prepareStatement("SELECT file_name,name FROM cs_query_store WHERE id = ? "); // NOI18N
updateUserQuery = con.prepareStatement("UPDATE cs_query_store SET file_name = ? WHERE id =?"); // NOI18N
deleteUserQuery = con.prepareStatement("DELETE from cs_query_store WHERE id = ?"); // NOI18N
deleteUserQueryGroupAssoc = con.prepareStatement(
"DELETE from cs_query_store_ug_assoc WHERE query_store_id = ?"); // NOI18N
maxId = con.prepareStatement("SELECT MAX(id) FROM cs_query_store"); // NOI18N
getUserGroupId = con.prepareStatement(
"SELECT distinct id from cs_ug where upper(name) = upper(?) and domain = ( select id from cs_domain where upper(name)=upper(?))"); // NOI18N
// -----------------------------------------------------------------------------------------
this.properties = properties;
// Erzeuge Verzeichnisse f\u00FCr den Querystore
qsd = new File(properties.getQueryStoreDirectory());
qsd.mkdirs();
} catch (Exception e) {
ExceptionHandler.handle(e);
}
}
//~ Methods ----------------------------------------------------------------
// -------------------------------------------------------------------------
/**
* speichert Such-Profil von einem User.
*
* @param user User, der das Profil speichern will
* @param data query das Profil, das gespeichert werden soll
*
* @return true, wenn gespeichert *
*/
public boolean storeQuery(final User user, final QueryData data) {
int effected = 0;
try {
int maxId = data.getID();
if (maxId == -1) // new Query need to be stored completely
{
maxId = getMaxId();
storeUserQuery.setInt(1, maxId);
storeUserQuery.setInt(2, user.getId());
storeUserQuery.setString(3, data.getName());
// filename constructed during runtime
final String fileName = createFilename(data, user, maxId);
writeFile(data.getData(), fileName);
storeUserQuery.setString(4, fileName);
effected = storeUserQuery.executeUpdate();
} else // change file only
{
deleteFile(data.getFileName());
writeFile(data.getData(), data.getFileName());
effected = 1;
}
final HashSet ugs = data.getUserGroups();
if (logger.isDebugEnabled()) {
logger.debug("user group in storeQuery" + ugs); // NOI18N
}
if (!ugs.isEmpty()) {
if (logger.isDebugEnabled()) {
logger.debug("ugs is not empty try to insert userGroupProfile"); // NOI18N
}
final Iterator iter = ugs.iterator();
while (iter.hasNext()) {
final String ugKey = (String)iter.next();
final Object[] ugk = UserGroup.parseKey(ugKey);
if (properties.getServerName().equalsIgnoreCase((String)ugk[1])) {
;
}
ugk[1] = "LOCAL"; // NOI18N
getUserGroupId.setString(1, (String)ugk[0]);
getUserGroupId.setString(2, (String)ugk[1]);
final ResultSet ugidSet = getUserGroupId.executeQuery();
int ugid = -1;
if (ugidSet.next()) {
ugid = ugidSet.getInt(1);
}
if (logger.isDebugEnabled()) {
logger.debug(ugid + " usergroupid for " + ugKey); // NOI18N
}
if (ugid == -1) {
break; // raus da:-)
}
if (logger.isDebugEnabled()) {
logger.debug("before insert ugProfile for ugid ==" + ugid); // NOI18N
}
storeUserGroupQuery.setInt(1, ugid); // ck[1] == domainname nur f\u00FCr lokale ugs
storeUserGroupQuery.setString(2, (String)ugk[1]);
storeUserGroupQuery.setInt(3, maxId);
if (logger.isDebugEnabled()) {
logger.debug(
"Datasets where inserted into UserProfile during insert #="
+ effected); // NOI18N
}
effected += storeUserGroupQuery.executeUpdate();
if (logger.isDebugEnabled()) {
logger.debug(
"Datasets where inserted into UserGroupProfile + Userprofile during insert #=" // NOI18N
+ effected);
}
}
}
} catch (Exception e) {
ExceptionHandler.handle(e);
}
return effected > 0;
}
/**
* -------------------------------------------------------------------------
*
* @param user DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public QueryInfo[] getQueryInfos(final User user) {
final HashMap result = new HashMap(10, 10);
try {
getUserQueryInfo.setInt(1, user.getId());
if (logger.isDebugEnabled()) {
logger.debug("try to retrieve UserQueryInfo in getQueryInfos(usr)"); // NOI18N
}
final ResultSet rs = getUserQueryInfo.executeQuery();
final String domain = properties.getServerName();
while (rs.next()) {
if (logger.isDebugEnabled()) {
logger.debug(
"try to retrieve UserQueryInfo in getQueryInfos(usr) result retrieved try to getInt(id)"); // NOI18N
}
final int id = rs.getInt("id"); // NOI18N
result.put(
new Integer(id),
new QueryInfo(id, (rs.getString("name")).trim(), domain, rs.getString("file_name"))); // NOI18N
}
getUserGroupInfo.setInt(1, user.getId());
if (logger.isDebugEnabled()) {
logger.debug("try to retrieve UserGroupinfos for" + user); // NOI18N
}
final ResultSet rs2 = getUserGroupInfo.executeQuery();
int qs_id = 0;
int ug_id = 0;
while (rs2.next()) {
qs_id = rs2.getInt("query_store_id"); // xxx // NOI18N
ug_id = rs2.getInt("ug_id"); // NOI18N
// add userGroup to QueryInfo of this user
((QueryInfo)result.get(new Integer(qs_id))).addUserGroup(ug_id + "@" + domain); // NOI18N
}
} catch (Exception e) {
ExceptionHandler.handle(e);
}
return (QueryInfo[])result.values().toArray(new QueryInfo[result.size()]);
}
/**
* -------------------------------------------------------------------------
*
* @param ug DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public QueryInfo[] getQueryInfos(final UserGroup ug) {
final HashMap result = new HashMap(10, 10);
try {
getUserGroupQueryInfo.setInt(1, ug.getId());
if (logger.isDebugEnabled()) {
logger.debug("try to retrieve UserGroupQueryInfo in getQueryInfos(ug)"); // NOI18N
}
final ResultSet rs = getUserGroupQueryInfo.executeQuery();
final String domain = properties.getServerName();
while (rs.next()) {
if (logger.isDebugEnabled()) {
logger.debug(
"try to retrieve UserGroupQueryInfo in getQueryInfos(ug) result retrieved try to getInt(id)"); // NOI18N
}
final int id = rs.getInt("id"); // NOI18N
result.put(
new Integer(id),
new QueryInfo(id, (rs.getString("name")).trim(), domain, rs.getString("file_name"))); // NOI18N
}
// interessiert hier nicht oder ??? xxx
/* getUserGroupInfo.setInt(1,ug.getID());
* rs = getUserGroupQueryInfo.executeQuery(); int qs_id=0; int ug_id=0; while(rs.next()) { qs_id =
* rs.getInt("id"); ug_id= rs.getInt(ug_id); // add userGroup to QueryInfo of this user
* ((QueryInfo)result.get(new Integer(qs_id))).addUserGroup(ug_id+"@"+domain); }
*/
} catch (Exception e) {
ExceptionHandler.handle(e);
}
return (QueryInfo[])result.values().toArray(new QueryInfo[result.size()]);
}
/**
* -------------------------------------------------------------------------
*
* @param queryId DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public QueryData getQuery(final int queryId) {
ResultSet rs = null;
QueryData q = null;
try {
getUserQuery.setInt(1, queryId);
rs = getUserQuery.executeQuery();
String fileName = null;
final String name = null;
// String domain=null;
byte[] data = new byte[0];
if (rs.next()) {
fileName = rs.getString("file_name").trim(); // NOI18N
rs.getString("name").trim(); // NOI18N
}
data = readFile(fileName);
if (logger.isDebugEnabled()) {
logger.debug("info :: data " + data); // NOI18N
}
q = new QueryData(queryId, properties.getServerName(), name, fileName, data); // file auslesen
} catch (Exception e) {
ExceptionHandler.handle(e);
}
return q;
}
// -------------------------------------------------------------------------------
/**
* loescht ein Such-Profil oder ein Suchergebnis.
*
* @param id UserId, UserGroupId oder queryResultId
*
* @return true, wenn erfolgreich geloescht, sonst false *
*/
// erg\u00E4nzen durch QueryInfo
public boolean delete(final int id) {
int effected = 0;
try {
// delete file first
getUserQuery.setInt(1, id);
final ResultSet rs = getUserQuery.executeQuery();
if (rs.next()) {
final String fileName = rs.getString("file_name").trim();
deleteFile(fileName);
}
deleteUserQuery.setInt(1, id);
deleteUserQueryGroupAssoc.setInt(1, id);
// delete store entry
effected = deleteUserQuery.executeUpdate();
// delete user group assocs
effected += deleteUserQueryGroupAssoc.executeUpdate();
} catch (Exception e) {
ExceptionHandler.handle(e);
}
return effected > 0;
}
/**
* ------------------------------------------------------------------------------
*
* @param user DOCUMENT ME!
* @param data DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean updateQuery(final User user, final QueryData data) {
return storeQuery(user, data);
}
/**
* /////////////////////////////////////////////////////////////////////////////
* //////////////////////////////////////////////////////////////////////////////
* /////////////////////////////////////////////////////////////////////////////
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
private int getMaxId() throws Exception {
final ResultSet rs = maxId.executeQuery();
if (rs.next()) {
// max+1
return rs.getInt(1) + 1;
}
// first entry
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
/**
* DOCUMENT ME!
*
* @param data DOCUMENT ME!
* @param fileName DOCUMENT ME!
*/
private void writeFile(final byte[] data, final String fileName) {
try {
final File outputFile = new File(qsd, fileName);
final FileOutputStream out = new FileOutputStream(outputFile);
out.write(data, 0, data.length);
out.close();
} catch (Exception e) {
logger.error("<LS> ERROR :: ", e); // NOI18N
}
}
/**
* DOCUMENT ME!
*
* @param fileName DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private byte[] readFile(final String fileName) {
byte[] data = null;
try {
final File inFile;
final FileInputStream stream;
inFile = new File(qsd, fileName);
data = new byte[(int)inFile.length()];
stream = new FileInputStream(inFile);
// read the file into data
final int bytesRead = stream.read(data, 0, (int)inFile.length());
if (bytesRead == -1) { // error occured during readingprocess
throw new Exception("read failed"); // NOI18N
} else if (bytesRead != (int)inFile.length()) {
throw new Exception("Information probably erroneous"); // NOI18N
}
stream.close();
} catch (Exception e) {
logger.error("<LS> ERROR :: ", e); // NOI18N
data = new byte[0];
}
return data;
}
/**
* DOCUMENT ME!
*
* @param fileName DOCUMENT ME!
*/
private void deleteFile(final String fileName) {
final File f = new File(qsd, fileName);
f.delete();
}
/**
* ///////////////////////////////////////////////// /////////////////////////////////////////////
*
* @param data DOCUMENT ME!
* @param user DOCUMENT ME!
* @param id DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String createFilename(final QueryData data, final User user, final int id) {
return id + user.getName() + data.getName() + System.currentTimeMillis() + ".str"; // NOI18N
}
} // end class