From a300626210e27544f288406c52113e715b37b036 Mon Sep 17 00:00:00 2001 From: zapata Date: Sun, 1 Dec 2002 15:05:51 +0000 Subject: [PATCH] tracked down a nasty error reporting bug --- source/mir/media/MirMediaException.java | 11 +- source/mir/misc/FileHandlerUserException.java | 21 +- source/mir/servlet/ServletModuleDispatch.java | 4 +- source/mir/storage/Database.java | 2191 ++++++++++---------- source/mircoders/entity/EntityImages.java | 197 +- source/mircoders/media/MediaHandlerImages.java | 44 +- source/mircoders/media/MediaRequest.java | 27 +- .../mircoders/servlet/ServletModuleOpenIndy.java | 631 +++--- .../servlet/ServletModuleUploadedMedia.java | 12 +- 9 files changed, 1580 insertions(+), 1558 deletions(-) diff --git a/source/mir/media/MirMediaException.java b/source/mir/media/MirMediaException.java index ac8cac6c..aa348a5b 100755 --- a/source/mir/media/MirMediaException.java +++ b/source/mir/media/MirMediaException.java @@ -35,22 +35,15 @@ import java.lang.*; /* * MirMediaException - - * - * @version $Id: MirMediaException.java,v 1.6 2002/11/04 04:35:21 mh Exp $ + * + * @version $Id: MirMediaException.java,v 1.7 2002/12/01 15:05:51 zapata Exp $ * @author mh * */ public final class MirMediaException extends Exception { - String msg; - public MirMediaException(String msg) { super(msg); - this.msg = msg; - } - - public String getMsg() { - return msg; } } diff --git a/source/mir/misc/FileHandlerUserException.java b/source/mir/misc/FileHandlerUserException.java index 80d207a1..afa8d504 100755 --- a/source/mir/misc/FileHandlerUserException.java +++ b/source/mir/misc/FileHandlerUserException.java @@ -36,13 +36,19 @@ import java.lang.*; /* * differentiates itself from a bug in that it * represents a probable user error - * - * @version $Id: FileHandlerUserException.java,v 1.3 2002/11/27 07:46:34 mh Exp $ + * + * @version $Id: FileHandlerUserException.java,v 1.4 2002/12/01 15:05:51 zapata Exp $ * @author mh * * $Log: FileHandlerUserException.java,v $ + * Revision 1.4 2002/12/01 15:05:51 zapata + * tracked down a nasty error reporting bug + * * Revision 1.3 2002/11/27 07:46:34 mh - * get rid of annoying $Log$ keywords + * get rid of annoying $Log: FileHandlerUserException.java,v $ + * get rid of annoying Revision 1.4 2002/12/01 15:05:51 zapata + * get rid of annoying tracked down a nasty error reporting bug + * get rid of annoying keywords * * Revision 1.2 2002/11/04 04:35:21 mh * merge media InputStream changes from MIR_1_0 branch @@ -65,15 +71,8 @@ import java.lang.*; */ public final class FileHandlerUserException extends Exception { - String msg; - - public FileHandlerUserException(String msg) { + public FileHandlerUserException(String msg) { super(msg); - this.msg = msg; - } - - public String getMsg() { - return msg; } } diff --git a/source/mir/servlet/ServletModuleDispatch.java b/source/mir/servlet/ServletModuleDispatch.java index 77c49cbb..51ebbdfd 100755 --- a/source/mir/servlet/ServletModuleDispatch.java +++ b/source/mir/servlet/ServletModuleDispatch.java @@ -42,7 +42,7 @@ import mir.log.*; * Dispatcher, calls the method passed to ServletModule Class, through the "do" * Parameter (via POST or GET) * - * @version $Id: ServletModuleDispatch.java,v 1.10 2002/11/30 19:45:56 zapata Exp $ + * @version $Id: ServletModuleDispatch.java,v 1.11 2002/12/01 15:05:51 zapata Exp $ * * @Author rk * @@ -102,7 +102,7 @@ public final class ServletModuleDispatch { throw new ServletModuleException("method not allowed!" + e.getMessage()); } catch ( InvocationTargetException e) { - System.out.println(e.getMessage()); + logger.debug( "invocation target exception: " + e.getMessage()); if (e.getTargetException() instanceof ServletModuleUserException) { throw new ServletModuleUserException(e.getTargetException().getMessage()); } diff --git a/source/mir/storage/Database.java b/source/mir/storage/Database.java index 738db07a..979656a6 100755 --- a/source/mir/storage/Database.java +++ b/source/mir/storage/Database.java @@ -55,280 +55,280 @@ import mir.misc.*; * Treiber, Host, User und Passwort, ueber den der Zugriff auf die * Datenbank erfolgt. * - * @version $Id: Database.java,v 1.24 2002/11/04 04:35:21 mh Exp $ + * @version $Id: Database.java,v 1.25 2002/12/01 15:05:51 zapata Exp $ * @author rk * */ public class Database implements StorageObject { - protected String theTable; - protected String theCoreTable=null; - protected String thePKeyName="id"; - protected int thePKeyType, thePKeyIndex; - protected boolean evaluatedMetaData=false; - protected ArrayList metadataFields,metadataLabels, - metadataNotNullFields; - protected int[] metadataTypes; - protected Class theEntityClass; - protected StorageObject myselfDatabase; - protected SimpleList popupCache=null; - protected boolean hasPopupCache = false; - protected SimpleHash hashCache=null; - protected boolean hasTimestamp=true; - private String database_driver, database_url; - private int defaultLimit; - protected DatabaseAdaptor theAdaptor; - protected Logfile theLog; - private static Class GENERIC_ENTITY_CLASS=null, - STORABLE_OBJECT_ENTITY_CLASS=null; + protected String theTable; + protected String theCoreTable=null; + protected String thePKeyName="id"; + protected int thePKeyType, thePKeyIndex; + protected boolean evaluatedMetaData=false; + protected ArrayList metadataFields,metadataLabels, + metadataNotNullFields; + protected int[] metadataTypes; + protected Class theEntityClass; + protected StorageObject myselfDatabase; + protected SimpleList popupCache=null; + protected boolean hasPopupCache = false; + protected SimpleHash hashCache=null; + protected boolean hasTimestamp=true; + private String database_driver, database_url; + private int defaultLimit; + protected DatabaseAdaptor theAdaptor; + protected Logfile theLog; + private static Class GENERIC_ENTITY_CLASS=null, + STORABLE_OBJECT_ENTITY_CLASS=null; private static SimpleHash POPUP_EMTYLINE=new SimpleHash(); protected static final ObjectStore o_store=ObjectStore.getInstance(); - private SimpleDateFormat _dateFormatterOut = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - private SimpleDateFormat _dateFormatterIn = - new SimpleDateFormat("yyyy-MM-dd HH:mm"); + private SimpleDateFormat _dateFormatterOut = + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private SimpleDateFormat _dateFormatterIn = + new SimpleDateFormat("yyyy-MM-dd HH:mm"); private Calendar _cal = new GregorianCalendar(); private static final int _millisPerHour = 60 * 60 * 1000; private static final int _millisPerMinute = 60 * 1000; - static { - // always same object saves a little space - POPUP_EMTYLINE.put("key", ""); POPUP_EMTYLINE.put("value", "--"); + static { + // always same object saves a little space + POPUP_EMTYLINE.put("key", ""); POPUP_EMTYLINE.put("value", "--"); try { GENERIC_ENTITY_CLASS = Class.forName("mir.entity.StorableObjectEntity"); STORABLE_OBJECT_ENTITY_CLASS = Class.forName("mir.entity.StorableObjectEntity"); } catch (Exception e) { - System.err.println("FATAL: Database.java could not initialize" + e.toString()); + System.err.println("FATAL: Database.java could not initialize" + e.getMessage()); } } - /** - * Kontruktor bekommt den Filenamen des Konfigurationsfiles übergeben. - * Aus diesem file werden Database.Logfile, - * Database.Username,Database.Password, - * Database.Host und Database.Adaptor - * ausgelesen und ein Broker für die Verbindugen zur Datenbank - * erzeugt. - * - * @param String confFilename Dateiname der Konfigurationsdatei - */ - public Database() throws StorageObjectException { - theLog = Logfile.getInstance(MirConfig.getProp("Home")+ - MirConfig.getProp("Database.Logfile")); - String theAdaptorName=MirConfig.getProp("Database.Adaptor"); - defaultLimit = Integer.parseInt(MirConfig.getProp("Database.Limit")); - try { - theEntityClass = GENERIC_ENTITY_CLASS; - theAdaptor = (DatabaseAdaptor)Class.forName(theAdaptorName).newInstance(); - } catch (Exception e){ - theLog.printError("Error in Database() constructor with "+ - theAdaptorName + " -- " +e.toString()); - throw new StorageObjectException("Error in Database() constructor with " - +e.toString()); - } - /*String database_username=MirConfig.getProp("Database.Username"); - String database_password=MirConfig.getProp("Database.Password"); - String database_host=MirConfig.getProp("Database.Host"); - try { - database_driver=theAdaptor.getDriver(); - database_url=theAdaptor.getURL(database_username,database_password, - database_host); - theLog.printDebugInfo("adding Broker with: " +database_driver+":"+ - database_url ); - MirConfig.addBroker(database_driver,database_url); - //myBroker=MirConfig.getBroker(); - }*/ - } - - /** - * Liefert die Entity-Klasse zurück, in der eine Datenbankzeile gewrappt - * wird. Wird die Entity-Klasse durch die erbende Klasse nicht überschrieben, - * wird eine mir.entity.GenericEntity erzeugt. - * - * @return Class-Objekt der Entity - */ - public java.lang.Class getEntityClass () { - return theEntityClass; - } - - /** - * Liefert die Standardbeschränkung von select-Statements zurück, also - * wieviel Datensätze per Default selektiert werden. - * - * @return Standard-Anzahl der Datensätze - */ - public int getLimit () { - return defaultLimit; - } - - /** - * Liefert den Namen des Primary-Keys zurück. Wird die Variable nicht von - * der erbenden Klasse überschrieben, so ist der Wert PKEY - * @return Name des Primary-Keys - */ - public String getIdName () { - return thePKeyName; - } - - /** - * Liefert den Namen der Tabelle, auf das sich das Datenbankobjekt bezieht. - * - * @return Name der Tabelle - */ - public String getTableName () { - return theTable; - } - - /* - * Dient dazu vererbte Tabellen bei objectrelationalen DBMS - * zu speichern, wenn die id einer Tabelle in der parenttabelle verwaltet - * wird. - * @return liefert theCoreTabel als String zurueck, wenn gesetzt, sonst - * the Table - */ - - public String getCoreTable(){ - if (theCoreTable!=null) return theCoreTable; - else return theTable; - } - - /** - * Liefert Feldtypen der Felder der Tabelle zurueck (s.a. java.sql.Types) - * @return int-Array mit den Typen der Felder - * @exception StorageObjectException - */ - public int[] getTypes () throws StorageObjectException { - if (metadataTypes == null) - get_meta_data(); - return metadataTypes; - } - - /** - * Liefert eine Liste der Labels der Tabellenfelder - * @return ArrayListe mit Labeln - * @exception StorageObjectException - */ - public ArrayList getLabels () throws StorageObjectException { - if (metadataLabels == null) - get_meta_data(); - return metadataLabels; - } - - /** - * Liefert eine Liste der Felder der Tabelle - * @return ArrayList mit Feldern - * @exception StorageObjectException - */ - public ArrayList getFields () throws StorageObjectException { - if (metadataFields == null) - get_meta_data(); - return metadataFields; - } - - - /* - * Gets value out of ResultSet according to type and converts to String - * @param inValue Wert aus ResultSet. - * @param aType Datenbanktyp. - * @return liefert den Wert als String zurueck. Wenn keine Umwandlung moeglich - * dann /unsupported value/ - */ - private String getValueAsString (ResultSet rs, int valueIndex, int aType) throws StorageObjectException { - String outValue = null; - if (rs != null) { - try { - switch (aType) { - case java.sql.Types.BIT: - outValue = (rs.getBoolean(valueIndex) == true) ? "1" : "0"; - break; - case java.sql.Types.INTEGER:case java.sql.Types.SMALLINT:case java.sql.Types.TINYINT:case java.sql.Types.BIGINT: - int out = rs.getInt(valueIndex); - if (!rs.wasNull()) - outValue = new Integer(out).toString(); - break; - case java.sql.Types.NUMERIC: + /** + * Kontruktor bekommt den Filenamen des Konfigurationsfiles übergeben. + * Aus diesem file werden Database.Logfile, + * Database.Username,Database.Password, + * Database.Host und Database.Adaptor + * ausgelesen und ein Broker für die Verbindugen zur Datenbank + * erzeugt. + * + * @param String confFilename Dateiname der Konfigurationsdatei + */ + public Database() throws StorageObjectException { + theLog = Logfile.getInstance(MirConfig.getProp("Home")+ + MirConfig.getProp("Database.Logfile")); + String theAdaptorName=MirConfig.getProp("Database.Adaptor"); + defaultLimit = Integer.parseInt(MirConfig.getProp("Database.Limit")); + try { + theEntityClass = GENERIC_ENTITY_CLASS; + theAdaptor = (DatabaseAdaptor)Class.forName(theAdaptorName).newInstance(); + } catch (Exception e){ + theLog.printError("Error in Database() constructor with "+ + theAdaptorName + " -- " +e.getMessage()); + throw new StorageObjectException("Error in Database() constructor with " + +e.getMessage()); + } + /*String database_username=MirConfig.getProp("Database.Username"); + String database_password=MirConfig.getProp("Database.Password"); + String database_host=MirConfig.getProp("Database.Host"); + try { + database_driver=theAdaptor.getDriver(); + database_url=theAdaptor.getURL(database_username,database_password, + database_host); + theLog.printDebugInfo("adding Broker with: " +database_driver+":"+ + database_url ); + MirConfig.addBroker(database_driver,database_url); + //myBroker=MirConfig.getBroker(); + }*/ + } + + /** + * Liefert die Entity-Klasse zurück, in der eine Datenbankzeile gewrappt + * wird. Wird die Entity-Klasse durch die erbende Klasse nicht überschrieben, + * wird eine mir.entity.GenericEntity erzeugt. + * + * @return Class-Objekt der Entity + */ + public java.lang.Class getEntityClass () { + return theEntityClass; + } + + /** + * Liefert die Standardbeschränkung von select-Statements zurück, also + * wieviel Datensätze per Default selektiert werden. + * + * @return Standard-Anzahl der Datensätze + */ + public int getLimit () { + return defaultLimit; + } + + /** + * Liefert den Namen des Primary-Keys zurück. Wird die Variable nicht von + * der erbenden Klasse überschrieben, so ist der Wert PKEY + * @return Name des Primary-Keys + */ + public String getIdName () { + return thePKeyName; + } + + /** + * Liefert den Namen der Tabelle, auf das sich das Datenbankobjekt bezieht. + * + * @return Name der Tabelle + */ + public String getTableName () { + return theTable; + } + + /* + * Dient dazu vererbte Tabellen bei objectrelationalen DBMS + * zu speichern, wenn die id einer Tabelle in der parenttabelle verwaltet + * wird. + * @return liefert theCoreTabel als String zurueck, wenn gesetzt, sonst + * the Table + */ + + public String getCoreTable(){ + if (theCoreTable!=null) return theCoreTable; + else return theTable; + } + + /** + * Liefert Feldtypen der Felder der Tabelle zurueck (s.a. java.sql.Types) + * @return int-Array mit den Typen der Felder + * @exception StorageObjectException + */ + public int[] getTypes () throws StorageObjectException { + if (metadataTypes == null) + get_meta_data(); + return metadataTypes; + } + + /** + * Liefert eine Liste der Labels der Tabellenfelder + * @return ArrayListe mit Labeln + * @exception StorageObjectException + */ + public ArrayList getLabels () throws StorageObjectException { + if (metadataLabels == null) + get_meta_data(); + return metadataLabels; + } + + /** + * Liefert eine Liste der Felder der Tabelle + * @return ArrayList mit Feldern + * @exception StorageObjectException + */ + public ArrayList getFields () throws StorageObjectException { + if (metadataFields == null) + get_meta_data(); + return metadataFields; + } + + + /* + * Gets value out of ResultSet according to type and converts to String + * @param inValue Wert aus ResultSet. + * @param aType Datenbanktyp. + * @return liefert den Wert als String zurueck. Wenn keine Umwandlung moeglich + * dann /unsupported value/ + */ + private String getValueAsString (ResultSet rs, int valueIndex, int aType) throws StorageObjectException { + String outValue = null; + if (rs != null) { + try { + switch (aType) { + case java.sql.Types.BIT: + outValue = (rs.getBoolean(valueIndex) == true) ? "1" : "0"; + break; + case java.sql.Types.INTEGER:case java.sql.Types.SMALLINT:case java.sql.Types.TINYINT:case java.sql.Types.BIGINT: + int out = rs.getInt(valueIndex); + if (!rs.wasNull()) + outValue = new Integer(out).toString(); + break; + case java.sql.Types.NUMERIC: /** @todo Numeric can be float or double depending upon * metadata.getScale() / especially with oracle */ - long outl = rs.getLong(valueIndex); - if (!rs.wasNull()) - outValue = new Long(outl).toString(); - break; - case java.sql.Types.REAL: - float tempf = rs.getFloat(valueIndex); - if (!rs.wasNull()) { - tempf *= 10; - tempf += 0.5; - int tempf_int = (int)tempf; - tempf = (float)tempf_int; - tempf /= 10; - outValue = "" + tempf; - outValue = outValue.replace('.', ','); - } - break; - case java.sql.Types.DOUBLE: - double tempd = rs.getDouble(valueIndex); - if (!rs.wasNull()) { - tempd *= 10; - tempd += 0.5; - int tempd_int = (int)tempd; - tempd = (double)tempd_int; - tempd /= 10; - outValue = "" + tempd; - outValue = outValue.replace('.', ','); - } - break; - case java.sql.Types.CHAR:case java.sql.Types.VARCHAR:case java.sql.Types.LONGVARCHAR: - outValue = rs.getString(valueIndex); - //if (outValue != null) - //outValue = StringUtil.encodeHtml(StringUtil.unquote(outValue)); - break; - case java.sql.Types.LONGVARBINARY: - outValue = rs.getString(valueIndex); - //if (outValue != null) - //outValue = StringUtil.encodeHtml(StringUtil.unquote(outValue)); - break; - case java.sql.Types.TIMESTAMP: + long outl = rs.getLong(valueIndex); + if (!rs.wasNull()) + outValue = new Long(outl).toString(); + break; + case java.sql.Types.REAL: + float tempf = rs.getFloat(valueIndex); + if (!rs.wasNull()) { + tempf *= 10; + tempf += 0.5; + int tempf_int = (int)tempf; + tempf = (float)tempf_int; + tempf /= 10; + outValue = "" + tempf; + outValue = outValue.replace('.', ','); + } + break; + case java.sql.Types.DOUBLE: + double tempd = rs.getDouble(valueIndex); + if (!rs.wasNull()) { + tempd *= 10; + tempd += 0.5; + int tempd_int = (int)tempd; + tempd = (double)tempd_int; + tempd /= 10; + outValue = "" + tempd; + outValue = outValue.replace('.', ','); + } + break; + case java.sql.Types.CHAR:case java.sql.Types.VARCHAR:case java.sql.Types.LONGVARCHAR: + outValue = rs.getString(valueIndex); + //if (outValue != null) + //outValue = StringUtil.encodeHtml(StringUtil.unquote(outValue)); + break; + case java.sql.Types.LONGVARBINARY: + outValue = rs.getString(valueIndex); + //if (outValue != null) + //outValue = StringUtil.encodeHtml(StringUtil.unquote(outValue)); + break; + case java.sql.Types.TIMESTAMP: // it's important to use Timestamp here as getting it // as a string is undefined and is only there for debugging // according to the API. we can make it a string through formatting. // -mh - Timestamp timestamp = (rs.getTimestamp(valueIndex)); + Timestamp timestamp = (rs.getTimestamp(valueIndex)); if(!rs.wasNull()) { java.util.Date date = new java.util.Date(timestamp.getTime()); outValue = _dateFormatterOut.format(date); _cal.setTime(date); int offset = _cal.get(Calendar.ZONE_OFFSET)+ - _cal.get(Calendar.DST_OFFSET); + _cal.get(Calendar.DST_OFFSET); String tzOffset = StringUtil.zeroPaddingNumber( - offset/_millisPerHour,2,2); + offset/_millisPerHour,2,2); outValue = outValue+"+"+tzOffset; } - break; - default: - outValue = ""; - theLog.printWarning("Unsupported Datatype: at " + valueIndex + - " (" + aType + ")"); - } - } catch (SQLException e) { - throw new StorageObjectException("Could not get Value out of Resultset -- " - + e.toString()); - } - } - return outValue; - } - - /* - * select-Operator um einen Datensatz zu bekommen. - * @param id Primaerschluessel des Datensatzes. - * @return liefert EntityObject des gefundenen Datensatzes oder null. - */ - public Entity selectById(String id) throws StorageObjectException + break; + default: + outValue = ""; + theLog.printWarning("Unsupported Datatype: at " + valueIndex + + " (" + aType + ")"); + } + } catch (SQLException e) { + throw new StorageObjectException("Could not get Value out of Resultset -- " + + e.getMessage()); + } + } + return outValue; + } + + /* + * select-Operator um einen Datensatz zu bekommen. + * @param id Primaerschluessel des Datensatzes. + * @return liefert EntityObject des gefundenen Datensatzes oder null. + */ + public Entity selectById(String id) throws StorageObjectException { - if (id==null||id.equals("")) - throw new StorageObjectException("id war null"); + if (id==null||id.equals("")) + throw new StorageObjectException("id war null"); // ask object store for object if ( StoreUtil.implementsStorableObject(theEntityClass) ) { @@ -341,149 +341,149 @@ public class Database implements StorageObject { if ( hit!=null ) return hit; } - Statement stmt=null;Connection con=getPooledCon(); - Entity returnEntity=null; - try { - ResultSet rs; - /** @todo better prepared statement */ - String selectSql = "select * from " + theTable + " where " + thePKeyName + "=" + id; - stmt = con.createStatement(); - rs = executeSql(stmt, selectSql); - if (rs != null) { - if (evaluatedMetaData==false) evalMetaData(rs.getMetaData()); - if (rs.next()) - returnEntity = makeEntityFromResultSet(rs); - else theLog.printDebugInfo("Keine daten fuer id: " + id + "in Tabelle" + theTable); - rs.close(); - } - else { - theLog.printDebugInfo("No Data for Id " + id + " in Table " + theTable); - } - } - catch (SQLException sqe){ - throwSQLException(sqe,"selectById"); return null; - } - catch (NumberFormatException e) { - theLog.printError("ID ist keine Zahl: " + id); - } - finally { freeConnection(con,stmt); } - - /** @todo OS: Entity should be saved in ostore */ - return returnEntity; - } - - - /** - * select-Operator um Datensaetze zu bekommen, die key = value erfuellen. - * @param key Datenbankfeld der Bedingung. - * @param value Wert die der key anehmen muss. - * @return EntityList mit den gematchten Entities - */ - public EntityList selectByFieldValue(String aField, String aValue) - throws StorageObjectException - { - return selectByFieldValue(aField, aValue, 0); - } - - /** - * select-Operator um Datensaetze zu bekommen, die key = value erfuellen. - * @param key Datenbankfeld der Bedingung. - * @param value Wert die der key anehmen muss. - * @param offset Gibt an ab welchem Datensatz angezeigt werden soll. - * @return EntityList mit den gematchten Entities - */ - public EntityList selectByFieldValue(String aField, String aValue, int offset) - throws StorageObjectException - { - return selectByWhereClause(aField + "=" + aValue, offset); - } - - - /** - * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. - * Also offset wird der erste Datensatz genommen. - * - * @param wc where-Clause - * @return EntityList mit den gematchten Entities - * @exception StorageObjectException - */ - public EntityList selectByWhereClause(String where) - throws StorageObjectException - { - return selectByWhereClause(where, 0); - } - - - /** - * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. - * Als maximale Anzahl wird das Limit auf der Konfiguration genommen. - * - * @param wc where-Clause - * @param offset ab welchem Datensatz. - * @return EntityList mit den gematchten Entities - * @exception StorageObjectException - */ - public EntityList selectByWhereClause(String whereClause, int offset) - throws StorageObjectException - { - return selectByWhereClause(whereClause, null, offset); - } - - - /** - * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. - * Also offset wird der erste Datensatz genommen. - * Als maximale Anzahl wird das Limit auf der Konfiguration genommen. - * - * @param wc where-Clause - * @param ob orderBy-Clause - * @return EntityList mit den gematchten Entities - * @exception StorageObjectException - */ - - public EntityList selectByWhereClause(String where, String order) - throws StorageObjectException { - return selectByWhereClause(where, order, 0); - } - - - /** - * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. - * Als maximale Anzahl wird das Limit auf der Konfiguration genommen. - * - * @param wc where-Clause - * @param ob orderBy-Clause - * @param offset ab welchem Datensatz - * @return EntityList mit den gematchten Entities - * @exception StorageObjectException - */ - - public EntityList selectByWhereClause(String whereClause, String orderBy, int offset) - throws StorageObjectException { - return selectByWhereClause(whereClause, orderBy, offset, defaultLimit); - } - - - /** - * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. - * @param wc where-Clause - * @param ob orderBy-Clause - * @param offset ab welchem Datensatz - * @param limit wieviele Datensätze - * @return EntityList mit den gematchten Entities - * @exception StorageObjectException - */ - - public EntityList selectByWhereClause(String wc, String ob, int offset, int limit) - throws StorageObjectException + Statement stmt=null;Connection con=getPooledCon(); + Entity returnEntity=null; + try { + ResultSet rs; + /** @todo better prepared statement */ + String selectSql = "select * from " + theTable + " where " + thePKeyName + "=" + id; + stmt = con.createStatement(); + rs = executeSql(stmt, selectSql); + if (rs != null) { + if (evaluatedMetaData==false) evalMetaData(rs.getMetaData()); + if (rs.next()) + returnEntity = makeEntityFromResultSet(rs); + else theLog.printDebugInfo("Keine daten fuer id: " + id + "in Tabelle" + theTable); + rs.close(); + } + else { + theLog.printDebugInfo("No Data for Id " + id + " in Table " + theTable); + } + } + catch (SQLException sqe){ + throwSQLException(sqe,"selectById"); return null; + } + catch (NumberFormatException e) { + theLog.printError("ID ist keine Zahl: " + id); + } + finally { freeConnection(con,stmt); } + + /** @todo OS: Entity should be saved in ostore */ + return returnEntity; + } + + + /** + * select-Operator um Datensaetze zu bekommen, die key = value erfuellen. + * @param key Datenbankfeld der Bedingung. + * @param value Wert die der key anehmen muss. + * @return EntityList mit den gematchten Entities + */ + public EntityList selectByFieldValue(String aField, String aValue) + throws StorageObjectException + { + return selectByFieldValue(aField, aValue, 0); + } + + /** + * select-Operator um Datensaetze zu bekommen, die key = value erfuellen. + * @param key Datenbankfeld der Bedingung. + * @param value Wert die der key anehmen muss. + * @param offset Gibt an ab welchem Datensatz angezeigt werden soll. + * @return EntityList mit den gematchten Entities + */ + public EntityList selectByFieldValue(String aField, String aValue, int offset) + throws StorageObjectException + { + return selectByWhereClause(aField + "=" + aValue, offset); + } + + + /** + * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. + * Also offset wird der erste Datensatz genommen. + * + * @param wc where-Clause + * @return EntityList mit den gematchten Entities + * @exception StorageObjectException + */ + public EntityList selectByWhereClause(String where) + throws StorageObjectException + { + return selectByWhereClause(where, 0); + } + + + /** + * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. + * Als maximale Anzahl wird das Limit auf der Konfiguration genommen. + * + * @param wc where-Clause + * @param offset ab welchem Datensatz. + * @return EntityList mit den gematchten Entities + * @exception StorageObjectException + */ + public EntityList selectByWhereClause(String whereClause, int offset) + throws StorageObjectException + { + return selectByWhereClause(whereClause, null, offset); + } + + + /** + * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. + * Also offset wird der erste Datensatz genommen. + * Als maximale Anzahl wird das Limit auf der Konfiguration genommen. + * + * @param wc where-Clause + * @param ob orderBy-Clause + * @return EntityList mit den gematchten Entities + * @exception StorageObjectException + */ + + public EntityList selectByWhereClause(String where, String order) + throws StorageObjectException { + return selectByWhereClause(where, order, 0); + } + + + /** + * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. + * Als maximale Anzahl wird das Limit auf der Konfiguration genommen. + * + * @param wc where-Clause + * @param ob orderBy-Clause + * @param offset ab welchem Datensatz + * @return EntityList mit den gematchten Entities + * @exception StorageObjectException + */ + + public EntityList selectByWhereClause(String whereClause, String orderBy, int offset) + throws StorageObjectException { + return selectByWhereClause(whereClause, orderBy, offset, defaultLimit); + } + + + /** + * select-Operator liefert eine EntityListe mit den gematchten Datensätzen zurück. + * @param wc where-Clause + * @param ob orderBy-Clause + * @param offset ab welchem Datensatz + * @param limit wieviele Datensätze + * @return EntityList mit den gematchten Entities + * @exception StorageObjectException + */ + + public EntityList selectByWhereClause(String wc, String ob, int offset, int limit) + throws StorageObjectException { // check o_store for entitylist if ( StoreUtil.implementsStorableObject(theEntityClass) ) { StoreIdentifier search_sid = - new StoreIdentifier( theEntityClass, - StoreContainerType.STOC_TYPE_ENTITYLIST, - StoreUtil.getEntityListUniqueIdentifierFor(theTable,wc,ob,offset,limit) ); + new StoreIdentifier( theEntityClass, + StoreContainerType.STOC_TYPE_ENTITYLIST, + StoreUtil.getEntityListUniqueIdentifierFor(theTable,wc,ob,offset,limit) ); EntityList hit = (EntityList)o_store.use(search_sid); if ( hit!=null ) { theLog.printDebugInfo("CACHE (hit): " + search_sid.toString()); @@ -491,146 +491,146 @@ public class Database implements StorageObject { } } - // local - EntityList theReturnList=null; - Connection con=null; Statement stmt=null; - ResultSet rs; - int offsetCount = 0, count=0; - - // build sql-statement - - /** @todo count sql string should only be assembled if we really count - * see below at the end of method //rk */ - - if (wc != null && wc.length() == 0) { - wc = null; - } - StringBuffer countSql = new StringBuffer("select count(*) from ").append(theTable); - StringBuffer selectSql = new StringBuffer("select * from ").append(theTable); - if (wc != null) { - selectSql.append(" where ").append(wc); - countSql.append(" where ").append(wc); - } - if (ob != null && !(ob.length() == 0)) { - selectSql.append(" order by ").append(ob); - } - if (theAdaptor.hasLimit()) { - if (limit > -1 && offset > -1) { - selectSql.append(" limit "); - if (theAdaptor.reverseLimit()) { - selectSql.append(limit).append(",").append(offset); - } - else { - selectSql.append(offset).append(",").append(limit); - } - } - } - - // execute sql - try { - con = getPooledCon(); - stmt = con.createStatement(); - - // selecting... - rs = executeSql(stmt, selectSql.toString()); - if (rs != null) { - if (!evaluatedMetaData) evalMetaData(rs.getMetaData()); - - theReturnList = new EntityList(); - Entity theResultEntity; - while (rs.next()) { - theResultEntity = makeEntityFromResultSet(rs); - theReturnList.add(theResultEntity); - offsetCount++; - } - rs.close(); - } - - // making entitylist infos - if (!(theAdaptor.hasLimit())) count = offsetCount; - - if (theReturnList != null) { - // now we decide if we have to know an overall count... - count=offsetCount; - if (limit > -1 && offset > -1) { - if (offsetCount==limit) { - /** @todo counting should be deffered to entitylist - * getSize() should be used */ - rs = executeSql(stmt, countSql.toString()); - if (rs != null) { - if ( rs.next() ) count = rs.getInt(1); - rs.close(); - } - else theLog.printError("Could not count: " + countSql); - } - } - theReturnList.setCount(count); - theReturnList.setOffset(offset); - theReturnList.setWhere(wc); - theReturnList.setOrder(ob); + // local + EntityList theReturnList=null; + Connection con=null; Statement stmt=null; + ResultSet rs; + int offsetCount = 0, count=0; + + // build sql-statement + + /** @todo count sql string should only be assembled if we really count + * see below at the end of method //rk */ + + if (wc != null && wc.length() == 0) { + wc = null; + } + StringBuffer countSql = new StringBuffer("select count(*) from ").append(theTable); + StringBuffer selectSql = new StringBuffer("select * from ").append(theTable); + if (wc != null) { + selectSql.append(" where ").append(wc); + countSql.append(" where ").append(wc); + } + if (ob != null && !(ob.length() == 0)) { + selectSql.append(" order by ").append(ob); + } + if (theAdaptor.hasLimit()) { + if (limit > -1 && offset > -1) { + selectSql.append(" limit "); + if (theAdaptor.reverseLimit()) { + selectSql.append(limit).append(",").append(offset); + } + else { + selectSql.append(offset).append(",").append(limit); + } + } + } + + // execute sql + try { + con = getPooledCon(); + stmt = con.createStatement(); + + // selecting... + rs = executeSql(stmt, selectSql.toString()); + if (rs != null) { + if (!evaluatedMetaData) evalMetaData(rs.getMetaData()); + + theReturnList = new EntityList(); + Entity theResultEntity; + while (rs.next()) { + theResultEntity = makeEntityFromResultSet(rs); + theReturnList.add(theResultEntity); + offsetCount++; + } + rs.close(); + } + + // making entitylist infos + if (!(theAdaptor.hasLimit())) count = offsetCount; + + if (theReturnList != null) { + // now we decide if we have to know an overall count... + count=offsetCount; + if (limit > -1 && offset > -1) { + if (offsetCount==limit) { + /** @todo counting should be deffered to entitylist + * getSize() should be used */ + rs = executeSql(stmt, countSql.toString()); + if (rs != null) { + if ( rs.next() ) count = rs.getInt(1); + rs.close(); + } + else theLog.printError("Could not count: " + countSql); + } + } + theReturnList.setCount(count); + theReturnList.setOffset(offset); + theReturnList.setWhere(wc); + theReturnList.setOrder(ob); theReturnList.setStorage(this); theReturnList.setLimit(limit); - if ( offset >= limit ) - theReturnList.setPrevBatch(offset - limit); - if ( offset+offsetCount < count ) - theReturnList.setNextBatch(offset + limit); + if ( offset >= limit ) + theReturnList.setPrevBatch(offset - limit); + if ( offset+offsetCount < count ) + theReturnList.setNextBatch(offset + limit); if ( StoreUtil.implementsStorableObject(theEntityClass) ) { StoreIdentifier sid=theReturnList.getStoreIdentifier(); theLog.printDebugInfo("CACHE (add): " + sid.toString()); o_store.add(sid); } - } - } - catch (SQLException sqe) { throwSQLException(sqe, "selectByWhereClause"); } - finally { freeConnection(con, stmt); } - - return theReturnList; - } - - - /** - * Bastelt aus einer Zeile der Datenbank ein EntityObjekt. - * - * @param rs Das ResultSetObjekt. - * @return Entity Die Entity. - */ - private Entity makeEntityFromResultSet (ResultSet rs) - throws StorageObjectException - { - /** @todo OS: get Pkey from ResultSet and consult ObjectStore */ - HashMap theResultHash = new HashMap(); - String theResult = null; - int theType; - Entity returnEntity = null; - try { - int size = metadataFields.size(); - for (int i = 0; i < size; i++) { - // alle durchlaufen bis nix mehr da - - theType = metadataTypes[i]; - if (theType == java.sql.Types.LONGVARBINARY) { - InputStreamReader is = (InputStreamReader)rs.getCharacterStream(i + 1); - if (is != null) { - char[] data = new char[32768]; - StringBuffer theResultString = new StringBuffer(); - int len; - while ((len = is.read(data)) > 0) { - theResultString.append(data, 0, len); - } - is.close(); - theResult = theResultString.toString(); - } - else { - theResult = null; - } - } - else { - theResult = getValueAsString(rs, (i + 1), theType); - } - if (theResult != null) { - theResultHash.put(metadataFields.get(i), theResult); - } - } + } + } + catch (SQLException sqe) { throwSQLException(sqe, "selectByWhereClause"); } + finally { freeConnection(con, stmt); } + + return theReturnList; + } + + + /** + * Bastelt aus einer Zeile der Datenbank ein EntityObjekt. + * + * @param rs Das ResultSetObjekt. + * @return Entity Die Entity. + */ + private Entity makeEntityFromResultSet (ResultSet rs) + throws StorageObjectException + { + /** @todo OS: get Pkey from ResultSet and consult ObjectStore */ + HashMap theResultHash = new HashMap(); + String theResult = null; + int theType; + Entity returnEntity = null; + try { + int size = metadataFields.size(); + for (int i = 0; i < size; i++) { + // alle durchlaufen bis nix mehr da + + theType = metadataTypes[i]; + if (theType == java.sql.Types.LONGVARBINARY) { + InputStreamReader is = (InputStreamReader)rs.getCharacterStream(i + 1); + if (is != null) { + char[] data = new char[32768]; + StringBuffer theResultString = new StringBuffer(); + int len; + while ((len = is.read(data)) > 0) { + theResultString.append(data, 0, len); + } + is.close(); + theResult = theResultString.toString(); + } + else { + theResult = null; + } + } + else { + theResult = getValueAsString(rs, (i + 1), theType); + } + if (theResult != null) { + theResultHash.put(metadataFields.get(i), theResult); + } + } if (theEntityClass != null) { returnEntity = (Entity)theEntityClass.newInstance(); returnEntity.setValues(theResultHash); @@ -642,178 +642,178 @@ public class Database implements StorageObject { } else { throwStorageObjectException("Internal Error: theEntityClass not set!"); } - } catch (IllegalAccessException e) { - throwStorageObjectException("Kein Zugriff! -- " + e.toString()); - } catch (IOException e) { - throwStorageObjectException("IOException! -- " + e.toString()); - } catch (InstantiationException e) { - throwStorageObjectException("Keine Instantiiierung! -- " + e.toString()); - } catch (SQLException sqe) { - throwSQLException(sqe, "makeEntityFromResultSet"); - return null; - } - return returnEntity; - } - - /** - * insert-Operator: fügt eine Entity in die Tabelle ein. Eine Spalte WEBDB_CREATE - * wird automatisch mit dem aktuellen Datum gefuellt. - * - * @param theEntity - * @return der Wert des Primary-keys der eingefügten Entity - */ - public String insert (Entity theEntity) throws StorageObjectException { - //cache - invalidatePopupCache(); + } catch (IllegalAccessException e) { + throwStorageObjectException("No access! -- " + e.getMessage()); + } catch (IOException e) { + throwStorageObjectException("IOException! -- " + e.getMessage()); + } catch (InstantiationException e) { + throwStorageObjectException("No Instatiation! -- " + e.getMessage()); + } catch (SQLException sqe) { + throwSQLException(sqe, "makeEntityFromResultSet"); + return null; + } + return returnEntity; + } + + /** + * insert-Operator: fügt eine Entity in die Tabelle ein. Eine Spalte WEBDB_CREATE + * wird automatisch mit dem aktuellen Datum gefuellt. + * + * @param theEntity + * @return der Wert des Primary-keys der eingefügten Entity + */ + public String insert (Entity theEntity) throws StorageObjectException { + //cache + invalidatePopupCache(); // invalidating all EntityLists corresponding with theEntityClass if ( StoreUtil.implementsStorableObject(theEntityClass) ) { StoreContainerType stoc_type = - StoreContainerType.valueOf( theEntityClass, - StoreContainerType.STOC_TYPE_ENTITYLIST); + StoreContainerType.valueOf( theEntityClass, + StoreContainerType.STOC_TYPE_ENTITYLIST); o_store.invalidate(stoc_type); } - String returnId = null; - Connection con = null; PreparedStatement pstmt = null; + String returnId = null; + Connection con = null; PreparedStatement pstmt = null; try { - ArrayList streamedInput = theEntity.streamedInput(); - StringBuffer f = new StringBuffer(); - StringBuffer v = new StringBuffer(); - String aField, aValue; - boolean firstField = true; - // make sql-string - for (int i = 0; i < getFields().size(); i++) { - aField = (String)getFields().get(i); - if (!aField.equals(thePKeyName)) { - aValue = null; - // sonderfaelle - if (aField.equals("webdb_create") || + ArrayList streamedInput = theEntity.streamedInput(); + StringBuffer f = new StringBuffer(); + StringBuffer v = new StringBuffer(); + String aField, aValue; + boolean firstField = true; + // make sql-string + for (int i = 0; i < getFields().size(); i++) { + aField = (String)getFields().get(i); + if (!aField.equals(thePKeyName)) { + aValue = null; + // sonderfaelle + if (aField.equals("webdb_create") || aField.equals("webdb_lastchange")) { - aValue = "NOW()"; - } - else { - if (streamedInput != null && streamedInput.contains(aField)) { - aValue = "?"; - } - else { - if (theEntity.hasValueForField(aField)) { - aValue = "'" + StringUtil.quote((String)theEntity.getValue(aField)) - + "'"; - } - } - } - // wenn Wert gegeben, dann einbauen - if (aValue != null) { - if (firstField == false) { - f.append(","); - v.append(","); - } - else { - firstField = false; - } - f.append(aField); - v.append(aValue); - } - } - } // end for - // insert into db - StringBuffer sqlBuf = new StringBuffer("insert into ").append(theTable).append("(").append(f).append(") values (").append(v).append(")"); - String sql = sqlBuf.toString(); - theLog.printInfo("INSERT: " + sql); - con = getPooledCon(); - con.setAutoCommit(false); - pstmt = con.prepareStatement(sql); - if (streamedInput != null) { - for (int i = 0; i < streamedInput.size(); i++) { - String inputString = (String)theEntity.getValue((String)streamedInput.get(i)); - pstmt.setBytes(i + 1, inputString.getBytes()); - } - } - int ret = pstmt.executeUpdate(); - if(ret == 0){ - //insert failed - return null; - } - pstmt = con.prepareStatement(theAdaptor.getLastInsertSQL((Database)myselfDatabase)); - ResultSet rs = pstmt.executeQuery(); - rs.next(); - returnId = rs.getString(1); - theEntity.setId(returnId); - } catch (SQLException sqe) { - throwSQLException(sqe, "insert"); - } finally { - try { - con.setAutoCommit(true); - } catch (Exception e) { - ; - } - freeConnection(con, pstmt); - } + aValue = "NOW()"; + } + else { + if (streamedInput != null && streamedInput.contains(aField)) { + aValue = "?"; + } + else { + if (theEntity.hasValueForField(aField)) { + aValue = "'" + StringUtil.quote((String)theEntity.getValue(aField)) + + "'"; + } + } + } + // wenn Wert gegeben, dann einbauen + if (aValue != null) { + if (firstField == false) { + f.append(","); + v.append(","); + } + else { + firstField = false; + } + f.append(aField); + v.append(aValue); + } + } + } // end for + // insert into db + StringBuffer sqlBuf = new StringBuffer("insert into ").append(theTable).append("(").append(f).append(") values (").append(v).append(")"); + String sql = sqlBuf.toString(); + theLog.printInfo("INSERT: " + sql); + con = getPooledCon(); + con.setAutoCommit(false); + pstmt = con.prepareStatement(sql); + if (streamedInput != null) { + for (int i = 0; i < streamedInput.size(); i++) { + String inputString = (String)theEntity.getValue((String)streamedInput.get(i)); + pstmt.setBytes(i + 1, inputString.getBytes()); + } + } + int ret = pstmt.executeUpdate(); + if(ret == 0){ + //insert failed + return null; + } + pstmt = con.prepareStatement(theAdaptor.getLastInsertSQL((Database)myselfDatabase)); + ResultSet rs = pstmt.executeQuery(); + rs.next(); + returnId = rs.getString(1); + theEntity.setId(returnId); + } catch (SQLException sqe) { + throwSQLException(sqe, "insert"); + } finally { + try { + con.setAutoCommit(true); + } catch (Exception e) { + ; + } + freeConnection(con, pstmt); + } /** @todo store entity in o_store */ - return returnId; - } - - /** - * update-Operator: aktualisiert eine Entity. Eine Spalte WEBDB_LASTCHANGE - * wird automatisch mit dem aktuellen Datum gefuellt. - * - * @param theEntity - */ - public void update (Entity theEntity) throws StorageObjectException + return returnId; + } + + /** + * update-Operator: aktualisiert eine Entity. Eine Spalte WEBDB_LASTCHANGE + * wird automatisch mit dem aktuellen Datum gefuellt. + * + * @param theEntity + */ + public void update (Entity theEntity) throws StorageObjectException { - Connection con = null; PreparedStatement pstmt = null; - /** @todo this is stupid: why do we prepare statement, when we - * throw it away afterwards. should be regular statement - * update/insert could better be one routine called save() - * that chooses to either insert or update depending if we - * have a primary key in the entity. i don't know if we - * still need the streamed input fields. // rk */ - - /** @todo extension: check if Entity did change, otherwise we don't need + Connection con = null; PreparedStatement pstmt = null; + /** @todo this is stupid: why do we prepare statement, when we + * throw it away afterwards. should be regular statement + * update/insert could better be one routine called save() + * that chooses to either insert or update depending if we + * have a primary key in the entity. i don't know if we + * still need the streamed input fields. // rk */ + + /** @todo extension: check if Entity did change, otherwise we don't need * the roundtrip to the database */ - /** invalidating corresponding entitylists in o_store*/ + /** invalidating corresponding entitylists in o_store*/ if ( StoreUtil.implementsStorableObject(theEntityClass) ) { StoreContainerType stoc_type = - StoreContainerType.valueOf( theEntityClass, - StoreContainerType.STOC_TYPE_ENTITYLIST); + StoreContainerType.valueOf( theEntityClass, + StoreContainerType.STOC_TYPE_ENTITYLIST); o_store.invalidate(stoc_type); } - ArrayList streamedInput = theEntity.streamedInput(); - String id = theEntity.getId(); - String aField; - StringBuffer fv = new StringBuffer(); - boolean firstField = true; - //cache - invalidatePopupCache(); - // build sql statement - for (int i = 0; i < getFields().size(); i++) { - aField = (String)metadataFields.get(i); - // only normal cases - if (!(aField.equals(thePKeyName) || aField.equals("webdb_create") || - aField.equals("webdb_lastchange") || (streamedInput != null && streamedInput.contains(aField)))) { - if (theEntity.hasValueForField(aField)) { - if (firstField == false) { - fv.append(", "); - } - else { - firstField = false; - } - fv.append(aField).append("='").append(StringUtil.quote((String)theEntity.getValue(aField))).append("'"); - } - } - } - StringBuffer sql = new StringBuffer("update ").append(theTable).append(" set ").append(fv); - // exceptions - if (metadataFields.contains("webdb_lastchange")) { - sql.append(",webdb_lastchange=NOW()"); - } + ArrayList streamedInput = theEntity.streamedInput(); + String id = theEntity.getId(); + String aField; + StringBuffer fv = new StringBuffer(); + boolean firstField = true; + //cache + invalidatePopupCache(); + // build sql statement + for (int i = 0; i < getFields().size(); i++) { + aField = (String)metadataFields.get(i); + // only normal cases + if (!(aField.equals(thePKeyName) || aField.equals("webdb_create") || + aField.equals("webdb_lastchange") || (streamedInput != null && streamedInput.contains(aField)))) { + if (theEntity.hasValueForField(aField)) { + if (firstField == false) { + fv.append(", "); + } + else { + firstField = false; + } + fv.append(aField).append("='").append(StringUtil.quote((String)theEntity.getValue(aField))).append("'"); + } + } + } + StringBuffer sql = new StringBuffer("update ").append(theTable).append(" set ").append(fv); + // exceptions + if (metadataFields.contains("webdb_lastchange")) { + sql.append(",webdb_lastchange=NOW()"); + } // special case: the webdb_create requires the field in yyyy-mm-dd HH:mm // format so anything extra will be ignored. -mh - if (metadataFields.contains("webdb_create") && + if (metadataFields.contains("webdb_create") && theEntity.hasValueForField("webdb_create")) { // minimum of 10 (yyyy-mm-dd)... if (theEntity.getValue("webdb_create").length() >= 10) { @@ -828,448 +828,457 @@ public class Database implements StorageObject { Timestamp tStamp = new Timestamp(d.getTime()); sql.append(",webdb_create='"+tStamp.toString()+"'"); } catch (ParseException e) { - throw new StorageObjectException(e.toString()); + throw new StorageObjectException(e.getMessage()); + } + } + } + if (streamedInput != null) { + for (int i = 0; i < streamedInput.size(); i++) { + sql.append(",").append(streamedInput.get(i)).append("=?"); + } + } + sql.append(" where id=").append(id); + theLog.printInfo("UPDATE: " + sql); + // execute sql + try { + con = getPooledCon(); + con.setAutoCommit(false); + pstmt = con.prepareStatement(sql.toString()); + if (streamedInput != null) { + for (int i = 0; i < streamedInput.size(); i++) { + String inputString = theEntity.getValue((String)streamedInput.get(i)); + pstmt.setBytes(i + 1, inputString.getBytes()); } } - } - if (streamedInput != null) { - for (int i = 0; i < streamedInput.size(); i++) { - sql.append(",").append(streamedInput.get(i)).append("=?"); - } - } - sql.append(" where id=").append(id); - theLog.printInfo("UPDATE: " + sql); - // execute sql - try { - con = getPooledCon(); - con.setAutoCommit(false); - pstmt = con.prepareStatement(sql.toString()); - if (streamedInput != null) { - for (int i = 0; i < streamedInput.size(); i++) { - String inputString = theEntity.getValue((String)streamedInput.get(i)); - pstmt.setBytes(i + 1, inputString.getBytes()); - } - } - pstmt.executeUpdate(); - } catch (SQLException sqe) { - throwSQLException(sqe, "update"); - } finally { - try { - con.setAutoCommit(true); - } catch (Exception e) { - ; - } - freeConnection(con, pstmt); - } - } - - /* - * delete-Operator - * @param id des zu loeschenden Datensatzes - * @return boolean liefert true zurueck, wenn loeschen erfolgreich war. - */ - public boolean delete (String id) throws StorageObjectException { - - invalidatePopupCache(); + pstmt.executeUpdate(); + } catch (SQLException sqe) { + throwSQLException(sqe, "update"); + } finally { + try { + con.setAutoCommit(true); + } catch (Exception e) { + ; + } + freeConnection(con, pstmt); + } + } + + /* + * delete-Operator + * @param id des zu loeschenden Datensatzes + * @return boolean liefert true zurueck, wenn loeschen erfolgreich war. + */ + public boolean delete (String id) throws StorageObjectException { + + invalidatePopupCache(); // ostore send notification if ( StoreUtil.implementsStorableObject(theEntityClass) ) { String uniqueId = id; if ( theEntityClass.equals(StorableObjectEntity.class) ) uniqueId+="@"+theTable; - theLog.printInfo("CACHE: (del) " + id); - StoreIdentifier search_sid = - new StoreIdentifier(theEntityClass, StoreContainerType.STOC_TYPE_ENTITY, uniqueId); + theLog.printInfo("CACHE: (del) " + id); + StoreIdentifier search_sid = + new StoreIdentifier(theEntityClass, StoreContainerType.STOC_TYPE_ENTITY, uniqueId); o_store.invalidate(search_sid); - } - - /** @todo could be prepared Statement */ - Statement stmt = null; Connection con = null; - int res = 0; - String sql="delete from "+theTable+" where "+thePKeyName+"='"+id+"'"; - theLog.printInfo("DELETE " + sql); - try { - con = getPooledCon(); stmt = con.createStatement(); - res = stmt.executeUpdate(sql); - } + } + + /** @todo could be prepared Statement */ + Statement stmt = null; Connection con = null; + int res = 0; + String sql="delete from "+theTable+" where "+thePKeyName+"='"+id+"'"; + theLog.printInfo("DELETE " + sql); + try { + con = getPooledCon(); stmt = con.createStatement(); + res = stmt.executeUpdate(sql); + } catch (SQLException sqe) { throwSQLException(sqe, "delete"); } finally { freeConnection(con, stmt); } - return (res > 0) ? true : false; - } - - /* noch nicht implementiert. - * @return immer false - */ - public boolean delete (EntityList theEntityList) { - invalidatePopupCache(); - return false; - } - - /** - * Diese Methode sollte ueberschrieben werden, wenn fuer die abgeleitete Database-Klasse - * eine SimpleList mit Standard-Popupdaten erzeugt werden koennen soll. - * @return null - */ - public SimpleList getPopupData () throws StorageObjectException { - return null; - } - - /** - * Holt Daten fuer Popups. - * @param name Name des Feldes. - * @param hasNullValue Wenn true wird eine leerer Eintrag fuer die Popups erzeugt. - * @return SimpleList Gibt freemarker.template.SimpleList zurueck. - */ - public SimpleList getPopupData (String name, boolean hasNullValue) - throws StorageObjectException { - return getPopupData(name, hasNullValue, null); - } - - /** - * Holt Daten fuer Popups. - * @param name Name des Feldes. - * @param hasNullValue Wenn true wird eine leerer Eintrag fuer die Popups erzeugt. - * @param where Schraenkt die Selektion der Datensaetze ein. - * @return SimpleList Gibt freemarker.template.SimpleList zurueck. - */ - public SimpleList getPopupData (String name, boolean hasNullValue, String where) throws StorageObjectException { - return getPopupData(name, hasNullValue, where, null); - } - - /** - * Holt Daten fuer Popups. - * @param name Name des Feldes. - * @param hasNullValue Wenn true wird eine leerer Eintrag fuer die Popups erzeugt. - * @param where Schraenkt die Selektion der Datensaetze ein. - * @param order Gibt ein Feld als Sortierkriterium an. - * @return SimpleList Gibt freemarker.template.SimpleList zurueck. - */ - public SimpleList getPopupData (String name, boolean hasNullValue, String where, String order) throws StorageObjectException { - // caching - if (hasPopupCache && popupCache != null) - return popupCache; - SimpleList simpleList = null; - Connection con = null; - Statement stmt = null; - // build sql - StringBuffer sql = new StringBuffer("select ").append(thePKeyName) - .append(",").append(name).append(" from ") - .append(theTable); - if (where != null && !(where.length() == 0)) - sql.append(" where ").append(where); - sql.append(" order by "); - if (order != null && !(order.length() == 0)) - sql.append(order); - else - sql.append(name); - // execute sql - try { - con = getPooledCon(); - } catch (Exception e) { - throw new StorageObjectException(e.toString()); - } - try { - stmt = con.createStatement(); - ResultSet rs = executeSql(stmt, sql.toString()); - - if (rs != null) { - if (!evaluatedMetaData) get_meta_data(); - simpleList = new SimpleList(); - // if popup has null-selector - if (hasNullValue) simpleList.add(POPUP_EMTYLINE); - - SimpleHash popupDict; - while (rs.next()) { - popupDict = new SimpleHash(); - popupDict.put("key", getValueAsString(rs, 1, thePKeyType)); - popupDict.put("value", rs.getString(2)); - simpleList.add(popupDict); - } - rs.close(); - } - } catch (Exception e) { - theLog.printError("getPopupData: "+e.toString()); - throw new StorageObjectException(e.toString()); - } finally { - freeConnection(con, stmt); - } - - if (hasPopupCache) popupCache = simpleList; - return simpleList; - } - - /** - * Liefert alle Daten der Tabelle als SimpleHash zurueck. Dies wird verwandt, - * wenn in den Templates ein Lookup-Table benoetigt wird. Sollte nur bei kleinen - * Tabellen Verwendung finden. - * @return SimpleHash mit den Tabellezeilen. - */ - public SimpleHash getHashData () { - /** @todo dangerous! this should have a flag to be enabled, otherwise - * very big Hashes could be returned */ - if (hashCache == null) { - try { - hashCache = HTMLTemplateProcessor.makeSimpleHash(selectByWhereClause("", - -1)); - } catch (StorageObjectException e) { - theLog.printDebugInfo(e.toString()); - } - } - return hashCache; - } - - /* invalidates the popupCache - */ - protected void invalidatePopupCache () { - /** @todo invalidates toooo much */ - popupCache = null; - hashCache = null; - } - - /** - * Diese Methode fuehrt den Sqlstring sql aus und timed im Logfile. - * @param stmt Statemnt - * @param sql Sql-String - * @return ResultSet - * @exception StorageObjectException - */ - public ResultSet executeSql (Statement stmt, String sql) - throws StorageObjectException, SQLException - { - long startTime = System.currentTimeMillis(); - ResultSet rs; - try { - rs = stmt.executeQuery(sql); - theLog.printInfo((System.currentTimeMillis() - startTime) + "ms. for: " - + sql); - } - catch (SQLException e) - { - theLog.printDebugInfo("Failed: " + (System.currentTimeMillis() - - startTime) + "ms. for: "+ sql); - throw e; - } - - return rs; - } - - /** - * Fuehrt Statement stmt aus und liefert Resultset zurueck. Das SQL-Statment wird - * getimed und geloggt. - * @param stmt PreparedStatement mit der SQL-Anweisung - * @return Liefert ResultSet des Statements zurueck. - * @exception StorageObjectException, SQLException - */ - public ResultSet executeSql (PreparedStatement stmt) - throws StorageObjectException, SQLException { - - long startTime = (new java.util.Date()).getTime(); - ResultSet rs = stmt.executeQuery(); - theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms."); - return rs; - } - - /** - * returns the number of rows in the table - */ - public int getSize(String where) - throws SQLException,StorageObjectException - { - long startTime = System.currentTimeMillis(); - String sql = "SELECT Count(*) FROM "+ theTable; - if (where != null && !(where.length() == 0)) - sql = sql + " where " + where; - Connection con = null; - Statement stmt = null; - int result = 0; - - try { - con = getPooledCon(); - stmt = con.createStatement(); - ResultSet rs = executeSql(stmt,sql); - while(rs.next()){ - result = rs.getInt(1); - } - } catch (SQLException e) { - theLog.printError(e.toString()); - } finally { - freeConnection(con,stmt); - } - //theLog.printInfo(theTable + " has "+ result +" rows where " + where); - theLog.printInfo((System.currentTimeMillis() - startTime) + "ms. for: " - + sql); - return result; - } - - public int executeUpdate(Statement stmt, String sql) - throws StorageObjectException, SQLException - { - int rs; - long startTime = (new java.util.Date()).getTime(); - try - { - rs = stmt.executeUpdate(sql); - theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms. for: " - + sql); - } - catch (SQLException e) - { - theLog.printDebugInfo("Failed: " + (new java.util.Date().getTime() - - startTime) + "ms. for: "+ sql); - throw e; - } - return rs; - } - - public int executeUpdate(String sql) - throws StorageObjectException, SQLException - { - int result=-1; - long startTime = (new java.util.Date()).getTime(); - Connection con=null;PreparedStatement pstmt=null; - try { - con=getPooledCon(); - pstmt = con.prepareStatement(sql); - result = pstmt.executeUpdate(); - } - catch (Exception e) { - theLog.printDebugInfo("settimage :: setImage gescheitert: "+e.toString()); - throw new StorageObjectException("executeUpdate failed: "+e.toString()); - } - finally { freeConnection(con,pstmt); } - theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms. for: " - + sql); - return result; - } - - /** - * Wertet ResultSetMetaData aus und setzt interne Daten entsprechend - * @param md ResultSetMetaData - * @exception StorageObjectException - */ - private void evalMetaData (ResultSetMetaData md) - throws StorageObjectException { - - this.evaluatedMetaData = true; - this.metadataFields = new ArrayList(); - this.metadataLabels = new ArrayList(); - this.metadataNotNullFields = new ArrayList(); - try { - int numFields = md.getColumnCount(); - this.metadataTypes = new int[numFields]; - String aField; - int aType; - for (int i = 1; i <= numFields; i++) { - aField = md.getColumnName(i); - metadataFields.add(aField); - metadataLabels.add(md.getColumnLabel(i)); - aType = md.getColumnType(i); - metadataTypes[i - 1] = aType; - if (aField.equals(thePKeyName)) { - thePKeyType = aType; thePKeyIndex = i; - } - if (md.isNullable(i) == md.columnNullable) { - metadataNotNullFields.add(aField); - } - } - } catch (SQLException e) { - throwSQLException(e, "evalMetaData"); - } - } - - /** - * Wertet die Metadaten eines Resultsets fuer eine Tabelle aus, - * um die alle Columns und Typen einer Tabelle zu ermitteln. - */ - private void get_meta_data () throws StorageObjectException { - Connection con = null; - PreparedStatement pstmt = null; - String sql = "select * from " + theTable + " where 0=1"; - try { - con = getPooledCon(); - pstmt = con.prepareStatement(sql); - theLog.printInfo("METADATA: " + sql); - ResultSet rs = pstmt.executeQuery(); - evalMetaData(rs.getMetaData()); - rs.close(); - } catch (SQLException e) { - throwSQLException(e, "get_meta_data"); - } finally { - freeConnection(con, pstmt); - } - } - - - public Connection getPooledCon() throws StorageObjectException { - /* @todo , doublecheck but I'm pretty sure that this is unnecessary. -mh - try{ - Class.forName("com.codestudio.sql.PoolMan").newInstance(); - } catch (Exception e){ - throw new StorageObjectException("Could not find the PoolMan Driver" - +e.toString()); - }*/ - Connection con = null; - try{ - con = SQLManager.getInstance().requestConnection(); - } catch(SQLException e){ - theLog.printError("could not connect to the database "+e.toString()); - System.err.println("could not connect to the database "+e.toString()); - throw new StorageObjectException("Could not connect to the database"+ - e.toString()); - } - return con; - } - - public void freeConnection (Connection con, Statement stmt) - throws StorageObjectException { - SQLManager.getInstance().closeStatement(stmt); - SQLManager.getInstance().returnConnection(con); - } - - /** - * Wertet SQLException aus und wirft dannach eine StorageObjectException - * @param sqe SQLException - * @param wo Funktonsname, in der die SQLException geworfen wurde - * @exception StorageObjectException - */ - protected void throwSQLException (SQLException sqe, String wo) - throws StorageObjectException { - String state = ""; - String message = ""; - int vendor = 0; - if (sqe != null) { - state = sqe.getSQLState(); - message = sqe.getMessage(); - vendor = sqe.getErrorCode(); - } - theLog.printError(state + ": " + vendor + " : " + message + " Funktion: " - + wo); - throw new StorageObjectException((sqe == null) ? "undefined sql exception" : - sqe.toString()); - } - - protected void _throwStorageObjectException (Exception e, String wo) - throws StorageObjectException { - if (e != null) { - theLog.printError(e.toString()+ wo); - throw new StorageObjectException(wo + e.toString()); - } else { - theLog.printError(wo); - throw new StorageObjectException(wo); - } - - } - - /** - * Loggt Fehlermeldung mit dem Parameter Message und wirft dannach - * eine StorageObjectException - * @param message Nachricht mit dem Fehler - * @exception StorageObjectException - */ - void throwStorageObjectException (String message) - throws StorageObjectException { - _throwStorageObjectException(null, message); - } + return (res > 0) ? true : false; + } + + /* noch nicht implementiert. + * @return immer false + */ + public boolean delete (EntityList theEntityList) { + invalidatePopupCache(); + return false; + } + + /** + * Diese Methode sollte ueberschrieben werden, wenn fuer die abgeleitete Database-Klasse + * eine SimpleList mit Standard-Popupdaten erzeugt werden koennen soll. + * @return null + */ + public SimpleList getPopupData () throws StorageObjectException { + return null; + } + + /** + * Holt Daten fuer Popups. + * @param name Name des Feldes. + * @param hasNullValue Wenn true wird eine leerer Eintrag fuer die Popups erzeugt. + * @return SimpleList Gibt freemarker.template.SimpleList zurueck. + */ + public SimpleList getPopupData (String name, boolean hasNullValue) + throws StorageObjectException { + return getPopupData(name, hasNullValue, null); + } + + /** + * Holt Daten fuer Popups. + * @param name Name des Feldes. + * @param hasNullValue Wenn true wird eine leerer Eintrag fuer die Popups erzeugt. + * @param where Schraenkt die Selektion der Datensaetze ein. + * @return SimpleList Gibt freemarker.template.SimpleList zurueck. + */ + public SimpleList getPopupData (String name, boolean hasNullValue, String where) throws StorageObjectException { + return getPopupData(name, hasNullValue, where, null); + } + + /** + * Holt Daten fuer Popups. + * @param name Name des Feldes. + * @param hasNullValue Wenn true wird eine leerer Eintrag fuer die Popups erzeugt. + * @param where Schraenkt die Selektion der Datensaetze ein. + * @param order Gibt ein Feld als Sortierkriterium an. + * @return SimpleList Gibt freemarker.template.SimpleList zurueck. + */ + public SimpleList getPopupData (String name, boolean hasNullValue, String where, String order) throws StorageObjectException { + // caching + if (hasPopupCache && popupCache != null) + return popupCache; + SimpleList simpleList = null; + Connection con = null; + Statement stmt = null; + // build sql + StringBuffer sql = new StringBuffer("select ").append(thePKeyName) + .append(",").append(name).append(" from ") + .append(theTable); + if (where != null && !(where.length() == 0)) + sql.append(" where ").append(where); + sql.append(" order by "); + if (order != null && !(order.length() == 0)) + sql.append(order); + else + sql.append(name); + // execute sql + try { + con = getPooledCon(); + } + catch (Exception e) { + throw new StorageObjectException(e.getMessage()); + } + try { + stmt = con.createStatement(); + ResultSet rs = executeSql(stmt, sql.toString()); + + if (rs != null) { + if (!evaluatedMetaData) get_meta_data(); + simpleList = new SimpleList(); + // if popup has null-selector + if (hasNullValue) simpleList.add(POPUP_EMTYLINE); + + SimpleHash popupDict; + while (rs.next()) { + popupDict = new SimpleHash(); + popupDict.put("key", getValueAsString(rs, 1, thePKeyType)); + popupDict.put("value", rs.getString(2)); + simpleList.add(popupDict); + } + rs.close(); + } + } + catch (Exception e) { + theLog.printError("getPopupData: "+e.getMessage()); + throw new StorageObjectException(e.toString()); + } + finally { + freeConnection(con, stmt); + } + + if (hasPopupCache) popupCache = simpleList; + return simpleList; + } + + /** + * Liefert alle Daten der Tabelle als SimpleHash zurueck. Dies wird verwandt, + * wenn in den Templates ein Lookup-Table benoetigt wird. Sollte nur bei kleinen + * Tabellen Verwendung finden. + * @return SimpleHash mit den Tabellezeilen. + */ + public SimpleHash getHashData () { + /** @todo dangerous! this should have a flag to be enabled, otherwise + * very big Hashes could be returned */ + if (hashCache == null) { + try { + hashCache = HTMLTemplateProcessor.makeSimpleHash(selectByWhereClause("", + -1)); + } + catch (StorageObjectException e) { + theLog.printDebugInfo(e.getMessage()); + } + } + return hashCache; + } + + /* invalidates the popupCache + */ + protected void invalidatePopupCache () { + /** @todo invalidates toooo much */ + popupCache = null; + hashCache = null; + } + + /** + * Diese Methode fuehrt den Sqlstring sql aus und timed im Logfile. + * @param stmt Statemnt + * @param sql Sql-String + * @return ResultSet + * @exception StorageObjectException + */ + public ResultSet executeSql (Statement stmt, String sql) + throws StorageObjectException, SQLException + { + long startTime = System.currentTimeMillis(); + ResultSet rs; + try { + rs = stmt.executeQuery(sql); + theLog.printInfo((System.currentTimeMillis() - startTime) + "ms. for: " + + sql); + } + catch (SQLException e) + { + theLog.printDebugInfo("Failed: " + (System.currentTimeMillis() + - startTime) + "ms. for: "+ sql); + throw e; + } + + return rs; + } + + /** + * Fuehrt Statement stmt aus und liefert Resultset zurueck. Das SQL-Statment wird + * getimed und geloggt. + * @param stmt PreparedStatement mit der SQL-Anweisung + * @return Liefert ResultSet des Statements zurueck. + * @exception StorageObjectException, SQLException + */ + public ResultSet executeSql (PreparedStatement stmt) + throws StorageObjectException, SQLException { + + long startTime = (new java.util.Date()).getTime(); + ResultSet rs = stmt.executeQuery(); + theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms."); + return rs; + } + + /** + * returns the number of rows in the table + */ + public int getSize(String where) + throws SQLException,StorageObjectException + { + long startTime = System.currentTimeMillis(); + String sql = "SELECT Count(*) FROM "+ theTable; + if (where != null && !(where.length() == 0)) + sql = sql + " where " + where; + Connection con = null; + Statement stmt = null; + int result = 0; + + try { + con = getPooledCon(); + stmt = con.createStatement(); + ResultSet rs = executeSql(stmt,sql); + while(rs.next()){ + result = rs.getInt(1); + } + } + catch (SQLException e) { + theLog.printError(e.getMessage()); + } + finally { + freeConnection(con,stmt); + } + //theLog.printInfo(theTable + " has "+ result +" rows where " + where); + theLog.printInfo((System.currentTimeMillis() - startTime) + "ms. for: " + + sql); + return result; + } + + public int executeUpdate(Statement stmt, String sql) + throws StorageObjectException, SQLException + { + int rs; + long startTime = (new java.util.Date()).getTime(); + try + { + rs = stmt.executeUpdate(sql); + theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms. for: " + + sql); + } + catch (SQLException e) + { + theLog.printDebugInfo("Failed: " + (new java.util.Date().getTime() + - startTime) + "ms. for: "+ sql); + throw e; + } + return rs; + } + + public int executeUpdate(String sql) throws StorageObjectException, SQLException + { + int result=-1; + long startTime = (new java.util.Date()).getTime(); + Connection con=null; + PreparedStatement pstmt=null; + try { + con=getPooledCon(); + pstmt = con.prepareStatement(sql); + result = pstmt.executeUpdate(); + } + catch (Exception e) { + theLog.printDebugInfo("settimage :: setImage failed: "+e.getMessage()); + throw new StorageObjectException("executeUpdate failed: "+e.getMessage()); + } + finally { + freeConnection(con,pstmt); + } + theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms. for: " + sql); + return result; + } + + /** + * Wertet ResultSetMetaData aus und setzt interne Daten entsprechend + * @param md ResultSetMetaData + * @exception StorageObjectException + */ + private void evalMetaData (ResultSetMetaData md) + throws StorageObjectException { + + this.evaluatedMetaData = true; + this.metadataFields = new ArrayList(); + this.metadataLabels = new ArrayList(); + this.metadataNotNullFields = new ArrayList(); + try { + int numFields = md.getColumnCount(); + this.metadataTypes = new int[numFields]; + String aField; + int aType; + for (int i = 1; i <= numFields; i++) { + aField = md.getColumnName(i); + metadataFields.add(aField); + metadataLabels.add(md.getColumnLabel(i)); + aType = md.getColumnType(i); + metadataTypes[i - 1] = aType; + if (aField.equals(thePKeyName)) { + thePKeyType = aType; thePKeyIndex = i; + } + if (md.isNullable(i) == md.columnNullable) { + metadataNotNullFields.add(aField); + } + } + } catch (SQLException e) { + throwSQLException(e, "evalMetaData"); + } + } + + /** + * Wertet die Metadaten eines Resultsets fuer eine Tabelle aus, + * um die alle Columns und Typen einer Tabelle zu ermitteln. + */ + private void get_meta_data () throws StorageObjectException { + Connection con = null; + PreparedStatement pstmt = null; + String sql = "select * from " + theTable + " where 0=1"; + try { + con = getPooledCon(); + pstmt = con.prepareStatement(sql); + theLog.printInfo("METADATA: " + sql); + ResultSet rs = pstmt.executeQuery(); + evalMetaData(rs.getMetaData()); + rs.close(); + } catch (SQLException e) { + throwSQLException(e, "get_meta_data"); + } finally { + freeConnection(con, pstmt); + } + } + + + public Connection getPooledCon() throws StorageObjectException { + /* @todo , doublecheck but I'm pretty sure that this is unnecessary. -mh + try{ + Class.forName("com.codestudio.sql.PoolMan").newInstance(); + } catch (Exception e){ + throw new StorageObjectException("Could not find the PoolMan Driver" + +e.toString()); + }*/ + Connection con = null; + + try{ + con = SQLManager.getInstance().requestConnection(); + } + catch(SQLException e){ + theLog.printError("could not connect to the database "+e.getMessage()); + System.err.println("could not connect to the database "+e.getMessage()); + throw new StorageObjectException("Could not connect to the database"+ e.getMessage()); + } + + return con; + } + + public void freeConnection (Connection con, Statement stmt) throws StorageObjectException { + SQLManager.getInstance().closeStatement(stmt); + SQLManager.getInstance().returnConnection(con); + } + + /** + * Wertet SQLException aus und wirft dannach eine StorageObjectException + * @param sqe SQLException + * @param wo Funktonsname, in der die SQLException geworfen wurde + * @exception StorageObjectException + */ + protected void throwSQLException (SQLException sqe, String wo) throws StorageObjectException { + String state = ""; + String message = ""; + int vendor = 0; + if (sqe != null) { + state = sqe.getSQLState(); + message = sqe.getMessage(); + vendor = sqe.getErrorCode(); + } + theLog.printError(state + ": " + vendor + " : " + message + " Funktion: " + + wo); + throw new StorageObjectException((sqe == null) ? "undefined sql exception" : + sqe.getMessage()); + } + + protected void _throwStorageObjectException (Exception e, String wo) + throws StorageObjectException { + + if (e != null) { + theLog.printError(e.getMessage()+ wo); + throw new StorageObjectException(wo + e.getMessage()); + } + else { + theLog.printError(wo); + throw new StorageObjectException(wo); + } + + } + + /** + * Loggt Fehlermeldung mit dem Parameter Message und wirft dannach + * eine StorageObjectException + * @param message Nachricht mit dem Fehler + * @exception StorageObjectException + */ + void throwStorageObjectException (String message) + throws StorageObjectException { + _throwStorageObjectException(null, message); + } } diff --git a/source/mircoders/entity/EntityImages.java b/source/mircoders/entity/EntityImages.java index 19028f7d..597c2816 100755 --- a/source/mircoders/entity/EntityImages.java +++ b/source/mircoders/entity/EntityImages.java @@ -54,85 +54,86 @@ import mir.storage.*; * Diese Klasse enthält die Daten eines MetaObjekts * * @author RK, mh - * @version $Id: EntityImages.java,v 1.10 2002/11/27 21:17:09 mh Exp $ + * @version $Id: EntityImages.java,v 1.11 2002/12/01 15:05:51 zapata Exp $ */ public class EntityImages extends EntityUploadedMedia { - public EntityImages() - { - super(); - } + public EntityImages() + { + super(); + } - public EntityImages(StorageObject theStorage) { - this(); - setStorage(theStorage); - } + public EntityImages(StorageObject theStorage) { + this(); + setStorage(theStorage); + } - // - // methods + // + // methods - public InputStream getImage() throws StorageObjectException - { - theLog.printDebugInfo("--getimage started"); - java.sql.Connection con=null;Statement stmt=null; + public InputStream getImage() throws StorageObjectException + { + theLog.printDebugInfo("--getimage started"); + java.sql.Connection con=null;Statement stmt=null; BlobInputStream in; InputStream img_in = null; - try { - con = theStorageObject.getPooledCon(); - con.setAutoCommit(false); - LargeObjectManager lom; + try { + con = theStorageObject.getPooledCon(); + con.setAutoCommit(false); + LargeObjectManager lom; java.sql.Connection jCon; stmt = con.createStatement(); - ResultSet rs = theStorageObject.executeSql(stmt, - "select image_data from images where id="+getId()); + ResultSet rs = theStorageObject.executeSql(stmt, + "select image_data from images where id="+getId()); jCon = ((com.codestudio.sql.PoolManConnectionHandle)con) - .getNativeConnection(); + .getNativeConnection(); lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI(); - if(rs!=null) { + if(rs!=null) { if (rs.next()) { LargeObject lob = lom.open(rs.getInt(1)); in = (BlobInputStream)lob.getInputStream(); img_in = new ImageInputStream(in, con, stmt); } rs.close(); - } - } catch (Exception e) { + } + } + catch (Exception e) { e.printStackTrace(); - theLog.printError("EntityImages -- getImage failed"+e.toString()); + theLog.printError("EntityImages -- getImage failed"+e.toString()); try { con.setAutoCommit(true); } catch (Exception e2) { e.printStackTrace(); theLog.printError( - "EntityImages -- getImage reseting transaction mode failed" - +e2.toString()); + "EntityImages -- getImage reseting transaction mode failed" + +e2.toString()); } theStorageObject.freeConnection(con,stmt); throwStorageObjectException(e, "EntityImages -- getImage failed: "); } //} return img_in; - } + } - public void setImage(InputStream in, String type) - throws StorageObjectException { + public void setImage(InputStream in, String type) + throws StorageObjectException { - if (in!=null) { - java.sql.Connection con=null;PreparedStatement pstmt=null; + if (in!=null) { + java.sql.Connection con=null;PreparedStatement pstmt=null; File f = null; - try { + try { - theLog.printDebugInfo("settimage :: making internal representation of image"); + theLog.printDebugInfo("settimage :: making internal representation of image"); File tempDir = new File(MirConfig.getProp("TempDir")); f = File.createTempFile("mir", ".tmp", tempDir); FileUtil.write(f, in); - WebdbImage webdbImage= new WebdbImage(f, type); - theLog.printDebugInfo("settimage :: made internal representation of image"); + WebdbImage webdbImage= new WebdbImage(f, type); + theLog.printDebugInfo("settimage :: made internal representation of image"); con = theStorageObject.getPooledCon(); con.setAutoCommit(false); @@ -142,7 +143,7 @@ public class EntityImages extends EntityUploadedMedia LargeObjectManager lom; java.sql.Connection jCon; jCon = ((com.codestudio.sql.PoolManConnectionHandle)con) - .getNativeConnection(); + .getNativeConnection(); lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI(); int oidImage = lom.create(); int oidIcon = lom.create(); @@ -153,12 +154,12 @@ public class EntityImages extends EntityUploadedMedia lobImage.close(); lobIcon.close(); String sql = "update images set img_height='" - +webdbImage.getImageHeight() + - "',img_width='" + webdbImage.getImageWidth() + - "',icon_height='" + webdbImage.getIconHeight() + - "',icon_width='" + webdbImage.getIconWidth() - + "', image_data="+oidImage+", icon_data="+oidIcon - +" where id="+getId(); + +webdbImage.getImageHeight() + + "',img_width='" + webdbImage.getImageWidth() + + "',icon_height='" + webdbImage.getIconHeight() + + "',icon_width='" + webdbImage.getIconWidth() + + "', image_data="+oidImage+", icon_data="+oidIcon + +" where id="+getId(); theLog.printDebugInfo("settimage :: updating sizes: "+ sql); pstmt = con.prepareStatement(sql); //pstmt.setBytes(1, imageData); @@ -167,37 +168,43 @@ public class EntityImages extends EntityUploadedMedia sql="update content set is_produced='0' where to_media="+getId(); pstmt = con.prepareStatement(sql); pstmt.executeUpdate(); - } - catch (Exception e) {throwStorageObjectException(e, "settimage :: setImage gescheitert: ");} - finally { - try { + } + catch (Exception e) { + throwStorageObjectException(e, "settimage :: setImage gescheitert: "); + } + finally { + try { if (con!=null) con.setAutoCommit(true); // get rid of the temp. file f.delete(); - } catch (Exception e) {;} - theStorageObject.freeConnection(con,pstmt); + } + catch (Exception e) { + } + + if (con!=null) + theStorageObject.freeConnection(con,pstmt); } - } - } - - public void update() throws StorageObjectException { - super.update(); - try { - theStorageObject.executeUpdate("update content set is_produced='0' where to_media="+getId()); - } catch (SQLException e) { - throwStorageObjectException(e, "EntityImages :: update :: failed!! "); - } - } - - public void setValues(HashMap theStringValues) - { - if (theStringValues != null) { - if (!theStringValues.containsKey("is_published")) - theStringValues.put("is_published","0"); - } - super.setValues(theStringValues); - } + } + } + + public void update() throws StorageObjectException { + super.update(); + try { + theStorageObject.executeUpdate("update content set is_produced='0' where to_media="+getId()); + } catch (SQLException e) { + throwStorageObjectException(e, "EntityImages :: update :: failed!! "); + } + } + + public void setValues(HashMap theStringValues) + { + if (theStringValues != null) { + if (!theStringValues.containsKey("is_published")) + theStringValues.put("is_published","0"); + } + super.setValues(theStringValues); + } /** * Takes an OutputStream as an argument and reads in the data @@ -205,48 +212,50 @@ public class EntityImages extends EntityUploadedMedia * * It will also take care of closing the OutputStream. */ - public InputStream getIcon() throws StorageObjectException - { - java.sql.Connection con=null;Statement stmt=null; + public InputStream getIcon() throws StorageObjectException + { + java.sql.Connection con=null;Statement stmt=null; BlobInputStream in=null;ImageInputStream img_in=null; - try { - con = theStorageObject.getPooledCon(); - con.setAutoCommit(false); + try { + con = theStorageObject.getPooledCon(); + con.setAutoCommit(false); LargeObjectManager lom; java.sql.Connection jCon; - stmt = con.createStatement(); - ResultSet rs = theStorageObject.executeSql(stmt, - "select icon_data from images where id="+getId()); + stmt = con.createStatement(); + ResultSet rs = theStorageObject.executeSql(stmt, + "select icon_data from images where id="+getId()); jCon = ((com.codestudio.sql.PoolManConnectionHandle)con) - .getNativeConnection(); + .getNativeConnection(); lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI(); - if(rs!=null) { - if (rs.next()) { + if(rs!=null) { + if (rs.next()) { LargeObject lob = lom.open(rs.getInt(1)); in = (BlobInputStream)lob.getInputStream(); img_in = new ImageInputStream( in, con ,stmt); //img_data = rs.getBytes(1); - } + } rs.close(); - } - } catch (Exception e) { + } + } + catch (Exception e) { e.printStackTrace(); - theLog.printError("EntityImages -- getIcon failed"+e.toString()); + theLog.printError("EntityImages -- getIcon failed"+e.toString()); try { con.setAutoCommit(true); - } catch (Exception e2) { + } + catch (Exception e2) { e.printStackTrace(); theLog.printError( - "EntityImages -- getIcon reseting transaction mode failed" - +e2.toString()); + "EntityImages -- getIcon reseting transaction mode failed" + +e2.toString()); } theStorageObject.freeConnection(con,stmt); throwStorageObjectException(e, "EntityImages -- getIcon failed:"); - } + } return img_in; - } + } /** * a small wrapper class that allows us to store the DB connection resources @@ -272,7 +281,8 @@ public class EntityImages extends EntityUploadedMedia try { _con.setAutoCommit(true); theStorageObject.freeConnection(_con,_stmt); - } catch (Exception e) { + } + catch (Exception e) { throw new IOException("close(): "+e.toString()); } } @@ -282,5 +292,4 @@ public class EntityImages extends EntityUploadedMedia } } - -} +} \ No newline at end of file diff --git a/source/mircoders/media/MediaHandlerImages.java b/source/mircoders/media/MediaHandlerImages.java index 53a9a8c4..b529aa3a 100755 --- a/source/mircoders/media/MediaHandlerImages.java +++ b/source/mircoders/media/MediaHandlerImages.java @@ -59,7 +59,7 @@ import mircoders.entity.EntityImages; * * @see mir.media.MirMedia * @author mh - * @version $Id: MediaHandlerImages.java,v 1.13 2002/11/28 07:28:24 mh Exp $ + * @version $Id: MediaHandlerImages.java,v 1.14 2002/12/01 15:05:51 zapata Exp $ */ @@ -67,36 +67,36 @@ public abstract class MediaHandlerImages implements MirMedia { static Logfile theLog = Logfile.getInstance(MirConfig.getProp("Home")+ "log/media.log"); - static final String PNG = "PNG"; - static final String JPEG = "JPEG"; + static final String PNG = "PNG"; + static final String JPEG = "JPEG"; abstract String getType(); - public InputStream getMedia(Entity ent, Entity mediaTypeEnt) + public InputStream getMedia(Entity ent, Entity mediaTypeEnt) throws MirMediaException - { + { InputStream in; try { in = ((EntityImages)ent).getImage(); } catch ( StorageObjectException e) { - theLog.printDebugInfo("MediaHandlerImages.getImage: "+e.toString()); + theLog.printDebugInfo("MediaHandlerImages.getImage: "+e.toString()); throw new MirMediaException(e.toString()); } return in; } - public void set(InputStream in, Entity ent, Entity mediaTypeEnt) + public void set(InputStream in, Entity ent, Entity mediaTypeEnt) throws MirMediaException { try { ((EntityImages)ent).setImage(in, getType()); - } catch ( StorageObjectException e) { - theLog.printError("MediaHandlerImages.set: "+e.toString()); - throw new MirMediaException(e.toString()); } - - } + catch ( StorageObjectException e) { + theLog.printError("MediaHandlerImages.set: "+e.getMessage()); + throw new MirMediaException(e.getMessage()); + } + } public void produce(Entity ent, Entity mediaTypeEnt) throws MirMediaException { @@ -132,15 +132,15 @@ public abstract class MediaHandlerImages implements MirMedia throw new MirMediaException(msg); } } - - public InputStream getIcon(Entity ent) throws MirMediaException - { + + public InputStream getIcon(Entity ent) throws MirMediaException + { InputStream in; try { in = ((EntityImages)ent).getIcon(); } catch ( StorageObjectException e) { - theLog.printDebugInfo("MediaHandlerImages.getIcon: "+e.toString()); + theLog.printDebugInfo("MediaHandlerImages.getIcon: "+e.toString()); throw new MirMediaException(e.toString()); } @@ -172,32 +172,32 @@ public abstract class MediaHandlerImages implements MirMedia public String getTinyIconName() { return MirConfig.getProp("Producer.Icon.TinyImage"); - } + } public String getBigIconName() { return MirConfig.getProp("Producer.Icon.BigImage"); - } + } public String getIconAltName() { return "Image"; - } + } public boolean isVideo() { return false; - } + } public boolean isAudio() { return false; - } + } public boolean isImage () { return true; - } + } public String getDescr(Entity mediaType) { diff --git a/source/mircoders/media/MediaRequest.java b/source/mircoders/media/MediaRequest.java index 087df336..a9939eaf 100755 --- a/source/mircoders/media/MediaRequest.java +++ b/source/mircoders/media/MediaRequest.java @@ -55,7 +55,7 @@ import mir.media.*; * appropriate media objects are set. * * @author mh - * @version $Id: MediaRequest.java,v 1.8 2002/11/29 06:38:27 mh Exp $ + * @version $Id: MediaRequest.java,v 1.9 2002/12/01 15:05:51 zapata Exp $ * */ @@ -137,7 +137,7 @@ public class MediaRequest implements FileHandler contentType = "text/plain"; // rfc1867 says this is the default } //theLog.printInfo("CONTENT TYPE IS: "+contentType); - + if (contentType.equals("text/plain") || contentType.equals("application/octet-stream")) { _throwBadContentType(fileName, contentType); @@ -151,18 +151,18 @@ public class MediaRequest implements FileHandler throw new FileHandlerUserException("Missing field: media title "+mediaTitle+fileNum); } - // TODO: need to add all the extra fields that can be present in the + // TODO: need to add all the extra fields that can be present in the // admin upload form. -mh mediaValues.put("title", mediaTitle); mediaValues.put("date", StringUtil.date2webdbDate( new GregorianCalendar())); mediaValues.put("to_publisher", _user); //mediaValues.put("to_media_folder", "7"); // op media_folder - mediaValues.put("is_produced", "0"); + mediaValues.put("is_produced", "0"); // icky backwards compatibility code -mh if (_publish == true) { - mediaValues.put("is_published", "1"); + mediaValues.put("is_published", "1"); } else { if (!mediaValues.containsKey("is_published")) mediaValues.put("is_published", "0"); @@ -185,7 +185,7 @@ public class MediaRequest implements FileHandler Entity mediaType = null; Entity mediaType2 = null; - + // find out if we an exact content-type match if so take it. // otherwise try to match majortype/* // @todo this should probably be moved to DatabaseMediaType -mh @@ -213,8 +213,9 @@ public class MediaRequest implements FileHandler mediaHandler = MediaHelper.getHandler(mediaType); mediaStorage = MediaHelper.getStorage(mediaType, "mircoders.storage.Database"); - } catch (MirMediaException e) { - throw new FileHandlerException (e.getMsg()); + } + catch (MirMediaException e) { + throw new FileHandlerException (e.getMessage()); } mediaValues.put("to_media_type",mediaTypeId); @@ -231,7 +232,7 @@ public class MediaRequest implements FileHandler } catch (Exception e) { throw new FileHandlerException("Error in MediaRequest: "+e.toString()); } - + mediaEnt.setStorage(mediaStorage); mediaEnt.setValues(mediaValues); mediaId = mediaEnt.insert(); @@ -239,8 +240,9 @@ public class MediaRequest implements FileHandler //save and store the media data/metadata try { mediaHandler.set(filePart.getInputStream(), mediaEnt, mediaType); - } catch (MirMediaException e) { - throw new FileHandlerException(e.getMsg()); + } + catch (MirMediaException e) { + throw new FileHandlerException(e.getMessage()); } try { if (_produce == true ) @@ -252,7 +254,8 @@ public class MediaRequest implements FileHandler } _returnList.add(mediaEnt); - } catch (StorageObjectException e) { + } + catch (StorageObjectException e) { // first try to delete it.. don't catch exception as we've already.. try { mediaStorage.delete(mediaId); } catch (Exception e2) {} throw new FileHandlerException("error in MediaRequest: "+e.toString()); diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index d6e9e585..fcc3741c 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -84,7 +84,7 @@ import mircoders.search.*; * open-postings to the newswire * * @author mir-coders group - * @version $Id: ServletModuleOpenIndy.java,v 1.48 2002/11/30 19:45:57 zapata Exp $ + * @version $Id: ServletModuleOpenIndy.java,v 1.49 2002/12/01 15:05:51 zapata Exp $ * */ @@ -143,25 +143,25 @@ public class ServletModuleOpenIndy extends ServletModule if (aid!=null && !aid.equals("")) { - SimpleHash mergeData = new SimpleHash(); - - // onetimepasswd - if(passwdProtection.equals("yes")){ - String passwd = this.createOneTimePasswd(); - System.out.println(passwd); - HttpSession session = req.getSession(false); - session.setAttribute("passwd",passwd); - mergeData.put("passwd", passwd); - } - - if (language!=null) { - HttpSession session = req.getSession(false); - session.setAttribute("Locale", new Locale(language, "")); - session.setAttribute("passwd",language); - } - - mergeData.put("aid", aid); - deliver(req, res, mergeData, commentFormTemplate); + SimpleHash mergeData = new SimpleHash(); + + // onetimepasswd + if(passwdProtection.equals("yes")){ + String passwd = this.createOneTimePasswd(); + System.out.println(passwd); + HttpSession session = req.getSession(false); + session.setAttribute("passwd",passwd); + mergeData.put("passwd", passwd); + } + + if (language!=null) { + HttpSession session = req.getSession(false); + session.setAttribute("Locale", new Locale(language, "")); + session.setAttribute("passwd",language); + } + + mergeData.put("aid", aid); + deliver(req, res, mergeData, commentFormTemplate); } else throw new ServletModuleException("aid not set!"); } @@ -177,61 +177,61 @@ public class ServletModuleOpenIndy extends ServletModule String aid = req.getParameter("to_media"); // the article id the comment will belong to if (aid!=null && !aid.equals("")) { - // ok, collecting data from form - try { - HashMap withValues = getIntersectingValues(req, DatabaseComment.getInstance()); + // ok, collecting data from form + try { + HashMap withValues = getIntersectingValues(req, DatabaseComment.getInstance()); - //no html in comments(for now) - for (Iterator i=withValues.keySet().iterator(); i.hasNext(); ){ + //no html in comments(for now) + for (Iterator i=withValues.keySet().iterator(); i.hasNext(); ){ String k=(String)i.next(); String v=(String)withValues.get(k); withValues.put(k,StringUtil.removeHTMLTags(v)); - } - withValues.put("is_published","1"); - - //checking the onetimepasswd - if(passwdProtection.equals("yes")){ - HttpSession session = req.getSession(false); - String sessionPasswd = (String)session.getAttribute("passwd"); - if ( sessionPasswd == null){ - throw new ServletModuleUserException("Lost password"); - } - String passwd = req.getParameter("passwd"); - if ( passwd == null || (!sessionPasswd.equals(passwd))) { - throw new ServletModuleUserException("Missing password"); - } - session.invalidate(); - } - - // inserting into database - String id = mainModule.add(withValues); - logger.debug("id: "+id); - //insert was not successfull - if(id==null){ - deliver(req, res, new SimpleHash(), commentFormDupeTemplate); - } else { - DatabaseContent.getInstance().setUnproduced("id="+aid); - - try { - EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); - MirGlobal.localizer().openPostings().afterCommentPosting(comment); - } - catch (Throwable t) { - throw new ServletModuleException(t.getMessage()); - } - - - - } - - // redirecting to url - // should implement back to article - SimpleHash mergeData = new SimpleHash(); - deliver(req, res, mergeData, commentFormDoneTemplate); - } - catch (StorageObjectException e) { throw new ServletModuleException(e.toString());} - catch (ModuleException e) { throw new ServletModuleException(e.toString());} + } + withValues.put("is_published","1"); + + //checking the onetimepasswd + if(passwdProtection.equals("yes")){ + HttpSession session = req.getSession(false); + String sessionPasswd = (String)session.getAttribute("passwd"); + if ( sessionPasswd == null){ + throw new ServletModuleUserException("Lost password"); + } + String passwd = req.getParameter("passwd"); + if ( passwd == null || (!sessionPasswd.equals(passwd))) { + throw new ServletModuleUserException("Missing password"); + } + session.invalidate(); + } + + // inserting into database + String id = mainModule.add(withValues); + logger.debug("id: "+id); + //insert was not successfull + if(id==null){ + deliver(req, res, new SimpleHash(), commentFormDupeTemplate); + } else { + DatabaseContent.getInstance().setUnproduced("id="+aid); + + try { + EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); + MirGlobal.localizer().openPostings().afterCommentPosting(comment); + } + catch (Throwable t) { + throw new ServletModuleException(t.getMessage()); + } + + + + } + + // redirecting to url + // should implement back to article + SimpleHash mergeData = new SimpleHash(); + deliver(req, res, mergeData, commentFormDoneTemplate); + } + catch (StorageObjectException e) { throw new ServletModuleException(e.toString());} + catch (ModuleException e) { throw new ServletModuleException(e.toString());} } else throw new ServletModuleException("aid not set!"); @@ -281,7 +281,7 @@ public class ServletModuleOpenIndy extends ServletModule extraInfo.put("topics", themenModule.getTopicsList()); - } + } catch (Exception e) { logger.error("languagePopUpData or getTopicslist failed "+e.toString()); throw new ServletModuleException("OpenIndy -- failed getting language or topics: "+e.toString()); @@ -313,10 +313,11 @@ public class ServletModuleOpenIndy extends ServletModule MediaRequest mediaReq = new MediaRequest("1", true, true); mp = new WebdbMultipartRequest(req, (FileHandler)mediaReq); mediaList = mediaReq.getEntityList(); - } catch (FileHandlerUserException e) { - throw new ServletModuleUserException(e.getMsg()); } - + catch (FileHandlerUserException e) { + throw new ServletModuleUserException(e.getMessage()); + } + HashMap withValues = mp.getParameters(); //checking the onetimepasswd @@ -336,7 +337,7 @@ public class ServletModuleOpenIndy extends ServletModule if ((((String)withValues.get("title")).length() == 0) || (((String)withValues.get("description")).length() == 0) || (((String)withValues.get("content_data")).length() == 0)) - throw new ServletModuleUserException("Missing field"); + throw new ServletModuleUserException("Missing field"); // call the routines that escape html @@ -390,14 +391,14 @@ public class ServletModuleOpenIndy extends ServletModule try{ DatabaseContentToTopics.getInstance().setTopics(cid,to_topicsArr); setTopic = true; - } - catch (Exception e) { + } + catch (Exception e) { logger.error("setting content_x_topic failed"); contentModule.deleteById(cid); throw new ServletModuleException("smod - openindy :: insposting: setting content_x_topic failed: "+e.toString()); } //end try } //end if - + //if we're here all is ok... associate the media to the article for(int i=0;i= totalHits){ - throw new ServletModuleUserException("newPosition: index out bounds, value was:"+(new Integer(newPosition)).toString()); - } - session.setAttribute("positionInResults",new Integer(newPosition)); - + int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); + int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()-increment; + if (newPosition < 0 || newPosition >= totalHits){ + throw new ServletModuleUserException("newPosition: index out bounds, value was:"+(new Integer(newPosition)).toString()); + } + session.setAttribute("positionInResults",new Integer(newPosition)); + } else { - if (searchSubmitValue != null && searchSubmitValue.equals("Forward")){ - int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); - int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()+increment; - if (newPosition < 0 || newPosition >= totalHits){ - throw new ServletModuleUserException("newPosition: index out bounds, value was:"+(new Integer(newPosition)).toString()); - } - session.setAttribute("positionInResults",new Integer(newPosition)); - - } - else { - String indexPath=MirConfig.getProp("IndexPath"); - - - String creatorFragment = creatorTerm.makeTerm(req); - if (creatorFragment != null){ - queryString = queryString + " +" + creatorFragment; - } - - // search title, description, and content for something - // the contentTerm uses param "search_boolean" to combine its terms - String contentFragment = contentTerm.makeTerm(req); - if (contentFragment != null){ - logger.debug("contentFragment: " + contentFragment); - queryString = queryString + " +" + contentFragment; - } - - String topicFragment = topicTerm.makeTerm(req); - if (topicFragment != null){ - queryString = queryString + " +" + topicFragment; - } - - String imagesFragment = imagesTerm.makeTerm(req); - if (imagesFragment != null){ - queryString = queryString + " +" + imagesFragment; - } - - String audioFragment = audioTerm.makeTerm(req); - if (audioFragment != null){ - queryString = queryString + " +" + audioFragment; - } - - String videoFragment = videoTerm.makeTerm(req); - if (videoFragment != null){ - queryString = queryString + " +" + videoFragment; - } - - if (queryString == null || queryString == ""){ - queryString = ""; - } - else{ - try{ - Searcher searcher = null; - try { - searcher = new IndexSearcher(indexPath); - } - catch(IOException e) { - logger.debug("Can't open indexPath: " + indexPath); - throw new ServletModuleUserException("Problem with Search Index! : "+ e.toString()); - } - - Query query = null; - try { - query = QueryParser.parse(queryString, "content", new StandardAnalyzer()); - } - catch(Exception e) { - searcher.close(); - logger.debug("Query don't parse: " + queryString); - throw new ServletModuleUserException("Problem with Query String! (was '"+queryString+"')"); - } - - Hits hits = null; - try { - hits = searcher.search(query); - } - catch(IOException e) { - searcher.close(); - logger.debug("Can't get hits: " + e.toString()); - throw new ServletModuleUserException("Problem getting hits!"); - } - - int start = 0; - int end = hits.length(); - - String sortBy=req.getParameter("search_sort"); - if (sortBy == null || sortBy.equals("")){ - throw new ServletModuleUserException("Please let me sort by something!(missing search_sort)"); - } - - // here is where the documents will go for storage across sessions - ArrayList theDocumentsSorted = new ArrayList(); - - if (sortBy.equals("score")){ - for(int i = start; i < end; i++) { - theDocumentsSorted.add(hits.doc(i)); - } - } - else{ - // then we'll sort by date! - HashMap dateToPosition = new HashMap(end,1.0F); //we know how big it will be - for(int i = start; i < end; i++) { - String creationDate=(hits.doc(i)).get("creationDate"); - // do a little dance in case two contents created at the same second! - if (dateToPosition.containsKey(creationDate)){ - ((ArrayList) (dateToPosition.get(creationDate))).add(new Integer(i)); - } - else{ - ArrayList thePositions = new ArrayList(); - thePositions.add(new Integer(i)); - dateToPosition.put(creationDate,thePositions); - } - } - Set keys = dateToPosition.keySet(); - ArrayList keyList= new ArrayList(keys); - Collections.sort(keyList); - if (sortBy.equals("date_desc")){ - Collections.reverse(keyList); - } - else{ - if (!sortBy.equals("date_asc")){ - throw new ServletModuleUserException("don't know how to sort by: "+ sortBy); - } - } - ListIterator keyTraverser = keyList.listIterator(); - while (keyTraverser.hasNext()){ - ArrayList positions = (ArrayList)dateToPosition.get((keyTraverser.next())); - ListIterator positionsTraverser=positions.listIterator(); - while (positionsTraverser.hasNext()){ - theDocumentsSorted.add(hits.doc(((Integer)(positionsTraverser.next())).intValue())); - } - } - } - - try{ - searcher.close(); - } - catch (IOException e){ - logger.debug("Can't close searcher: " + e.toString()); - throw new ServletModuleUserException("Problem closing searcher(normal)!"); - } - - - session.removeAttribute("numberOfHits"); - session.removeAttribute("theDocumentsSorted"); - session.removeAttribute("positionInResults"); - - session.setAttribute("numberOfHits",new Integer(end)); - session.setAttribute("theDocumentsSorted",theDocumentsSorted); - session.setAttribute("positionInResults",new Integer(0)); - - } - catch (IOException e){ - logger.debug("Can't close searcher: " + e.toString()); - throw new ServletModuleUserException("Problem closing searcher!"); - } - } - } + if (searchSubmitValue != null && searchSubmitValue.equals("Forward")){ + int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); + int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()+increment; + if (newPosition < 0 || newPosition >= totalHits){ + throw new ServletModuleUserException("newPosition: index out bounds, value was:"+(new Integer(newPosition)).toString()); + } + session.setAttribute("positionInResults",new Integer(newPosition)); + + } + else { + String indexPath=MirConfig.getProp("IndexPath"); + + + String creatorFragment = creatorTerm.makeTerm(req); + if (creatorFragment != null){ + queryString = queryString + " +" + creatorFragment; + } + + // search title, description, and content for something + // the contentTerm uses param "search_boolean" to combine its terms + String contentFragment = contentTerm.makeTerm(req); + if (contentFragment != null){ + logger.debug("contentFragment: " + contentFragment); + queryString = queryString + " +" + contentFragment; + } + + String topicFragment = topicTerm.makeTerm(req); + if (topicFragment != null){ + queryString = queryString + " +" + topicFragment; + } + + String imagesFragment = imagesTerm.makeTerm(req); + if (imagesFragment != null){ + queryString = queryString + " +" + imagesFragment; + } + + String audioFragment = audioTerm.makeTerm(req); + if (audioFragment != null){ + queryString = queryString + " +" + audioFragment; + } + + String videoFragment = videoTerm.makeTerm(req); + if (videoFragment != null){ + queryString = queryString + " +" + videoFragment; + } + + if (queryString == null || queryString == ""){ + queryString = ""; + } + else{ + try{ + Searcher searcher = null; + try { + searcher = new IndexSearcher(indexPath); + } + catch(IOException e) { + logger.debug("Can't open indexPath: " + indexPath); + throw new ServletModuleUserException("Problem with Search Index! : "+ e.toString()); + } + + Query query = null; + try { + query = QueryParser.parse(queryString, "content", new StandardAnalyzer()); + } + catch(Exception e) { + searcher.close(); + logger.debug("Query don't parse: " + queryString); + throw new ServletModuleUserException("Problem with Query String! (was '"+queryString+"')"); + } + + Hits hits = null; + try { + hits = searcher.search(query); + } + catch(IOException e) { + searcher.close(); + logger.debug("Can't get hits: " + e.toString()); + throw new ServletModuleUserException("Problem getting hits!"); + } + + int start = 0; + int end = hits.length(); + + String sortBy=req.getParameter("search_sort"); + if (sortBy == null || sortBy.equals("")){ + throw new ServletModuleUserException("Please let me sort by something!(missing search_sort)"); + } + + // here is where the documents will go for storage across sessions + ArrayList theDocumentsSorted = new ArrayList(); + + if (sortBy.equals("score")){ + for(int i = start; i < end; i++) { + theDocumentsSorted.add(hits.doc(i)); + } + } + else{ + // then we'll sort by date! + HashMap dateToPosition = new HashMap(end,1.0F); //we know how big it will be + for(int i = start; i < end; i++) { + String creationDate=(hits.doc(i)).get("creationDate"); + // do a little dance in case two contents created at the same second! + if (dateToPosition.containsKey(creationDate)){ + ((ArrayList) (dateToPosition.get(creationDate))).add(new Integer(i)); + } + else{ + ArrayList thePositions = new ArrayList(); + thePositions.add(new Integer(i)); + dateToPosition.put(creationDate,thePositions); + } + } + Set keys = dateToPosition.keySet(); + ArrayList keyList= new ArrayList(keys); + Collections.sort(keyList); + if (sortBy.equals("date_desc")){ + Collections.reverse(keyList); + } + else{ + if (!sortBy.equals("date_asc")){ + throw new ServletModuleUserException("don't know how to sort by: "+ sortBy); + } + } + ListIterator keyTraverser = keyList.listIterator(); + while (keyTraverser.hasNext()){ + ArrayList positions = (ArrayList)dateToPosition.get((keyTraverser.next())); + ListIterator positionsTraverser=positions.listIterator(); + while (positionsTraverser.hasNext()){ + theDocumentsSorted.add(hits.doc(((Integer)(positionsTraverser.next())).intValue())); + } + } + } + + try{ + searcher.close(); + } + catch (IOException e){ + logger.debug("Can't close searcher: " + e.toString()); + throw new ServletModuleUserException("Problem closing searcher(normal)!"); + } + + + session.removeAttribute("numberOfHits"); + session.removeAttribute("theDocumentsSorted"); + session.removeAttribute("positionInResults"); + + session.setAttribute("numberOfHits",new Integer(end)); + session.setAttribute("theDocumentsSorted",theDocumentsSorted); + session.setAttribute("positionInResults",new Integer(0)); + + } + catch (IOException e){ + logger.debug("Can't close searcher: " + e.toString()); + throw new ServletModuleUserException("Problem closing searcher!"); + } + } + } } - + try { - ArrayList theDocs = (ArrayList)session.getAttribute("theDocumentsSorted"); - if (theDocs != null){ - - mergeData.put("numberOfHits", ((Integer)session.getAttribute("numberOfHits")).toString()); - SimpleList theHits = new SimpleList(); - int pIR=((Integer)session.getAttribute("positionInResults")).intValue(); - int terminus; - int numHits=((Integer)session.getAttribute("numberOfHits")).intValue(); - - if (!(pIR+increment>=numHits)){ - mergeData.put("hasNext","y"); - } - if (pIR-increment>=0){ - mergeData.put("hasPrevious","y"); - } - - if ((pIR+increment)>numHits){ - terminus=numHits; - } - else { - terminus=pIR+increment; - } - for(int i = pIR; i < terminus; i++) { - SimpleHash h = new SimpleHash(); - Document theHit = (Document)theDocs.get(i); - whereTerm.returnMeta(h,theHit); - creatorTerm.returnMeta(h,theHit); - titleTerm.returnMeta(h,theHit); - descriptionTerm.returnMeta(h,theHit); - dateTerm.returnMeta(h,theHit); - imagesTerm.returnMeta(h,theHit); - audioTerm.returnMeta(h,theHit); - videoTerm.returnMeta(h,theHit); - theHits.add(h); - } - mergeData.put("hits",theHits); - } + ArrayList theDocs = (ArrayList)session.getAttribute("theDocumentsSorted"); + if (theDocs != null){ + + mergeData.put("numberOfHits", ((Integer)session.getAttribute("numberOfHits")).toString()); + SimpleList theHits = new SimpleList(); + int pIR=((Integer)session.getAttribute("positionInResults")).intValue(); + int terminus; + int numHits=((Integer)session.getAttribute("numberOfHits")).intValue(); + + if (!(pIR+increment>=numHits)){ + mergeData.put("hasNext","y"); + } + if (pIR-increment>=0){ + mergeData.put("hasPrevious","y"); + } + + if ((pIR+increment)>numHits){ + terminus=numHits; + } + else { + terminus=pIR+increment; + } + for(int i = pIR; i < terminus; i++) { + SimpleHash h = new SimpleHash(); + Document theHit = (Document)theDocs.get(i); + whereTerm.returnMeta(h,theHit); + creatorTerm.returnMeta(h,theHit); + titleTerm.returnMeta(h,theHit); + descriptionTerm.returnMeta(h,theHit); + dateTerm.returnMeta(h,theHit); + imagesTerm.returnMeta(h,theHit); + audioTerm.returnMeta(h,theHit); + videoTerm.returnMeta(h,theHit); + theHits.add(h); + } + mergeData.put("hits",theHits); + } } catch (Exception e) { - logger.debug("Can't iterate over hits: " + e.toString()); - throw new ServletModuleUserException("Problem getting hits!"); + logger.debug("Can't iterate over hits: " + e.toString()); + throw new ServletModuleUserException("Problem getting hits!"); } - + mergeData.put("queryString",queryString); deliver(req,res,mergeData,searchResultsTemplate); } @@ -690,7 +691,7 @@ public class ServletModuleOpenIndy extends ServletModule public void getpdf(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException, ServletModuleUserException { String ID_REQUEST_PARAM = "id"; - + String generateFO=MirConfig.getProp("GenerateFO"); String generatePDF=MirConfig.getProp("GeneratePDF"); @@ -702,11 +703,11 @@ public class ServletModuleOpenIndy extends ServletModule Hierarchy hierarchy = Hierarchy.getDefaultHierarchy(); log = hierarchy.getLoggerFor("fop"); log.setPriority(Priority.WARN); - + String producerStorageRoot=MirConfig.getProp("Producer.StorageRoot"); String producerDocRoot=MirConfig.getProp("Producer.DocRoot"); String templateDir=MirConfig.getPropWithHome("HTMLTemplateProcessor.Dir"); - String xslSheet=templateDir + "/" + String xslSheet=templateDir + "/" + MirConfig.getProp("Producer.PrintableContent.html2foStyleSheetName"); try { String idParam = req.getParameter(ID_REQUEST_PARAM); @@ -714,11 +715,11 @@ public class ServletModuleOpenIndy extends ServletModule EntityContent contentEnt = (EntityContent)contentModule.getById(idParam); String publishPath = contentEnt.getValue("publish_path"); - String foFile = producerStorageRoot + producerDocRoot + "/" - + publishPath + "/" + idParam + ".fo"; - XSLTInputHandler input = new XSLTInputHandler(new File(foFile), - new File(xslSheet)); - + String foFile = producerStorageRoot + producerDocRoot + "/" + + publishPath + "/" + idParam + ".fo"; + XSLTInputHandler input = new XSLTInputHandler(new File(foFile), + new File(xslSheet)); + ByteArrayOutputStream out = new ByteArrayOutputStream(); res.setContentType("application/pdf"); @@ -736,22 +737,22 @@ public class ServletModuleOpenIndy extends ServletModule throw new ServletModuleUserException("Missing id parameter."); } } catch (Exception ex) { - throw new ServletModuleException(ex.toString()); + throw new ServletModuleException(ex.toString()); } } else { throw new ServletModuleUserException("Can't generate a PDF because the config tells me not to."); } } - + private void _throwBadContentType (String fileName, String contentType) throws ServletModuleUserException { logger.error("Wrong file type uploaded!: " + fileName+" " +contentType); throw new ServletModuleUserException("The file you uploaded is of the " - +"following mime-type: "+contentType - +", we do not support this mime-type. " - +"Error One or more files of unrecognized type. Sorry"); + +"following mime-type: "+contentType + +", we do not support this mime-type. " + +"Error One or more files of unrecognized type. Sorry"); } protected String createOneTimePasswd(){ @@ -768,14 +769,14 @@ public class ServletModuleOpenIndy extends ServletModule /* this is an overwritten method of ServletModule in order to use different bundles for open and admin */ public void deliver(HttpServletRequest req, HttpServletResponse res, - TemplateModelRoot rtm, TemplateModelRoot popups, - String templateFilename) + TemplateModelRoot rtm, TemplateModelRoot popups, + String templateFilename) throws ServletModuleException { if (rtm == null) rtm = new SimpleHash(); try { PrintWriter out = res.getWriter(); HTMLTemplateProcessor.process(res, templateFilename, rtm, popups, out, - getLocale(req), "bundles.open"); + getLocale(req), "bundles.open"); out.close(); } catch (HTMLParseException e) { throw new ServletModuleException(e.toString()); diff --git a/source/mircoders/servlet/ServletModuleUploadedMedia.java b/source/mircoders/servlet/ServletModuleUploadedMedia.java index 30f9a2fa..dd5c422c 100755 --- a/source/mircoders/servlet/ServletModuleUploadedMedia.java +++ b/source/mircoders/servlet/ServletModuleUploadedMedia.java @@ -33,6 +33,7 @@ package mircoders.servlet; import freemarker.template.SimpleHash; import freemarker.template.SimpleList; + import mir.entity.Entity; import mir.entity.EntityList; import mir.media.MediaHelper; @@ -46,6 +47,8 @@ import mir.servlet.ServletModuleException; import mir.servlet.ServletModuleUserException; import mir.storage.Database; import mir.storage.StorageObjectException; +import mir.log.*; + import mircoders.entity.EntityUsers; import mircoders.entity.EntityUploadedMedia; import mircoders.storage.DatabaseMediaType; @@ -68,7 +71,7 @@ import java.util.HashMap; * ServletModuleBilder - * liefert HTML fuer Bilder * - * @version $Id: ServletModuleUploadedMedia.java,v 1.12 2002/11/29 13:43:42 zapata Exp $ + * @version $Id: ServletModuleUploadedMedia.java,v 1.13 2002/12/01 15:05:51 zapata Exp $ * @author RK, the mir-coders group */ @@ -81,6 +84,10 @@ public abstract class ServletModuleUploadedMedia return null; } + public ServletModuleUploadedMedia() { + logger = new LoggerWrapper("ServletModule.UploadedMedia"); + } + public void insert(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException, ServletModuleUserException { try { @@ -109,7 +116,8 @@ public abstract class ServletModuleUploadedMedia deliver(req, res, mergeData, popups, templateListString); } catch (FileHandlerUserException e) { - throw new ServletModuleUserException(e.getMsg()); + logger.error("ServletModuleUploadedMedia.insert: " + e.getMessage()); + throw new ServletModuleUserException(e.getMessage()); } catch (FileHandlerException e) { throw new ServletModuleException( -- 2.11.0