package org.infoglue.cms.util.workflow.hibernate; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.infoglue.cms.controllers.kernel.impl.simple.LuceneController; import org.infoglue.deliver.util.Timer; import net.sf.hibernate.HibernateException; import net.sf.hibernate.Session; import net.sf.hibernate.SessionFactory; import com.opensymphony.module.propertyset.PropertyException; import com.opensymphony.module.propertyset.hibernate.HibernatePropertySetDAO; import com.opensymphony.module.propertyset.hibernate.PropertySetItem; /** * Quickfix */ public class InfoglueHibernatePropertySetDAOImpl implements HibernatePropertySetDAO { private final static Logger logger = Logger.getLogger(InfoglueHibernatePropertySetDAOImpl.class.getName()); /** * */ private SessionFactory sessionFactory; /** * */ public InfoglueHibernatePropertySetDAOImpl(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } /** * */ public void setImpl(PropertySetItem item, boolean isUpdate) { Session session = null; String entityNameIdKey = "" + item.getEntityName() + "_" + item.getEntityId(); logger.info("setImpl....:" + entityNameIdKey); logger.info("setImpl....:" + item.getKey() + "=" + item.getStringVal()); Map<String,Object> keyMap = entityNameIdKeyMap.get(entityNameIdKey); Map<String,Object> valueMap = entityNameIdValueMap.get(entityNameIdKey); //logger.info("entityNameIdValueMap:" + entityNameIdValueMap); //logger.info("valueMap:" + valueMap); if(valueMap != null) { //logger.info("Removing :" + item.getKey()); valueMap.remove(item.getKey()); } if(keyMap != null) { //logger.info("Removing knowledge of " + item.getKey() + " so that it will get search for in the database"); if(keyMap.containsKey(item.getKey())) { keyMap.remove(item.getKey()); //logger.info("Rereading object..."); findByKey(item.getEntityName(), item.getEntityId(), item.getKey()); } else { keyMap.put(item.getKey(), true); //logger.info("Rereading object..."); findByKey(item.getEntityName(), item.getEntityId(), item.getKey()); } } try { session = this.sessionFactory.openSession(); if (isUpdate) { session.update(item); } else { session.save(item); } session.flush(); } catch (HibernateException he) { throw new PropertyException("Could not save key '" + item.getKey() + "':" + he.getMessage()); } finally { try { if (session != null) { if (!session.connection().getAutoCommit()) { session.connection().commit(); } session.close(); } } catch (Exception e) { } } if(valueMap != null) { //logger.info("Removing :" + item.getKey()); valueMap.put(item.getKey(), item); } } public Collection getKeys(String entityName, Long entityId, String prefix, int type) { //logger.info("getKeys"); Session session = null; List list = null; try { session = this.sessionFactory.openSession(); list = InfoglueHibernatePropertySetDAOUtils.getKeysImpl(session, entityName, entityId, prefix, type); } catch (HibernateException e) { list = Collections.EMPTY_LIST; } finally { try { if (session != null) { session.flush(); session.close(); } } catch (Exception e) { } } return list; } public PropertySetItem create(String entityName, long entityId, String key) { return new InfogluePropertySetItemImpl(entityName, entityId, key); } private static Map<String, Map<String,Object>> entityNameIdKeyMap = new HashMap<String, Map<String,Object>>(); private static Map<String, Map<String,Object>> entityNameIdValueMap = new HashMap<String, Map<String,Object>>(); public PropertySetItem findByKey(String entityName, Long entityId, String key) { Timer t = new Timer(); String entityNameIdKey = "" + entityName + "_" + entityId; //logger.info("findByKey: " + entityNameIdKey); Map<String,Object> keyMap = entityNameIdKeyMap.get(entityNameIdKey); Map<String,Object> valueMap = entityNameIdValueMap.get(entityNameIdKey); //logger.info("entityNameIdValueMap:" + entityNameIdValueMap); if(keyMap == null) { keyMap = new HashMap<String,Object>(); entityNameIdKeyMap.put(entityNameIdKey, keyMap); List<String> keyList = (List<String>)getKeys(entityName, entityId, null, 0); for(String currentKey : keyList) { //logger.info("Found:" + currentKey); keyMap.put(currentKey, true); } } if(valueMap == null) { valueMap = new HashMap<String,Object>(); entityNameIdValueMap.put(entityNameIdKey, valueMap); } /* if(valueMap != null && valueMap.get(key) != null) { PropertySetItem item = (PropertySetItem)valueMap.get(key); if(key.equals("workflow_status") || key.indexOf("languageId") > -1) { logger.info("cached Key:" + key); logger.info("cached Item:" + item.getType()); logger.info("cached Item:" + item.getStringVal()); } //logger.info("Cached item exists:" + key); return item; } if(keyMap != null && keyMap.get(key) == null) { //logger.info("No key in cached key map... returning null for:" + key); return null; } */ Session session = null; PropertySetItem item = null; try { session = this.sessionFactory.openSession(); item = InfoglueHibernatePropertySetDAOUtils.getItem(session, entityName, entityId, key); session.flush(); } catch (HibernateException e) { //t.printElapsedTime("FindByKey empty: " + entityName + ":" + entityId + ":" + key); //e.printStackTrace(); return null; } finally { try { if (session != null) { session.close(); } } catch (Exception e) { } } if(valueMap != null) valueMap.put(key, item); if(key.equals("workflow_status") || key.indexOf("languageId") > -1) { logger.info("Key:" + key); logger.info("Item:" + item.getType()); logger.info("Item:" + item.getStringVal()); } //t.printElapsedTime("FindByKey: " + entityName + ":" + entityId + ":" + key); return item; } public void remove(String entityName, Long entityId) { logger.info("remove:" + entityName + "_" + entityId); Session session = null; try { session = this.sessionFactory.openSession(); //hani: todo this needs to be optimised rather badly, but I have no idea how Collection keys = getKeys(entityName, entityId, null, 0); Iterator iter = keys.iterator(); while (iter.hasNext()) { String key = (String) iter.next(); String entityNameIdKey = "" + entityName + "_" + entityId; Map<String,Object> valueMap = entityNameIdValueMap.get(entityNameIdKey); if(valueMap != null) { logger.info("Removing " + key); valueMap.remove(key); } session.delete(InfoglueHibernatePropertySetDAOUtils.getItem(session, entityName, entityId, key)); } session.flush(); } catch (HibernateException e) { throw new PropertyException("Could not remove all keys: " + e.getMessage()); } finally { try { if (session != null) { if (!session.connection().getAutoCommit()) { session.connection().commit(); } session.close(); } } catch (Exception e) { } } } public void remove(String entityName, Long entityId, String key) { logger.info("Remove full"); Session session = null; try { session = this.sessionFactory.openSession(); String entityNameIdKey = "" + entityName + "_" + entityId; Map<String,Object> valueMap = entityNameIdValueMap.get(entityNameIdKey); if(valueMap != null) { logger.info("Removing " + key); valueMap.remove(key); } session.delete(InfoglueHibernatePropertySetDAOUtils.getItem(session, entityName, entityId, key)); session.flush(); } catch (HibernateException e) { throw new PropertyException("Could not remove key '" + key + "': " + e.getMessage()); } finally { try { if (session != null) { if (!session.connection().getAutoCommit()) { session.connection().commit(); } session.close(); } } catch (Exception e) { } } } }