//idega 2000 - Tryggvi Larusson
/*
*Copyright 2000 idega.is All Rights Reserved.
*/
package com.idega.data;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.List;
import java.util.Vector;
import com.idega.util.StringHandler;
//import com.idega.util.datastructures.HashtableMultivalued;
/**
* Title: idega Data Objects
* Description: Idega Data Objects is a Framework for Object/Relational mapping and seamless integration between datastores
* Copyright: Copyright (c) 2001
* Company: idega
* @author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson</a>
* @version 1.0
*/
public class EntityControl {
// private static HashtableMultivalued relationshipClasses = new HashtableMultivalued();
private static boolean autoCreate = false;
protected static boolean limitTableNameToThirtyCharacters = false;
/**
**Creates a unique ID for the ID column
*@deprecated moved to InterbaseDatastoreInterface. This method will be
*removed in future versions */
// throw away!!
protected static String getInterbaseGeneratorName(GenericEntity entity) {
String entityName = entity.getTableName();
if (entityName.endsWith("_")) {
return (entityName + "gen").toUpperCase();
} else {
return (entityName + "_gen").toUpperCase();
}
}
/**
**Creates a unique ID for the ID column
*@deprecated moved to OracleDatastoreInterface. This method will be removed
*in future versions */
// throw away!!
protected static String getOracleSequenceName(GenericEntity entity) {
String entityName = entity.getTableName();
return entityName + "_seq";
//if (entityName.endsWith("_")){
// return entityName+"seq";
//}
//else{
// return entityName+"_seq";
//}
}
/**
**Creates a unique ID for the ID column
*@deprecated moved to DatastoreInterface and its subclasses
*This method will be removed in future versions
**/
// throw away!!
public static int createUniqueID(GenericEntity entity) throws SQLException {
int returnInt = -1;
Connection conn = null;
Statement stmt = null;
ResultSet RS = null;
try {
conn = entity.getConnection();
String datastoreType = DatastoreInterface.getDataStoreType(conn);
if (datastoreType.equals("interbase")) {
stmt = conn.createStatement();
RS = stmt.executeQuery("SELECT GEN_ID(" + getInterbaseGeneratorName(entity) + ", 1) FROM RDB$DATABASE");
RS.next();
returnInt = RS.getInt(1);
} else if (datastoreType.equals("oracle")) {
stmt = conn.createStatement();
RS = stmt.executeQuery("SELECT " + getOracleSequenceName(entity) + ".nextval FROM dual");
RS.next();
returnInt = RS.getInt(1);
}
} finally {
if (RS != null) {
RS.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
entity.freeConnection(conn);
}
}
return returnInt;
}
/**
public static void insert(IDOLegacyEntity entity)throws SQLException{
Connection conn= null;
//Statement Stmt= null;
PreparedStatement Stmt = null;
Statement Stmt2= null;
ResultSet RS = null;
//PreparedStatement Stmt = null;
try{
conn = entity.getConnection();
String datastoreType= DatastoreInterface.getDataStoreType(conn);
if (datastoreType.equals("interbase")){
if ( entity.isNull(entity.getIDColumnName()) ){
entity.setID(createUniqueID(entity));
}
//Stmt = conn.createStatement();
//int i = Stmt.executeUpdate("insert into "+entity.getTableName()+"("+entity.getCommaDelimitedColumnNames()+") values ("+entity.getCommaDelimitedColumnValues()+")");
String statement = "insert into "+entity.getTableName()+"("+entity.getCommaDelimitedColumnNames()+") values ("+entity.getQuestionmarksForColumns()+")";
//System.out.println(statement);
Stmt = conn.prepareStatement (statement);
setForPreparedStatement(Stmt,entity);
Stmt.execute();
}
else if (datastoreType.equals("oracle")){
if ( entity.isNull(entity.getIDColumnName()) ){
entity.setID(createUniqueID(entity));
}
//Stmt = conn.createStatement();
//int i = Stmt.executeUpdate("insert into "+entity.getTableName()+"("+entity.getCommaDelimitedColumnNames()+") values ("+entity.getCommaDelimitedColumnValues()+")");
String statement = "insert into "+entity.getTableName()+"("+entity.getCommaDelimitedColumnNames()+") values ("+entity.getQuestionmarksForColumns()+")";
//System.out.println(statement);
Stmt = conn.prepareStatement (statement);
setForPreparedStatement(Stmt,entity);
Stmt.execute();
}
else if (datastoreType.equals("mysql")){
//conn = entity.getConnection();
//Stmt = conn.createStatement();
//int i = Stmt.executeUpdate("insert into "+entity.getTableName()+"("+entity.getCommaDelimitedColumnNames()+") values ("+entity.getCommaDelimitedColumnValues()+")");
String statement = "insert into "+entity.getTableName()+"("+entity.getCommaDelimitedColumnNames()+") values ("+entity.getQuestionmarksForColumns()+")";
//System.out.println(statement);
Stmt = conn.prepareStatement (statement);
setForPreparedStatement(Stmt,entity);
Stmt.execute();
if (entity.getID() == -1){
Stmt2 = conn.createStatement();
RS = Stmt2.executeQuery("select last_insert_id()");
RS.next();
entity.setID(RS.getInt(1));
}
}
}
finally{
if (RS != null){
RS.close();
}
if(Stmt2 != null){
Stmt2.close();
}
if(Stmt != null){
Stmt.close();
}
if (conn != null){
entity.freeConnection(conn);
}
}
}
**/
/*
public static void update(IDOLegacyEntity entity)throws SQLException{
try{
DatastoreInterface.getInstance(entity).update(entity);
}
catch(Exception ex){
if(ex instanceof SQLException){
ex.printStackTrace();
throw (SQLException)ex.fillInStackTrace();
}
}
}
*/
/*
public static void update(IDOLegacyEntity entity)throws SQLException{
Connection conn= null;
PreparedStatement Stmt= null;
try{
conn = entity.getConnection();
// Stmt = conn.createStatement();
String statement = "update "+entity.getTableName()+" set "+entity.getAllColumnsAndQuestionMarks()+" where "+entity.getIDColumnName()+"="+entity.getID();
//System.out.println(statement);
Stmt = conn.prepareStatement (statement);
setForPreparedStatement(Stmt,entity);
Stmt.execute();
//int i = Stmt.executeUpdate("update "+entity.getEntityName()+" set "+entity.getAllColumnsAndValues()+" where "+entity.getIDColumnName()+"="+entity.getID());
}
finally{
if(Stmt != null){
Stmt.close();
}
if (conn != null){
entity.freeConnection(conn);
}
}
}*/
/*
protected static String setForPreparedStatement(PreparedStatement statement,IDOLegacyEntity entity)throws SQLException{
String returnString = "";
String[] names = entity.getColumnNames();
int questionmarkCount=1;
for (int i = 0; i < names.length; i++){
if (!entity.isNull(names[i])){
//if (returnString.equals("")){
// returnString = "'"+getStringColumnValue(names[i])+"'";
//}
//else{
// returnString = returnString + ",'" + getStringColumnValue(names[i])+"'";
//}
insertIntoPreparedStatement(names[i],statement,questionmarkCount,entity);
questionmarkCount++;
}
}
return returnString;
}
*/
/*
private static void insertIntoPreparedStatement(String columnName,PreparedStatement statement, int index,IDOLegacyEntity entity)throws SQLException{
String storageClassName = entity.getStorageClassName(columnName);
if (storageClassName.equals("java.lang.Integer")){
statement.setInt(index,entity.getIntColumnValue(columnName));
}
else if (storageClassName.equals("java.lang.Boolean")){
boolean bool = entity.getBooleanColumnValue(columnName);
if (bool){
statement.setString(index,"Y");
}
else{
statement.setString(index,"N");
}
}
else if (storageClassName.equals("java.lang.String")){
statement.setString(index,entity.getStringColumnValue(columnName));
}
else if (storageClassName.equals("java.lang.Float")){
statement.setFloat(index,entity.getFloatColumnValue(columnName));
}
else if (storageClassName.equals("java.lang.Double")){
statement.setDouble(index,entity.getDoubleColumnValue(columnName));
}
else if (storageClassName.equals("java.sql.Timestamp")){
statement.setTimestamp(index,(Timestamp)entity.getColumnValue(columnName));
}
else if (storageClassName.equals("java.sql.Time")){
statement.setTime(index,(Time)entity.getColumnValue(columnName));
}
else if (storageClassName.equals("java.sql.Date")){
statement.setDate(index,(java.sql.Date)entity.getColumnValue(columnName));
}
else if (storageClassName.equals("com.idega.util.Gender")){
statement.setString(index,entity.getColumnValue(columnName).toString());
}
else if (storageClassName.equals("com.idega.data.BlobWrapper")){
//statement.setDate(index,(java.sql.Date)getColumnValue(columnName));
}
else{
statement.setObject(index,entity.getColumnValue(columnName));
}
}
*/
public static void deleteMultiple(GenericEntity entity, String columnName, String stringColumnValue) throws SQLException {
Connection conn = null;
Statement Stmt = null;
try {
conn = entity.getConnection();
Stmt = conn.createStatement();
Stmt.executeUpdate("delete from " + entity.getEntityName() + " where " + columnName + "='" + stringColumnValue + "'");
} finally {
if (Stmt != null) {
Stmt.close();
}
if (conn != null) {
entity.freeConnection(conn);
}
}
}
public static void deleteMultiple(GenericEntity entity, String columnName1, String stringColumnValue1, String columnName2, String stringColumnValue2) throws SQLException {
Connection conn = null;
Statement Stmt = null;
try {
conn = entity.getConnection();
Stmt = conn.createStatement();
Stmt.executeUpdate("delete from " + entity.getEntityName() + " where " + columnName1 + "='" + stringColumnValue1 + "' and " + columnName2 + "='" + stringColumnValue2 + "'");
} finally {
if (Stmt != null) {
Stmt.close();
}
if (conn != null) {
entity.freeConnection(conn);
}
}
}
/**
*Deletes everything from the table of this entity - use with CAUTION :)
**/
public static void clear(GenericEntity entity) throws SQLException {
Connection conn = null;
Statement Stmt = null;
try {
conn = entity.getConnection();
Stmt = conn.createStatement();
Stmt.executeUpdate("delete from " + entity.getEntityName());
} finally {
if (Stmt != null) {
Stmt.close();
}
if (conn != null) {
entity.freeConnection(conn);
}
}
entity.setEntityState(IDOLegacyEntity.STATE_DELETED);
}
public static EntityRelationship addManyToManyRelationShip(IDOEntity relatingEntity1, IDOEntity relatingEntity2, String relationShipTableName) {
try {
String idColumnName1 = relatingEntity1.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName();
String idColumnName2 = relatingEntity2.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName();
return addManyToManyRelationShip(relatingEntity1, relatingEntity2, relationShipTableName, idColumnName1, idColumnName2);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
protected static EntityRelationship addManyToManyRelationShip(String relatingEntityClassName1, String relatingEntityClassName2) {
try {
GenericEntity entity1 = GenericEntity.getStaticInstance(relatingEntityClassName1);
GenericEntity entity2 = GenericEntity.getStaticInstance(relatingEntityClassName2);
String generatedTableName = createMiddleTableString(entity1, entity2);
return addManyToManyRelationShip(entity1, entity2, generatedTableName);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
public static EntityRelationship addManyToManyRelationShip(String relatingEntityClassName1, String relatingEntityClassName2, String relationShipTableName) {
try {
return addManyToManyRelationShip(com.idega.data.GenericEntity.getStaticInstance(relatingEntityClassName1), com.idega.data.GenericEntity.getStaticInstance(relatingEntityClassName2), relationShipTableName);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
public static String getTreeRelationShipTableName(IDOEntity entity) {
EntityRelationship rel = getManyToManyRelationShip(entity, entity);
if (rel != null) {
return rel.getTableName();
} else {
return null;
}
/*
String treeName = entity.getTableName() + "_tree";
treeName = getCheckedRelatedTableName(treeName);
return treeName;
*/
}
private static String createTreeRelationShipTableName(GenericEntity entity) {
String treeName = entity.getTableName() + "_tree";
return treeName;
}
public static String getTreeRelationShipChildColumnName(GenericEntity entity) {
return "child_" + entity.getIDColumnName();
}
public static String getTreeRelationShipChildColumnName(IDOEntity entity) throws IDOCompositePrimaryKeyException {
return "child_" + entity.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName();
}
public static void addTreeRelationShip(GenericEntity entity) {
String relationShipTableName = createTreeRelationShipTableName(entity);
String idColumnName1 = entity.getIDColumnName();
String idColumnName2 = getTreeRelationShipChildColumnName(entity);
addManyToManyRelationShip(entity, entity, relationShipTableName, idColumnName1, idColumnName2);
}
static String getCheckedRelatedTableName(String relatedTableName) {
//this is necessary for Oracle and maybe others!
if (limitTableNameToThirtyCharacters) {
//relatedTableName = relatedTableName.substring(0, Math.min(relatedTableName.length(), 30));
relatedTableName = getTableNameShortenedToThirtyCharacters(relatedTableName);
}
return relatedTableName;
}
static EntityRelationship addManyToManyRelationShip(IDOEntity relatingEntity1, IDOEntity relatingEntity2) {
String relationShipTableName = createMiddleTableString(relatingEntity1, relatingEntity2);
return addManyToManyRelationShip(relatingEntity1, relatingEntity2, relationShipTableName);
}
private static EntityRelationship addManyToManyRelationShip(IDOEntity relatingEntity1, IDOEntity relatingEntity2, String relationShipTableName, String column1, String column2) {
//if(relationshipTables==null){
// relationshipTables=new HashtableDoubleKeyed();
//}
//String relatingEntityName1 = relatingEntity1.getEntityName();
//String relatingEntityName2 = relatingEntity2.getEntityName();
String relatingEntityName1 = relatingEntity1.getEntityDefinition().getSQLTableName();
String relatingEntityName2 = relatingEntity2.getEntityDefinition().getSQLTableName();
EntityRelationship rel = new EntityRelationship();
rel.setTableName(relationShipTableName);
//Class relatingEntityClass1 = relatingEntity1.getClass();
//Class relatingEntityClass2 = relatingEntity2.getClass();
Class relatingEntityClass1 = relatingEntity1.getEntityDefinition().getInterfaceClass();
Class relatingEntityClass2 = relatingEntity2.getEntityDefinition().getInterfaceClass();
rel.addColumn(column1, relatingEntityClass1);
rel.addColumn(column2, relatingEntityClass2);
getIDOContainer().getRelationshipTableMap().put(relatingEntityName1, relatingEntityName2, rel);
//relationshipTables.put(relatingEntityClassName1,relatingEntityClassName2,relationShipTableName);
// relationshipClasses.put(relatingEntityClass1, relatingEntityClass2);
// relationshipClasses.put(relatingEntityClass2, relatingEntityClass1);
((GenericEntityDefinition)relatingEntity1.getEntityDefinition()).addManyToManyRelatedEntity(relatingEntity2.getEntityDefinition());
((GenericEntityDefinition)relatingEntity2.getEntityDefinition()).addManyToManyRelatedEntity(relatingEntity1.getEntityDefinition());
return rel;
}
/**
* Returns a list of Class Objects
* @deprecated replaced with IDOEntity#getEntityDefinition().getManyToManyRelatedEntities();
*/
public static List getManyToManyRelationShipClasses(Class entityClass) {
return getManyToManyRelationShipClasses(GenericEntity.getStaticInstanceIDO(entityClass));
//return relationshipClasses.getList(IDOLookup.getBeanClassFor(entityClass));
}
/**
* Returns a list of Class Objects
* @deprecated replaced with IDOEntity#getEntityDefinition().getManyToManyRelatedEntities();
*/
protected static List getManyToManyRelationShipClasses(IDOEntity entity) {
IDOEntityDefinition[] manyToManies = entity.getEntityDefinition().getManyToManyRelatedEntities();
Vector beanClasses = new Vector(manyToManies.length);
for (int i = 0; i < manyToManies.length; i++) {
beanClasses.add(((GenericEntityDefinition)manyToManies[i]).getBeanClass());
}
return beanClasses;
//return relationshipClasses.getList(entity.getClass());
}
/**
* Returns a list of EntityRelationship Objects
*/
protected static List getManyToManyRelationShips(GenericEntity entity) {
//if (relationshipTables != null) {
return getIDOContainer().getRelationshipTableMap().get(entity.getEntityName());
//}
//return null;
}
/**@todo : set back to protected
*
*/
public static String getManyToManyRelationShipTableName(Class entityClass1, Class entityClass2) {
return getManyToManyRelationShipName(com.idega.data.GenericEntity.getStaticInstanceIDO(entityClass1), com.idega.data.GenericEntity.getStaticInstanceIDO(entityClass2));
}
protected static String getManyToManyRelationShipName(IDOEntity entity1, IDOEntity entity2) {
return getManyToManyRelationShipName(entity1.getEntityDefinition().getSQLTableName(), entity2.getEntityDefinition().getSQLTableName());
}
protected static String getManyToManyRelationShipName(String relatingEntityName1, String relatingEntityName2) {
EntityRelationship rel = getManyToManyRelationShip(relatingEntityName1, relatingEntityName2);
if (rel != null) {
return rel.getTableName();
} else {
return null;
}
}
private static String createMiddleTableString(IDOEntity entity1, IDOEntity entity2) {
String tableToSelectFrom = "";
String tableName1=entity1.getEntityDefinition().getSQLTableName().toUpperCase();
String tableName2=entity2.getEntityDefinition().getSQLTableName().toUpperCase();
tableToSelectFrom = StringHandler.concatAlphabetically(tableName1,tableName2, "_");
return tableToSelectFrom;
}
protected static String getNameOfMiddleTable(IDOEntity entity1, IDOEntity entity2) {
String tableName = getManyToManyRelationShipName(entity1, entity2);
if (tableName == null) {
String generatedTableName = createMiddleTableString(entity1, entity2);
EntityRelationship rel = addManyToManyRelationShip(entity1, entity2, generatedTableName);
return rel.getTableName();
} else {
return tableName;
}
}
/**
* Returns the first int from the first column of the result of the SQL Query
*/
public static int returnSingleSQLQuery(GenericEntity entity, String SQLString) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
int recordCount = -1;
try {
conn = entity.getConnection(entity.getDatasource());
stmt = conn.createStatement();
rs = stmt.executeQuery(SQLString);
if (rs.next()) {
recordCount = rs.getInt(1);
}
if (rs != null) {
rs.close();
//System.out.println(SQLString+"\n");
}
} catch (SQLException e) {
System.err.println("There was an error in EntityControl.returnSingleSQLQuery " + e.getMessage());
e.printStackTrace(System.err);
} catch (Exception e) {
System.err.println("There was an error in EntityControl.returnSingleSQLQuery " + e.getMessage());
e.printStackTrace(System.err);
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) {
System.err.println("There was an error in EntityControl.returnSingleSQLQuery " + ex.getMessage());
ex.printStackTrace(System.err);
}
}
if (conn != null) {
entity.freeConnection(entity.getDatasource(), conn);
}
}
return recordCount;
}
/**
* Returns an int[] array out of an the first columns row of the result of the SQL Query
*/
public static int[] returnIntArraySQLQuery(GenericEntity entity, String SQLString) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
int size = 0;
int[] recordCount = new int[size];
try {
conn = entity.getConnection(entity.getDatasource());
stmt = conn.createStatement();
rs = stmt.executeQuery(SQLString);
int counter = 0;
int recordAt = -1;
while (rs.next()) {
try {
recordAt = rs.getInt(1);
recordCount[counter] = recordAt;
counter++;
} catch (ArrayIndexOutOfBoundsException ex) {
size += 10;
int[] newArr = new int[size];
for (int i = 0; i < recordCount.length; i++) {
newArr[i] = recordCount[i];
}
newArr[counter] = recordAt;
recordCount = newArr;
}
}
rs.close();
if (size > counter) {
int[] newArr = new int[counter];
for (int i = 0; i < recordCount.length; i++) {
newArr[i] = recordCount[i];
}
recordCount = newArr;
}
//System.out.println(SQLString+"\n");
} catch (SQLException e) {
System.err.println("There was an error in EntityControl.returnSingleSQLQuery " + e.getMessage());
e.printStackTrace(System.err);
} catch (Exception e) {
System.err.println("There was an error in EntityControl.returnSingleSQLQuery " + e.getMessage());
e.printStackTrace(System.err);
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) {
System.err.println("There was an error in EntityControl.returnSingleSQLQuery " + ex.getMessage());
ex.printStackTrace(System.err);
}
}
if (conn != null) {
entity.freeConnection(entity.getDatasource(), conn);
}
}
return recordCount;
}
public static void setAutoCreationOfEntities(boolean ifAutoCreate) {
autoCreate = ifAutoCreate;
}
public static boolean getIfEntityAutoCreate() {
return autoCreate;
}
/**
* Returns a list of IDOLegacyEntity Class objects that have N:1 relationship with entityClass
*/
public static List getNToOneRelatedClasses(Class entityClass) {
return getNToOneRelatedClasses(GenericEntity.getStaticInstanceIDO(entityClass));
}
/**
* Returns a list of IDOLegacyEntity Class objects that have N:1 relationship with entity
*/
public static List getNToOneRelatedClasses(IDOEntity entity) {
List theReturn = new java.util.Vector();
IDOEntityBean bean = (IDOEntityBean)entity;
Collection attributes = bean.getAttributes();
java.util.Iterator iter = attributes.iterator();
while (iter.hasNext()) {
EntityAttribute item = (EntityAttribute)iter.next();
if (item.isOneToNRelationship()) {
theReturn.add(item.getRelationShipClass());
}
}
return theReturn;
}
protected static String getTableNameShortenedToThirtyCharacters(String originalTableName) {
try {
String theReturn = originalTableName.substring(0, Math.min(30, originalTableName.length()));
return theReturn;
} catch (NullPointerException ne) {
throw new RuntimeException("EntityControl.getTableNameShortenedToThirtyCharacters(). originalTableName is null");
}
}
public static EntityRelationship getManyToManyRelationShip(IDOEntity relatingEntity1, IDOEntity relatingEntity2) {
String relatingEntityName1 = relatingEntity1.getEntityDefinition().getSQLTableName();
String relatingEntityName2 = relatingEntity2.getEntityDefinition().getSQLTableName();
return getManyToManyRelationShip(relatingEntityName1, relatingEntityName2);
}
protected static EntityRelationship getManyToManyRelationShip(String relatingEntityName1, String relatingEntityName2) {
EntityRelationship rel = (EntityRelationship)getIDOContainer().getRelationshipTableMap().get(relatingEntityName1, relatingEntityName2);
if (rel == null) {
return null;
} else {
return rel;
}
//return (String)relationshipTables.get(relatingEntityClassName1,relatingEntityClassName2);
}
public static IDOContainer getIDOContainer(){
return IDOContainer.getInstance();
}
}