/* * * Copyright (C) 2001 Idega hf. All Rights Reserved. * * This software is the proprietary information of Idega hf. Use is subject to * license terms. * */ package com.idega.data; import java.io.InputStream; import java.io.OutputStream; import java.io.Serializable; import java.lang.reflect.Array; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Time; import java.sql.Timestamp; import java.text.Collator; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.CreateException; import javax.ejb.EJBException; import javax.ejb.EJBLocalHome; import javax.ejb.EJBLocalObject; import javax.ejb.FinderException; import javax.ejb.RemoveException; import javax.persistence.Entity; import javax.persistence.EntityManager; import com.idega.business.ExplicitSynchronizationBusiness; import com.idega.core.idgenerator.business.IdGenerator; import com.idega.core.idgenerator.business.IdGeneratorFactory; import com.idega.core.persistence.EntityManagerService; import com.idega.data.query.Column; import com.idega.data.query.Criteria; import com.idega.data.query.MatchCriteria; import com.idega.data.query.SelectQuery; import com.idega.data.query.Table; import com.idega.data.query.WildCardColumn; import com.idega.idegaweb.IWMainApplication; import com.idega.repository.data.RefactorClassRegistry; import com.idega.util.CoreConstants; import com.idega.util.CoreUtil; import com.idega.util.ListUtil; import com.idega.util.StringUtil; import com.idega.util.database.ConnectionBroker; import com.idega.util.expression.ELUtil; import com.idega.util.logging.LoggingHelper; /** * A class to serve as a base implementation for objects mapped to persistent * data in the IDO Framework. * * * @author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson</a> * @version 1.4 * @modified <a href="mailto:eiki@idega.is">Eirikur Hrafnsson</a> */ public abstract class GenericEntity implements Serializable, IDOEntity, IDOEntityBean, EntityRepresentation { private static final long serialVersionUID = -6654406719924582653L; public static final String MANY_TO_ONE = "many-to-one"; public static final String ONE_TO_MANY = "one-to-many"; public static final String MANY_TO_MANY = "many-to-many"; public static final String ONE_TO_ONE = "one-to-one"; protected static final String UNIQUE_ID_COLUMN_NAME = "UNIQUE_ID"; static String DEFAULT_DATASOURCE = "default"; private int _state = IDOLegacyEntity.STATE_NEW; private Map<String, Object> _columns = new Hashtable<String, Object>(); private Map<String, Boolean> _updatedColumns; private String _dataSource; String[] _cachedColumnNameList; private Map<String, EJBLocalHome> _ejbHomes = new HashMap<String, EJBLocalHome>(); private Object _primaryKey; private Map<String, String> _theMetaDataAttributes; private List<String> _insertMetaData; private List<String> _updateMetaData; private List<String> _deleteMetaData; private Hashtable<String, Integer> _theMetaDataIds; private Map<String, String> _theMetaDataTypes; private boolean _hasMetaDataRelationship = false; private boolean _metaDataHasChanged = false; public String _lobColumnName; private boolean insertStartData = true; protected static String COLUMN_VALUE_TRUE = "Y"; protected static String COLUMN_VALUE_FALSE = "N"; private boolean canRegisterColumnsForUpdate = false; private Table idoQueryTable = null; /* * protected static int STATE_NEW = 0; protected static int * STATE_IN_SYNCH_WITH_DATASTORE = 1; protected static int * STATE_NOT_IN_SYNCH_WITH_DATASTORE = 2; protected static int * STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE = 3; protected static int * STATE_DELETED = 4; */ protected GenericEntity() { this(DEFAULT_DATASOURCE); } protected GenericEntity(String dataSource) { setDatasource(dataSource); try { firstLoadInMemoryCheck(); } catch (Error e) { System.err.println("Error in " + this.getClass().getName() + ".firstLoadInMemoryCheck()"); e.printStackTrace(); } setDefaultValues(); // this boolean is needed because developers are using setColumn in // setDefaultValues() and not initializeColumnValue // it stops the defaultvalues from being considered changed this.canRegisterColumnsForUpdate = true; } protected GenericEntity(int id) throws SQLException { this(id, DEFAULT_DATASOURCE); } protected GenericEntity(int id, String dataSource) throws SQLException { setDatasource(dataSource); firstLoadInMemoryCheck(); this.findByPrimaryKey(id); } private void firstLoadInMemoryCheck() { GenericEntityDefinition entityDefinition = getGenericEntityDefinition(); if (entityDefinition == null) { // IDOEntityDefinition entityDefinition = new GenericEntityDefinition(); entityDefinition.setSQLTableName(this.getEntityName()); entityDefinition.setUniqueEntityName(this.getEntityName()); ((PrimaryKeyDefinition) entityDefinition.getPrimaryKeyDefinition()).setPrimaryKeyClass(this.getPrimaryKeyClass()); this.setGenericEntityDefinition(entityDefinition); // IDOEntityDefinition ends // First store a static instance of this class try { getIDOContainer().getEntityStaticInstances().put(this.getClass(), GenericEntity.instanciateEntity(this.getClass(), getDatasource())); } catch (Exception ex) { ex.printStackTrace(); } this.getGenericEntityDefinition().setInterfaceClass(getInterfaceClass()); // call the ializeAttributes that stores information about columns and // relationships beforeInitializeAttributes(); initializeAttributes(); afterInitializeAttributes(); setLobColumnName(); if (EntityControl.getIfEntityAutoCreate()) { try { DatastoreInterface.getInstance(this).createEntityRecord(this); } catch (Exception ex) { ex.printStackTrace(); } } } } protected static IDOContainer getIDOContainer() { return IDOContainer.getInstance(); } protected static Collection getLoadedEntityBeans() { return getIDOContainer().getEntityStaticInstances().values(); } /** * Meant to be overrided in subclasses to add default attributes */ protected void beforeInitializeAttributes() { } /** * Meant to be overrided in subclasses to add default attributes */ protected void afterInitializeAttributes() { } /** * Override this function to set staring Data into the record of the entity at * creation time */ public void insertStartData() throws Exception { } public String getTableName() { return getEntityName(); } /** * Subclasses have to implement this method - this should return the name of * the underlying table */ public abstract String getEntityName(); public abstract void initializeAttributes(); @Override public Collection<EntityAttribute> getAttributes() { // ties the attribute vector to the subclass of IDOLegacyEntity because // the theAttributes variable is static. return getGenericEntityDefinition().getEntityFieldsCollection(); } protected GenericEntityDefinition getGenericEntityDefinition() { return (GenericEntityDefinition) getIDOContainer().getEntityDefinitions().get(this.getClass()); } protected GenericEntityDefinition setGenericEntityDefinition(GenericEntityDefinition definition) { return (GenericEntityDefinition) getIDOContainer().getEntityDefinitions().put(this.getClass(), definition); } public void setID(int id) { setColumn(getIDColumnName(), new Integer(id)); } public void setID(Integer id) { setColumn(getIDColumnName(), id); } public int getID() { return getIntColumnValue(getIDColumnName()); } public Object getPrimaryKeyValue() { if (this._primaryKey != null) { return this._primaryKey; } else { return this.getValue(getIDColumnName()); } } public Integer getIDInteger() { return (Integer) getPrimaryKeyValue(); } /** * default unimplemented function, gets the name of the record from the * datastore */ public String getName() { Object primaryKey = this.getPrimaryKey(); if (primaryKey != null) { return primaryKey.toString(); } return null; } public BlobWrapper getEmptyBlob(String columnName) { return new BlobWrapper(this, columnName); } /** * default unimplemented function, sets the name of the record in the * datastore */ public void setName(String name) { // does nothing } /** * @see java.lang.Object#toString() * @see com.idega.data.GenericEntity#getName() * @see com.idega.data.GenericEntity#decode(String pkString) */ @Override public String toString() { return this.getName(); } /** * Decodes a String into a primaryKey Object. Recognises strings of the same * format as com.idega.data.GenericEntity#toString() returns. * * @see com.idega.data.GenericEntity#toString() */ @Override public Integer decode(String pkString) { return Integer.decode(pkString); } /** * Decodes a String into a primaryKey Object. Recognizes strings of the same * format as com.idega.data.GenericEntity#toString() returns. * * @see com.idega.data.GenericEntity#toString() */ @Override public Collection<Integer> decode(String[] primaryKeys) { Collection<Integer> c = new ArrayList<Integer>(); for (int i = 0; i < primaryKeys.length; i++) { c.add(decode(primaryKeys[i])); } return c; } /** * @deprecated Replaced with addAttribute() */ @Deprecated protected void addColumnName(String columnName) { addAttribute(columnName); } protected void addAttribute(String attributeName) { EntityAttribute attribute; attribute = new EntityAttribute(attributeName); attribute.setDeclaredEntity(getGenericEntityDefinition()); attribute.setAsPrimaryKey(true); attribute.setNullable(false); addAttribute(attribute); } /** * @deprecated Replaced with addAttribute() */ @Deprecated protected void addColumnName(String columnName, String longName, boolean ifVisible, boolean ifEditable, String storageClassName) { addAttribute(columnName, longName, ifVisible, ifEditable, storageClassName); } public void addAttribute(String attributeName, String longName, boolean ifVisible, boolean ifEditable, String storageClassName) { try { addAttribute(attributeName, longName, ifVisible, ifEditable, RefactorClassRegistry.forName(storageClassName)); } catch (ClassNotFoundException e) { throw new RuntimeException("Exception in " + this.getClass().getName() + e.getMessage()); } } protected void addAttribute(String attributeName, String longName, boolean ifVisible, boolean ifEditable, Class storageClass) { EntityAttribute attribute = new EntityAttribute(attributeName.toLowerCase()); attribute.setAsPrimaryKey(this.getIDColumnName().equalsIgnoreCase(attributeName)); attribute.setDeclaredEntity(getGenericEntityDefinition()); attribute.setLongName(longName); attribute.setVisible(ifVisible); attribute.setEditable(ifEditable); attribute.setStorageClass(storageClass); addAttribute(attribute); } /** * Added by Eirikur Hrafnsson * */ protected void addAttribute(String attributeName, String longName, boolean ifVisible, boolean ifEditable, String storageClassName, int maxLength) { try { addAttribute(attributeName, longName, ifVisible, ifEditable, RefactorClassRegistry.forName(storageClassName), maxLength); } catch (ClassNotFoundException e) { throw new RuntimeException("Exception in " + this.getClass().getName() + e.getMessage()); } } protected void addAttribute(String attributeName, String longName, Class storageClass) { addAttribute(attributeName, longName, true, true, storageClass); } protected void addAttribute(String attributeName, String longName, Class storageClass, int maxLength) { addAttribute(attributeName, longName, true, true, storageClass, maxLength); } protected void addAttribute(String attributeName, String longName, boolean ifVisible, boolean ifEditable, Class storageClass, int maxLength) { EntityAttribute attribute = new EntityAttribute(attributeName); attribute.setAsPrimaryKey(this.getIDColumnName().equalsIgnoreCase(attributeName)); attribute.setDeclaredEntity(getGenericEntityDefinition()); attribute.setLongName(longName); attribute.setVisible(ifVisible); attribute.setEditable(ifEditable); attribute.setStorageClass(storageClass); attribute.setMaxLength(maxLength); addAttribute(attribute); } /** * @deprecated Replaced with addAttribute() */ @Deprecated protected void addColumnName(String columnName, String longName, boolean ifVisible, boolean ifEditable, String storageClassName, String relationShipType, String relationShipClassName) { addAttribute(columnName, longName, ifVisible, ifEditable, storageClassName, relationShipType, relationShipClassName); } protected void addAttribute(String attributeName, String longName, boolean ifVisible, boolean ifEditable, String storageClassName, String relationShipType, String relationShipClassName) { try { addAttribute(attributeName, longName, ifVisible, ifEditable, RefactorClassRegistry.forName(storageClassName), relationShipType, RefactorClassRegistry.forName(relationShipClassName)); } catch (ClassNotFoundException e) { throw new RuntimeException("Exception in " + this.getClass().getName() + e.getMessage()); } } protected void addAttribute(String attributeName, String longName, boolean ifVisible, boolean ifEditable, Class storageClass, String relationShipType, Class relationShipClass) { EntityAttribute attribute = new EntityAttribute(attributeName); attribute.setAsPrimaryKey(this.getIDColumnName().equalsIgnoreCase(attributeName)); attribute.setDeclaredEntity(getGenericEntityDefinition()); attribute.setLongName(longName); attribute.setVisible(ifVisible); attribute.setEditable(ifEditable); attribute.setRelationShipType(relationShipType); attribute.setRelationShipClass(relationShipClass); attribute.setStorageClass(storageClass); addAttribute(attribute); } protected void addAttribute(String attributeName, String longName, boolean ifVisible, boolean ifEditable, String storageClassName, int maxLength, String relationShipType, String relationShipClassName) { try { addAttribute(attributeName, longName, ifVisible, ifEditable, RefactorClassRegistry.forName(storageClassName), maxLength, relationShipType, RefactorClassRegistry.forName(relationShipClassName)); } catch (ClassNotFoundException e) { throw new RuntimeException("Exception in " + this.getClass().getName() + e.getMessage()); } } protected void addAttribute(String attributeName, String longName, boolean ifVisible, boolean ifEditable, Class storageClass, int maxLength, String relationShipType, Class relationShipClass) { EntityAttribute attribute = new EntityAttribute(attributeName); attribute.setAsPrimaryKey(this.getIDColumnName().equalsIgnoreCase(attributeName)); attribute.setDeclaredEntity(getGenericEntityDefinition()); attribute.setLongName(longName); attribute.setVisible(ifVisible); attribute.setEditable(ifEditable); attribute.setRelationShipType(relationShipType); attribute.setRelationShipClass(relationShipClass); attribute.setStorageClass(storageClass); attribute.setMaxLength(maxLength); addAttribute(attribute); } protected void addAttribute(EntityAttribute attribute) { // getAttributesMap().put(attribute.getName().toUpperCase(),attribute); getGenericEntityDefinition().addFieldEntity(attribute); // getAttributes().addElement(attribute); } protected void addLanguageAttribute() { this.addAttribute(getLanguageIDColumnName(), "Language", true, true, "java.lang.Integer", "one_to_one", "com.idega.core.localisation.data.Language"); } /** * @deprecated Replaced with getAttribute() */ @Deprecated public EntityAttribute getColumn(String columnName) { return getAttribute(columnName); } public EntityAttribute getAttribute(String attributeName) { // return (EntityAttribute) columns.get(columnName.toLowerCase()); // EntityAttribute theReturn = // (EntityAttribute)getAttributesMap().get(attributeName.toUpperCase()); EntityAttribute theReturn = getGenericEntityDefinition().getEntityAttribute(attributeName.toUpperCase()); /** * EntityAttribute theReturn = null; EntityAttribute tempColumn = null; for * (Enumeration enumeration = getAttributes().elements(); * enumeration.hasMoreElements();) { tempColumn = (EntityAttribute) * enumeration.nextElement(); if * (tempColumn.getColumnName().equalsIgnoreCase(attributeName)) { theReturn = * tempColumn; } } */ /* * if(theReturn==null){ System.err.println("Error in * "+this.getClass().getName()+".getAttribute(): * ColumnName='"+attributeName+"' exists in table but not in Entity Class"); } */ return theReturn; } protected void addOneToOneRelationship(String relationshipColumnName, Class relatingEntityClass) { addOneToOneRelationship(relationshipColumnName, relatingEntityClass.getName(), relatingEntityClass); } protected void addOneToOneRelationship(String relationshipColumnName, String description, Class relatingEntityClass) { try { Class primaryKeyInRelatedClass = IDOLookup.getEntityDefinitionForClass(relatingEntityClass).getPrimaryKeyDefinition().getPrimaryKeyClass(); addAttribute(relationshipColumnName, description, true, true, primaryKeyInRelatedClass, com.idega.data.GenericEntity.ONE_TO_ONE, relatingEntityClass); } catch (IDOLookupException e) { e.printStackTrace(); } } protected void addManyToOneRelationship(String relationshipColumnName, Class relatingEntityClass) { addManyToOneRelationship(relationshipColumnName, relatingEntityClass.getName(), relatingEntityClass); } protected void addManyToOneRelationship(String relationshipColumnName, String description, Class relatingEntityClass) { try { Class primaryKeyInRelatedClass = IDOLookup.getEntityDefinitionForClass(relatingEntityClass).getPrimaryKeyDefinition().getPrimaryKeyClass(); addAttribute(relationshipColumnName, description, true, true, primaryKeyInRelatedClass, com.idega.data.GenericEntity.MANY_TO_ONE, relatingEntityClass); } catch (IDOLookupException e) { e.printStackTrace(); } } protected void addRelationship(String relationshipName, String relationshipType, String relationshipClassName) { try { EntityAttribute attribute = new EntityAttribute(getGenericEntityDefinition()); attribute.setName(relationshipName); attribute.setAttributeType("relationship"); attribute.setRelationShipClass(RefactorClassRegistry.forName(relationshipClassName)); addAttribute(attribute); } catch (ClassNotFoundException e) { throw new RuntimeException("Exception in " + this.getClass().getName() + e.getMessage()); } } // /** // *Constructs an array of GenericEntities through an int Array (containing // rows of id's from the datastore) - uses the findByPrimaryKey method to // instanciate a new object fetched from the database // *@deprecated Only IDOLegacyEntity method, does not work with pure IDOEntity // **/ // public IDOLegacyEntity[] constructArray(int[] id_array) { // IDOLegacyEntity[] returnArr = null; // try { // returnArr = // (IDOLegacyEntity[])java.lang.reflect.Array.newInstance(this.getClass(), // id_array.length); // for (int i = 0; i < id_array.length; i++) { // returnArr[i] = (IDOLegacyEntity)instanciateEntity(this.getClass()); // returnArr[i].findByPrimaryKey(id_array[i]); // } // } catch (Exception ex) { // System.err.println("There was an error in // com.idega.data.GenericEntity.constructArray(int[] id_array): " + // ex.getMessage()); // } // return returnArr; // } /** * Constructs an array of GenericEntities through a String Array (containing * only int's for the rows of id's from the datastore) - uses the * findByPrimaryKey method to instanciate a new object fetched from the * database * * @deprecated Only IDOLegacyEntity method, does not work with pure IDOEntity */ @Deprecated public IDOLegacyEntity[] constructArray(String[] id_array) { IDOLegacyEntity[] returnArr = null; try { returnArr = (IDOLegacyEntity[]) java.lang.reflect.Array.newInstance(this.getClass(), id_array.length); for (int i = 0; i < id_array.length; i++) { returnArr[i] = (IDOLegacyEntity) instanciateEntity(this.getClass(), getDatasource()); returnArr[i].findByPrimaryKey(Integer.parseInt(id_array[i])); } } catch (Exception ex) { System.err.println("There was an error in com.idega.data.GenericEntity.constructArray(String[] id_array): " + ex.getMessage()); } return returnArr; } /** * Sets the colums value or removes the existing value if columnValue == null * * @param columnName * @param columnValue * @param needsToUpdate * true if this is a column that is changing, false if it is just * being loaded from the database */ protected void setValue(String columnName, Object columnValue, boolean needsToUpdate) { // only update if it is a new value // and remove if it a null value String upperCaseColumnName = columnName.toUpperCase(); Object oldValue = this._columns.get(upperCaseColumnName); if (columnValue != null) { if (!(oldValue != null && columnValue.equals(oldValue))) { this._columns.put(upperCaseColumnName, columnValue); } else { // its the same, don't add it needsToUpdate = false; } } else { removeFromColumn(upperCaseColumnName); } if (needsToUpdate) { flagColumnUpdate(upperCaseColumnName); if ((getEntityState() == IDOLegacyEntity.STATE_NEW) || (getEntityState() == IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE)) { setEntityState(IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE); } else { setEntityState(IDOLegacyEntity.STATE_NOT_IN_SYNCH_WITH_DATASTORE); } } } protected void setValue(String columnName, Object columnValue) { setValue(columnName, columnValue, true); } protected Object getValue(String columnName) { return this._columns.get(columnName.toUpperCase()); } /** * Sets the column to null */ public void removeFromColumn(String columnName) { this._columns.remove(columnName.toUpperCase()); this.flagColumnUpdate(columnName); } /** * This method is called when changing a columns value or initilizing it * * @param columnName * @param columnValue * @param needsToUpdate * true if we are changing the column value, false if just loading * from the database */ public void setColumn(String columnName, Object columnValue, boolean needsToUpdate) { if (this.getRelationShipClass(columnName) == null) { // this is the most common case, the column is just a primative type and // not a relational column (foreign key) setValue(columnName, columnValue, needsToUpdate); } else if (columnValue instanceof IDOEntity) { // this is the second most common case, an IDOEntity is passed into the // setColumn method but we save its primarykey as the column value setValue(columnName, ((IDOEntity) columnValue).getPrimaryKey(), needsToUpdate); } else { // lastly this is used for other cases. setting ids directly (foreign // keys) setValue(columnName, columnValue, needsToUpdate); } } /** * Sets the columns value and flags the column as changed * * @param columnName * @param columnValue */ public void setColumn(String columnName, Object columnValue) { setColumn(columnName, columnValue, true); } /** * Sets the column value for the first time, the column is NOT flagged as * changed * * @param columnName * @param columnValue */ protected void initializeColumnValue(String columnName, Object columnValue) { setColumn(columnName, columnValue, false); } public void setColumn(String columnName, int columnValue) { setColumn(columnName, new Integer(columnValue), true); } public void setColumn(String columnName, Integer columnValue) { setColumn(columnName, columnValue, true); } public void setColumn(String columnName, float columnValue) { setColumn(columnName, new Float(columnValue), true); } public void setColumn(String columnName, Float columnValue) { setColumn(columnName, columnValue, true); } public void setColumn(String columnName, boolean columnValue) { setColumn(columnName, new Boolean(columnValue), true); } public void setColumn(String columnName, Boolean columnValue) { setColumn(columnName, columnValue, true); } public void setColumn(String columnName, char columnValue) { setColumn(columnName, String.valueOf(columnValue), true); } public void setColumn(String columnName, double columnValue) { setColumn(columnName, new Double(columnValue), true); } public void setColumn(String columnName, Double columnValue) { setColumn(columnName, columnValue, true); } /** * @deprecated replaced with removeFromColumn(columnName) Sets a column value * to null */ @Deprecated public void setColumnAsNull(String columnName) throws SQLException { Connection Conn = null; try { /** * @todo stringbuffer */ Conn = getConnection(getDatasource()); String sql = "update " + this.getEntityName() + " set " + columnName + " = null where " + this.getIDColumnName() + " = " + this.getPrimaryKeyValueSQLString(); Conn.createStatement().executeUpdate(sql); Conn.commit(); } catch (SQLException e) { e.printStackTrace(System.err); } finally { if (Conn != null) { freeConnection(getDatasource(), Conn); } } } /** * The Outputstream must be completele written to when insert() or update() is * executed on the Entity Class */ public OutputStream getColumnOutputStream(String columnName) { BlobWrapper wrapper = getBlobColumnValue(columnName); if (wrapper == null) { wrapper = new BlobWrapper(this, columnName); setColumn(columnName, wrapper); } else { this.flagColumnUpdate(columnName); if ((getEntityState() == IDOLegacyEntity.STATE_NEW) || (getEntityState() == IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE)) { setEntityState(IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE); } else { this.setEntityState(IDOLegacyEntity.STATE_NOT_IN_SYNCH_WITH_DATASTORE); } } return wrapper.getOutputStreamForBlobWrite(); } public void setColumn(String columnName, InputStream streamForBlobWrite) { BlobWrapper wrapper = getBlobColumnValue(columnName); if (wrapper != null) { wrapper.setInputStreamForBlobWrite(streamForBlobWrite); this.flagColumnUpdate(columnName); if ((getEntityState() == IDOLegacyEntity.STATE_NEW) || (getEntityState() == IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE)) { setEntityState(IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE); } else { this.setEntityState(IDOLegacyEntity.STATE_NOT_IN_SYNCH_WITH_DATASTORE); } } else { wrapper = new BlobWrapper(this, columnName); wrapper.setInputStreamForBlobWrite(streamForBlobWrite); setColumn(columnName, wrapper, true); } } public BlobWrapper getBlobColumnValue(String columnName) { BlobWrapper wrapper = (BlobWrapper) getColumnValue(columnName); if (wrapper == null) { wrapper = new BlobWrapper(this, columnName); this.setColumn(columnName, wrapper, false); } return wrapper; } public InputStream getInputStreamColumnValue(String columnName) { BlobWrapper wrapper = getBlobColumnValue(columnName); /* * if(wrapper==null){ wrapper = new BlobWrapper(this,columnName); * this.setColumn(columnName,wrapper); } */ return wrapper.getBlobInputStream(); } protected <T>T getRealValue(String columnName) { return getRealValue(columnName, (T) null); // Type parameter added because of Maven 2 compiler - it fails without casting to T } @SuppressWarnings("unchecked") protected <T>T getRealValue(String columnName, T defaultValue) { Object value = getColumnValue(columnName); return value == null ? defaultValue : (T) value; } @Override public Object getColumnValue(String columnName) { Object returnObj = null; Object value = getValue(columnName); Class<? extends IDOEntity> relationClass = this.getRelationShipClass(columnName); if (value instanceof com.idega.data.IDOEntity) { returnObj = value; } // else if (value instanceof java.lang.Integer){ else if (relationClass != null) { // if (getRelationShipClass(columnName).getName().indexOf("idega") != -1){ if (relationClass.isAnnotationPresent(Entity.class)) { if (value != null) { EntityManagerService service = new EntityManagerService(); EntityManager manager = service.getEntityManagerFactory().createEntityManager(); returnObj = manager.find(relationClass, value); } } else { try { // returnObj = // this.findByPrimaryInOtherClass(getRelationShipClass(columnName),((Integer)value).intValue()); if (value != null) { IDOHome home = IDOLookup.getHome(relationClass); if (this.getDatasource() != null) { home = IDOLookup.getHome(relationClass, getDatasource()); } returnObj = home.findByPrimaryKeyIDO(value); } } catch (Exception ex) { System.err.println("Exception in com.idega.data.GenericEntity.getColumnValue(String columnName): of type+ " + ex.getClass().getName() + " , Message = " + ex.getMessage()); ex.printStackTrace(System.err); } finally { } } // } // else{ // } } // else{ // returnObj = value; // } // } else { returnObj = value; } if (returnObj == null) { } else { } return returnObj; } public String getStringColumnValue(String columnName) { if (getValue(columnName) != null) { if (this.getStorageClass(columnName).equals(java.lang.Boolean.class)) { if (((Boolean) getColumnValue(columnName)).booleanValue() == true) { return "Y"; } else { return "N"; } } else { return getValue(columnName).toString(); } } else { return null; } } public char getCharColumnValue(String columnName) { return getCharColumnValue(columnName, ' '); } public char getCharColumnValue(String columnName, char returnValueIfNull) { String tempString = (String) getColumnValue(columnName); return (tempString == null || tempString.length() == 0) ? returnValueIfNull : tempString.charAt(0); } public float getFloatColumnValue(String columnName) { return getFloatColumnValue(columnName, -1F); } public float getFloatColumnValue(String columnName, float returnValueIfNull) { Float tempFloat = (Float) getColumnValue(columnName); return (tempFloat == null) ? returnValueIfNull : tempFloat.floatValue(); } public double getDoubleColumnValue(String columnName) { return getDoubleColumnValue(columnName, -1D); } public double getDoubleColumnValue(String columnName, double returnValueIfNull) { Double tempDouble = (Double) getColumnValue(columnName); return (tempDouble == null) ? returnValueIfNull : tempDouble.doubleValue(); } public Integer getIntegerColumnValue(String columnName) { return (Integer) getValue(columnName); } public int getIntColumnValue(String columnName) { return getIntColumnValue(columnName, -1); } public int getIntColumnValue(String columnName, int returnValueIfNull) { Object tempInt = getValue(columnName); return (tempInt == null) ? returnValueIfNull : new Integer(tempInt.toString()).intValue(); } public boolean getBooleanColumnValue(String columnName) { return getBooleanColumnValue(columnName, false); } public boolean getBooleanColumnValue(String columnName, boolean returnValueIfNull) { Object value = getValue(columnName); if (value != null) { // Boolean tempBool = (Boolean) getValue(columnName); // if (tempBool != null){ // return tempBool.booleanValue(); if (value instanceof Boolean) { return ((Boolean) value).booleanValue(); } else if (value instanceof String) { String sValue = (String) value; if (sValue.equals(COLUMN_VALUE_TRUE)) { return true; } else if (sValue.equals(COLUMN_VALUE_FALSE)) { return false; } } } return returnValueIfNull; } public Date getDateColumnValue(String columnName) { return (Date) getValue(columnName); } public Timestamp getTimestampColumnValue(String columnName) { return (Timestamp) getValue(columnName); } public Time getTimeColumnValue(String columnName) { return (Time) getValue(columnName); } public void setLongName(String columnName, String longName) { getColumn(columnName).setLongName(longName); } public String getLongName(String columnName) { return getColumn(columnName).getLongName(); } public void setRelationShipType(String columnName, String type) { getColumn(columnName).setRelationShipType(type); } public String getRelationShipType(String columnName) { return getColumn(columnName).getRelationShipType(); } /** * @deprecated replaced with getStorageClass */ @Deprecated public int getStorageClassType(String columnName) { EntityAttribute attribute = getColumn(columnName); if (attribute != null) { return attribute.getStorageClassType(); } else { return 0; } } /** * @deprecated replaced with getStorageClass */ @Deprecated public String getStorageClassName(String columnName) { String theReturn = ""; if (getColumn(columnName) != null) { theReturn = getColumn(columnName).getStorageClassName(); } return theReturn; } public Class getStorageClass(String columnName) { Class theReturn = null; if (getColumn(columnName) != null) { theReturn = getColumn(columnName).getStorageClass(); } return theReturn; } /** * @deprecated replaced with setStorageClass */ @Deprecated public void setStorageClassName(String columnName, String className) { try { getColumn(columnName).setStorageClass(RefactorClassRegistry.forName(className)); } catch (ClassNotFoundException e) { throw new RuntimeException("Exception in " + this.getClass().getName() + e.getMessage()); } } public void setStorageClass(String columnName, Class javaClass) { getColumn(columnName).setStorageClass(javaClass); } /** * @deprecated replaced with setStorageClass */ @Deprecated public void setStorageClassType(String columnName, int classType) { getColumn(columnName).setStorageClassType(classType); } public void setEditable(String columnName, boolean ifEditable) { getColumn(columnName).setEditable(ifEditable); } public boolean getIfEditable(String columnName) { return getColumn(columnName).getIfEditable(); } public void setVisible(String columnName, boolean ifVisible) { getColumn(columnName).setVisible(ifVisible); } public boolean getIfVisible(String columnName) { return getColumn(columnName).getIfVisible(); } /* * public String getRelationShipClassName(String columnName){ String theReturn = * ""; if (getColumn(columnName) != null){ theReturn = * getColumn(columnName).getRelationShipClassName(); } return theReturn; } */ /** * Returns null if the specified column does have a relationship Class */ public Class<? extends IDOEntity> getRelationShipClass(String columnName) { EntityAttribute column = getAttribute(columnName); if (column != null) { return column.getRelationShipClass(); } return null; } public void setRelationShipClassName(String columnName, String className) { try { getColumn(columnName).setRelationShipClass(RefactorClassRegistry.forName(className)); } catch (ClassNotFoundException e) { throw new RuntimeException("Exception in " + this.getClass().getName() + e.getMessage()); } } public void setMaxLength(String columnName, int maxLength) { getColumn(columnName).setMaxLength(maxLength); } public int getMaxLength(String columnName) { return getColumn(columnName).getMaxLength(); } public void setNullable(String columnName, boolean ifNullable) { getColumn(columnName).setNullable(ifNullable); } public boolean getIfNullable(String columnName) { return getColumn(columnName).getIfNullable(); } public boolean getIfUnique(String columnName) { return getColumn(columnName).getIfUnique(); } public void setUnique(String columnName, boolean ifUnique) { getColumn(columnName).setUnique(ifUnique); } public void setAsPrimaryKey(String columnName, boolean ifPrimaryKey) { getColumn(columnName).setAsPrimaryKey(ifPrimaryKey); } public boolean isPrimaryKey(String columnName) { return getColumn(columnName).isPrimaryKey(); } /** * Gets a databaseconnection identified by the datasourceName */ public Connection getConnection(String datasourceName) throws SQLException { return ConnectionBroker.getConnection(datasourceName); } /** * Gets the default database connection */ public Connection getConnection() throws SQLException { return ConnectionBroker.getConnection(getDatasource()); } /** * Frees the connection used, must be done after using a databaseconnection */ public void freeConnection(String datasourceName, Connection connection) { ConnectionBroker.freeConnection(datasourceName, connection); } /** * Frees the default connection used, must be done after using a * databaseconnection */ public void freeConnection(Connection connection) { ConnectionBroker.freeConnection(getDatasource(), connection); } /** * Sets the datasource to another datastore.<br> * Can be used to switch the datasource when the entity has been fetched from * another datasource (.e.g. when this instance is inserted into a new * datastore with another datasource). */ @Override public void setDatasource(String dataSource) { setDatasource(dataSource, false); } /** * Sets the datasource to another datastore.<br> * Can be used to switch the datasource when the entity has been fetched from * another datasource (.e.g. when this instance is inserted into a new * datastore with another datasource). * * @param reloadEntity * if TRUE then the entity datatables in the new datasource will be * checked for inconsistencies */ public void setDatasource(String dataSource, boolean reloadEntity) { if (!dataSource.equals(this._dataSource)) { try { // Connect the blob fields if the datasource is changed // System.out.println("[setDataSource()] "+this.getClass().getName()+" // EntityState="+this.getEntityState()); if (getEntityState() == IDOLegacyEntity.STATE_IN_SYNCH_WITH_DATASTORE && this.hasLobColumn()) { BlobWrapper wrapper = this.getBlobColumnValue(this.getLobColumnName()); BlobInputStream inStream = wrapper.getBlobInputStream(); // inStream.setDataSource(this._dataSource); wrapper.setInputStreamForBlobWrite(inStream); setEntityState(IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE); // System.out.println(this.getClass().getName()+".setDatasource("+dataSource+"), // connecting blob fields"); } } catch (Exception e) { System.err.println("Exception in connecting blob fields for " + this.getClass().getName() + ", primary value=" + this.getPrimaryKeyValueSQLString()); e.printStackTrace(); } } this._dataSource = dataSource; if (reloadEntity) { getIDOContainer().getEntityDefinitions().put(this.getClass(), null); firstLoadInMemoryCheck(); } } @Override public String getDatasource() { return this._dataSource; } /** * @todo add: public String getPKColumnName(){ String entityName = * getEntityName(); if (entityName.endsWith("_")){ return * entityName+"id"; } else{ return entityName+"_id"; } } */ public boolean isPrimaryKeyColumn(String columnName) { IDOEntityField[] fields = getEntityDefinition().getPrimaryKeyDefinition().getFields(); for (int i = 0; i < fields.length; i++) { if (fields[i].getSQLFieldName().equalsIgnoreCase(columnName)) { return true; } } return false; } public String getIDColumnName() { IDOPrimaryKeyDefinition pkd = this.getEntityDefinition().getPrimaryKeyDefinition(); if (pkd == null || pkd.getFields().length == 0) { String entityName = getEntityName(); if (entityName.endsWith("_")) { return entityName + "ID"; } else { return entityName + "_ID"; } } else { try { return pkd.getField().getSQLFieldName(); } catch (IDOCompositePrimaryKeyException e) { return pkd.getFields()[0].getSQLFieldName(); } } } public static String getLanguageIDColumnName() { return "language_id"; } /** * Gets a String array with all the columns defined in this entity bean. * * @see com.idega.data.IDOLegacyEntity#getColumnNames() */ public String[] getColumnNames() { String[] theReturn = getCachedColumnNames(); if (theReturn == null) { Collection<String> results = new ArrayList<String>(); // int i = 0; // for (Enumeration e = columns.keys(); e.hasMoreElements();i++){ // for (Enumeration e = getAttributes().elements(); e.hasMoreElements(); // i++) /*for (Iterator iter = getAttributes().iterator(); iter.hasNext(); i++) { EntityAttribute temp = (EntityAttribute) iter.next(); // EntityAttribute temp = (EntityAttribute) e.nextElement(); if (temp.getAttributeType().equals("column")) { // vector.addElement(temp.getColumnName().toLowerCase()); vector.addElement(temp.getColumnName()); } }*/ for (EntityAttribute object : getAttributes()) { if (object.getAttributeType().equals("column")) { results.add(object.getColumnName()); } } theReturn = results.toArray(new String[0]); setCachedColumnNames(theReturn); } return theReturn; } private String[] getCachedColumnNames() { return getIDOEntityStaticInstance()._cachedColumnNameList; } private void setCachedColumnNames(String[] columnNames) { getIDOEntityStaticInstance()._cachedColumnNameList = columnNames; } /** @todo this should not be done every time cache!!* */ public String[] getVisibleColumnNames() { List<String> theColumns = new ArrayList<String>(); for (Iterator<EntityAttribute> iter = getAttributes().iterator(); iter.hasNext();) { String tempName = iter.next().getColumnName(); if (getIfVisible(tempName)) { theColumns.add(tempName); } } return theColumns.toArray(new String[0]); } public String[] getEditableColumnNames() { Collection<String> theColumns = new ArrayList<String>(); for (Iterator<EntityAttribute> iter = getAttributes().iterator(); iter.hasNext();) { String tempName = iter.next().getColumnName(); if (getIfEditable(tempName)) { theColumns.add(tempName); } } return theColumns.toArray(new String[0]); } public boolean isNull(String columnName) { Object o = this._columns.get(columnName.toUpperCase()); if (o == null) { return true; } else { return false; } } public boolean hasBeenSetNull(String columnName) { if (this.hasColumnBeenUpdated(columnName)) { return this.isNull(columnName); } else { return false; } } /* * Returns the type of the underlying datastore - returns: "mysql", * "interbase", "oracle", "unimplemented" */ /* * public String getDataStoreType(Connection connection){ if (dataStoreType == * null){ if (connection != null){ if * (connection.getClass().getName().indexOf("oracle") != -1 ){ dataStoreType = * "oracle"; } else if (connection.getClass().getName().indexOf("interbase") != * -1 ){ dataStoreType = "interbase"; } else if * (connection.getClass().getName().indexOf("mysql") != -1 ){ dataStoreType = * "mysql"; } * * else{ dataStoreType = "unimplemented"; } } else{ dataStoreType = ""; } } * return dataStoreType; } */ /** * *Override this function to set default values to columns if they have no * set values */ public void setDefaultValues() { // default implementation does nothing } /** * Inserts this entity as a record into the datastore */ public void insert() throws SQLException { try { DatastoreInterface.getInstance(this).insert(this); if (isBeanCachingActive()) { IDOContainer.getInstance().getBeanCache(getDatasource(),this.getInterfaceClass()).putCachedEntity(getPrimaryKey(), this); } flushQueryCache(); } catch (Exception ex) { if (isDebugActive()) { ex.printStackTrace(); } try { this.closeBlobConnections(); } catch (Exception e) { } if (ex instanceof SQLException) { // ex.printStackTrace(); // throw (SQLException)ex.fillInStackTrace(); throw (SQLException) ex; } else { ex.printStackTrace(); throw new SQLException("Exception rethrown: " + ex.getClass().getName() + " - " + ex.getMessage()); } } } /** * Inserts/update/removes this entity's metadata into the datastore */ public void updateMetaData() throws SQLException { try { if (isIdColumnValueNotEmpty()) { DatastoreInterface.getInstance(this).crunchMetaData(this); } else { logWarning("[IDOLegacyEntity] updateMetaData(): getID == -1 (" + this.getTableName() + ")"); } } catch (Exception ex) { if (ex instanceof SQLException) { ex.printStackTrace(); throw (SQLException) ex.fillInStackTrace(); } else { ex.printStackTrace(); } } } /** * Inserts/update/removes this entity's metadata into the datastore */ public void insertMetaData() throws SQLException { updateMetaData(); } /** * deletes all of this entity's metadata */ public void deleteMetaData() throws SQLException { try { DatastoreInterface.getInstance(this).deleteMetaData(this); } catch (Exception ex) { if (ex instanceof SQLException) { ex.printStackTrace(); throw (SQLException) ex.fillInStackTrace(); } } } /** * Inserts this entity as a record into the datastore */ public void insert(Connection c) throws SQLException { try { DatastoreInterface.getInstance(c).insert(this, c); flushQueryCache(); } catch (Exception ex) { if (ex instanceof SQLException) { ex.printStackTrace(); throw (SQLException) ex.fillInStackTrace(); } } } /* * public void insert()throws SQLException{ EntityControl.insert(this); } */ /** * Updates the entity in the datastore */ public synchronized void update() throws SQLException { try { DatastoreInterface.getInstance(this).update(this); updateInCaches(); } catch (Exception ex) { if (isDebugActive()) { ex.printStackTrace(); } if (ex instanceof SQLException) { // ex.printStackTrace(); throw (SQLException) ex.fillInStackTrace(); } } } /** * Updates the entity in the datastore */ public void update(Connection c) throws SQLException { try { DatastoreInterface.getInstance(c).update(this, c); updateInCaches(); } catch (Exception ex) { if (ex instanceof SQLException) { // ex.printStackTrace(); throw (SQLException) ex.fillInStackTrace(); } } } private void updateInCaches() { flushQueryCache(); if (IDOContainer.getInstance().beanCachingActive(this.getInterfaceClass())) { IDOContainer.getInstance().getBeanCache(getDatasource(),this.getInterfaceClass()).putCachedEntity(this.getPrimaryKey(), this); } } public void delete() throws SQLException { try { DatastoreInterface.getInstance(this).delete(this); deleteInCaches(); } catch (Exception ex) { if (ex instanceof SQLException) { ex.printStackTrace(); throw (SQLException) ex.fillInStackTrace(); } } } public void delete(Connection c) throws SQLException { try { DatastoreInterface.getInstance(c).delete(this, c); deleteInCaches(); } catch (Exception ex) { if (ex instanceof SQLException) { ex.printStackTrace(); throw (SQLException) ex.fillInStackTrace(); } } } private void deleteInCaches() { flushQueryCache(); if (IDOContainer.getInstance().beanCachingActive(this.getInterfaceClass())) { IDOContainer.getInstance().getBeanCache(getDatasource(),this.getInterfaceClass()).removeCachedEntity(this.getPrimaryKey()); } this.empty(); } public void deleteMultiple(String columnName, String stringColumnValue) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = this.getConnection(); Stmt = conn.createStatement(); Stmt.executeUpdate("delete from " + this.getEntityName() + " where " + columnName + "='" + stringColumnValue + "'"); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { this.freeConnection(conn); } } } public void deleteMultiple(String columnName1, String stringColumnValue1, String columnName2, String stringColumnValue2) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = this.getConnection(); Stmt = conn.createStatement(); Stmt.executeUpdate("delete from " + this.getEntityName() + " where " + columnName1 + "='" + stringColumnValue1 + "' and " + columnName2 + "='" + stringColumnValue2 + "'"); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { this.freeConnection(conn); } } } /** * Deletes everything from the table of this entity */ public void clear() throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = this.getConnection(); Stmt = conn.createStatement(); Stmt.executeUpdate("delete from " + this.getEntityName()); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { this.freeConnection(conn); } } this.setEntityState(IDOLegacyEntity.STATE_DELETED); } /** * *Function to populate a column through a string representation */ public void setStringColumn(String columnName, String columnValue) { int classType = getStorageClassType(columnName); if (classType == EntityAttribute.TYPE_JAVA_LANG_INTEGER) { if (columnValue != null) { setColumn(columnName, new Integer(columnValue), true); } } else if (classType == EntityAttribute.TYPE_JAVA_LANG_STRING) { if (columnValue != null) { setColumn(columnName, columnValue, true); } } else if (classType == EntityAttribute.TYPE_JAVA_LANG_BOOLEAN) { if (columnValue != null) { if (columnValue.equals("Y")) { setColumn(columnName, new Boolean(true), true); } else if (columnValue.equals("N")) { setColumn(columnName, new Boolean(false), true); } else { setColumn(columnName, new Boolean(false), true); } } } else if (classType == EntityAttribute.TYPE_JAVA_LANG_FLOAT) { if (columnValue != null) { setColumn(columnName, new Float(columnValue), true); } } else if (classType == EntityAttribute.TYPE_JAVA_LANG_DOUBLE) { if (columnValue != null) { setColumn(columnName, new Double(columnValue), true); } } else if (classType == EntityAttribute.TYPE_JAVA_SQL_TIMESTAMP) { if (columnValue != null) { setColumn(columnName, java.sql.Timestamp.valueOf(columnValue), true); } } else if (classType == EntityAttribute.TYPE_JAVA_SQL_DATE) { if (columnValue != null) { setColumn(columnName, java.sql.Date.valueOf(columnValue), true); } } else if (classType == EntityAttribute.TYPE_JAVA_UTIL_DATE) { if (columnValue != null) { setColumn(columnName, java.sql.Date.valueOf(columnValue), true); } } else if (classType == EntityAttribute.TYPE_JAVA_SQL_TIME) { if (columnValue != null) { setColumn(columnName, java.sql.Time.valueOf(columnValue), true); } } else if (classType == EntityAttribute.TYPE_COM_IDEGA_UTIL_GENDER) { if (columnValue != null) { setColumn(columnName, columnValue.toString(), true); } } } public void fillColumn(String columnName, ResultSet RS) throws SQLException { DatastoreInterface.getInstance(this).fillColumn(this, columnName, RS); /* * int classType = getStorageClassType(columnName); * * if (classType==EntityAttribute.TYPE_JAVA_LANG_INTEGER){ //if * (RS.getInt(columnName) != -1){ int theInt = RS.getInt(columnName); * boolean wasNull = RS.wasNull(); if(!wasNull){ setColumn(columnName,new * Integer(theInt)); //setColumn(columnName.toLowerCase(),new * Integer(theInt)); } * * //} } else if (classType==EntityAttribute.TYPE_JAVA_LANG_STRING){ if * (RS.getString(columnName) != null){ * setColumn(columnName,RS.getString(columnName)); } * } else if (classType==EntityAttribute.TYPE_JAVA_LANG_BOOLEAN){ String * theString = RS.getString(columnName); if (theString != null){ if * (theString.equals("Y")){ setColumn(columnName,new Boolean(true)); } else * if (theString.equals("N")){ setColumn(columnName,new Boolean(false)); } } } * else if (classType==EntityAttribute.TYPE_JAVA_LANG_FLOAT){ float theFloat = * RS.getFloat(columnName); boolean wasNull = RS.wasNull(); if(!wasNull){ * setColumn(columnName,new Float(theFloat)); * //setColumn(columnName.toLowerCase(),new Float(theFloat)); } * } else if (classType==EntityAttribute.TYPE_JAVA_LANG_DOUBLE){ double * theDouble = RS.getFloat(columnName); boolean wasNull = RS.wasNull(); * if(!wasNull){ setColumn(columnName,new Double(theDouble)); * //setColumn(columnName.toLowerCase(),new Double(theDouble)); } * * double doble = RS.getDouble(columnName); } else if * (classType==EntityAttribute.TYPE_JAVA_SQL_TIMESTAMP){ if * (RS.getTimestamp(columnName) != null){ * setColumn(columnName,RS.getTimestamp(columnName)); } } else if * (classType==EntityAttribute.TYPE_JAVA_SQL_DATE){ if * (RS.getDate(columnName) != null){ * setColumn(columnName,RS.getDate(columnName)); } } else if * (classType==EntityAttribute.TYPE_JAVA_SQL_TIME){ java.sql.Date date = * RS.getDate(columnName); if (date != null){ setColumn(columnName,date); * //setColumn(columnName.toLowerCase(),date); } } else if * (classType==EntityAttribute.TYPE_COM_IDEGA_DATA_BLOBWRAPPER){ //if * (RS.getDate(columnName) != null){ // * setColumn(columnName.toLowerCase(),RS.getTime(columnName)); //} * setColumn(columnName,getEmptyBlob(columnName)); * //setColumn(columnName.toLowerCase(),getEmptyBlob(columnName)); * } else if (classType==EntityAttribute.TYPE_COM_IDEGA_UTIL_GENDER){ * String gender = RS.getString(columnName); if (gender != null){ * setColumn(columnName,new Gender(gender)); * //setColumn(columnName.toLowerCase(),new Gender(gender)); * } } */ } @Override public synchronized void ejbLoad() throws EJBException { try { if (this.getEntityState() != IDOLegacyEntity.STATE_IN_SYNCH_WITH_DATASTORE) { Object pk = this.getPrimaryKey(); /* * if(pk instanceof Integer){ * findByPrimaryKey(((Integer)pk).intValue()); } */ if (pk == null) { throw new EJBException("Cannot load entity " + this.getClass().getName() + " for primary key null"); } ejbLoad(pk); setEntityState(IDOLegacyEntity.STATE_IN_SYNCH_WITH_DATASTORE); } } catch (SQLException e) { // e.printStackTrace(); throw new EJBException(e.getMessage()); } catch (FinderException e) { // e.printStackTrace(); throw new EJBException(e.getMessage()); } } /** * To speed up loading when the ResultSet is already constructed */ public synchronized void preEjbLoad(ResultSet rs) throws EJBException { try { // Object pk = this.getPrimaryKey(); if (rs != null) { this.loadFromResultSet(rs); setEntityState(IDOLegacyEntity.STATE_IN_SYNCH_WITH_DATASTORE); } } catch (Exception e) { throw new EJBException(e.getMessage()); } } private void ejbLoad(Object pk) throws SQLException, FinderException { Connection conn = null; PreparedStatement Stmt = null; ResultSet RS = null; try { conn = getConnection(getDatasource()); // Stmt = conn.createStatement(); StringBuffer buffer = new StringBuffer(); // buffer.append("select * from "); buffer.append("select "); // System.out.println("COLUMN NAMES : // "+DatastoreInterface.getCommaDelimitedColumnNamesForSelect(this));/**@is // this where it is supposed to be?**/ DatastoreInterface dsi = DatastoreInterface.getInstance(this); buffer.append(dsi.getCommaDelimitedColumnNamesForSelect(this)); buffer.append(" from "); // skips lob colums buffer.append(getEntityName()); /* * buffer.append(" where "); buffer.append(getIDColumnName()); * buffer.append("='"); buffer.append(pk.toString()); buffer.append("'"); */ // dsi.appendPrimaryKeyWhereClause(this,buffer); IDOEntityField[] fields = getEntityDefinition().getPrimaryKeyDefinition().getFields(); dsi.appendPrimaryKeyWhereClauseWithQuestionMarks(fields, buffer); String sql = buffer.toString(); logSQL(sql); Stmt = conn.prepareStatement(sql); dsi.setForPreparedStatementPrimaryKeyQuestionValues(this, fields, Stmt, 1); RS = Stmt.executeQuery(); // ResultSet RS = Stmt.executeQuery("select * from "+getTableName()+" // where "+getIDColumnName()+"="+id); // eiki added null check if ((RS == null) || !RS.next()) { throw new FinderException("Record with Primary Key = '" + pk + "' not found"); } loadFromResultSet(RS); } finally { if (RS != null) { RS.close(); } if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } setEntityState(IDOLegacyEntity.STATE_IN_SYNCH_WITH_DATASTORE); } /** * @ deprecated Replaced with ejbLoad(Object value); * @param id * @throws SQLException */ public void findByPrimaryKey(int id) throws SQLException { setPrimaryKey(id); Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); StringBuffer buffer = new StringBuffer(); // buffer.append("select * from "); buffer.append("select "); // System.out.println("COLUMN NAMES : // "+DatastoreInterface.getCommaDelimitedColumnNamesForSelect(this));/**@is // this where it is supposed to be?**/ buffer.append(DatastoreInterface.getInstance(this).getCommaDelimitedColumnNamesForSelect(this)); buffer.append(" from "); // skips lob colums buffer.append(getEntityName()); buffer.append(" where "); buffer.append(getIDColumnName()); buffer.append("="); buffer.append(id); ResultSet RS = Stmt.executeQuery(buffer.toString()); // ResultSet RS = Stmt.executeQuery("select * from "+getTableName()+" // where "+getIDColumnName()+"="+id); // eiki added null check if ((RS == null) || !RS.next()) { throw new SQLException("Record with id=" + id + " not found"); } loadFromResultSet(RS); if (RS != null) { RS.close(); } } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } setEntityState(IDOLegacyEntity.STATE_IN_SYNCH_WITH_DATASTORE); } <PK> PK getPrimaryKeyFromResultSet(ResultSet rs) throws SQLException { IDOEntityField[] fields = getGenericEntityDefinition().getPrimaryKeyDefinition().getFields(); Class<PK> primaryKeyClass = getPrimaryKeyClass(); return getPrimaryKeyFromResultSet(primaryKeyClass, fields, rs); } @SuppressWarnings("unchecked") <PK> PK getPrimaryKeyFromResultSet(Class<PK> primaryKeyClass, IDOEntityField[] primaryKeyFields, ResultSet rs) throws SQLException { IDOEntityField[] fields = primaryKeyFields; Class<PK> pkClass = primaryKeyClass; PK theReturn = null; if (pkClass == Integer.class) { theReturn = (PK) new Integer(rs.getInt(this.getIDColumnName())); } else { try { theReturn = (PK) getPrimaryKeyClass().newInstance(); } catch (InstantiationException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } if (theReturn instanceof String) { theReturn = (PK) rs.getString(getIDColumnName()); } else { if (theReturn instanceof IDOPrimaryKey) { IDOPrimaryKey primaryKey = (IDOPrimaryKey) theReturn; for (int i = 0; i < fields.length; i++) { Object value = rs.getObject(fields[i].getSQLFieldName()); primaryKey.setPrimaryKeyValue(fields[i].getSQLFieldName(), value); } return (PK) primaryKey; } } } if (rs.wasNull()) { return null; } return theReturn; } private void loadFromResultSet(ResultSet RS) { String[] columnNames = getColumnNames(); for (int i = 0; i < columnNames.length; i++) { try { // if (RS.getString(columnNames[i]) != null){ fillColumn(columnNames[i], RS); // } } catch (Exception ex) { /* * //NOCATH try{ //if (RS.getString(columnNames[i].toUpperCase()) != * null){ fillColumn(columnNames[i],RS); //} } catch(SQLException exe){ * try{ //if (RS.getString(columnNames[i].toLowerCase()) != null){ * fillColumn(columnNames[i],RS); //} } catch(SQLException exep){ * * System.err.println("Exception in "+this.getClass().getName()+" * findByPrimaryKey, RS.getString( "+columnNames[i]+" ) not found: * "+exep.getMessage()); //exep.printStackTrace(System.err); } } */ System.err.println("Exception in " + this.getClass().getName() + " findByPrimaryKey, RS.getString( " + columnNames[i] + " ) not found: " + ex.getMessage()); if (!(ex instanceof NullPointerException)) { ex.printStackTrace(System.err); } } } } public String getNameOfMiddleTable(IDOEntity entity1, IDOEntity entity2) { return EntityControl.getNameOfMiddleTable(entity1, entity2); } /** * @deprecated replaced with idoGetRelated */ @Deprecated public IDOLegacyEntity[] findRelated(IDOLegacyEntity entity) throws SQLException { return findRelated(entity, "", ""); } /** * @deprecated replaced with idoGetRelated */ @Deprecated public int[] findRelatedIDs(IDOLegacyEntity entity) throws SQLException { return findRelatedIDs(entity, "", ""); } private String getFindRelatedSQLQuery(IDOEntity entity, String entityColumnName, String entityColumnValue) { return getFindRelatedSQLQuery(entity, entityColumnName, entityColumnValue, null); } private String getFindRelatedSQLQuery(IDOEntity entity, String entityColumnName, String entityColumnValue, String orderByColumnName) { String tableToSelectFrom = getNameOfMiddleTable(entity, this); String primaryValue = getPrimaryKeyValueSQLString(); // eiki added for // string primary key // support String entityIDColumnName = null; try { entityIDColumnName = entity.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName(); } catch (IDOCompositePrimaryKeyException e) { e.printStackTrace(); } StringBuffer buffer = new StringBuffer(); // Optimization by Sigtryggur 23.06.05 buffer.append("select e." + entityIDColumnName + " from "); buffer.append(tableToSelectFrom + " middle, " + entity.getEntityDefinition().getSQLTableName() + " e"); buffer.append(" where "); if (isColumnValueNotEmpty(primaryValue)) { buffer.append("middle." + this.getIDColumnName()); buffer.append("="); buffer.append(primaryValue); buffer.append(" and "); } buffer.append(" middle." + entityIDColumnName); buffer.append("="); buffer.append("e." + entityIDColumnName); primaryValue = GenericEntity.getKeyValueSQLString(entity.getPrimaryKey()); if (isColumnValueNotEmpty(primaryValue)) { buffer.append(" and "); buffer.append("middle." + entityIDColumnName); buffer.append("="); buffer.append(primaryValue); } if (entityColumnName != null) { if (!entityColumnName.equals("")) { buffer.append(" and "); buffer.append("e." + entityColumnName); if (entityColumnValue != null) { buffer.append(" = "); buffer.append("'" + entityColumnValue + "'"); } else { buffer.append(" is null"); } } } if (orderByColumnName != null) { if (!orderByColumnName.equals("")) { buffer.append(" order by e."); buffer.append(orderByColumnName); } } String SQLString = buffer.toString(); return SQLString; } protected String getFindReverseRelatedSQLQuery(IDOEntity entity, String entityColumnName, String entityColumnValue) { String tableToSelectFrom = getNameOfMiddleTable(entity, this); String primaryValue = getPrimaryKeyValueSQLString(); StringBuffer buffer = new StringBuffer(); buffer.append("select e.* from "); buffer.append(tableToSelectFrom + " middle, " + this.getEntityName() + " e"); buffer.append(" where "); if (isColumnValueNotEmpty(primaryValue)) { buffer.append("middle." + this.getIDColumnName()); buffer.append("="); buffer.append(primaryValue); buffer.append(" and "); } buffer.append(" middle." + this.getIDColumnName()); buffer.append("="); buffer.append("e." + this.getIDColumnName()); primaryValue = GenericEntity.getKeyValueSQLString(entity.getPrimaryKey()); try { if (isColumnValueNotEmpty(primaryValue)) { buffer.append(" and "); buffer.append("middle." + entity.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName()); buffer.append("="); buffer.append(primaryValue); } } catch (IDOCompositePrimaryKeyException e) { e.printStackTrace(); return null; } if (entityColumnName != null) { if (!entityColumnName.equals("")) { buffer.append(" and "); buffer.append("e." + entityColumnName); if (entityColumnValue != null) { buffer.append(" = "); buffer.append("'" + entityColumnValue + "'"); } else { buffer.append(" is null"); } } } String SQLString = buffer.toString(); return SQLString; } /** * @deprecated replaced with idoGetRelated() */ @Deprecated public IDOLegacyEntity[] findRelated(IDOLegacyEntity entity, String entityColumnName, String entityColumnValue) throws SQLException { String SQLString = this.getFindRelatedSQLQuery(entity, entityColumnName, entityColumnValue); return findRelated(entity, SQLString); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findReverseRelated(IDOLegacyEntity entity) throws SQLException { return findRelated(entity); } /** * @deprecated replaced with idoGetRelated */ @Deprecated protected IDOLegacyEntity[] findRelated(IDOLegacyEntity entity, String SQLString) throws SQLException { Connection conn = null; Statement Stmt = null; Collection<IDOLegacyEntity> results = new ArrayList<IDOLegacyEntity>(); /* * String tableToSelectFrom = ""; if (entity.getEntityName().endsWith("_")) { * tableToSelectFrom = entity.getEntityName() + this.getEntityName(); } else { * tableToSelectFrom = entity.getEntityName() + "_" + this.getEntityName(); } */ try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); ResultSet RS = Stmt.executeQuery(SQLString); while (RS.next()) { IDOLegacyEntity tempobj = null; try { Class<?> relatedClass = entity.getClass(); tempobj = this.findByPrimaryInOtherClass(relatedClass, RS.getInt(entity.getIDColumnName())); } catch (Exception ex) { System.err.println("There was an error in com.idega.data.GenericEntity.findRelated(IDOLegacyEntity entity,String SQLString): " + ex.getMessage()); } results.add(tempobj); } RS.close(); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } return (IDOLegacyEntity[]) results.toArray((Object[]) Array.newInstance(entity.getClass(), 0)); } /** * @deprecated replaced with idoGetRelatedPKs */ @Deprecated public int[] findRelatedIDs(IDOLegacyEntity entity, String entityColumnName, String entityColumnValue) throws SQLException { String tableToSelectFrom = getNameOfMiddleTable(entity, this); StringBuffer buffer = new StringBuffer(); buffer.append("select e.* from "); buffer.append(tableToSelectFrom + " middle, " + entity.getEntityName() + " e"); buffer.append(" where "); buffer.append("middle." + this.getIDColumnName()); buffer.append("="); // buffer.append(this.getID()); buffer.append(getPrimaryKeyValueSQLString()); buffer.append(" and "); buffer.append("middle." + entity.getIDColumnName()); buffer.append("="); buffer.append("e." + entity.getIDColumnName()); // /if (entity.getID() != -1) if (isColumnValueNotEmpty(getKeyValueSQLString(entity.getPrimaryKeyValue()))) { buffer.append(" and "); buffer.append("middle." + entity.getIDColumnName()); buffer.append("="); // buffer.append(entity.getID()); buffer.append(getKeyValueSQLString(entity.getPrimaryKeyValue())); } if (entityColumnName != null) { if (!entityColumnName.equals("")) { buffer.append(" and "); buffer.append("e." + entityColumnName); if (entityColumnValue != null) { buffer.append(" = "); buffer.append("'" + entityColumnValue + "'"); } else { buffer.append(" is null"); } } } String SQLString = buffer.toString(); return findRelatedIDs(entity, SQLString); } /** * @deprecated replaced with idoGetRelatedPKs */ @Deprecated protected int[] findRelatedIDs(IDOLegacyEntity entity, String SQLString) throws SQLException { Connection conn = null; Statement Stmt = null; int[] toReturn = null; int length; Collection<Integer> results = new ArrayList<Integer>(); /* * String tableToSelectFrom = ""; if (entity.getEntityName().endsWith("_")) { * tableToSelectFrom = entity.getEntityName() + this.getEntityName(); } else { * tableToSelectFrom = entity.getEntityName() + "_" + this.getEntityName(); } */ try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); ResultSet rs = Stmt.executeQuery(SQLString); length = 0; while (rs.next()) { try { results.add(((Number) rs.getObject(entity.getIDColumnName())).intValue()); length++; } catch (Exception ex) { System.err.println("There was an error in com.idega.data.GenericEntity.findRelatedIDs(IDOLegacyEntity entity,String SQLString): " + ex.getMessage()); } } rs.close(); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } if (length > 0) { toReturn = new int[length]; int index = 0; for (Iterator<Integer> iter = results.iterator(); iter.hasNext();) { Integer item = iter.next(); toReturn[index++] = item.intValue(); } } else { toReturn = new int[0]; } return toReturn; } /** * Finds all instances of the current object in the otherEntity */ @SuppressWarnings("deprecation") public IDOLegacyEntity[] findAssociated(IDOLegacyEntity otherEntity) throws SQLException { return otherEntity.findAll("select * from " + otherEntity.getEntityName() + " where " + this.getIDColumnName() + "= " + getPrimaryKeyValueSQLString()); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAssociatedOrdered(IDOLegacyEntity otherEntity, String column_name) throws SQLException { return otherEntity.findAll("select * from " + otherEntity.getEntityName() + " where " + this.getIDColumnName() + "= " + getPrimaryKeyValueSQLString() + " order by " + column_name); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAll() throws SQLException { return findAll("select * from " + getEntityName()); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllOrdered(String orderByColumnName) throws SQLException { return findAll("select * from " + getEntityName() + " order by " + orderByColumnName); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnOrdered(String columnName, String toFind, String orderByColumnName, String condition) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName + " " + condition + " '" + toFind + "' order by " + orderByColumnName); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnOrdered(String columnName, String toFind, String orderByColumnName) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName + " like '" + toFind + "' order by " + orderByColumnName); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnEqualsOrdered(String columnName, String toFind, String orderByColumnName) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName + " = '" + toFind + "' order by " + orderByColumnName); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnOrdered(String columnName1, String toFind1, String columnName2, String toFind2, String orderByColumnName, String condition1, String condition2) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " " + condition1 + " '" + toFind1 + "' and " + columnName2 + " " + condition2 + " '" + toFind2 + "' order by " + orderByColumnName); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnOrdered(String columnName1, String toFind1, String columnName2, String toFind2, String orderByColumnName) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " like '" + toFind1 + "' and " + columnName2 + " like '" + toFind2 + "' order by " + orderByColumnName); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnEqualsOrdered(String columnName1, String toFind1, String columnName2, String toFind2, String orderByColumnName) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " = '" + toFind1 + "' and " + columnName2 + " = '" + toFind2 + "' order by " + orderByColumnName); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnEqualsOrdered(String columnName1, int toFind1, String columnName2, int toFind2, String orderByColumnName) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " = " + toFind1 + " and " + columnName2 + " = " + toFind2 + " order by " + orderByColumnName); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnDescendingOrdered(String columnName, String toFind, String orderByColumnName) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName + " like '" + toFind + "' order by " + orderByColumnName + " desc"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnDescendingOrdered(String columnName1, String toFind1, String columnName2, String toFind2, String orderByColumnName) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " like '" + toFind1 + "' and " + columnName2 + " like '" + toFind2 + "' order by " + orderByColumnName + " desc"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllDescendingOrdered(String orderByColumnName) throws SQLException { return findAll("select * from " + getEntityName() + " order by " + orderByColumnName + " desc"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumn(String columnName, String toFind, String condition) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName + " " + condition + " '" + toFind + "'"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumn(String columnName1, String toFind1, char condition1, String columnName2, String toFind2, char condition2) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " " + String.valueOf(condition1) + " '" + toFind1 + "' and " + columnName2 + " " + String.valueOf(condition2) + " '" + toFind2 + "'"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumn(String columnName, String toFind) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName + " like '" + toFind + "'"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnEquals(String columnName, String toFind) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName + " = '" + toFind + "'"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumn(String columnName, int toFind) throws SQLException { return findAllByColumn(columnName, Integer.toString(toFind)); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnEquals(String columnName, int toFind) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName + " = " + toFind + ""); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumn(String columnName1, String toFind1, String columnName2, String toFind2, String columnName3, String toFind3) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " like '" + toFind1 + "' and " + columnName2 + " like '" + toFind2 + "' and " + columnName3 + " like '" + toFind3 + "'"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnEquals(String columnName1, String toFind1, String columnName2, String toFind2, String columnName3, String toFind3) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " = '" + toFind1 + "' and " + columnName2 + " = '" + toFind2 + "' and " + columnName3 + " = '" + toFind3 + "'"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumn(String columnName1, String toFind1, String columnName2, String toFind2) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " like '" + toFind1 + "' and " + columnName2 + " like '" + toFind2 + "'"); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAllByColumnEquals(String columnName1, String toFind1, String columnName2, String toFind2) throws SQLException { return findAll("select * from " + getEntityName() + " where " + columnName1 + " = '" + toFind1 + "' and " + columnName2 + " = '" + toFind2 + "'"); } /** * @deprecated */ @Deprecated public int getNumberOfRecords(String columnName, String columnValue) throws SQLException { return getNumberOfRecords("select count(*) from " + getEntityName() + " where " + columnName + " like '" + columnValue + "'"); } public int getNumberOfRecords(String columnName, int columnValue) throws SQLException { // return getNumberOfRecords("select count(*) from " + getEntityName() + " // where " + columnName + " = " + columnValue); return getNumberOfRecords(new MatchCriteria(this.idoQueryTable, columnName, MatchCriteria.EQUALS, columnValue)); } public int getNumberOfRecordsRelated(IDOLegacyEntity entity) throws SQLException { String tableToSelectFrom = getNameOfMiddleTable(entity, this); String SQLString = "select count(*) from " + tableToSelectFrom + " where " + this.getIDColumnName() + "=" + getPrimaryKeyValueSQLString(); // System.out.println(SQLString); return getNumberOfRecords(SQLString); } public int getNumberOfRecordsReverseRelated(IDOLegacyEntity entity) throws SQLException { String tableToSelectFrom = getNameOfMiddleTable(this, entity); String SQLString = "select count(*) from " + tableToSelectFrom + " where " + this.getIDColumnName() + "=" + getPrimaryKeyValueSQLString(); // System.out.println(SQLString); return getNumberOfRecords(SQLString); } public int getNumberOfRecords() throws SQLException { // return getNumberOfRecords("select count(*) from " + getEntityName()); return getNumberOfRecords((Criteria) null); } public int getNumberOfRecords(String CountSQLString) throws SQLException { return getIntTableValue(CountSQLString); } public int getNumberOfRecords(SelectQuery query) throws SQLException { return getIntTableValue(query); } public double getAverage(String averageSQLString) throws SQLException { return getDoubleTableValue(averageSQLString); } /** * Checks if the value of the specified columnName in the database is null. * Use this method for columns where the storage type is a blob, because even * if the value in the database is null, the value in the _columns map is a * BlobWrapper, that is the method isNull(columnName) returns false. Why don' * t we solve the problem by changing the method isNull(columnName)? Because * you can't check if the value is null without starting to read the * inputstream, that is after checking you have to reset the internal stream * of the BlobWrapper. In order to avoid this we check the value directly in * the database via a sql statement. Keep in mind that the BlobWrapper has to * execute a sql statement to get a stream of the value, that is the statement * of the method isStoredValueNull is even faster. * * @author thomas */ protected boolean isStoredValueNull(String columnName) { IDOQuery query = idoQuery(); query.appendSelectCountFrom(this).appendWhereEquals(getIDColumnName(), getPrimaryKeyValueSQLString()); query.appendAndIsNotNull(columnName); // number of records is either zero or one try { int numberOfRecords = getNumberOfRecords(query.toString()); return (numberOfRecords == 0); } catch (SQLException sqlEx) { logError("[GenericEntity] Could not check the following column " + columnName); log(sqlEx); return true; } } protected double idoGetValueFromSingleValueResultSet(IDOQuery query) throws IDOException { return idoGetValueFromSingleValueResultSet(query.toString()); } protected double idoGetValueFromSingleValueResultSet(String sqlString) throws IDOException { try { if (isDebugActive()) { logSQL(sqlString); } return this.getDoubleTableValue(sqlString); } catch (SQLException e) { throw new IDOException(e, this); } } public int getNumberOfRecordsForStringColumn(String columnName, String operator, String columnValue) throws SQLException { // StringBuffer buffer = new StringBuffer("\'"); // buffer.append(columnValue); // buffer.append('\''); return getNumberOfRecords(columnName, operator, columnValue); } public int getNumberOfRecords(String columnName, String operator, String columnValue) throws SQLException { return getNumberOfRecords(new MatchCriteria(idoQueryTable(), columnName, operator, columnValue)); // StringBuffer buffer = new StringBuffer("select count(*) from "); // buffer.append(getEntityName()).append(" where // ").append(columnName).append(" ").append(operator).append(" // ").append(columnValue); // return getNumberOfRecords(buffer.toString()); } private int getNumberOfRecords(Criteria criteria) throws SQLException { SelectQuery query = new SelectQuery(idoQueryTable()); query.addColumn(new Column(idoQueryTable(), getIDColumnName())); query.setAsCountQuery(true); if (criteria != null) { query.addCriteria(criteria); // query.addCriteria(new // MatchCriteria(idoQueryTable(),columnName,operator,columnValue,)); } // StringBuffer buffer = new StringBuffer("select count(*) from "); // buffer.append(getEntityName()).append(" where // ").append(columnName).append(" ").append(operator).append(" // ").append(columnValue); // return getNumberOfRecords(buffer.toString()); return getNumberOfRecords(query); } public int getMaxColumnValue(String columnName) throws SQLException { return getIntTableValue("select max(" + columnName + ") from " + getEntityName()); } public int getMaxColumnValue(String columnToGetMaxFrom, String columnCondition, String columnConditionValue) throws SQLException { return getIntTableValue("select max(" + columnToGetMaxFrom + ") from " + getEntityName() + " where " + columnCondition + " = '" + columnConditionValue + "'"); } public int getIntTableValue(String CountSQLString) throws SQLException { return getIntTableValue(CountSQLString, null); } public int getIntTableValue(SelectQuery query) throws SQLException { return getIntTableValue(null, query); } private int getIntTableValue(String CountSQLString, SelectQuery query) throws SQLException { Connection conn = null; // Statement stmt = null; // ResultSet rs = null; ResultHelper rsh = null; int recordCount = -1; try { conn = getConnection(this.getDatasource()); rsh = prepareResultSet(conn, CountSQLString, query); if (rsh.rs.next()) { recordCount = rsh.rs.getInt(1); // rs.close(); // System.out.println(SQLString+"\n"); } } catch (SQLException e) { throw new SQLException("There was an error in com.idega.data.GenericEntity.getNumberOfRecords \n" + e.getMessage()); } catch (Exception e) { System.err.println("There was an error in com.idega.data.GenericEntity.getNumberOfRecords " + e.getMessage()); } finally { if (rsh != null) { rsh.close(); } /* * if (stmt != null) { stmt.close(); } */ if (conn != null) { freeConnection(getDatasource(), conn); } } return recordCount; } public Date getDateTableValue(String dateSQLString) throws SQLException { Connection conn = null; Statement stmt = null; ResultSet rs = null; Date date = null; try { conn = getConnection(this.getDatasource()); stmt = conn.createStatement(); rs = stmt.executeQuery(dateSQLString); if (rs.next()) { date = new Date(rs.getTimestamp(1).getTime()); } rs.close(); // System.out.println(SQLString+"\n"); } catch (SQLException e) { throw new SQLException("There was an error in com.idega.data.GenericEntity.getDateTableValue \n" + e.getMessage()); } catch (Exception e) { System.err.println("There was an error in com.idega.data.GenericEntity.getDateTableValue " + e.getMessage()); } finally { if (stmt != null) { stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } return date; } public double getDoubleTableValue(String sqlString) throws SQLException { Connection conn = null; Statement stmt = null; ResultSet rs = null; double value = 0; try { conn = getConnection(this.getDatasource()); stmt = conn.createStatement(); rs = stmt.executeQuery(sqlString); if (rs.next()) { value = rs.getDouble(1); } rs.close(); // System.out.println(SQLString+"\n"); } catch (SQLException e) { throw new SQLException("There was an error in com.idega.data.GenericEntity.getDoubleTableValue \n" + e.getMessage()); } catch (Exception e) { System.err.println("There was an error in com.idega.data.GenericEntity.getDoubleTableValue " + e.getMessage()); } finally { if (stmt != null) { stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } return value; } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAll(String SQLString) throws SQLException { // System.out.println(SQLString); return findAll(SQLString, -1); } /** * @deprecated */ @Deprecated public IDOLegacyEntity[] findAll(String SQLString, int returningNumberOfRecords) throws SQLException { // System.err.println("com.idega.data.GenericEntity.findAll(\""+SQLString+"\");"); /* * Connection conn= null; Statement Stmt= null; ResultSetMetaData metaData; * Vector vector = new Vector(); boolean check=true; //Vector theIDs = new * Vector(); try{ conn = getConnection(getDatasource()); Stmt = * conn.createStatement(); ResultSet RS = Stmt.executeQuery(SQLString); * metaData = RS.getMetaData(); int count = 1; while (RS.next() && check){ * count++; if(returningNumberOfRecords!=-1){ * if(count>returningNumberOfRecords){ check=false; } } * * IDOLegacyEntity tempobj=null; try{ tempobj = * (IDOLegacyEntity)Class.forName(this.getClass().getName()).newInstance(); } * catch(Exception ex){ System.err.println("There was an error in * com.idega.data.GenericEntity.findAll "+ex.getMessage()); * ex.printStackTrace(System.err); } if(tempobj != null){ for (int i = 1; i <= * metaData.getColumnCount(); i++){ * * * if ( RS.getObject(metaData.getColumnName(i)) != null){ * * //System.out.println("ColumName "+i+": "+metaData.getColumnName(i)); * tempobj.fillColumn(metaData.getColumnName(i),RS); } } * } vector.addElement(tempobj); * } RS.close(); * } finally{ if(Stmt != null){ Stmt.close(); } if (conn != null){ * freeConnection(getDatasource(),conn); } } /* for (Enumeration enum = * theIDs.elements();enum.hasMoreElements();){ Integer tempInt = (Integer) * enum.nextElement(); vector.addElement(new * IDOLegacyEntity(tempInt.intValue())); } */ this.logSQL(SQLString); List list = EntityFinder.findAll((IDOLegacyEntity) this, SQLString, returningNumberOfRecords); if (list != null) { return (IDOLegacyEntity[]) list.toArray((Object[]) Array.newInstance(this.getClass(), 0)); // return vector.toArray(new IDOLegacyEntity[0]); } else { // Provided for backwards compatability where there was almost never // returned null if // there was nothing found return (IDOLegacyEntity[]) Array.newInstance(this.getClass(), 0); } } /** * @deprecated Replaced with idoAddTo */ @Deprecated public void addTo(IDOLegacyEntity entityToAddTo) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); // String sql = "insert into // "+getNameOfMiddleTable(entityToAddTo,this)+"("+getIDColumnName()+","+entityToAddTo.getIDColumnName()+") // values("+getID()+","+entityToAddTo.getID()+")"; String sql = null; // try // { sql = "insert into " + getNameOfMiddleTable(entityToAddTo, this) + "(" + getIDColumnName() + "," + entityToAddTo.getIDColumnName() + ") values(" + getPrimaryKeyValueSQLString() + "," + getKeyValueSQLString(entityToAddTo.getPrimaryKeyValue()) + ")"; /* * } catch (RemoteException rme) { throw new SQLException("RemoteException * in addTo, message: " + rme.getMessage()); } */ // debug("statement: "+sql); Stmt.executeUpdate(sql); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } /** * Default move behavior with a tree relationship */ public void moveChildrenToCurrent(IDOLegacyEntity entityFrom, String entityFromColumName) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); String sql = "update " + getNameOfMiddleTable(entityFrom, this) + " set " + getIDColumnName() + " = " + getPrimaryKeyValueSQLString() + " where " + getIDColumnName() + " = " + getKeyValueSQLString(entityFrom.getPrimaryKeyValue()); Stmt.executeUpdate(sql); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } /** * Default relationship adding behavior with a many-to-many relationship */ public void addTo(IDOLegacyEntity entityToAddTo, String entityToAddToColumName) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); String sql = "insert into " + getNameOfMiddleTable(entityToAddTo, this) + "(" + getIDColumnName() + "," + entityToAddToColumName + ") values(" + getPrimaryKeyValueSQLString() + "," + getKeyValueSQLString(entityToAddTo.getPrimaryKeyValue()) + ")"; Stmt.executeUpdate(sql); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } public void addToTree(IDOLegacyEntity entityToAddTo, String entityToAddToColumName, String middleTableName) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); String sql = "insert into " + middleTableName + "(" + getIDColumnName() + "," + entityToAddToColumName + ") values(" + getPrimaryKeyValueSQLString() + "," + getKeyValueSQLString(entityToAddTo.getPrimaryKeyValue()) + ")"; logSQL(sql); Stmt.executeUpdate(sql); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } /** * Default delete behavior with a tree relationship */ public void removeFrom(IDOLegacyEntity entityToDelete, String entityToDeleteColumName) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); String sql = "delete from " + getNameOfMiddleTable(entityToDelete, this) + " where " + entityToDeleteColumName + " = " + getKeyValueSQLString(entityToDelete.getPrimaryKeyValue()); logSQL(sql); Stmt.executeUpdate(sql); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } /** * *Default insert behavior with a many-to-many relationship and * EntityBulkUpdater */ public void addTo(IDOLegacyEntity entityToAddTo, Connection conn) throws SQLException { Statement Stmt = null; try { Stmt = conn.createStatement(); Stmt.executeUpdate("insert into " + getNameOfMiddleTable(entityToAddTo, this) + "(" + getIDColumnName() + "," + entityToAddTo.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName() + ") values(" + getPrimaryKeyValueSQLString() + "," + getKeyValueSQLString(entityToAddTo.getPrimaryKeyValue()) + ")"); } catch (IDOCompositePrimaryKeyException e) { e.printStackTrace(); } finally { if (Stmt != null) { Stmt.close(); } } } /** * Attention: Beta implementation */ public void addTo(Class entityToAddTo, int id) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); Stmt.executeUpdate("insert into " + getNameOfMiddleTable(com.idega.data.GenericEntity.getStaticInstanceIDO(entityToAddTo), this) + "(" + getIDColumnName() + "," + (com.idega.data.GenericEntity.getStaticInstanceIDO(entityToAddTo)).getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName() + ") values(" + getPrimaryKeyValueSQLString() + "," + id + ")"); } catch (IDOCompositePrimaryKeyException e) { e.printStackTrace(); throw new SQLException(e.getMessage()); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } /** * Attention: Beta implementation */ public void addTo(Class entityToAddTo, int[] ids) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); String middleTable = getNameOfMiddleTable(getStaticInstanceIDO(entityToAddTo), this); String columnName = (getStaticInstanceIDO(entityToAddTo)).getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName(); if (ids != null) { for (int i = 0; i < ids.length; i++) { try { Stmt.executeUpdate("insert into " + middleTable + "(" + getIDColumnName() + "," + columnName + ") values(" + getPrimaryKeyValueSQLString() + "," + ids[i] + ")"); } finally { } } } } catch (IDOCompositePrimaryKeyException e) { e.printStackTrace(); throw new SQLException(e.getMessage()); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } public void addTo(IDOLegacyEntity entityToAddTo, String extraColumnName, String extraColumnValue) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); Stmt.executeUpdate("insert into " + getNameOfMiddleTable(entityToAddTo, this) + "(" + getIDColumnName() + "," + entityToAddTo.getIDColumnName() + "," + extraColumnName + ") values(" + getPrimaryKeyValueSQLString() + "," + getKeyValueSQLString(entityToAddTo.getPrimaryKeyValue()) + ",'" + extraColumnValue + "')"); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } public void addTo(IDOLegacyEntity entityToAddTo, String extraColumnName, String extraColumnValue, String extraColumnName1, String extraColumnValue1) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); Stmt.executeUpdate("insert into " + getNameOfMiddleTable(entityToAddTo, this) + "(" + getIDColumnName() + "," + entityToAddTo.getIDColumnName() + "," + extraColumnName + "," + extraColumnName1 + ") values(" + getPrimaryKeyValueSQLString() + "," + getKeyValueSQLString(entityToAddTo.getPrimaryKeyValue()) + ",'" + extraColumnValue + "','" + extraColumnValue1 + "')"); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } public void addTo(IDOLegacyEntity entityToAddTo, String extraColumnName, String extraColumnValue, String extraColumnName1, String extraColumnValue1, String extraColumnName2, String extraColumnValue2) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); Stmt.executeUpdate("insert into " + getNameOfMiddleTable(entityToAddTo, this) + "(" + getIDColumnName() + "," + entityToAddTo.getIDColumnName() + "," + extraColumnName + "," + extraColumnName1 + "," + extraColumnName2 + ") values(" + getPrimaryKeyValueSQLString() + "," + getKeyValueSQLString(entityToAddTo.getPrimaryKeyValue()) + ",'" + extraColumnValue + "','" + extraColumnValue1 + "','" + extraColumnValue2 + "')"); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } /** * @deprecated Replaced with idoRemoveFrom */ @Deprecated public void removeFrom(IDOLegacyEntity entityToRemoveFrom) throws SQLException { removeFrom((IDOEntity) entityToRemoveFrom); } /** * * <p>Removes all records from related entity, where records are related * to current instance of entity.</p> * @param relatedTableName is table name to remove from, * not <code>null</code>; * @return <code>true</code> when successfully removed, <code>false</code> * otherwise; * @author <a href="mailto:martynas@idega.is">Martynas Stakė</a> */ protected boolean removeFrom(String relatedTableName) { if (StringUtil.isEmpty(relatedTableName)) { return Boolean.FALSE; } /* Creating query */ StringBuilder query = new StringBuilder(); query.append("DELETE FROM ").append(relatedTableName).append(CoreConstants.SPACE) .append("WHERE ").append(getIDColumnName()).append(CoreConstants.EQ).append(getPrimaryKeyValueSQLString()); return executeUpdate(query.toString()); } private void removeFrom(IDOEntity entityToRemoveFrom, String middleTableName) throws SQLException { Connection conn = null; Statement Stmt = null; String qry = ""; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); // try // { if (!isColumnValueNotEmpty(getKeyValueSQLString(entityToRemoveFrom.getPrimaryKey()))) { // all // in // middle // table qry = "delete from " + middleTableName + " where " + this.getIDColumnName() + "= " + getPrimaryKeyValueSQLString(); } else { // just removing this particular one qry = "delete from " + middleTableName + " where " + this.getIDColumnName() + "=" + getPrimaryKeyValueSQLString() + " AND " + entityToRemoveFrom.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName() + "= " + getKeyValueSQLString(entityToRemoveFrom.getPrimaryKey()); } // } /* * catch (RemoteException rme) { throw new SQLException("RemoteException * in removeFrom, message: " + rme.getMessage()); } */ // System.out.println("GENERIC ENTITY: "+ qry); logSQL(qry); Stmt.executeUpdate(qry); } catch (IDOCompositePrimaryKeyException e) { e.printStackTrace(); } catch (EJBException e) { e.printStackTrace(); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } private void removeFrom(IDOEntity entityToRemoveFrom) throws SQLException { removeFrom(entityToRemoveFrom, getNameOfMiddleTable(entityToRemoveFrom, this)); } /** * Attention: Beta implementation */ public void removeFrom(Class entityToRemoveFrom, int id) throws SQLException { Connection conn = null; Statement Stmt = null; String qry = ""; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); qry = "delete from " + getNameOfMiddleTable(com.idega.data.GenericEntity.getStaticInstance(entityToRemoveFrom), this) + " where " + this.getIDColumnName() + "= " + getPrimaryKeyValueSQLString() + " AND " + com.idega.data.GenericEntity.getStaticInstance(entityToRemoveFrom).getIDColumnName() + "='" + id + "'"; // System.out.println("GENERIC ENTITY: "+ qry); Stmt.executeUpdate(qry); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } /** * @deprecated Replaced with idoRemoveFrom */ @Deprecated public void removeFrom(Class entityToRemoveFrom) throws SQLException { Connection conn = null; Statement Stmt = null; String qry = ""; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); qry = "delete from " + getNameOfMiddleTable(getStaticInstanceIDO(entityToRemoveFrom), this) + " where " + this.getIDColumnName() + "= " + getPrimaryKeyValueSQLString(); // System.out.println("GENERIC ENTITY: "+ qry); Stmt.executeUpdate(qry); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } /** * *Default remove behavior with a many-to-many relationship * deletes only * one line in middle table if the genericentity wa consructed with a value * * Takes in a connection but does not close it. */ public void removeFrom(IDOLegacyEntity entityToRemoveFrom, Connection conn) throws SQLException { Statement Stmt = null; String qry = ""; try { Stmt = conn.createStatement(); if (isColumnValueNotEmpty(getKeyValueSQLString(entityToRemoveFrom.getPrimaryKeyValue()))) { // all // in // middle // table qry = "delete from " + getNameOfMiddleTable(entityToRemoveFrom, this) + " where " + this.getIDColumnName() + "= " + getPrimaryKeyValueSQLString(); } else { // just removing this particular one qry = "delete from " + getNameOfMiddleTable(entityToRemoveFrom, this) + " where " + this.getIDColumnName() + "= " + getPrimaryKeyValueSQLString() + " AND " + entityToRemoveFrom.getIDColumnName() + "= " + getKeyValueSQLString(entityToRemoveFrom.getPrimaryKeyValue()); } // System.out.println("GENERIC ENTITY: "+ qry); logSQL(qry); Stmt.executeUpdate(qry); } finally { if (Stmt != null) { Stmt.close(); } } } public void removeFrom(IDOLegacyEntity[] entityToRemoveFrom) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); String idColumnName = this.getIDColumnName(); String id = getPrimaryKeyValueSQLString(); //int count = 0; for (int i = 0; i < entityToRemoveFrom.length; i++) { String sql1 = "delete from " + getNameOfMiddleTable(entityToRemoveFrom[i], this) + " where " + idColumnName + "= " + id; logSQL(sql1); /*count += */Stmt.executeUpdate(sql1); if (!isColumnValueNotEmpty(getKeyValueSQLString(entityToRemoveFrom[i].getPrimaryKeyValue()))) { // removing all in middle table String sql2 = "delete from " + getNameOfMiddleTable(entityToRemoveFrom[i], this) + " where " + idColumnName + "= " + id; logSQL(sql2); /*count += */Stmt.executeUpdate(sql2); } else { // just removing this particular one String sql2 = "delete from " + getNameOfMiddleTable(entityToRemoveFrom[i], this) + " where " + idColumnName + "= " + id + " AND " + entityToRemoveFrom[i].getIDColumnName() + "= " + getKeyValueSQLString(entityToRemoveFrom[i].getPrimaryKeyValue()); logSQL(sql2); /*count += */Stmt.executeUpdate(sql2); } } } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } public void reverseRemoveFrom(IDOLegacyEntity entityToRemoveFrom) throws SQLException { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); String sql = "delete from " + getNameOfMiddleTable(entityToRemoveFrom, this) + " where " + entityToRemoveFrom.getIDColumnName() + "= " + getKeyValueSQLString(entityToRemoveFrom.getPrimaryKeyValue()); logSQL(sql); Stmt.executeUpdate(sql); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } @Override public int compareTo(IDOEntity entity) { Collator coll = Collator.getInstance(); return coll.compare(this.getPrimaryKey().toString(), entity.getPrimaryKey().toString()); } /** * This method just calls equals(IDOEntity) by casting obj to IDOEntity */ @Override public boolean equals(Object obj) { boolean isEqual = false; try { isEqual = equals((IDOEntity) obj); } catch (ClassCastException e) { // the user is comparing apples to oranges of course they are not equal // and this is an error too! e.printStackTrace(); return false; } return isEqual; } /** * The method returns true if the entity primary keys match * * @param entity * @return */ public boolean equals(IDOEntity entity) { if (entity != null) { if (entity.getEntityDefinition().getSQLTableName().equalsIgnoreCase(this.getEntityDefinition().getSQLTableName())) { String entityPK = String.valueOf(entity.getPrimaryKey()); if (entityPK != null && entityPK.equals(String.valueOf(this.getPrimaryKey()))) { return true; } return false; } return false; } return false; } public void empty() { this._columns.clear(); } public boolean hasLobColumn() throws Exception { String lobColumnName = this.getLobColumnName(); // String lobColumnName = this.getStaticInstance()._lobColumnName; if (lobColumnName == null) { return false; } return true; } private void setLobColumnName(String lobColumnName) { this.getIDOEntityStaticInstance()._lobColumnName = lobColumnName; } private void setLobColumnName() { if (getLobColumnName() == null) { String[] columnNames = this.getColumnNames(); for (int i = 0; i < columnNames.length; i++) { if (EntityAttribute.TYPE_COM_IDEGA_DATA_BLOBWRAPPER == this.getStorageClassType(columnNames[i])) { setLobColumnName(columnNames[i]); } } } } public String getLobColumnName() { return this.getIDOEntityStaticInstance()._lobColumnName; } public static GenericEntity getStaticInstance(String entityClassName) { try { return (GenericEntity) getStaticInstanceIDO(RefactorClassRegistry.forName(entityClassName)); } catch (Exception e) { throw new RuntimeException(e.getClass().getName() + ": " + e.getMessage()); } /* * if (_allStaticClasses==null){ _allStaticClasses=new Hashtable(); } * IDOLegacyEntity theReturn = * (IDOLegacyEntity)_allStaticClasses.get(entityClassName); * if(theReturn==null){ try{ theReturn = * (IDOLegacyEntity)Class.forName(entityClassName).newInstance(); * _allStaticClasses.put(entityClassName,theReturn); } catch(Exception ex){ * ex.printStackTrace(); } } return theReturn; */ } private GenericEntity getIDOEntityStaticInstance() { // return getStaticInstance(entityClass.getName()); return (GenericEntity) getStaticInstanceIDO(this.getClass()); } /** * @deprecated Only for IDOLegacyEntity, does not work with pure IDOEntity, * use getStaticInstanceIDO() instead */ @Deprecated public static IDOLegacyEntity getStaticInstance(Class entityClass) { // //return getStaticInstance(entityClass.getName()); // if (entityClass.isInterface()) { // return getStaticInstance(IDOLookup.getBeanClassFor(entityClass)); // } // if (_allStaticClasses == null) { // _allStaticClasses = new Hashtable(); // } // // IDOLegacyEntity theReturn = // (IDOLegacyEntity)_allStaticClasses.get(entityClass.getName()); // // if (theReturn == null) { // try { // //theReturn = (IDOLegacyEntity)entityClass.newInstance(); // theReturn = (IDOLegacyEntity)instanciateEntity(entityClass); // _allStaticClasses.put(entityClass, theReturn); // } catch (Exception ex) { // ex.printStackTrace(); // } // } // return theReturn; return (IDOLegacyEntity) getStaticInstanceIDO(entityClass, GenericEntity.DEFAULT_DATASOURCE); } public static IDOEntity getStaticInstanceIDO(Class entityClass) { return GenericEntity.getStaticInstanceIDO(entityClass, GenericEntity.DEFAULT_DATASOURCE); } public static IDOEntity getStaticInstanceIDO(Class entityClass, String datasource) { // return getStaticInstance(entityClass.getName()); if (entityClass.isInterface()) { return getStaticInstanceIDO(IDOLookup.getBeanClassFor(entityClass)); } IDOEntity theReturn = getIDOContainer().getEntityStaticInstances().get(entityClass + datasource); if (theReturn == null) { try { theReturn = instanciateEntity(entityClass, datasource); // it might be that the method instanciateEntity(Class) has just put an // initialized instance of the specified entityClass into // the _allStaticInstances map. // !!!!!!This instance should not be replaced!!!! // Therefore get the "right" instance. IDOEntity correctInstance = getIDOContainer().getEntityStaticInstances().get(entityClass); if (correctInstance != null) { theReturn = correctInstance; } else { getIDOContainer().getEntityStaticInstances().put(entityClass, theReturn); } } catch (Exception ex) { ex.printStackTrace(); } } return theReturn; } public void addManyToManyRelationShip(IDOEntity relatingEntity, String relationShipTableName) { // addManyToManyRelationShip(relatingEntity.getClass().getName(), // relationShipTableName); addManyToManyRelationShip(relatingEntity.getEntityDefinition().getInterfaceClass().getName(), relationShipTableName); } public void addManyToManyRelationShip(Class relatingEntityClass, String relationShipTableName) { EntityControl.addManyToManyRelationShip(this.getClass().getName(), relatingEntityClass.getName(), relationShipTableName); } public void addManyToManyRelationShip(String relatingEntityClassName, String relationShipTableName) { try { addManyToManyRelationShip(RefactorClassRegistry.forName(relatingEntityClassName), relationShipTableName); } catch (ClassNotFoundException e) { throw new RuntimeException("Exception in " + this.getClass().getName() + e.getMessage()); } } public void addManyToManyRelationShip(String relatingEntityClassName) { try { // relationShipTableName = // EntityControl.getMiddleTableString(this,instanciateEntity(relatingEntityClassName) // ); // addManyToManyRelationShip(this.getClass().getName(),relatingEntityClassName); EntityControl.addManyToManyRelationShip(this.getClass().getName(), relatingEntityClassName); } catch (Exception ex) { ex.printStackTrace(); } } public void addManyToManyRelationShip( Class<? extends IDOEntity> relatingEntityClass) { addManyToManyRelationShip(relatingEntityClass.getName()); } public void addTreeRelationShip() { EntityControl.addTreeRelationShip(this); } public int getEntityState() { return this._state; } public void setEntityState(int state) { this._state = state; } public boolean isInSynchWithDatastore() { return (getEntityState() == IDOLegacyEntity.STATE_IN_SYNCH_WITH_DATASTORE); } /** * * @deprecated replaced with IDOLookup.findByPrimaryKeyLegacy(); */ @Deprecated public static IDOLegacyEntity getEntityInstance(Class entityClass, int id) { IDOLegacyEntity entity = null; try { return IDOLookup.findByPrimaryKeyLegacy(entityClass, id); } catch (Exception e) { e.printStackTrace(System.err); System.err.println("IDOLegacyEntity: error initializing entity"); } return entity; } /** * * @deprecated Replaced with IDOLookup.instanciateEntity(entityClass); */ @Deprecated public static GenericEntity getEntityInstance(Class entityClass) { return (GenericEntity) IDOLookup.instanciateEntity(entityClass); } public void addMetaDataRelationship() { addManyToManyRelationShip(MetaData.class); // this.getStaticInstance(this.getClass())._hasMetaDataRelationship=true; this.getIDOEntityStaticInstance()._hasMetaDataRelationship = true; // bug in getIDOEntityStaticInstance this._hasMetaDataRelationship = true; } public boolean hasMetaDataRelationship() { return this.getIDOEntityStaticInstance()._hasMetaDataRelationship; } // fetches the metadata for this id and puts it in a HashTable private void getMetaData() { this._theMetaDataAttributes = new Hashtable<String, String>(); this._theMetaDataIds = new Hashtable<String, Integer>(); this._theMetaDataTypes = new Hashtable<String, String>(); // _theMetaDataOrdering = new Hashtable(); if (getEntityState() == IDOLegacyEntity.STATE_NEW || getEntityState() == IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE) { // if it is new then it has no primary key and has no relation to the // metdata table return; } else { // look for the metadata Connection conn = null; Statement Stmt = null; ResultSet RS = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); MetaData metadata = (MetaData) getStaticInstance(MetaData.class); String metadataIdColumn = metadata.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName(); String metadataTableName = metadata.getEntityDefinition().getSQLTableName(); String tableToSelectFrom = getNameOfMiddleTable(metadata, this); StringBuffer buffer = new StringBuffer(); buffer.append("select ic_metadata.ic_metadata_id,ic_metadata.metadata_name,ic_metadata.metadata_value,ic_metadata.meta_data_type from "); buffer.append(tableToSelectFrom); buffer.append(",ic_metadata where "); buffer.append(tableToSelectFrom); buffer.append("."); buffer.append(getIDColumnName()); buffer.append("= "); buffer.append(getPrimaryKeyValueSQLString()); buffer.append(" and "); buffer.append(tableToSelectFrom); buffer.append("."); buffer.append(metadataIdColumn); buffer.append("="); buffer.append(metadataTableName); buffer.append("."); buffer.append(metadataIdColumn); // buffer.append(" order by "); // buffer.append(metadataTableName); // buffer.append(".order_number"); String query = buffer.toString(); this.logSQL("[MetadataQuery]: " + query); RS = Stmt.executeQuery(query); while (RS.next()) { if (RS.getString("metadata_value") != null) { this._theMetaDataAttributes.put(RS.getString("metadata_name"), RS.getString("metadata_value")); this._theMetaDataIds.put(RS.getString("metadata_name"), new Integer(RS.getInt("ic_metadata_id"))); } if (RS.getString("meta_data_type") != null) { this._theMetaDataTypes.put(RS.getString("metadata_name"), RS.getString("meta_data_type")); } // if (RS.getInt("ordering_number") != -1) { // _theMetaDataOrdering.put(RS.getString("metadata_name"), new // Integer(RS.getInt("ordering_number"))); // } } } catch (SQLException ex) { System.err.println("Exception in " + this.getClass().getName() + " gettingMetaData " + ex.getMessage()); ex.printStackTrace(System.err); } catch (IDOCompositePrimaryKeyException e) { System.err.println("Exception in " + this.getClass().getName() + " gettingMetaData " + e.getMessage()); e.printStackTrace(System.err); } finally { try { if (RS != null) { RS.close(); } if (Stmt != null) { Stmt.close(); } } catch (SQLException ex) { System.err.println("Exception in " + this.getClass().getName() + " gettingMetaData " + ex.getMessage()); ex.printStackTrace(System.err); } if (conn != null) { freeConnection(getDatasource(), conn); } } } } public String getMetaData(String metaDataKey) { if (this._theMetaDataAttributes == null) { getMetaData(); // get all meta data first if null } return this._theMetaDataAttributes.get(metaDataKey); } public void setMetaDataAttributes(Map<String, String> metaDataAttribs) { String metaDataKey; for (Iterator<String> iterator = metaDataAttribs.keySet().iterator(); iterator.hasNext();) { metaDataKey = iterator.next(); addMetaData(metaDataKey, metaDataAttribs.get(metaDataKey)); } } public void setMetaData(String metaDataKey, String metaDataValue) { addMetaData(metaDataKey, metaDataValue); } public void setMetaData(String metaDataKey, String metaDataValue, String metaDataType) { addMetaData(metaDataKey, metaDataValue, metaDataType, -1); } public void addMetaData(String metaDataKey, String metaDataValue) { addMetaData(metaDataKey, metaDataValue, null, -1); } public void renameMetaData(String oldKeyName, String newKeyName) { renameMetaData(oldKeyName, newKeyName, null); } public void renameMetaData(String oldKeyName, String newKeyName, String value) { if (this._theMetaDataAttributes == null) { getMetaData(); } if (oldKeyName != null && newKeyName != null && !oldKeyName.equals("") && !newKeyName.equals("") && !oldKeyName.equals(newKeyName)) { Integer pk = this._theMetaDataIds.get(oldKeyName); if (pk != null) { try { MetaData md = ((MetaDataHome) IDOLookup.getHome(MetaData.class)).findByPrimaryKey(pk); md.setName(newKeyName); if (value != null) { md.setValue(value); } md.store(); getMetaData(); // Reloading metadata cache } catch (IDOLookupException e) { e.printStackTrace(); } catch (FinderException e) { e.printStackTrace(); } } } } public void addMetaData(String metaDataKey, String metaDataValue, String metaDataType) { addMetaData(metaDataKey, metaDataValue, metaDataType, -1); } // Ordering not implemented yet private void addMetaData(String metaDataKey, String metaDataValue, String metaDataType, int orderingNumber) { boolean dataHasChanged = false; if (this._theMetaDataAttributes == null) { getMetaData(); // get all meta data first if null } // this null string is a strange value coming from the user tabs in the user // system, it means the value is empty or should be removed if (metaDataValue != null && !"null".equals(metaDataValue)) { if (metaDataType != null) { Object oldType = this._theMetaDataTypes.get(metaDataKey); if (!(oldType != null && metaDataType.equals(oldType))) { // the value changed this._theMetaDataTypes.put(metaDataKey, metaDataType); dataHasChanged = true; } } Object oldValue = this._theMetaDataAttributes.get(metaDataKey); Object obj = null; if (!(oldValue != null && metaDataValue.equals(oldValue))) { // the value changed obj = this._theMetaDataAttributes.put(metaDataKey, metaDataValue); dataHasChanged = true; } // Integer oldOrder = (Integer) _theMetaDataOrdering.get(metaDataKey); // if ( ! (oldOrder != null && oldOrder.intValue() == orderingNumber)) { // if (orderingNumber == -1) { // _theMetaDataOrdering.remove(metaDataKey); // } else { // _theMetaDataOrdering.put(metaDataKey, new Integer(orderingNumber)); // } // dataHasChanged = true; // } if (dataHasChanged) { if (obj == null) { // is new if (this._insertMetaData == null) { this._insertMetaData = new ArrayList<String>(); } this._insertMetaData.add(metaDataKey); } else { // is old if (this._updateMetaData == null) { this._updateMetaData = new ArrayList<String>(); } if (this._insertMetaData != null) { if (this._insertMetaData.indexOf(metaDataKey) == -1) { // is old this._updateMetaData.add(metaDataKey); } } else { this._updateMetaData.add(metaDataKey); } } // change state of the entity bean if ((getEntityState() == IDOLegacyEntity.STATE_NEW) || (getEntityState() == IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE)) { setEntityState(IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE); } else { this.setEntityState(IDOLegacyEntity.STATE_NOT_IN_SYNCH_WITH_DATASTORE); } metaDataHasChanged(true); } } else if (metaDataValue == null || "null".equals(metaDataValue)) { removeMetaData(metaDataKey); } } public void removeAllMetaData() { if (this._theMetaDataAttributes == null) { getMetaData(); // get all meta data first if null } if (this._deleteMetaData == null) { this._deleteMetaData = new ArrayList<String>(); } if (this._theMetaDataAttributes != null) { Set keySet = this._theMetaDataAttributes.keySet(); if (keySet != null) { Iterator iter = keySet.iterator(); while (iter.hasNext()) { String metaDataKey = (String) iter.next(); this._deleteMetaData.add(metaDataKey); if (this._insertMetaData != null) { this._insertMetaData.remove(metaDataKey); } if (this._updateMetaData != null) { this._updateMetaData.remove(metaDataKey); } } metaDataHasChanged(true); } } } /** * return true if the metadata to delete already exists */ public boolean removeMetaData(String metaDataKey) { if (this._theMetaDataAttributes == null) { getMetaData(); // get all meta data first if null } if (this._theMetaDataAttributes.get(metaDataKey) != null) { if (this._deleteMetaData == null) { this._deleteMetaData = new ArrayList<String>(); } this._deleteMetaData.add(metaDataKey); if ((getEntityState() == IDOLegacyEntity.STATE_NEW) || (getEntityState() == IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE)) { setEntityState(IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE); } else { this.setEntityState(IDOLegacyEntity.STATE_NOT_IN_SYNCH_WITH_DATASTORE); } if (this._insertMetaData != null) { this._insertMetaData.remove(metaDataKey); } if (this._updateMetaData != null) { this._updateMetaData.remove(metaDataKey); } metaDataHasChanged(true); return true; } else { return false; } } public void clearMetaDataVectors() { this._insertMetaData = null; this._updateMetaData = null; this._deleteMetaData = null; this._theMetaDataAttributes = null; this._theMetaDataTypes = null; } public Map<String, String> getMetaDataAttributes() { if (this._theMetaDataAttributes == null) { getMetaData(); } return this._theMetaDataAttributes; } public Hashtable<String, Integer> getMetaDataIds() { return this._theMetaDataIds; } public Map<String, String> getMetaDataTypes() { if (this._theMetaDataTypes == null) { getMetaData(); } return this._theMetaDataTypes; } public List<String> getMetaDataUpdate() { return this._updateMetaData; } public List<String> getMetaDataInsert() { return this._insertMetaData; } public List<String> getMetaDataDelete() { return this._deleteMetaData; } public boolean metaDataHasChanged() { return this._metaDataHasChanged; } public void metaDataHasChanged(boolean metaDataHasChanged) { this._metaDataHasChanged = metaDataHasChanged; } @Override public void setEJBLocalHome(javax.ejb.EJBLocalHome ejbHome) { this._ejbHomes.put(this.getClass().getName() + getDatasource(), ejbHome); } @Override public javax.ejb.EJBLocalHome getEJBLocalHome() { return getEJBLocalHome(getDatasource()); } public javax.ejb.EJBLocalHome getEJBLocalHome(String datasource) { String key = this.getClass().toString() + datasource; EJBLocalHome ejbHome = this._ejbHomes.get(key); if (ejbHome == null) { try { ejbHome = IDOLookup.getHome(this.getClass(), datasource); this._ejbHomes.put(key, ejbHome); } catch (Exception e) { throw new EJBException("Lookup for home for: " + this.getClass().getName() + " failed. Errormessage was: " + e.getMessage()); } } return ejbHome; } /** * Not implemented * * @todo: implement */ public javax.ejb.Handle getHandle() { return null; } @Override public Object getPrimaryKey() { return getPrimaryKeyValue(); } public boolean isIdentical(javax.ejb.EJBObject ejbo) { if (ejbo != null) { try { return ejbo.getPrimaryKey().equals(this.getPrimaryKey()); } catch (java.rmi.RemoteException rme) { rme.printStackTrace(); } } return false; } @Override public void remove() throws RemoveException { try { delete(); } catch (Exception e) { throw new IDORemoveException(e); } } @Override public void store() throws IDOStoreException { try { if ((getEntityState() == IDOLegacyEntity.STATE_NEW) || (getEntityState() == IDOLegacyEntity.STATE_NEW_AND_NOT_IN_SYNCH_WITH_DATASTORE)) { insert(); } else if (this.getEntityState() == IDOLegacyEntity.STATE_NOT_IN_SYNCH_WITH_DATASTORE) { update(); } if (this.hasMetaDataRelationship()) { this.updateMetaData(); } if(this instanceof ExplicitlySynchronizedEntity){ ExplicitlySynchronizedEntity thisEntity = (ExplicitlySynchronizedEntity) this; ExplicitSynchronizationBusiness explicitSynchronizationBusiness = ELUtil.getInstance().getBean(ExplicitSynchronizationBusiness.BEAN_NAME); explicitSynchronizationBusiness.synchronize(thisEntity); } } catch (Exception e) { e.printStackTrace(); throw new IDOStoreException(e.getMessage(), e); } } @Override public void ejbActivate() { } @Override public void ejbPassivate() { if (this._columns != null) { this._columns.clear(); } this._dataSource = DEFAULT_DATASOURCE; this._state = IDOLegacyEntity.STATE_NEW; this._updatedColumns = null; this._primaryKey = null; this._theMetaDataAttributes = null; this._insertMetaData = null; this._updateMetaData = null; this._deleteMetaData = null; this._theMetaDataIds = null; // _hasMetaDataRelationship = false; this._metaDataHasChanged = false; } @Override public void ejbRemove() throws javax.ejb.RemoveException { remove(); } @Override public void ejbStore() { store(); } @Override public void setEntityContext(javax.ejb.EntityContext ctx) { } @Override public void unsetEntityContext() { } @Override public Object ejbCreate() throws CreateException { // if this entity has used addUniqueIdColumn() this method will generated // the unique id and set the column in the entity. // see addUniqueIDColumn() and generateAndSetUniqueIDForIDO() if (hasUniqueIDColumn()) { generateAndSetUniqueIDForIDO(); } if (this.doInsertInCreate()) { this.insertForCreate(); } return getPrimaryKey(); } /** * Generates unique id string 36 characters long (128bit) and sets the unique * id column. <br> * The default implementation generates the string with a combination of a * <br> * dummy ip address and a time based random number generator.<br> * For more info see the JUG project, * http://www.doomdark.org/doomdark/proj/jug/ An example uid: * ac483688-b6ed-4f45-ac64-c105e599d482 <br> * You must call addUniqueIDColumn() in your IDO's initializeAttributes method * to enable this behavior. */ protected void generateAndSetUniqueIDForIDO() { if (getUniqueId() == null) { IdGenerator uidGenerator = IdGeneratorFactory.getUUIDGenerator(); String uniqueId = uidGenerator.generateId(); setUniqueId(uniqueId); } } /** * Gets the name for the UniqueId Column. Defaults to UNIQUE_ID * * @return */ protected String getUniqueIdColumnName() { return UNIQUE_ID_COLUMN_NAME; } /** * Sets the Unique ID column. This method should generally never be called * manually * * @param uniqueId */ public void setUniqueId(String uniqueId) { setColumn(getUniqueIdColumnName(), uniqueId); } /** * @return true if this entity has called addUniqueIdColumn() to add a unique * id column to its table */ protected boolean hasUniqueIDColumn() { return getGenericEntityDefinition().hasField(getUniqueIdColumnName()); } /** * Default create method for IDO */ public Object ejbCreateIDO() throws CreateException { return ejbCreate(); } /** * Default create method for IDO */ public IDOEntity ejbHomeCreateIDO() throws CreateException { throw new UnsupportedOperationException("Not implemented"); // return ejbCreate(); } /** * Default postcreate method for IDO */ public void ejbPostCreateIDO() { // does nothing } public void ejbPostCreate() { } @Override public Object ejbFindByPrimaryKey(Object pk) throws FinderException { this.setPrimaryKey(pk); return getPrimaryKey(); } /** * Default findByPrimaryKey method for IDO */ public Object ejbFindByPrimaryKeyIDO(Object pk) throws FinderException { return ejbFindByPrimaryKeyIDO(pk); } void flagColumnUpdate(String columnName) { if (this.canRegisterColumnsForUpdate) { if (this._updatedColumns == null) { this._updatedColumns = new HashMap<String, Boolean>(); } this._updatedColumns.put(columnName.toUpperCase(), Boolean.TRUE); } } boolean hasColumnBeenUpdated(String columnName) { if (this._updatedColumns == null) { return false; } else { return (this._updatedColumns.get(columnName.toUpperCase()) != null); } } public boolean columnsHaveChanged() { return (this._updatedColumns != null); } public void setToInsertStartData(boolean ifTrue) { this.insertStartData = ifTrue; } public boolean getIfInsertStartData() { return this.insertStartData; } protected void setPrimaryKey(int pk) { Integer id = new Integer(pk); this.setPrimaryKey(id); } protected void setPrimaryKey(Object pk) { if (pk instanceof IDOPrimaryKey) { IDOEntityField[] fields = this.getGenericEntityDefinition().getPrimaryKeyDefinition().getFields(); IDOPrimaryKey primaryKey = (IDOPrimaryKey) pk; for (int i = 0; i < fields.length; i++) { initializeColumnValue(fields[i].getSQLFieldName(), primaryKey.getPrimaryKeyValue(fields[i].getSQLFieldName().toUpperCase())); } } else { initializeColumnValue(getIDColumnName(), pk); } this._primaryKey = pk; } private static GenericEntity instanciateEntity(Class entityInterfaceOrBeanClass, String datasource) { try { return (GenericEntity) IDOLookup.instanciateEntity(entityInterfaceOrBeanClass, datasource); } catch (Exception e1) { // Only for legacy beans; e1.printStackTrace(); try { GenericEntity ent = (GenericEntity) entityInterfaceOrBeanClass.newInstance(); ent.setDatasource(datasource); return ent; } catch (Exception e2) { e2.printStackTrace(); throw new RuntimeException(e1.getMessage()); } } } private IDOLegacyEntity findByPrimaryInOtherClass(Class entityInterfaceOrBeanClass, int id) throws java.sql.SQLException { IDOLegacyEntity returnEntity = IDOLookup.findByPrimaryKeyLegacy(entityInterfaceOrBeanClass, id, this.getDatasource()); // returnEntity.setDatasource(this.getDatasource()); return returnEntity; } /** * @deprecated replacced with idoFindPKsBySQL */ @Deprecated protected <PK> Collection<PK> idoFindIDsBySQL(String sqlQuery) throws FinderException { return idoFindPKsBySQL(sqlQuery); } protected <PK> Collection<PK> idoFindPKsBySQL(String sqlQuery) throws FinderException { return idoFindPKsBySQL(sqlQuery, -1, -1); } /** * Fetches the primarykey resultset and then loads the beans with data(the * prefect size determines how many get loaded) The query must be a select all * query! * * @param sqlQuery * @param countQuery * @param prefetchSize * @return * @throws FinderException */ protected Collection idoFindPKsByQueryUsingLoadBalance(SelectQuery sqlQuery, int prefetchSize) throws FinderException { Collection pkColl = null; Class interfaceClass = this.getInterfaceClass(); boolean queryCachingActive = IDOContainer.getInstance().queryCachingActive(interfaceClass); if (queryCachingActive) { pkColl = IDOContainer.getInstance().getBeanCache(getDatasource(),interfaceClass).getCachedFindQuery(sqlQuery.toString()); } if (pkColl == null) { pkColl = this.idoFindPKsByQueryIgnoringCacheAndUsingLoadBalance(sqlQuery, prefetchSize); if (queryCachingActive) { IDOContainer.getInstance().getBeanCache(getDatasource(),interfaceClass).putCachedFindQuery(sqlQuery.toString(), pkColl); } } else { if (this.isDebugActive()) { logSQL("Cache hit for SQL query: " + sqlQuery); } } return pkColl; } protected Collection idoFindByPrimaryKeyCollection(Collection primaryKeys, int prefetchSize) throws FinderException { return new IDOPrimaryKeyList(primaryKeys, this, prefetchSize); } public Collection ejbFindByPrimaryKeyCollection(Collection primaryKeys) throws FinderException { return idoFindByPrimaryKeyCollection(primaryKeys, 1000); } /** * * @param sqlQuery * @return IDOPrimaryKeyList * @throws FinderException */ protected Collection idoFindPKsByQueryIgnoringCacheAndUsingLoadBalance(SelectQuery sqlQuery, int prefetchSize) throws FinderException { return new IDOPrimaryKeyList(sqlQuery, this, prefetchSize); } /** * * @param sqlQuery * @param returnProxy * If this entity and the returnProxy have one-to-one related primary * keys, that is they have the same primaryKeys, then this method is * able to return IDOPriamryKeyList that will return IDEntities of * the same type as returnProxy when wrapped into IDOEntityList * although the SelectQuery only uses this entity * @return IDOPrimaryKeyList * @throws FinderException */ protected Collection idoFindPKsByQueryIgnoringCacheAndUsingLoadBalance(SelectQuery sqlQuery, GenericEntity returnProxy, SelectQuery proxyQueryConstraints, int prefetchSize) throws FinderException { return new IDOPrimaryKeyList(sqlQuery, this, returnProxy, proxyQueryConstraints, prefetchSize); } protected Collection idoFindPKsBySQLIgnoringCache(String sqlQuery, int returningNumber, int startingEntry) throws FinderException { return idoFindPKsBySQLIgnoringCache(sqlQuery, returningNumber, startingEntry, null); } protected <PK> Collection<PK> idoFindPKsBySQLIgnoringCache(String sqlQuery, int returningNumber, int startingEntry, SelectQuery query) throws FinderException { logSQL(sqlQuery); if (startingEntry < 0) { startingEntry = 0; } if (returningNumber < 0) { returningNumber = 0; } Connection conn = null; ResultHelper rsh = null; Collection<PK> results = new ArrayList<PK>(); try { conn = getConnection(getDatasource()); rsh = prepareResultSet(conn, sqlQuery, query); int counter = 0; boolean addEntity = true; while (rsh.rs.next() && addEntity) { if (startingEntry <= counter) { if (returningNumber > 0) { if (counter < (returningNumber + startingEntry)) { addEntity = true; } else { addEntity = false; } } else { addEntity = true; } if (addEntity) { PK pk = this.getPrimaryKeyFromResultSet(rsh.rs); if (pk != null) { results.add(pk); } } } counter++; } } catch (SQLException sqle) { throw new IDOFinderException(sqle); } finally { if (rsh != null) { rsh.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } return results; } protected class ResultHelper { ResultSet rs = null; Statement stmt = null; void close() { if (this.rs != null) { try { this.rs.close(); } catch (SQLException e1) { e1.printStackTrace(); } } if (this.stmt != null) { try { this.stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } } } private ResultHelper prepareResultSet(Connection conn, String sqlString, SelectQuery query) throws SQLException { ResultHelper rsh = new ResultHelper(); if (conn != null) { if (query != null) { DatastoreInterface dsi = DatastoreInterface.getDatastoreInterfaceByDatasource(getDatasource()); List values = query.getValues(); if (values != null && dsi.isUsingPreparedStatements()) { rsh.stmt = conn.prepareStatement(query.toString(true)); dsi.insertIntoPreparedStatement(values, (PreparedStatement) rsh.stmt, 1); rsh.rs = ((PreparedStatement) rsh.stmt).executeQuery(); } else { rsh.stmt = conn.createStatement(); rsh.rs = rsh.stmt.executeQuery(query.toString()); } } else if (sqlString != null) { rsh.stmt = conn.createStatement(); rsh.rs = rsh.stmt.executeQuery(sqlString); } } return rsh; } /** * Finds all relationships this entity bean instane has with ALL * returningEntityInterfaceClass beans Returns a collection of returningEntity * instances * * @throws IDORelationshipException * if the returningEntity has no relationship defined with this bean * or an error with the query */ protected <T extends IDOEntity> Collection<T> idoGetRelatedEntities(Class<T> returningEntityInterfaceClass) throws IDORelationshipException { T returningEntity = IDOLookup.instanciateEntity(returningEntityInterfaceClass, getDatasource()); return idoGetRelatedEntitiesBySQL(returningEntity, getFindRelatedSQLQuery(returningEntity, "", "")); } /** * Returns a collection of returningEntity instances */ protected <T extends IDOEntity> Collection<T> idoGetRelatedEntities(T returningEntity, String columnName, String entityColumnValue) throws IDOException { String SQLString = this.getFindRelatedSQLQuery(returningEntity, columnName, entityColumnValue); return this.idoGetRelatedEntitiesBySQL(returningEntity, SQLString); } /** * Returns a collection of returningEntity instances */ protected <T extends IDOEntity> Collection<T> idoGetRelatedEntities(Class<T> returningEntityInterfaceClass, String columnName, String entityColumnValue) throws IDOException { T returningEntity = IDOLookup.instanciateEntity(returningEntityInterfaceClass); String SQLString = this.getFindRelatedSQLQuery(returningEntity, columnName, entityColumnValue); return this.idoGetRelatedEntitiesBySQL(returningEntity, SQLString); } /** * Returns a collection of returningEntity instances */ protected <T extends IDOEntity> Collection<T> idoGetRelatedEntitiesOrderedByColumn(Class<T> returningEntityInterfaceClass, String columnName) throws IDOException { T returningEntity = IDOLookup.instanciateEntity(returningEntityInterfaceClass); String SQLString = this.getFindRelatedSQLQuery(returningEntity, null, null, columnName); return this.idoGetRelatedEntitiesBySQL(returningEntityInterfaceClass, SQLString); } /** * Returns a collection of returningEntity instances * * @throws IDORelationshipException * if the returningEntity has no relationship defined with this bean * or an error with the query */ protected <T extends IDOEntity> Collection<T> idoGetRelatedEntities(T returningEntity) throws IDORelationshipException { String sqlQuery = this.getFindRelatedSQLQuery(returningEntity, "", ""); logSQL(sqlQuery); return idoGetRelatedEntitiesBySQL(returningEntity, sqlQuery); } /** * Returns a collection of entity(this) instances * * @throws IDORelationshipException * if the relatedEntity has no relationship defined with this bean * or an error with the query */ protected Collection idoGetReverseRelatedEntities(IDOEntity relatedEntity) throws IDORelationshipException { String sqlQuery = this.getFindReverseRelatedSQLQuery(relatedEntity, "", ""); logSQL(sqlQuery); return idoGetRelatedEntitiesBySQL(this, sqlQuery); } protected <T extends IDOEntity> Collection<T> idoGetRelatedEntitiesBySQL(Class<T> returningEntityInterfaceClass, String sqlQuery) throws IDORelationshipException { T returningEntity = IDOLookup.instanciateEntity(returningEntityInterfaceClass); return idoGetRelatedEntitiesBySQL(returningEntity, sqlQuery); } /** * Returns a collection of returningEntity instances * * @throws IDORelationshipException * if the returningEntity has no relationship defined with this bean * or an error with the query */ private <PK, T extends IDOEntity> Collection<T> idoGetRelatedEntitiesBySQL(T returningEntity, String sqlQuery) throws IDORelationshipException { Collection<T> results = new ArrayList<T>(); Collection<PK> ids = idoGetRelatedEntityPKs(returningEntity, sqlQuery); try { IDOHome home = IDOLookup.getHome(returningEntity.getClass(), getDatasource()); for (Iterator<PK> iter = ids.iterator(); iter.hasNext();) { try { PK pk = iter.next(); T entityToAdd = home.findByPrimaryKeyIDO(pk); results.add(entityToAdd); } catch (Exception e) { throw new EJBException(e.getMessage()); } } } catch (Exception e) { throw new IDORelationshipException("Error in idoGetRelatedEntities()" + e.getMessage()); } return results; } protected <PK, T extends IDOEntity> Collection<PK> idoGetRelatedEntityPKs(Class<T> returningEntityInterfaceClass) throws IDORelationshipException { T returningEntity = IDOLookup.instanciateEntity(returningEntityInterfaceClass); String sqlQuery = this.getFindRelatedSQLQuery(returningEntity, "", ""); return idoGetRelatedEntityPKs(returningEntity, sqlQuery); } protected <PK, T extends IDOEntity> Collection<PK> idoGetRelatedEntityPKs(Class<T> returningEntityInterfaceClass, String sqlQuery) throws IDORelationshipException { IDOEntity returningEntity = IDOLookup.instanciateEntity(returningEntityInterfaceClass); return idoGetRelatedEntityPKs(returningEntity, sqlQuery); } /** * Returns a collection of returningEntity primary keys * * @throws IDORelationshipException * if the returningEntity has no relationship defined with this bean * or an error with the query */ protected <PK> Collection<PK> idoGetRelatedEntityPKs(IDOEntity returningEntity) throws IDORelationshipException { String sqlQuery = this.getFindRelatedSQLQuery(returningEntity, "", ""); return idoGetRelatedEntityPKs(returningEntity, sqlQuery); } /** * Returns a collection of returningEntity primary keys */ private <PK> Collection<PK> idoGetRelatedEntityPKs(IDOEntity returningEntity, String sqlQuery) throws IDORelationshipException { Connection conn = null; Statement Stmt = null; Collection results = new ArrayList(); try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); logSQL(sqlQuery); ResultSet rs = Stmt.executeQuery(sqlQuery); while (rs.next()) { PK pk = ((GenericEntity) returningEntity).getPrimaryKeyFromResultSet(rs); results.add(pk); } rs.close(); } catch (Exception sqle) { throw new IDORelationshipException(sqle, this); } finally { if (Stmt != null) { try { Stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { freeConnection(getDatasource(), conn); } } return results; } protected <PK> Collection<PK> idoFindAllIDsOrderedBySQL(String oderByColumnName) throws FinderException { return this.idoFindIDsBySQL("select * from " + getTableName() + " order by " + oderByColumnName); } protected <PK> Collection<PK> idoFindAllIDsBySQL() throws FinderException { return this.idoFindIDsBySQL("select * from " + getTableName()); } /** * Finds one primary key by an SQL query */ protected Object idoFindOnePKBySQL(String sqlQuery) throws FinderException { return idoFindOnePKBySQL(sqlQuery, null); } /** * Finds one primary key by an SQL query */ private <PK> PK idoFindOnePKBySQL(String sqlQuery, SelectQuery selectQuery) throws FinderException { Collection<PK> coll = idoFindPKsBySQL(sqlQuery, 1, -1, selectQuery); try { if (!ListUtil.isEmpty(coll)) { return coll.iterator().next(); } } catch (Exception e) { throw new IDOFinderException(e); } throw new IDOFinderException("Nothing found"); } /** * Finds returningNumberOfRecords Primary keys from the specified sqlQuery */ protected <PK> Collection<PK> idoFindPKsBySQL(String sqlQuery, int returningNumberOfRecords) throws FinderException { return idoFindPKsBySQL(sqlQuery, returningNumberOfRecords, -1); } protected <PK> Collection<PK> idoFindPKsBySQL(String sqlQuery, int returningNumberOfRecords, int startingEntry) throws FinderException { return idoFindPKsBySQL(sqlQuery, returningNumberOfRecords, startingEntry, null); } /** * Finds returningNumberOfRecords Primary keys from the specified sqlQuery */ protected <PK> Collection<PK> idoFindPKsBySQL(String sqlQuery, int returningNumberOfRecords, int startingEntry, SelectQuery selectQuery) throws FinderException { boolean measureSQL = CoreUtil.isSQLMeasurementOn(); long start = measureSQL ? System.currentTimeMillis() : 0; try { Collection<PK> pkColl = null; Class interfaceClass = this.getInterfaceClass(); boolean queryCachingActive = IDOContainer.getInstance().queryCachingActive(interfaceClass); if (queryCachingActive) { IDOBeanCache cache = IDOContainer.getInstance().getBeanCache(getDatasource(), interfaceClass); pkColl = cache.getCachedFindQuery(sqlQuery); } if (pkColl == null) { pkColl = this.idoFindPKsBySQLIgnoringCache(sqlQuery, returningNumberOfRecords, startingEntry, selectQuery); if (queryCachingActive) { IDOContainer.getInstance().getBeanCache(getDatasource(),interfaceClass).putCachedFindQuery(sqlQuery, pkColl); } } else { if (this.isDebugActive()) { logSQL("Cache hit for SQL query: " + sqlQuery); } } return pkColl; } finally { if (measureSQL) { log(Level.INFO, "Query '" + sqlQuery + "' was executed in " + (System.currentTimeMillis() - start) + " ms"); } } } /** * @deprecated replaced with idoFindPKsBySQL */ @Deprecated protected Collection idoFindIDsBySQL(String SQLString, int returningNumberOfRecords) throws FinderException { return idoFindPKsBySQL(SQLString, returningNumberOfRecords); } /** * @todo use selectquery in all ido find methods */ protected Collection idoFindAllIDsByColumnBySQL(String columnName, String toFind) throws FinderException { return idoFindIDsBySQL("select " + getIDColumnName() + " from " + getTableName() + " where " + columnName + "='" + toFind + "'"); } /** * Finds PK of one entity that has this exact column value */ protected Object idoFindOnePKByColumnBySQL(String columnName, String toFind) throws FinderException { return idoFindOnePKBySQL("select " + getIDColumnName() + " from " + getTableName() + " where " + columnName + "='" + toFind + "'"); } /** * Finds PKs of all entities by a metadata key or metadata key and value * * @param key, * the metadata name cannot be null * @param value, * the metadata value can be null * @return all collection of primary keys of the current genericentity * @throws FinderException */ protected Collection idoFindPKsByMetaData(String key, String value) throws FinderException { MetaData metadata = (MetaData) getStaticInstance(MetaData.class); final String middleTableName = getNameOfMiddleTable(metadata, this); final String tableToSelectFrom = getEntityName(); final String metadataIdColumnName; final String metadataTableName = metadata.getEntityDefinition().getSQLTableName(); final String primaryColumnName = getIDColumnName(); final String keyColumn = MetaDataBMPBean.COLUMN_META_KEY; final String valueColumn = MetaDataBMPBean.COLUMN_META_VALUE; try { metadataIdColumnName = metadata.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName(); StringBuffer sql = new StringBuffer(); sql.append("select entity.* from ").append(tableToSelectFrom).append(" entity ,").append(middleTableName).append(" middle ,").append(metadataTableName).append(" meta ").append(" where ").append("entity.").append(primaryColumnName).append("=").append("middle").append(".").append(primaryColumnName).append(" and ").append("middle.").append(metadataIdColumnName).append("=").append("meta").append(".").append(metadataIdColumnName).append(" and ").append("meta.").append(keyColumn).append("=").append("'").append(key).append("'"); if (value != null) { sql.append(" and ").append("meta.").append(valueColumn).append("=").append("'").append(value).append("'"); } // TODO use selectquery return idoFindPKsBySQL(sql.toString()); } catch (IDOCompositePrimaryKeyException e) { e.printStackTrace(); throw new FinderException(e.getMessage()); } } /** * Finds an entity by its unique id column. <br> * See also addUniqueIDColumn() on how to add a unique generated id column to * your entity. * * @param uniqueID, * A 128 bit unique id string (36 characters long) * @return Object which is the primary key of the object found from the query. * @throws FinderException * if nothing found or there is an error with the query. */ protected Object idoFindOnePKByUniqueId(String uniqueID) throws FinderException { return idoFindOnePKByColumnBySQL(getUniqueIdColumnName(), uniqueID); } /** * Finds by two columns */ protected Collection idoFindAllIDsByColumnsBySQL(String columnName, String toFind, String columnName2, String toFind2) throws FinderException { IDOQuery query = new IDOQuery(); query.appendSelectAllFrom(getTableName()); query.appendWhere(columnName); query.appendEqualSign(); query.appendWithinSingleQuotes(toFind); query.appendAnd(); query.append(columnName2); query.appendEqualSign(); query.appendWithinSingleQuotes(toFind2); return idoFindIDsBySQL(query.toString()); } /** * Finds by two columns */ protected Collection idoFindAllIDsByColumnsBySQL(String columnName, int toFind, String columnName2, int toFind2) throws FinderException { IDOQuery query = new IDOQuery(); query.appendSelectAllFrom(getTableName()); query.appendWhere(columnName); query.appendEqualSign(); query.append(toFind); query.appendAnd(); query.append(columnName2); query.appendEqualSign(); query.append(toFind2); return idoFindIDsBySQL(query.toString()); } /** * Finds by two columns */ protected Collection idoFindAllIDsByColumnsBySQL(String columnName, int toFind, String columnName2, String toFind2) throws FinderException { IDOQuery query = new IDOQuery(); query.appendSelectAllFrom(getTableName()); query.appendWhere(columnName); query.appendEqualSign(); query.append(toFind); query.appendAnd(); query.append(columnName2); query.appendEqualSign(); query.appendWithinSingleQuotes(toFind2); return idoFindIDsBySQL(query.toString()); } protected Collection idoFindAllIDsByColumnOrderedBySQL(String columnName, String toFind, String orderByColumnName) throws FinderException { return idoFindIDsBySQL("select " + getIDColumnName() + " from " + getTableName() + " where " + columnName + " = '" + toFind + "' order by " + orderByColumnName); } protected Collection idoFindAllIDsByColumnOrderedBySQL(String columnName, int toFind, String orderByColumnName) throws FinderException { return idoFindIDsBySQL("select " + getIDColumnName() + " from " + getTableName() + " where " + columnName + " = " + toFind + " order by " + orderByColumnName); } protected Collection idoFindAllIDsByColumnOrderedBySQL(String columnName, String toFind) throws FinderException { return idoFindAllIDsByColumnOrderedBySQL(columnName, toFind, columnName); } protected Collection idoFindAllIDsByColumnOrderedBySQL(String columnName, int toFind) throws FinderException { return idoFindAllIDsByColumnOrderedBySQL(columnName, toFind, columnName); } protected Class getInterfaceClass() { return IDOLookup.getInterfaceClassFor(this.getClass()); } private void flushQueryCache() { Class interfaceClass = this.getInterfaceClass(); boolean queryCachingActive = IDOContainer.getInstance().queryCachingActive(interfaceClass); if (queryCachingActive) { IDOContainer.getInstance().getBeanCache(getDatasource(),interfaceClass).flushAllQueryCache(); } } private void flushBeanCache() { Class interfaceClass = this.getInterfaceClass(); boolean beanCachingActive = IDOContainer.getInstance().beanCachingActive(interfaceClass); if (beanCachingActive) { IDOContainer.getInstance().getBeanCache(getDatasource(),interfaceClass).flushAllBeanCache(); } } boolean closeBlobConnections() throws Exception { if (this.hasLobColumn()) { BlobWrapper wrapper = this.getBlobColumnValue(this.getLobColumnName()); if (wrapper != null) { wrapper.close(); return true; } } return false; } IDOEntity prefetchBeanFromResultSet(Object pk, ResultSet rs, String dataSourceName) throws FinderException { return IDOContainer.getInstance().findByPrimaryKey(this.getInterfaceClass(), pk, rs, (IDOHome) this.getEJBLocalHome(), dataSourceName); } /** * Meant to be overrided in subclasses, returns default Integer.class */ @Override public Class getPrimaryKeyClass() { return Integer.class; } /** * The default implementation. Returns the number of all records for this * entity. * * @return int the count of all records * @throws IDOException * if there was an exceptoin accessing the datastore */ protected int idoGetNumberOfRecords() throws IDOException { try { return this.getNumberOfRecords(); } catch (SQLException e) { throw new IDOException(e, this); } } /** * Returns the number of recors for the query sql. * * @param sql * A count SQL query. * @return int the count of the records * @throws IDOException * if there was an error with the query or erroraccessing the * datastore */ protected int idoGetNumberOfRecords(String sql) throws IDOException { try { if (isDebugActive()) { logSQL(sql); } return this.getNumberOfRecords(sql); } catch (SQLException e) { throw new IDOException(e, this); } } protected double idoGetAverage(String sql) throws IDOException { try { if (isDebugActive()) { logSQL(sql); } return this.getAverage(sql); } catch (SQLException e) { throw new IDOException(e, this); } } /** * Returns the number of recors for the query sql. * * @param query * A count query. * @return int the count of the records * @throws IDOException * if there was an error with the query or erroraccessing the * datastore */ protected int idoGetNumberOfRecords(IDOQuery query) throws IDOException { return idoGetNumberOfRecords(query.toString()); } /** * Returns the number of recors for the query sql. * * @param query * A count query. * @return int the count of the records * @throws IDOException * if there was an error with the query or erroraccessing the * datastore */ protected int idoGetNumberOfRecords(SelectQuery query) throws IDOException { try { if (isDebugActive()) { logSQL(query.toString()); } return this.getNumberOfRecords(query); } catch (SQLException e) { throw new IDOException(e, this); } } /** * *Default remove behavior with a many-to-many relationship * Deletes <b>ALL</b> * records of relation with all instances of entityInterfaceClass with this * entity bean instance * * @throws IDORemoveRelationshipException * if there is no relationship defined with the given entity class * or there is an error accessing it */ protected void idoRemoveFrom(Class entityInterfaceClass) throws IDORemoveRelationshipException { /** * @todo Change implementation */ try { // removeFrom(this.getStaticInstance(entityInterfaceClass)); removeFrom(entityInterfaceClass); } catch (SQLException ex) { // ex.printStackTrace(); throw new IDORemoveRelationshipException(ex, this); } } /** * *Default remove behavior with a many-to-many relationship * deletes only * one line in middle table if the genericentity wa consructed with a value * * @throws IDORemoveRelationshipException * if there is no relationship defined with the given entity class * or there is an error accessing it */ protected void idoRemoveFrom(IDOEntity entity) throws IDORemoveRelationshipException { /** * @todo Change implementation */ try { removeFrom(entity); } catch (SQLException ex) { // ex.printStackTrace(); throw new IDORemoveRelationshipException(ex, this); } } /** * * <p>Removes all relations between this {@link IDOEntity} and * entity given as parameter.</p> * @param entityInterfaceClass * @author <a href="mailto:martynas@idega.is">Martynas Stakė</a> */ protected void idoRemoveRelationsTo(Class<? extends IDOEntity> entityInterfaceClass) { try { idoRemoveFrom(entityInterfaceClass); getLogger().info("Successfully removed all relations between " + getClass().getSimpleName() + " by id: '" + getPrimaryKey() + "' and " + entityInterfaceClass.getSimpleName()); } catch (IDORemoveRelationshipException e) { getLogger().log(Level.WARNING, "Failed to remove relations between " + getClass().getSimpleName() + " by id: '" + getPrimaryKey() + "' and " + entityInterfaceClass.getSimpleName(), e); } } /** * * <p>Removes a record between this and given {@link IDOEntity}s</p> * @param entity to remove relation between, not <code>null</code>; * @author <a href="mailto:martynas@idega.is">Martynas Stakė</a> */ protected void idoRemoveRelationTo(IDOEntity entity) { if (entity != null) { try { removeFrom(entity); getLogger().info("Entity " + entity.getClass().getSimpleName() + " by id: '" + entity.getPrimaryKey() + "' removed from relation to " + getClass().getSimpleName() + " by id: '" + getPrimaryKey() + "'"); } catch (SQLException ex) { getLogger().log(Level.WARNING, "Failed to remove " + entity.getClass().getSimpleName() + " by id: '" + entity.getPrimaryKey() + "' from relation to " + getClass().getSimpleName() + " by id: '" + getPrimaryKey() + "' cause of: ", ex); } } } /** * * <p>Removes all records from SQL table, which are related to this * instance of entity object.</p> * @param relatedTableName is table name of related entity, not <code>null</code>; * @return <code>true</code> if successfully removed, <code>false</code> * otherwise; * @author <a href="mailto:martynas@idega.is">Martynas Stakė</a> */ protected boolean idoRemoveFrom(String relatedTableName) { return removeFrom(relatedTableName); } protected void idoRemoveFrom(IDOEntity entity, String middleTableName) throws IDORemoveRelationshipException { try { removeFrom(entity, middleTableName); } catch (SQLException ex) { throw new IDORemoveRelationshipException(ex, this); } } /** * *Default insert behavior with a many-to-many relationship * * * @throws IDOAddRelationshipException * if there is no relationship with the given entity or there is an * error accessing it */ protected void idoAddTo(Class entityToAddTo, Object primaryKey) throws IDOAddRelationshipException { try { IDOEntity entity = IDOLookup.instanciateEntity(entityToAddTo); idoAddTo(getNameOfMiddleTable(entity, this), entity.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName(), primaryKey); } catch (Exception e) { throw new IDOAddRelationshipException(e, this); } } /** * *Default insert behavior with a many-to-many relationship * * * @throws IDOAddRelationshipException * if there is no relationship with the given entity or there is an * error accessing it */ protected void idoAddTo(IDOEntity entity) throws IDOAddRelationshipException { try { idoAddTo(getNameOfMiddleTable(entity, this), entity.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName(), entity.getPrimaryKey()); } catch (Exception e) { throw new IDOAddRelationshipException(e, this); } } /** * * <p>Adds realtions between current entity and given ones.</p> * @param entities to add, not <code>null</code>; * @return <code>true</code> if all entities added, * <code>false</code> otherwise; * @author <a href="mailto:martynas@idega.is">Martynas Stakė</a> */ protected boolean idoAddTo(Collection<? extends IDOEntity> entities) { if (ListUtil.isEmpty(entities)) { return false; } for (IDOEntity entity: entities) { try { idoAddTo(entity); getLogger().info("Relation between " + getClass().getName() + " by id: '" + getPrimaryKey() + "' and " + entity.getClass().getName() + " by id: '" + entity.getPrimaryKey() + "' added!"); } catch (IDOAddRelationshipException e) { getLogger().log(Level.WARNING, "Failed to add relation between " + getClass().getName() + " by id: '" + getPrimaryKey() + "' and " + entity.getClass().getName() + " by id: '" + entity.getPrimaryKey() + "' cause of: ", e); return false; } } return true; } protected void idoAddTo(IDOEntity entity, String middleTableName) throws IDOAddRelationshipException { try { idoAddTo(middleTableName, entity.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName(), entity.getPrimaryKey()); } catch (Exception e) { throw new IDOAddRelationshipException(e, this); } } /** * * <p>Gracefully executes {@link Statement#executeUpdate(String)} with * default {@link Connection}</p> * @param sqlQuery to execute. UPDATE, DELETE, INSERT statements only, * not <code>null</code>; * @return <code>true</code> if executed, <code>false</code> otherwise; * @author <a href="mailto:martynas@idega.is">Martynas Stakė</a> */ protected boolean executeUpdate(String sqlQuery) { if (StringUtil.isEmpty(sqlQuery)) { return Boolean.FALSE; } Connection connection = null; Statement statement = null; /* Opening connection */ try { connection = getConnection(); statement = connection.createStatement(); } catch (SQLException e) { getLogger().log(Level.WARNING, "Failed to create connection cause of:", e); return Boolean.FALSE; } logSQL(sqlQuery); /* Executing query */ boolean result = Boolean.FALSE; try { statement.executeUpdate(sqlQuery); result = Boolean.TRUE; } catch (SQLException e) { getLogger().log(Level.WARNING, "Failed to perform update cause of:", e); } /* Closing */ try { statement.close(); } catch (SQLException e) { getLogger().log(Level.WARNING, "Failed to close connection, cause of: ", e); } freeConnection(connection); return result; } /** * * <p>Inserts given primary keys of entities into required relation table.</p> * @param entities to add, not <code>null</code>; * @param relatedTableName is name of relation table with this entity, * not <code>null</code>; * @return <code>true</code> if successfully updated, <code>false</code> * otherwise; * @author <a href="mailto:martynas@idega.is">Martynas Stakė</a> */ protected boolean idoAddTo(Collection<? extends IDOEntity> entities, String relatedTableName) { if (StringUtil.isEmpty(relatedTableName) || ListUtil.isEmpty(entities)) { return Boolean.FALSE; } /* Creating query */ StringBuilder query = new StringBuilder(); try { query.append("INSERT INTO ").append(relatedTableName).append(CoreConstants.SPACE) .append(CoreConstants.BRACKET_LEFT) .append(getIDColumnName()).append(CoreConstants.COMMA).append(entities.iterator().next().getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName()) .append(CoreConstants.BRACKET_RIGHT).append(CoreConstants.SPACE) .append("VALUES "); } catch (IDOCompositePrimaryKeyException e1) { getLogger().log(Level.WARNING, "Failed to get primary key of insertable entity, cause of: ", e1); return Boolean.FALSE; } for (Iterator<? extends IDOEntity> iterator = entities.iterator(); iterator.hasNext();) { query.append(CoreConstants.BRACKET_LEFT) .append(getPrimaryKeyValueSQLString()).append(CoreConstants.COMMA) .append(iterator.next().getPrimaryKey().toString()) .append(CoreConstants.BRACKET_RIGHT); if (iterator.hasNext()) { query.append(CoreConstants.COMMA).append(CoreConstants.SPACE); } } return executeUpdate(query.toString()); } /** * *Default insert behavior with a many-to-many relationship * * * @throws IDOAddRelationshipException * if there is no relationship with the given entity or there is an * error accessing it */ private void idoAddTo(String middleTableName, String sqlFieldName, Object primaryKey) throws IDOAddRelationshipException { /** * @todo Change implementation */ try { Connection conn = null; Statement Stmt = null; try { conn = getConnection(getDatasource()); Stmt = conn.createStatement(); // String sql = "insert into // "+getNameOfMiddleTable(entityToAddTo,this)+"("+getIDColumnName()+","+entityToAddTo.getIDColumnName()+") // values("+getID()+","+entityToAddTo.getID()+")"; String sql = null; // try // { sql = "insert into " + middleTableName + "(" + getIDColumnName() + "," + sqlFieldName + ") values(" + getPrimaryKeyValueSQLString() + "," + getKeyValueSQLString(primaryKey) + ")"; /* * } catch (RemoteException rme) { throw new * SQLException("RemoteException in addTo, message: " + * rme.getMessage()); } */ // debug("statement: "+sql); Stmt.executeUpdate(sql); } finally { if (Stmt != null) { Stmt.close(); } if (conn != null) { freeConnection(getDatasource(), conn); } } } catch (Exception ex) { // ex.printStackTrace(); throw new IDOAddRelationshipException(ex, this); } } /** * Method to execute an explicit update on the table of this entity bean <br> * <br> * This method then throws away all cache associated with all instances of * <b>THIS</b> entity bean class. * * @throws IDOException * if there is an error with the query or accessing the datastore * */ protected boolean idoExecuteTableUpdate(String sqlUpdateQuery) throws IDOException { try { if (SimpleQuerier.executeUpdate(sqlUpdateQuery, this.getDatasource(), false)) { synchronized (IDOContainer.getInstance().getBeanCache(getDatasource(),this.getInterfaceClass())) { flushQueryCache(); flushBeanCache(); } return true; } return false; } catch (SQLException sqle) { throw new IDOException(sqle, this); } } /** * Method to execute an explicit update on many (undetermined) tables in an * SQL datastore. <br> * <br> * This method then flushes all cache associated with all instances of <b>ALL</b> * entity bean classes. * * @throws IDOException * if there is an error with the query or accessing the datastore * */ protected boolean idoExecuteGlobalUpdate(String sqlUpdateQuery) throws IDOException { try { return SimpleQuerier.executeUpdate(sqlUpdateQuery, getDatasource(), true); } catch (SQLException sqle) { throw new IDOException(sqle, this); } } /** * This method will be changed to return true for "non-legacy" ido beans.<br> * Can be overrided to do an insert (insertForCreate()) when ejbCreate(xx) is * called */ protected boolean doInsertInCreate() { return false; } protected Object insertForCreate() throws CreateException { try { insert(); return this.getPrimaryKey(); } catch (SQLException sqle) { logError("Error in insertForCreate() for PrimaryKey=" + this.getPrimaryKey()); sqle.printStackTrace(); throw new IDOCreateException(sqle); } } @Override public IDOEntityDefinition getEntityDefinition() { return getGenericEntityDefinition(); } private boolean isBeanCachingActive() { try { if (IDOContainer.getInstance().beanCachingActive(getInterfaceClass())) { return true; } return false; } catch (Exception ex) { return false; } } protected IDOUtil getIDOUtil() { return IDOUtil.getInstance(); } @Override public boolean isIdentical(EJBLocalObject obj) { return this.equals(obj); } /** * Method getPrimaryKeyValueSQLString. Gets the primarykey for this record and * returns it value to be added to an sql query.<br> * e.g. if the primary key of of the type String this method returns the value * as = 'value' but if it is an integer as = value . * * @return String */ public String getPrimaryKeyValueSQLString() { return getKeyValueSQLString(getPrimaryKeyValue()); } /** * Method getPrimaryKeyValueSQLString. * * @return String */ /** * Method getKeyValueSQLString. Returns the value to be added to an sql query.<br> * e.g. if the value is of the type String this method returns the value as = * 'value' but if it is an integer as = value . * * @param keyValue * @return String */ public static String getKeyValueSQLString(Object value) { if (value != null) { if (value instanceof String) { return "'" + value.toString() + "'"; } else { return value.toString(); } } else { return null; } } /** * Method isIdColumnValueNotEmpty gets the primarykey value and uses * isColumnValueNotEmpty to check if it is empty or not * * @return boolean */ public boolean isIdColumnValueNotEmpty() { String value = getPrimaryKeyValueSQLString(); return isColumnValueNotEmpty(value); } /** * Method isColumnNotEmpty. This methods checks if the value is null,-1,'-1' * or "" and return false or true. * * @param value * @return boolean return true if the value is non of the above values */ public static boolean isColumnValueNotEmpty(String value) { // not sure if the =0 check is needed if ((value != null) && (!value.equals("-1")) && (!value.equals("'-1'")) && (!value.equals("")) && (!value.equals("0"))) { return true; } else { return false; } } /** * Gets a new empty query * * @return IDOQuery which is new and emtpy */ protected IDOQuery idoQuery() { IDOQuery query = new IDOQuery(); query.setDataStore(DatastoreInterface.getInstance(this)); return query; } protected SelectQuery idoSelectQuery() { SelectQuery query = new SelectQuery(idoQueryTable()); query.addColumn(new WildCardColumn(idoQueryTable())); return query; } protected SelectQuery idoSelectPKQuery() { SelectQuery query = new SelectQuery(idoQueryTable()); query.addColumn(new Column(idoQueryTable(), getIDColumnName())); return query; } protected Table idoQueryTable() { if (this.idoQueryTable == null) { this.idoQueryTable = new Table(this); } return this.idoQueryTable; } /** * * @param sqlQuery * @return IDOQuery with sqlQuery as the query */ protected IDOQuery idoQuery(String sqlQuery) { IDOQuery query = new IDOQuery(sqlQuery); query.setDataStore(DatastoreInterface.getInstance(this)); return query; } /** * @return IDOQuery With a prefixed select statement from this entity record. */ protected IDOQuery idoQueryGetSelect() { IDOQuery query = idoQuery(); query.appendSelectAllFrom(this.getEntityName()); return query; } /** * @return IDOQuery With a prefixed select count statement from this entity * record. */ protected IDOQuery idoQueryGetSelectCount() { IDOQuery query = idoQuery(); query.appendSelectCountFrom(this.getEntityName()); return query; } /** * Method idoFindPKsByQuery. Gets the result of the query. * * @param query * an IDOQuery for this entity. * @return Collection of Primary keys which is a result from the query. * @throws FinderException * if there is an error with the query. */ protected <PK> Collection<PK> idoFindPKsByQuery(IDOQuery query) throws FinderException { return idoFindPKsByQuery(query, -1, -1); } /** * Method idoFindPKsByQuery. Gets the result of the query. * * @param query * an IDOQuery for this entity. * @return Collection of Primary keys which is a result from the query. * @throws FinderException * if there is an error with the query. */ protected <PK> Collection<PK> idoFindPKsByQuery(SelectQuery query) throws FinderException { if (getEntityDefinition().isUseFinderCollectionPrefetch()) { int prefetchSize = getEntityDefinition().getFinderCollectionPrefetchSize(); return idoFindPKsByQueryUsingLoadBalance(query, prefetchSize); } else { return idoFindPKsByQuery(query, -1, -1); } } /** * Method idoFindPKsByQuery. Gets the result of the query. * * @param query * an IDOQuery for this entity. * @return Collection of Primary keys which is a result from the query. * @throws FinderException * if there is an error with the query. */ protected <PK> Collection<PK> idoFindPKsByQuery(IDOQuery query, int returningNumberOfEntities) throws FinderException { return idoFindPKsByQuery(query, returningNumberOfEntities, -1); } /** * Method idoFindPKsByQuery. Gets the result of the query. * * @param query * an SelectQuery for this entity. * @return Collection of Primary keys which is a result from the query. * @throws FinderException * if there is an error with the query. */ protected <PK> Collection<PK> idoFindPKsByQuery(SelectQuery query, int returningNumberOfEntities) throws FinderException { return idoFindPKsByQuery(query, returningNumberOfEntities, -1); } /** * Method idoFindPKsByQuery. Gets the result of the query. * * @param query * an IDOQuery for this entity. * @return Collection of Primary keys which is a result from the query. * @throws FinderException * if there is an error with the query. */ protected <PK> Collection<PK> idoFindPKsByQuery(IDOQuery query, int returningNumberOfEntities, int startingEntry) throws FinderException { return idoFindPKsBySQL(query.toString(), returningNumberOfEntities, startingEntry, null); } /** * Method idoFindPKsByQuery. Gets the result of the query. * * @param query * an SelectQuery for this entity. * @return Collection of Primary keys which is a result from the query. * @throws FinderException * if there is an error with the query. */ protected <PK> Collection<PK> idoFindPKsByQuery(SelectQuery query, int returningNumberOfEntities, int startingEntry) throws FinderException { return idoFindPKsBySQL(query.toString(), returningNumberOfEntities, startingEntry, query); } /** * Method idoFindOnePKByQuery. Gets the one primary key of the query or the * first result if there are many results.* * * @param query * an IDOQuery for this entity. * @return Object which is the primary key of the object found from the query. * @throws FinderException * if nothing found or there is an error with the query. */ protected <PK> PK idoFindOnePKByQuery(IDOQuery query) throws FinderException { return idoFindOnePKBySQL(query.toString(), null); } /** * Method idoFindOnePKBySelectQuery. Gets the one primary key of the query or * the first result if there are many results.* * * @param query * an IDOQuery for this entity. * @return Object which is the primary key of the object found from the query. * @throws FinderException * if nothing found or there is an error with the query. */ protected Object idoFindOnePKByQuery(SelectQuery query) throws FinderException { return idoFindOnePKBySQL(query.toString(), query); } /** * Default implimentation for IDOReportableEntity * * @param field * @return */ public Object getFieldValue(IDOReportableField field) { return this.getColumnValue(field.getName()); } /** * Convenience method to get a reference to a home for an entity * * @param entityClass * The entity interface class to get a reference to its home. * @return the home instance */ protected IDOHome getIDOHome(Class entityClass) throws IDOLookupException { return IDOLookup.getHome(entityClass); } /* * (non-Javadoc) * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { StringBuffer buffer = new StringBuffer(); buffer.append(getEntityName()); buffer.append(getPrimaryKey().hashCode()); return buffer.toString().hashCode(); } // STANDARD LOGGING METHODS: /** * Logs out to the default log level (which is by default INFO) * * @param msg * The message to log out */ protected void log(String msg) { // System.out.println(string); getLogger().log(getDefaultLogLevel(), msg); } /** * Logs out to the error log level (which is by default WARNING) to the * default Logger * * @param e * The Exception to log out */ protected void log(Exception e) { LoggingHelper.logException(e, this, getLogger(), getErrorLogLevel()); } /** * Logs out to the specified log level to the default Logger * * @param level * The log level * @param msg * The message to log out */ protected void log(Level level, String msg) { // System.out.println(msg); getLogger().log(level, msg); } /** * Logs out to the error log level (which is by default WARNING) to the * default Logger * * @param msg * The message to log out */ protected void logError(String msg) { // System.err.println(msg); getLogger().log(getErrorLogLevel(), msg); } /** * Logs out to the debug log level (which is by default FINER) to the default * Logger * * @param msg * The message to log out */ protected void logDebug(String msg) { System.err.println(msg); getLogger().log(getDebugLogLevel(), msg); } /** * Logs out to the SEVERE log level to the default Logger * * @param msg * The message to log out */ protected void logSevere(String msg) { // System.err.println(msg); getLogger().log(Level.SEVERE, msg); } /** * Logs out to the WARNING log level to the default Logger * * @param msg * The message to log out */ protected void logWarning(String msg) { // System.err.println(msg); getLogger().log(Level.WARNING, msg); } /** * Logs out to the CONFIG log level to the default Logger * * @param msg * The message to log out */ protected void logConfig(String msg) { // System.err.println(msg); getLogger().log(Level.CONFIG, msg); } /** * Logs out to the debug log level to the default Logger * * @param msg * The message to log out */ protected void debug(String msg) { logDebug(msg); } /** * Gets the default Logger. By default it uses the package and the class name * to get the logger.<br> * This behaviour can be overridden in subclasses. * * @return the default Logger */ protected Logger getLogger() { return Logger.getLogger(this.getClass().getName()); } /** * Gets the log level which messages are sent to when no log level is given. * * @return the Level */ protected Level getDefaultLogLevel() { return Level.INFO; } /** * Gets the log level which debug messages are sent to. * * @return the Level */ protected Level getDebugLogLevel() { return Level.FINER; } /** * Gets the log level which error messages are sent to. * * @return the Level */ protected Level getErrorLogLevel() { return Level.WARNING; } public void addIndex(String field) { getGenericEntityDefinition().addIndex(field); } public void addIndex(String name, String field) { getGenericEntityDefinition().addIndex(name, field); } public void addIndex(String name, String[] fields) { getGenericEntityDefinition().addIndex(name, fields); } public void hasAutoIncrement(boolean autoIncrement) { getEntityDefinition().setHasAutoIncrementColumn(autoIncrement); } public boolean getIfAutoIncrement() { return getEntityDefinition().hasAutoIncrementColumn(); } // ENTITY SPECIFIC LOG MEHTODS: // /** // * This method outputs the outputString to System.out if the Application // property // * "debug" is set to "TRUE" // */ // public void debug(String outputString) { // if (isDebugActive()) { // //System.out.println("[DEBUG] \"" + outputString + "\" : " + // this.getEntityName()); // } // } /** * This method logs the sqlCommand if the Log Level is low enough */ public void logSQL(String sqlCommand) { log(Level.FINEST, sqlCommand); // if (isDebugActive()) { // System.out.println("[DEBUG] \"" + outputString + "\" : " + // this.getEntityName()); // } } protected boolean isDebugActive() { return getIWMainApplication().getSettings().isDebugActive(); } public IWMainApplication getIWMainApplication() { return IWMainApplication.getDefaultIWMainApplication(); } // END STANDARD LOGGING METHODS /** * Adds a unique id string column to this entity that is filled with a * generated id when the entity is first stored.<br> * The UID is a 36 character long string (128bit). The default implementation * generates the string with a combination of a <br> * dummy ip address and a time based random number generator.<br> * For more info see the JUG project, * http://www.doomdark.org/doomdark/proj/jug/ An example uid: * ac483688-b6ed-4f45-ac64-c105e599d482 */ protected void addUniqueIDColumn() { addAttribute(getUniqueIdColumnName(), "A generated unique id do not change manually!", String.class, 36); setUnique(getUniqueIdColumnName(), true); } /** * A convenience method that you can use if your entity has the UniqueID * column.<br> * If you make your IDO interface extend the UniqueIDCapable interface you get * this method added to your bean. * * @return The unique id string of the entity if it has it, otherwise null */ public String getUniqueId() { if (hasUniqueIDColumn()) { return getStringColumnValue(getUniqueIdColumnName()); } return null; } /** * <p> * Gets the BeanCache instance for this entity and datasource. * </p> * @return */ protected IDOBeanCache getBeanCache(){ return IDOContainer.getInstance().getBeanCache(getDatasource(), getInterfaceClass()); } /** * <p> * Gets the collection of cached entities for this entity and datasource * </p> * @return */ protected Collection getCachedEntities(){ return getBeanCache().getCachedEntities(); } public ExplicitlySynchronizedEntity getSimpleExplicitlySynchronizedEntityEntity() { ExplicitlySynchronizedEntityImpl entity = new ExplicitlySynchronizedEntityImpl(); entity.setPK(getPrimaryKey()); if(this instanceof ExplicitlySynchronizedEntity){ ExplicitlySynchronizedEntity thisEntity = (ExplicitlySynchronizedEntity) this; entity.setSynchronizerKey(thisEntity.getSynchronizerKey()); entity.setChanges(getChanges()); } return entity; } public Collection<String> getChanges(){ if(this._updatedColumns == null){ return null; } return _updatedColumns.keySet(); } public String getPK() { return getStringColumnValue(getIDColumnName()); } private class ExplicitlySynchronizedEntityImpl implements ExplicitlySynchronizedEntity{ private String synchronizerKey; private String PK; private Collection<String> changes; @Override public String getSynchronizerKey() { return synchronizerKey; } public void setSynchronizerKey(String synchronizerKey) { this.synchronizerKey = synchronizerKey; } @Override public String getPK() { return PK; } public void setPK(Object pK) { PK = pK.toString(); } @Override public ExplicitlySynchronizedEntity getSimpleExplicitlySynchronizedEntityEntity() { return this; } public boolean equals(ExplicitlySynchronizedEntity entity) { return (entity.getPK().equals(PK) && entity.getSynchronizerKey().equals(synchronizerKey)); } @Override public Collection<String> getChanges(){ return changes; } public void setChanges(Collection<String> changes){ this.changes = changes; } } }