/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.server.localserver.object;
import Sirius.server.localserver.DBServer;
import Sirius.server.localserver.attribute.MemberAttributeInfo;
import Sirius.server.localserver.attribute.ObjectAttribute;
import Sirius.server.middleware.types.MetaClass;
import Sirius.server.middleware.types.MetaObject;
import Sirius.server.sql.DBConnection;
import org.apache.log4j.Logger;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.MissingResourceException;
/**
* DOCUMENT ME!
*
* @author schlob
* @version $Revision$, $Date$
*/
public class PersistenceHelper {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG;
protected static Class GEOMETRY;
// static initializer
static {
LOG = Logger.getLogger(PersistenceHelper.class);
try {
GEOMETRY = Class.forName("com.vividsolutions.jts.geom.Geometry"); // NOI18N
} catch (final ClassNotFoundException ex) {
final String message = "JTS Geometry class not in classpath, thus cannot reach fully operational state"; // NOI18N
LOG.fatal(message, ex);
throw new IllegalStateException(message, ex);
}
}
//~ Instance fields --------------------------------------------------------
protected DBServer dbServer;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new PersistenceHelper object.
*
* @param dbServer DOCUMENT ME!
*/
public PersistenceHelper(final DBServer dbServer) {
this.dbServer = dbServer;
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param value DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
boolean toBeQuoted(final java.lang.Object value) {
if (value == null) {
return false;
} else {
return ((GEOMETRY.isAssignableFrom(value.getClass()) || (value instanceof java.sql.Date)
|| (value instanceof java.util.Date)
|| ((value instanceof String)
&& !((String)value).startsWith("GeometryFromText")) // NOI18N
|| (value instanceof Boolean)
|| (value instanceof Character)));
}
}
/**
* DOCUMENT ME!
*
* @param mai DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws MissingResourceException DOCUMENT ME!
*/
boolean toBeQuoted(final MemberAttributeInfo mai) throws MissingResourceException {
final int type = mai.getTypeId();
final int[] quotedTypes = dbServer.getProperties().getQuotedTypes();
for (int i = 0; i < quotedTypes.length; i++) {
if (quotedTypes[i] == type) {
return true;
}
}
return false;
}
/**
* DOCUMENT ME!
*
* @param mai DOCUMENT ME!
* @param value DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws MissingResourceException DOCUMENT ME!
*/
boolean toBeQuoted(final MemberAttributeInfo mai, final java.lang.Object value) throws MissingResourceException {
boolean q = false;
q &= toBeQuoted(mai);
q |= toBeQuoted(value);
return q;
}
/**
* DOCUMENT ME!
*
* @param tableName DOCUMENT ME!
* @param key DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws SQLException DOCUMENT ME!
*/
int getNextID(final String tableName, final String key) throws SQLException {
final Connection con = dbServer.getActiveDBConnection().getConnection();
final String query = "SELECT NEXTVAL('" + tableName.toUpperCase() + "_SEQ')"; // NOI18N
Statement stmt = null;
ResultSet rs = null;
try {
stmt = con.createStatement();
rs = stmt.executeQuery(query);
if (rs.next()) {
return (rs.getInt(1));
} else {
return 1;
}
} finally {
DBConnection.closeResultSets(rs);
DBConnection.closeStatements(stmt);
}
}
/**
* Liefert Key zum Abfragen der MemberAttributInfo aus Hashmap das \u00FCber Fkt MetaClass.getMemberAttributeInfos()
* geliefert wird.
*
* @param mai DOCUMENT ME!
* @param value DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
String getDefaultValue(final MemberAttributeInfo mai, final java.lang.Object value) {
String defaultVal = mai.getDefaultValue();
if (defaultVal == null) {
defaultVal = "NULL"; // NOI18N
}
try {
if (toBeQuoted(mai, value)) {
defaultVal = "'" + defaultVal + "'"; // NOI18N
}
} catch (final MissingResourceException e) {
LOG.error(
"Exception when trying to retrieve list of quoted types. Insert unsafe. " // NOI18N
+ "Therefore default will be set to null (unquoted). This may lead to an SQL-Exception", // NOI18N
e);
}
if (LOG.isDebugEnabled()) {
LOG.debug("defaultValue :: " + defaultVal); // NOI18N
}
return defaultVal;
}
/**
* DOCUMENT ME!
*
* @param mo DOCUMENT ME!
* @param metaClass DOCUMENT ME!
* @param primaryKey DOCUMENT ME!
*/
void setPrimaryKey(final MetaObject mo, final MetaClass metaClass, final int primaryKey) {
// primary key feld der Klasse dieses Objekts
final String priK = metaClass.getPrimaryKey();
// theoretisch k\u00F6nnen mehrere Attribute mit dem Namen des primary keys existieren
final Iterator iter = mo.getAttributeByName(priK, 1).iterator();
// iteriere \u00FCber primary keys setze auf primaryKey falls value des pk attributs null
// iterator hier nur f\u00FCr den Fall das mehrere attribute gefunden werden
if (iter.hasNext()) {
// attribut (primary key)
final ObjectAttribute oa = (ObjectAttribute)iter.next();
java.lang.Object val = oa.getValue();
if (LOG.isDebugEnabled()) {
LOG.debug("primary key ::" + primaryKey); // NOI18N
}
if (oa.isPrimaryKey()) // falls das attribut
// tats\u00E4chlich pk ist s.o.
{
if ((val == null)
|| ((val != null) && val.toString().trim().equals("-1") // NOI18N
&& (val instanceof java.lang.Integer))) {
if (LOG.isDebugEnabled()) {
LOG.debug("primary key is null set val to primaryKey::" + val); // NOI18N
}
oa.setValue(new Integer(primaryKey));
val = new Integer(primaryKey);
} else { // val is not null and not -1
// skip
// lass es wie es ist
}
} else {
if (LOG.isInfoEnabled()) {
LOG.info(
"primary key name :: " // NOI18N
+ priK
+ " :: for class :: " // NOI18N
+ metaClass
+ " :: is ambigious and only one attribute with this name is primary key"); // NOI18N
}
}
}
}
}