r2809 - in trunk: topia-persistence/src/main/java/org/nuiton/topia topia-persistence/src/main/java/org/nuiton/topia/framework topia-persistence/src/main/java/org/nuiton/topia/generator topia-persistence/src/main/java/org/nuiton/topia/persistence topia-service-security/src/main/java/org/nuiton/topia/security/entities/authorization topia-service-security/src/main/java/org/nuiton/topia/taas
Author: athimel Date: 2013-10-02 18:24:51 +0200 (Wed, 02 Oct 2013) New Revision: 2809 Url: http://nuiton.org/projects/topia/repository/revisions/2809 Log: refs #2087 Fix AbstractTopiaContext implementation Fix TopiaEntityContextable generation Apply changes in topia-services-security (deprecated) Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityAbstract.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityContextable.java trunk/topia-service-security/src/main/java/org/nuiton/topia/security/entities/authorization/TopiaAssociationAuthorizationImpl.java trunk/topia-service-security/src/main/java/org/nuiton/topia/taas/TaasService.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-10-02 09:02:12 UTC (rev 2808) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-10-02 16:24:51 UTC (rev 2809) @@ -157,12 +157,8 @@ checkClosed(); try { - Query query = hibernateSupport.getHibernateSession().createQuery(jpaql); - for (Map.Entry<String, Object> entry : parameters.entrySet()) { - String name = entry.getKey(); - Object value = entry.getValue(); - query.setParameter(name, value); - } + Query query = prepareQuery(jpaql, parameters); + int result = query.executeUpdate(); return result; } catch (HibernateException eee) { Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java 2013-10-02 09:02:12 UTC (rev 2808) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java 2013-10-02 16:24:51 UTC (rev 2809) @@ -730,7 +730,7 @@ entityClass.getName())); } - TopiaDAOImpl<E> result = (TopiaDAOImpl<E>) daoCache.get(entityClass); + TopiaDAO<E> result = (TopiaDAO<E>) daoCache.get(entityClass); if (result == null) { // looking for specialized DAO @@ -738,9 +738,9 @@ // si on utilise la génération String daoClassname = entityClass.getName() + "DAO"; try { - Class<TopiaDAOImpl<E>> daoClass = - (Class<TopiaDAOImpl<E>>) Class.forName(daoClassname); - TopiaDAOImpl<E> spe = daoClass.getConstructor().newInstance(); + Class<TopiaDAO<E>> daoClass = + (Class<TopiaDAO<E>>) Class.forName(daoClassname); + TopiaDAO<E> spe = daoClass.getConstructor().newInstance(); result = spe; } catch (Exception eee) { log.warn("specialized DAO " + daoClassname + @@ -748,7 +748,11 @@ result = new TopiaDAOImpl<E>(); } - result.init(this, entityClass, getFiresSupport()); + if (result instanceof TopiaDAOImpl) { // backward compatibility + ((TopiaDAOImpl)result).init(this, entityClass, getFiresSupport()); + } else if (result instanceof AbstractTopiaDAO) { + ((AbstractTopiaDAO)result).init(this, this, this, this, getTopiaIdFactory(), getFiresSupport(), this); + } daoCache.put(entityClass, result); } return result; @@ -979,30 +983,9 @@ checkClosed(String.format("This context is closed, it is not possible to release the operation '%1$s'", "findAll")); - try { - Query query = getHibernate().createQuery(jpaql); - for (int j = 0; j < propertyNamesAndValues.length; j += 2) { - String name = (String) propertyNamesAndValues[j]; - Object value = propertyNamesAndValues[j + 1]; - if (value.getClass().isArray()) { - query.setParameterList(name, (Object[]) value); - } else if (value instanceof Collection<?>) { - query.setParameterList(name, (Collection<?>) value); - } else { - query.setParameter(name, value); - } - } - // tchemit 2010-11-30 reproduce the same behaviour than before with the dao legacy - if (useFlushMode) { - query.setFlushMode(FlushMode.AUTO); - } - List result = query.list(); - result = firesSupport.fireEntitiesLoad(this, result); - return result; - } catch (HibernateException eee) { - throw new TopiaException(String.format("An error occurs while query operation: %1$s : %2$s", - jpaql, eee.getMessage()), eee); - } + Map<String, Object> parameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues); + List<E> result = findAll(jpaql, parameters); + return result; } @Override @@ -1011,32 +994,9 @@ checkClosed(String.format("This context is closed, it is not possible to release the operation '%1$s'", "find")); - try { - Query query = getHibernate().createQuery(jpaql); - for (int j = 0; j < propertyNamesAndValues.length; j += 2) { - String name = (String) propertyNamesAndValues[j]; - Object value = propertyNamesAndValues[j + 1]; - if (value.getClass().isArray()) { - query.setParameterList(name, (Object[]) value); - } else if (value instanceof Collection<?>) { - query.setParameterList(name, (Collection<?>) value); - } else { - query.setParameter(name, value); - } - } - query.setFirstResult(startIndex); - query.setMaxResults(endIndex - startIndex + 1); - // tchemit 2010-11-30 reproduce the same behaviour than before with the dao legacy - if (useFlushMode) { - query.setFlushMode(FlushMode.AUTO); - } - List result = query.list(); - result = firesSupport.fireEntitiesLoad(this, result); - return result; - } catch (HibernateException eee) { - throw new TopiaException(String.format("An error occurs while query operation: %1$s : %2$s", - jpaql, eee.getMessage()), eee); - } + Map<String, Object> parameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues); + List<E> result = find(jpaql, startIndex, endIndex, parameters); + return result; } @Override @@ -1075,12 +1035,42 @@ checkClosed(String.format("This context is closed, it is not possible to release the operation '%1$s'", "find")); + Map<String, Object> parameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues); + int result = execute(jpaql, parameters); + return result; + } + + + protected Query prepareQuery(String jpaql, Map<String, Object> parameters) { + Query query = getHibernate().createQuery(jpaql); + for (Map.Entry<String, Object> entry : parameters.entrySet()) { + String name = entry.getKey(); + Object value = entry.getValue(); + if (value.getClass().isArray()) { + query.setParameterList(name, (Object[]) value); + } else if (value instanceof Collection<?>) { + query.setParameterList(name, (Collection<?>) value); + } else { + query.setParameter(name, value); + } + } + // tchemit 2010-11-30 reproduce the same behaviour than before with the dao legacy + if (useFlushMode) { + query.setFlushMode(FlushMode.AUTO); + } + return query; + } + + @Override + public <T> List<T> findAll(String jpaql, Map<String, Object> parameters) { + checkClosed(String.format("This context is closed, it is not possible to release the operation '%1$s'", + "findAll")); + try { - Query query = getHibernate().createQuery(jpaql); - for (int j = 0; j < propertyNamesAndValues.length; j += 2) { - query.setParameter((String) propertyNamesAndValues[j], propertyNamesAndValues[j + 1]); - } - int result = query.executeUpdate(); + Query query = prepareQuery(jpaql, parameters); + + List result = query.list(); + result = firesSupport.fireEntitiesLoad(this, result); return result; } catch (HibernateException eee) { throw new TopiaException(String.format("An error occurs while query operation: %1$s : %2$s", @@ -1088,20 +1078,41 @@ } } - @Override - public <T> List<T> findAll(String jpaql, Map<String, Object> parameters) { - throw new UnsupportedOperationException("This method is not available on TopiaContext, please use TopiaJpaSupport"); - } + public <T> List<T> find(String jpaql, int startIndex, int endIndex, Map<String, Object> parameters) { + checkClosed(String.format("This context is closed, it is not possible to release the operation '%1$s'", + "find")); - @Override - public <T> List<T> find(String jpaql, int startIndex, int endIndex, Map<String, Object> parameters) { - throw new UnsupportedOperationException("This method is not available on TopiaContext, please use TopiaJpaSupport"); + try { + Query query = prepareQuery(jpaql, parameters); + + query.setFirstResult(startIndex); + query.setMaxResults(endIndex - startIndex + 1); + + List result = query.list(); + result = firesSupport.fireEntitiesLoad(this, result); + return result; + } catch (HibernateException eee) { + throw new TopiaException(String.format("An error occurs while query operation: %1$s : %2$s", + jpaql, eee.getMessage()), eee); + } } @Override public int execute(String jpaql, Map<String, Object> parameters) { - throw new UnsupportedOperationException("This method is not available on TopiaContext, please use TopiaJpaSupport"); + checkClosed(String.format("This context is closed, it is not possible to release the operation '%1$s'", + "find")); + + try { + Query query = prepareQuery(jpaql, parameters); + + int result = query.executeUpdate(); + return result; + } catch (HibernateException eee) { + throw new TopiaException(String.format("An error occurs while query operation: %1$s : %2$s", + jpaql, eee.getMessage()), eee); + } + } @Override Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java 2013-10-02 09:02:12 UTC (rev 2808) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java 2013-10-02 16:24:51 UTC (rev 2809) @@ -25,6 +25,16 @@ package org.nuiton.topia.framework; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.beans.VetoableChangeSupport; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.apache.commons.collections.map.IdentityMap; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; @@ -50,6 +60,7 @@ import org.hibernate.event.spi.SaveOrUpdateEvent; import org.hibernate.event.spi.SaveOrUpdateEventListener; import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaDAOSupplier; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaJpaSupport; import org.nuiton.topia.TopiaPersistenceContext; @@ -71,16 +82,6 @@ import org.nuiton.util.CategorisedListenerSet; import org.nuiton.util.ListenerSet; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.beans.VetoableChangeSupport; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * TODO-fdesbois-20100507 : Need translation of javadoc. * <p/> @@ -605,12 +606,12 @@ } private void attachContext(Object entity, - AbstractTopiaDAO dao) { + TopiaDAOSupplier daoSupplier) { if (entity instanceof TopiaEntityContextable) { TopiaEntityContextable topiaEntityContextable = (TopiaEntityContextable) entity; - if (topiaEntityContextable.getTopiaDAO() == null) { + if (topiaEntityContextable.getTopiaDAOSupplier() == null) { try { - topiaEntityContextable.setTopiaDAO(dao); + topiaEntityContextable.setTopiaDAOSupplier(daoSupplier); } catch (TopiaException eee) { if (log.isWarnEnabled()) { log.warn("Impossible d'initialiser le TopiaContext" @@ -676,9 +677,11 @@ public void onPostLoad(PostLoadEvent event) { // TopiaContextImplementor context = getContext(rootContext, event // .getSession()); - AbstractTopiaDAO dao = null; // TODO brendan 30/09/13 Implment - if (dao != null && event.getEntity() instanceof TopiaEntity) { - attachContext(event.getEntity(), dao); + TopiaDAOSupplier daoSupplier = null; // TODO brendan 30/09/13 Implment + if (daoSupplier != null && event.getEntity() instanceof TopiaEntity) { + attachContext(event.getEntity(), daoSupplier); + TopiaEntity entity = (TopiaEntity)event.getEntity(); + AbstractTopiaDAO<? extends TopiaEntity> dao = (AbstractTopiaDAO)daoSupplier.getDAO(entity.getClass()); dao.getTopiaFiresSupport().fireOnPostLoad(dao, (TopiaEntity) event.getEntity(), new Object[]{}); } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java 2013-10-02 09:02:12 UTC (rev 2808) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java 2013-10-02 16:24:51 UTC (rev 2809) @@ -40,8 +40,11 @@ import org.nuiton.eugene.models.object.ObjectModelOperation; import org.nuiton.eugene.models.object.ObjectModelParameter; import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaDAOSupplier; import org.nuiton.topia.TopiaException; +import org.nuiton.topia.persistence.AbstractTopiaDAO; import org.nuiton.topia.persistence.EntityVisitor; +import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityAbstract; import org.nuiton.topia.persistence.TopiaEntityContextable; @@ -342,32 +345,32 @@ if (TopiaGeneratorUtil.isContextable(input)) { - addImport(outputAbstract, TopiaContext.class); + addImport(outputAbstract, TopiaDAOSupplier.class); // topiaContext attribute ObjectModelAttribute topiaContextAttribute = addAttribute( - outputAbstract, "topiaContext", TopiaContext.class, null, + outputAbstract, "topiaDAOSupplier", TopiaDAOSupplier.class, null, ObjectModelJavaModifier.PROTECTED, ObjectModelJavaModifier.TRANSIENT); setDocumentation(topiaContextAttribute, - "TopiaContext instance associated with the current \n" + + "TopiaDAO instance associated with the current \n" + "instance. For internal usage only"); ObjectModelOperation op = addOperation(outputAbstract, - "getTopiaContext", TopiaContext.class, + "getTopiaDAOSupplier", TopiaDAOSupplier.class, ObjectModelJavaModifier.PUBLIC); setDocumentation(op,"@since 3.0"); addAnnotation(outputAbstract, op, Override.class); setOperationBody(op, "" /*{ - return topiaContext; + return topiaDAOSupplier; }*/ ); op = addOperation(outputAbstract, - "setTopiaContext", "void", + "setTopiaDAOSupplier", "void", ObjectModelJavaModifier.PUBLIC); addException(op, TopiaException.class); - addParameter(op, TopiaContext.class, "context"); + addParameter(op, TopiaDAOSupplier.class, "topiaDAOSupplier"); setDocumentation(op, // "@param context The context to set.\n" + // "@throws TopiaException if trying to replace a context\n" + @@ -375,8 +378,8 @@ addAnnotation(outputAbstract, op, Override.class); setOperationBody(op, "" /*{ - if (topiaContext == null) { - topiaContext = context; + if (this.topiaDAOSupplier == null) { + this.topiaDAOSupplier = topiaDAOSupplier; // } else { // throw new TopiaException("TopiaContext replacement is forbidden"); } @@ -390,7 +393,7 @@ addAnnotation(outputAbstract, op, Override.class); setOperationBody(op, "" /*{ - getTopiaContext().getDAO(<%=input.getName()%>.class).update(this); + getTopiaDAOSupplier().getDAO(<%=input.getName()%>.class).update(this); }*/ ); @@ -400,7 +403,7 @@ addAnnotation(outputAbstract, op, Override.class); setOperationBody(op, "" /*{ - getTopiaContext().getDAO(<%=input.getName()%>.class).delete(this); + getTopiaDAOSupplier().getDAO(<%=input.getName()%>.class).delete(this); }*/ ); } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java 2013-10-02 09:02:12 UTC (rev 2808) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java 2013-10-02 16:24:51 UTC (rev 2809) @@ -269,7 +269,7 @@ if (entity instanceof TopiaEntityContextable) { TopiaEntityContextable contextable = (TopiaEntityContextable) entity; - contextable.setTopiaDAO(this); + contextable.setTopiaDAOSupplier(this.topiaDAOSupplier); } // save entity @@ -861,18 +861,18 @@ @Deprecated public E findByProperty(String propertyName, Object value) { - return newQueryBuilder().forProperties(propertyName, value).findUniqueOrNull(); + return newQueryBuilder().forProperties(propertyName, value).findAnyOrNull(); } @Override - public <R> R findByQuery(Class<R> type, String hql, Object... propertyNamesAndValues) throws TopiaException { + public <R> R findByQuery(Class<R> type, String hql, Object... propertyNamesAndValues) { Map<String, Object> properties = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues); return findAny(hql, properties, type); } @Override - public E findByPrimaryKey(Map<String, Object> keys) throws TopiaException { - return newQueryBuilder().forProperties(keys).findAnyOrNull(); + public E findByPrimaryKey(Map<String, Object> keys) { + return newQueryBuilder().forProperties(keys).findUniqueOrNull(); } @Override @@ -1166,7 +1166,7 @@ } // get the count (removing the order-by) - long count2 = dao.countByQuery("SELECT COUNT(*) " + + long count2 = dao.count("SELECT COUNT(*) " + hql.substring(0, i), params); pager = new TopiaPagerBean(); pager.setRecords(count2); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityAbstract.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityAbstract.java 2013-10-02 09:02:12 UTC (rev 2808) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityAbstract.java 2013-10-02 16:24:51 UTC (rev 2809) @@ -208,7 +208,7 @@ if (fireSupport == null) { if (this instanceof TopiaEntityContextable) { TopiaEntityContextable contextable = (TopiaEntityContextable) this; - AbstractTopiaDAO topiaDAO = contextable.getTopiaDAO(); + AbstractTopiaDAO topiaDAO = (AbstractTopiaDAO)contextable.getTopiaDAOSupplier().getDAO(getClass()); fireSupport = topiaDAO.getTopiaFiresSupport(); } } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityContextable.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityContextable.java 2013-10-02 09:02:12 UTC (rev 2808) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityContextable.java 2013-10-02 16:24:51 UTC (rev 2809) @@ -26,6 +26,7 @@ package org.nuiton.topia.persistence; import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaDAOSupplier; /** * {@link TopiaEntity} with {@link TopiaContext} support (injected by @@ -49,8 +50,8 @@ */ void delete(); - void setTopiaDAO(AbstractTopiaDAO topiaDAO); + void setTopiaDAOSupplier(TopiaDAOSupplier topiaDAO); - AbstractTopiaDAO getTopiaDAO(); + TopiaDAOSupplier getTopiaDAOSupplier(); } Modified: trunk/topia-service-security/src/main/java/org/nuiton/topia/security/entities/authorization/TopiaAssociationAuthorizationImpl.java =================================================================== --- trunk/topia-service-security/src/main/java/org/nuiton/topia/security/entities/authorization/TopiaAssociationAuthorizationImpl.java 2013-10-02 09:02:12 UTC (rev 2808) +++ trunk/topia-service-security/src/main/java/org/nuiton/topia/security/entities/authorization/TopiaAssociationAuthorizationImpl.java 2013-10-02 16:24:51 UTC (rev 2809) @@ -26,16 +26,15 @@ package org.nuiton.topia.security.entities.authorization; +import java.util.HashSet; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; +import org.nuiton.topia.persistence.AbstractTopiaDAO; +import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaId; -import org.nuiton.topia.security.entities.user.TopiaUserImpl; -import java.util.HashSet; -import java.util.List; - import static org.nuiton.topia.security.util.TopiaSecurityUtil.actionsString2Int; /** @@ -70,12 +69,12 @@ String select = "count(test)"; String from = TopiaId.getClassNameAsString(thisExpression) + " test join test." + nameAssociation + " as association"; String where = "test.topiaId=:test and association.topiaId=:association"; - TopiaContext context = getTopiaContext(); + TopiaDAO<? extends TopiaAssociationAuthorizationImpl> dao = getTopiaDAOSupplier().getDAO(getClass()); try { - List<?> find = context.findAll("select " + select + " from " + from + " where " + where, + Long count = dao.countByQuery("select " + select + " from " + from + " where " + where, "test", thisExpression, "association", thatExpression); - return (Long)find.get(0) >= 1; + return count >= 1; } catch (TopiaException e) { if (log.isDebugEnabled()) { log.debug("", e); Modified: trunk/topia-service-security/src/main/java/org/nuiton/topia/taas/TaasService.java =================================================================== --- trunk/topia-service-security/src/main/java/org/nuiton/topia/taas/TaasService.java 2013-10-02 09:02:12 UTC (rev 2808) +++ trunk/topia-service-security/src/main/java/org/nuiton/topia/taas/TaasService.java 2013-10-02 16:24:51 UTC (rev 2809) @@ -460,7 +460,8 @@ List<Permission> permissions; if (entity instanceof TopiaEntityContextable) { try { - TopiaContext topiaContext = ((TopiaEntityContextable)entity).getTopiaContext(); + TopiaContext topiaContext = null; // TODO AThimel 02/10/13 Find another why to get the TopiaContext +// TopiaContext topiaContext = ((TopiaEntityContextable)entity).getTopiaContext(); TopiaContextImplementor transaction = (TopiaContextImplementor)topiaContext; TopiaDAO<?> dao = transaction.getDAO(klass); permissions = dao.getRequestPermission(topiaId, actions);
participants (1)
-
athimel@users.nuiton.org