Re: Enhydra: Migration problems: Enhydra5.0 to Enhydra5.1

"Alfred Madl" <[email protected]> Fri, 03 Oct 2003 17:24:53 +0200
Newsgroups gmane.comp.java.enhydra.general
Message-ID <[email protected]>
Hi !

Hope our guys can help you...

If you currently have your very own and very different DO-code (and I assume 
now we get it to work with Enhydra 5.1), maybe you could try using DODS 5.1 
generator with YOUR templates (thats a new feature of the new DODs to 
support custom templates) ? We would be very happy to have a user of this 
new feature !

Greetings.

Alfred


>From: Axel Wilhelm Berle <[email protected]>
>Reply-To: [email protected]
>To: [email protected]
>CC: [email protected]
>Subject: Enhydra:  Migration problems: Enhydra5.0 to Enhydra5.1
>Date: Fri, 3 Oct 2003 14:13:28 +0200 (CEST)
>
>Hi Vladimir,
>
>well, in fact we are using only some parts of Enhydra.
>For the presentation layer, we use Xmlc; for the data
>layer we use the database manager. The app runs
>directly on tomcat.
>
>As for our configuration:
>
>- Java 1.4.2
>- Postgres
>- we generate the xxxDO classes ourselves
>
>He is how we use the database manager:
>
>ConfigFile configFile = new ConfigFile(new
>File(database_config_path));
>Config config = configFile.getConfig();
>m_databaseManager = new
>StandardDatabaseManager(config);
>
>The config-file is:
>
>Databases = "oksolutions"
>DefaultDatabase = "oksolutions"
>DB.oksolutions.ClassType = "Standard"
>DB.oksolutions.JdbcDriver = "org.postgresql.Driver"
>DB.oksolutions.Connection.MaxPreparedStatements = 10
>DB.oksolutions.Connection.Url =
>"jdbc:postgresql://192.168.0.200/oksolutions"
>DB.oksolutions.Connection.User = "oks"
>DB.oksolutions.Connection.Password = "password"
>DB.oksolutions.Connection.MaxPoolSize = 5
>DB.oksolutions.Connection.AllocationTimeout = 10000
>DB.oksolutions.Connection.Logging = false
>DB.oksolutions.ObjectId.CacheSize = 20
>DB.oksolutions.ObjectId.MinValue = 1000000
>ObjectIdColumnName = "objectid"
>VersionColumnName = "objectversion"
>
>The xxxxDO's are created "by hand" as the following
>example:
>
>package oksolution.data.counter;
>
>import
>com.lutris.appserver.server.sql.StandardDatabaseManager;
>import
>com.lutris.appserver.server.sql.DatabaseManagerException;
>import com.lutris.appserver.server.sql.DBConnection;
>import com.lutris.appserver.server.sql.DBQuery;
>import com.lutris.appserver.server.sql.ObjectId;
>import
>com.lutris.appserver.server.sql.ObjectIdException;
>import oksolution.data.BasicDO;
>
>
>public class CounterDO extends BasicDO {
>    //
>--------------------------------------------------------------------------
>    public static final String NAME               =
>"name";
>    public static final String CREATION_DATE      =
>"creation_date";
>    public static final String DESCRIPTION        =
>"description";
>    public static final String NUM_VISITAS        =
>"num_visitas";
>   //
>---------------------------------------------------------------------------
>    private String    m_name;
>    private Date      m_creationDate;
>    private String    m_description;
>    private int       m_numVisitas;
>   //
>---------------------------------------------------------------------------
>
>    public CounterDO(String name,
>                     String description)
>            throws ObjectIdException,
>DatabaseManagerException {
>       super();
>       setName(name);
>       setCreationDate(new
>Date(java.lang.System.currentTimeMillis()));
>       setDescription(description);
>       setNumVisitas(0);
>    }
>
>    // Construct person data object from the given
>database info
>    public CounterDO(ResultSet rs)
>             throws SQLException, ObjectIdException {
>       super(rs);
>       setNewVersion(getVersion());
>       setName(rs.getString(NAME));
>       setCreationDate(rs.getDate(CREATION_DATE));
>       setDescription(rs.getString(DESCRIPTION));
>       setNumVisitas(rs.getInt(NUM_VISITAS));
>       setDirty(false);
>    }
>
>    // Parameter names
>    // ORDER IS IMPORTANT! (use same order as in
>setData)
>    private static String[] PARAMETER_NAMES =
>       {NAME,
>        CREATION_DATE,
>        DESCRIPTION,
>        NUM_VISITAS};
>
>     // Set database parameters for this person data
>object
>     // ORDER IS IMPORTANT! (use same order as in
>getParameters)
>     protected int setParameters(PreparedStatement
>stmt, int param)
>             throws SQLException {
>	param = setString(stmt, param, getName());
>         param = setDate(stmt,param,
>getCreationDate());
>	param = setString(stmt, param, getDescription());
>         param = setInt(stmt, param, getNumVisitas());
>  	return param;
>     }
>
>     // Get database parameters names (columns in
>table)
>     // ORDER IS IMPORTANT! (use same order as in
>setParameters)
>     protected String[] getParameters() {
>	return PARAMETER_NAMES;
>     }
>
>    // Get database table name
>    protected String getTableName() {
>       return getDBTableName();
>    }
>
>    // Get main database table name
>    public static String getDBTableName() {
>       return "counter";
>    }
>
>
>   // - get/set
>-----------------------------------------------------------------
>
>   public String getName() {
>     return m_name;
>   }
>
>   public void setName(String name) {
>      m_name = name;
>      setDirty(true);
>   }
>
>   public Date getCreationDate() {
>      return m_creationDate;
>   }
>
>   public void setCreationDate(Date creationDate) {
>      m_creationDate = creationDate;
>   }
>
>   public String getDescription() {
>     return m_description;
>   }
>
>   public void setDescription(String description) {
>     m_description = description;
>     setDirty(true);
>   }
>
>   public int getNumVisitas() {
>     return m_numVisitas;
>   }
>
>   public void setNumVisitas(int numVisitas) {
>     m_numVisitas = numVisitas;
>     setDirty(true);
>   }
>
>}
>
>We took the BasicDO from one of the examples
>distributed with Enhydra 3.1:
>
>package oksolution.data;
>
>import com.lutris.appserver.server.*;
>import com.lutris.appserver.server.sql.*;
>import java.sql.*;
>import java.math.BigDecimal;
>import java.util.StringTokenizer;
>import java.sql.Time;
>
>import oksolution.business.DatabaseManager;
>
>/**
>  * Basic data object.  This could be rolled into
>CloneableDO and CoreDO.
>  * <P>
>  * <UL>
>  * <LI>Keeps track of whether or not the data object
>is "dirty"
>  * <LI>Keeps track of whether or not the database is
>being updated for
>  *     this data object
>  * <LI>Only updates database if the data object is
>dirty
>  * <LI>Does not update database if another process is
>doing an update
>  * </UL>
>  *
>  * @author Kristen Pol
>  * @since Enhydra2.0
>  */
>
>public abstract class BasicDO extends CloneableDO {
>
>     // protected data members
>
>     // Is this data object dirty?
>     protected boolean isDirty = false;
>
>     // Is the database entry for this data object
>being updated?
>     protected boolean isExecuting = false;
>
>     // constructors
>
>     // Construct data object from scratch
>     public BasicDO()
>             throws ObjectIdException,
>DatabaseManagerException {
>	super();
>         StandardDatabaseManager dbManager = null;
>         try {
>            dbManager =
>DatabaseManager.getDatabaseManager(null);
>         }
>         catch(Exception e) {}
>	setOId(dbManager.allocateObjectId());
>	setDirty(true);
>     }
>
>
>     // Construct data object from data in database
>     public BasicDO(ResultSet rs)
>             throws SQLException, ObjectIdException {
>         super(rs);
>         setNewVersion(getVersion());
>         setDirty(false);
>     }
>
>     // public and protected methods
>
>     // Clone this data object uniquely
>     public synchronized Object cloneUnique()
>	    throws DatabaseManagerException,
>ObjectIdException {
>         BasicDO basicDO = (BasicDO)
>super.cloneUnique();
>         basicDO.setNewVersion(0);
>         basicDO.setDirty(true);
>         return basicDO;
>     }
>
>     /* ---- SETTER/GETTER METHODS ---- */
>
>     // Set dirty flag
>     protected void setDirty(boolean isDirty) {
>         this.isDirty = isDirty;
>     }
>
>     // Is this data object dirty?
>     public boolean isDirty() {
>         return this.isDirty;
>     }
>
>     // Set executing flag
>     protected void setExecuting(boolean isExecuting) {
>         this.isExecuting = isExecuting;
>     }
>
>     // Is an execute method being called?
>     public boolean isExecuting() {
>         return this.isExecuting;
>     }
>
>     /* ---- INSERT METHODS ---- */
>
>     // Insert the data for this data object in the
>database
>     public PreparedStatement
>getInsertStatement(DBConnection conn)
>             throws SQLException {
>         String sql = "insert into " + getTableName() +
>" \n" +
>             "values " + createQuestionMarks(2 +
>getNumParams());
>         PreparedStatement stmt =
>conn.prepareStatement(sql);
>         int param = 1;
>         stmt.setBigDecimal(param++,
>getOId().toBigDecimal());
>         stmt.setInt(param++, getVersion());
>	param = setParameters(stmt, param);
>         return stmt;
>     }
>
>     // Insert data into database
>     public synchronized void
>executeInsert(DBConnection conn)
>             throws SQLException {
>         if (! isExecuting()) {
>             super.executeInsert(conn);
>             setExecuting(true);
>         }
>     }
>
>     // What to do after insert is done
>     public void finalizeInsert(boolean success) {
>         boolean p = persistent;
>         super.finalizeInsert(success);
>         if (p == true) {
>             persistent = true; // Bug fix for CoreDO!
>(it overwrites persistent)
>         }
>	done(success);
>     }
>
>     /* ---- UPDATE METHODS ---- */
>
>     // Update the data for this data object in the
>database
>     public PreparedStatement
>getUpdateStatement(DBConnection conn)
>             throws SQLException {
>         String sql =
>             "update " + getTableName() + " \n" +
>             "set " +
>             "objectversion = ?, " +
>	    createUpdateSql() +
>             " where objectid = ? and objectversion =
>?"; // [email protected].
>         PreparedStatement stmt =
>conn.prepareStatement(sql);
>         int param = 1;
>         stmt.setInt(param++, getNewVersion());
>	param = setParameters(stmt, param);
>         stmt.setBigDecimal(param++,
>getOId().toBigDecimal());
>         stmt.setInt(param++, getVersion());
>         return stmt;
>     }
>
>     // Update data in database
>     public synchronized void
>executeUpdate(DBConnection conn)
>             throws SQLException {
>         if (isDirty() && ! isExecuting()) {
>             super.executeUpdate(conn);
>             setExecuting(true);
>         }
>     }
>
>     // What to do after update is done
>     public void finalizeUpdate(boolean success) {
>         super.finalizeUpdate(success);
>	done(success);
>     }
>
>     /* ---- DELETE METHODS ---- */
>
>     // Delete the data for this data object from the
>database
>     public PreparedStatement
>getDeleteStatement(DBConnection conn)
>             throws SQLException {
>         String sql = "delete from " + getTableName() +
>" where objectid = ?";
>         PreparedStatement stmt =
>conn.prepareStatement(sql);
>         stmt.setBigDecimal(1,
>getOId().toBigDecimal());
>         return stmt;
>     }
>
>     // Delete data from database
>     public void executeDelete(DBConnection conn)
>             throws SQLException {
>         if (isPersistent()) {
>	    while (! isExecuting()) {
>		super.executeDelete(conn);
>		setExecuting(true);
>	    }
>         }
>     }
>
>     // What to do after delete is done
>     public void finalizeDelete(boolean success) {
>         super.finalizeDelete(success);
>	done(success);
>     }
>
>     /* ---- HELPER METHODS ---- */
>
>     // What is the name of the database table for this
>data object?
>     protected abstract String getTableName();
>
>     // Sql string to use for updating the database
>     protected abstract String[] getParameters();
>
>     // Set data for the given prepared statement
>     protected abstract int
>setParameters(PreparedStatement stmt, int param)
>	throws SQLException;
>
>     // Sql string to use for updating the database
>     protected String createUpdateSql() {
>	String[] parameters = getParameters();
>	String sql = "";
>	if (parameters != null) {
>	    int length = parameters.length;
>	    for (int i = 0; i < length; i++) {
>		sql += parameters[i] + "= ?";
>		if (i < (length - 1)) {
>		    sql += ",";
>		}
>	    }
>	}
>	return sql;
>     }
>
>     // Creates string like "(?,?,?)" with numberMarks
>number of question marks
>     protected String createQuestionMarks(int
>numberMarks)
>             throws SQLException {
>	String sql = "(";
>	for (int i = 0; i < numberMarks; i++) {
>	    sql += "?";
>	    if (i < (numberMarks - 1)) {
>		sql += ",";
>	    }
>	}
>	sql += ")";
>	return sql;
>     }
>
>     // How many parameters does this data object have?
>     protected int getNumParams() {
>	String updateSql = createUpdateSql();
>	StringTokenizer tokenizer = new
>StringTokenizer(updateSql, "?");
>	return tokenizer.countTokens();
>     }
>
>     // Set the Int in the statement
>     protected int setInt(PreparedStatement stmt, int
>param, int data)
>	    throws SQLException {
>         stmt.setInt(param++, data);
>	return param;
>     }
>
>     // Set the string in the statement
>     protected int setString(PreparedStatement stmt,
>int param, String data)
>	    throws SQLException {
>	if (data != null) {
>	    stmt.setString(param++, data);
>	} else {
>	    stmt.setNull(param++, Types.VARCHAR);
>	}
>	return param;
>     }
>
>     protected int setObjectId(PreparedStatement stmt,
>int param, ObjectId oid)
>	    throws SQLException {
>	if (oid != null) {
>	    stmt.setBigDecimal(param++, oid.toBigDecimal());
>	} else {
>	    stmt.setNull(param++, Types.VARCHAR);
>	}
>	return param;
>     }
>
>
>     protected int setBigDecimal(PreparedStatement
>stmt, int param, BigDecimal data)
>	    throws SQLException {
>	if (data != null) {
>	    stmt.setBigDecimal(param++, data);
>	} else {
>	    stmt.setNull(param++, Types.VARCHAR);
>	}
>	return param;
>     }
>
>     protected int setDate(PreparedStatement stmt, int
>param, Date data)
>	    throws SQLException {
>	if (data != null) {
>	    stmt.setDate(param++, data);
>	} else {
>	    stmt.setNull(param++, Types.VARCHAR);
>	}
>	return param;
>     }
>
>     protected int setTimestamp(PreparedStatement stmt,
>int param, Timestamp timestamp)
>	    throws SQLException {
>	if (timestamp != null) {
>	    stmt.setTimestamp(param++, timestamp);
>	} else {
>	    stmt.setNull(param++, Types.VARCHAR);
>	}
>	return param;
>     }
>
>     protected int setTime(PreparedStatement stmt, int
>param, Time data)
>	    throws SQLException {
>	if (data != null) {
>	    stmt.setTime(param++, data);
>	} else {
>	    stmt.setNull(param++, Types.VARCHAR);
>	}
>	return param;
>     }
>
>     // Set the Long in the statement
>     protected int setLong(PreparedStatement stmt, int
>param, long data)
>	    throws SQLException {
>         stmt.setLong(param++, data);
>	return param;
>     }
>
>
>     // private methods
>
>     private void done(boolean success) {
>	setDirty(! success);
>	setExecuting(false);
>     }
>}
>
>
>
>We make queries and transactions like that (inspired
>by the examples distributed with Enhydra3.1):
>
>
>   static public Vector getCounters() throws Exception
>{
>      // Pesquisar de novo, ordenado por NOME
>      DBQuery db = null;
>      Vector counterList = new Vector();
>      try {
>         CounterQuery counterQuery = new
>CounterQuery();
>         db = m_databaseManager.createQuery();
>         db.query(counterQuery);
>         CounterDO counterDO = null;
>         while ((counterDO = (CounterDO) db.next()) !=
>null) {
>            counterList.addElement(counterDO);
>         }
>      } catch (Exception e) {
>         throw e;
>      } finally {
>         db.release();
>      }
>      return counterList;
>   }
>
>or:
>
>   public synchronized static void saveCounters()
>throws Exception {
>      // Write the counterDOs back to the database
>      System.out.println("CounterManager: saving
>counters...");
>      DBTransaction db = null;
>      try {
>         db = m_databaseManager.createTransaction();
>         Enumeration e = m_counterTable.keys();   //
>counterName (string) -> CounterDO
>         while (e.hasMoreElements()) {
>            String counterName =
>(String)e.nextElement();
>            CounterDO counterDO =
>(CounterDO)m_counterTable.get(counterName);
>            db.update(counterDO);
>         }
>         db.commit();
>      } catch (Exception e) {
>         System.out.println("ERROR:
>CounterManager.saveCounters(): " + e.getMessage());
>         e.printStackTrace(System.out);
>         db.rollback();
>      } finally {
>         db.release();
>      }
>   }
>
>
>I think this wraps it all up. We hope you can give us
>some pointers. Thanks in advance for the help,
>
>Axel
>
>
>
>
>
>=====
>Axel Wilhelm Berle
>
>e-mail: [email protected]
>Tel: (office) +55 16 618.0090
>      (mobile) +55 16 9964.6343
>
>__________________________________________________________________
>
>Gesendet von Yahoo! Mail - http://mail.yahoo.de
>Logos und Klingeltöne fürs Handy bei http://sms.yahoo.de
>_______________________________________________
>Enhydra mailing list
>[email protected]
>http://www.enhydra.org/mailman/listinfo.cgi/enhydra

_________________________________________________________________
The new MSN 8: smart spam protection and 2 months FREE*  
http://join.msn.com/?page=features/junkmail