Topia-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 4806 discussions
r2810 - in trunk: . topia-persistence/src/main/java/org/nuiton/topia/generator topia-persistence/src/main/java/org/nuiton/topia/persistence topia-service-security/src/test/java/org/nuiton/topia/security
by bleny@users.nuiton.org 03 Oct '13
by bleny@users.nuiton.org 03 Oct '13
03 Oct '13
Author: bleny
Date: 2013-10-03 18:30:27 +0200 (Thu, 03 Oct 2013)
New Revision: 2810
Url: http://nuiton.org/projects/topia/repository/revisions/2810
Log:
refs #2087 review code generated in generated AbstractDAOs
Added:
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/LegacyEntityDAOTransformer.java
Modified:
trunk/pom.xml
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java
trunk/topia-service-security/src/test/java/org/nuiton/topia/security/TopiaSecurityTest.java
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2013-10-02 16:24:51 UTC (rev 2809)
+++ trunk/pom.xml 2013-10-03 16:30:27 UTC (rev 2810)
@@ -228,7 +228,7 @@
<relativizeDecorationLinks>false</relativizeDecorationLinks>
<!-- libs version -->
- <eugeneVersion>2.7.1</eugeneVersion>
+ <eugeneVersion>2.7.3-SNAPSHOT</eugeneVersion>
<nuitonUtilsVersion>2.7</nuitonUtilsVersion>
<nuitonCsvVersion>3.0-alpha-1</nuitonCsvVersion>
<nuitonDecoratorVersion>3.0-alpha-1</nuitonDecoratorVersion>
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2013-10-02 16:24:51 UTC (rev 2809)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2013-10-03 16:30:27 UTC (rev 2810)
@@ -27,11 +27,13 @@
/*{generator option: parentheses = false}*/
/*{generator option: writeString = +}*/
+import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.eugene.GeneratorUtil;
+import org.nuiton.eugene.java.JavaGeneratorUtil;
import org.nuiton.eugene.java.ObjectModelTransformerToJava;
import org.nuiton.eugene.models.object.ObjectModel;
import org.nuiton.eugene.models.object.ObjectModelAssociationClass;
@@ -43,21 +45,16 @@
import org.nuiton.eugene.models.object.ObjectModelJavaModifier;
import org.nuiton.eugene.models.object.ObjectModelOperation;
import org.nuiton.topia.TopiaException;
-import org.nuiton.topia.persistence.TopiaDAO;
import org.nuiton.topia.persistence.TopiaEntity;
-import org.nuiton.util.StringUtil;
-import java.security.Permission;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
/**
* To generate all <code>DAO</code> related classes for a given entity.
@@ -361,23 +358,6 @@
addImport(daoAbstractClass, List.class);
addImport(daoAbstractClass, TopiaException.class);
- boolean enableSecurity = TopiaGeneratorUtil.isClassWithSecurity(clazz);
-
- if (enableSecurity) {
- addImport(daoAbstractClass, ArrayList.class);
- addImport(daoAbstractClass, Permission.class);
- addImport(daoAbstractClass, "org.nuiton.topia.taas.entities.TaasAuthorizationImpl");
- addImport(daoAbstractClass, "org.nuiton.topia.taas.jaas.TaasPermission");
- addImport(daoAbstractClass, "org.nuiton.topia.taas.TaasUtil");
- addImport(daoAbstractClass, TopiaDAO.class);
-
- //FIXME : how to do static imports ?
-//import static org.nuiton.topia.taas.TaasUtil.CREATE;
-//import static org.nuiton.topia.taas.TaasUtil.DELETE;
-//import static org.nuiton.topia.taas.TaasUtil.LOAD;
-//import static org.nuiton.topia.taas.TaasUtil.UPDATE;
- }
-
ObjectModelOperation op;
// getEntityClass
@@ -389,7 +369,7 @@
addAnnotation(daoAbstractClass, op,Override.class);
setOperationBody(op, ""
/*{
- return (Class<E>)<%=clazzName%>.class;
+ return (Class<E>) <%=clazzName%>.class;
}*/
);
@@ -440,97 +420,6 @@
}
}
- if (enableSecurity) {
-
- // getRequestPermission
-
- op = addOperation(daoAbstractClass,
- "getRequestPermission",
- "List<Permission>",
- ObjectModelJavaModifier.PUBLIC);
-// setDocumentation(op, "Retourne les permissions a verifier pour " +
-// "l'acces a l'entite pour le service Taas");
- addException(op, TopiaException.class);
- addParameter(op, String.class, "topiaId");
- addParameter(op, int.class, "actions");
- StringBuilder buffer = new StringBuilder();
- buffer.append(""
-/*{
- List<Permission> resultPermissions = new ArrayList<Permission>();
- if ((actions & TaasUtil.CREATE) == TaasUtil.CREATE) {
-}*/
- );
- buffer.append(generateSecurity(daoAbstractClass, clazz,
- TopiaGeneratorUtil.getSecurityCreateTagValue(clazz)));
- buffer.append(""
-/*{
- }
- if ((actions & TaasUtil.LOAD) == TaasUtil.LOAD) {
-}*/
- );
- buffer.append(generateSecurity(daoAbstractClass, clazz,
- TopiaGeneratorUtil.getSecurityLoadTagValue(clazz)));
- buffer.append(""
-/*{
- }
- if ((actions & TaasUtil.UPDATE) == TaasUtil.UPDATE) {
-}*/
- );
- buffer.append(generateSecurity(daoAbstractClass, clazz,
- TopiaGeneratorUtil.getSecurityUpdateTagValue(clazz)));
- buffer.append(""
-/*{
- }
- if ((actions & TaasUtil.DELETE) == TaasUtil.DELETE) {
-}*/
- );
- buffer.append(generateSecurity(daoAbstractClass, clazz,
- TopiaGeneratorUtil.getSecurityDeleteTagValue(clazz)));
- buffer.append(""
-/*{
- }
- return resultPermissions;
- }*/
- );
-
- setOperationBody(op, buffer.toString());
-
- // THIMEL : Le code suivant doit pouvoir être déplacé dans DAODelegator ?
-
- // getRequestPermission
-
-
- op = addOperation(daoAbstractClass,
- "getRequestPermission",
- "List<Permission>",
- ObjectModelJavaModifier.PROTECTED);
- addParameter(op, String.class, "topiaId");
- addParameter(op, int.class, "actions");
- addParameter(op, String.class, "query");
- addParameter(op, Class.class, "daoClass");
- addException(op, TopiaException.class);
-// setDocumentation(op, "Retourne les permissions a verifier pour " +
-// "l'acces a l'entite pour le service Taas");
- setOperationBody(op, ""
-/*{ TopiaContext context = getTopiaContext();
- List<String> result = context.findAll(query, "id", topiaId);
-
- List<Permission> resultPermissions = new ArrayList<Permission>();
- for (String topiaIdPermission : result) {
- TopiaDAO dao = context.getDAO(daoClass);
- List<Permission> permissions = dao.getRequestPermission(topiaIdPermission, actions);
- if(permissions != null) {
- resultPermissions.addAll(permissions);
- } else {
- TaasPermission permission = new TaasPermission(topiaIdPermission, actions);
- resultPermissions.add(permission);
- }
- }
- return resultPermissions;
- }*/
- );
- }
-
Set<ObjectModelClass> usagesForclass = usages.get(clazz);
generateFindUsages(clazz, daoAbstractClass, usagesForclass);
}
@@ -612,7 +501,7 @@
body.append(""
/*{
{
- List<<%=attrType%>> list = getTopiaContext().getHibernateSession().createSQLQuery(
+ List<<%=attrType%>> list = topiaHibernateSupport.getHibernateSession().createSQLQuery(
"SELECT main.topiaid " +
"from <%=attrClassifierDBName%> main, <%=attrJoinTableName%> secondary " +
"where main.topiaid=secondary.<%=attrDBName%>" +
@@ -639,8 +528,8 @@
/*{
{
List<<%=attrSimpleType%>> list = topiaDAOSupplier
- .getDAO(<%=attrSimpleType%>.class)
- .findAllByProperties(<%=attrSimpleType%>.<%=getConstantName(reverseAttrName)%>, entity);
+ .getDAO(<%=attrSimpleType%>.class, <%=attrSimpleType%>DAO.class)
+ .forProperties(<%=attrSimpleType%>.<%=getConstantName(reverseAttrName)%>, entity).findAll();
for (<%=attrSimpleType%> item : list) {
// sletellier : Set null only if target is concerned by deletion
@@ -688,7 +577,7 @@
ObjectModelClass result,
Set<ObjectModelClass> usagesForclass) {
- builder.addImport(result, ArrayList.class.getName());
+ builder.addImport(result, LinkedList.class.getName());
builder.addImport(result, Map.class.getName());
builder.addImport(result, HashMap.class.getName());
builder.addImport(result, TopiaEntity.class.getName());
@@ -708,7 +597,7 @@
addAnnotation(result, operation, Override.class);
setOperationBody(operation, ""
/*{
- return new ArrayList<U>();
+ return new LinkedList<U>();
}*/
);
@@ -750,7 +639,7 @@
StringBuilder buffer = new StringBuilder(300);
buffer.append(""
/*{
- List<?> result = new ArrayList();
+ List<?> result = new LinkedList();
List tmp;
}*/
);
@@ -868,16 +757,18 @@
*
* @param result clazz where to add operations
* @param operations operations to generate
+ * @deprecated will be removed ASAP in topia 3.0
*/
- private void generateDAOOperations(ObjectModelClass result,
- Collection<ObjectModelOperation>
- operations) {
+ @Deprecated
+ protected void generateDAOOperations(ObjectModelClass result,
+ Collection<ObjectModelOperation>
+ operations) {
if (CollectionUtils.isEmpty(operations)) {
// no extra operations to generate
return;
}
-
+
for (ObjectModelOperation op : operations) {
Set<String> exceptions = op.getExceptions();
@@ -891,57 +782,6 @@
}
-
-
- private String generateSecurity(ObjectModelClass result,
- ObjectModelClass clazz,
- String tagValue) {
- StringBuilder buffer = new StringBuilder();
-
- if (StringUtils.isNotEmpty(tagValue)) {
- String security = tagValue;
- Pattern propertiesPattern = Pattern
- .compile("((?:[_a-zA-Z0-9]+\\.)+(?:_?[A-Z][_a-zA-Z0-9]*\\.)+)attribute\\.(?:([_a-z0-9][_a-zA-Z0-9]*))#(?:(create|load|update|delete))");
- String[] valuesSecurity = security.split(":");
-
- for (String valueSecurity : valuesSecurity) {
- Matcher matcher = propertiesPattern.matcher(valueSecurity);
- matcher.find();
- // className is fully qualified name of class
- String className = matcher.group(1);
- className = StringUtil.substring(className, 0, -1); // remove ended
- // .
- // target is class, attribute or operation
- String attributeName = matcher.group(2);
- String actions = matcher.group(3).toUpperCase();
-
- String query = "";
- String daoClass = "";
- if (className.equals(clazz.getQualifiedName())) {
- query = "select " + attributeName + ".topiaId from " + clazz.getQualifiedName() + " where topiaId = :id";
- daoClass = clazz.getAttribute(attributeName).getClassifier().getQualifiedName();
- } else {
- query = "select at.topiaId from " + className + " at inner join at." + attributeName + " cl where cl.topiaId = :id";
- daoClass = className;
- }
- buffer.append(""
-/*{
- resultPermissions.addAll(getRequestPermission(topiaId,
- <%=actions%>,
- "<%=query%>",
- <%=daoClass%>.class));
-}*/
- );
- }
- } else {
- buffer.append(""
-/*{ return null;
- }*/
- );
- }
- return buffer.toString();
- }
-
protected void generateNoNMultiplicity(String clazzName,
ObjectModelClass result,
ObjectModelAttribute attr,
@@ -949,6 +789,14 @@
String attrName = attr.getName();
String attrType = attr.getType();
String propertyName = clazzName + "." + getConstantName(attrName);
+
+ String attrTypeForGeneric;
+ if (JavaGeneratorUtil.isPrimitiveType(attrType)) {
+ attrTypeForGeneric = TopiaGeneratorUtil.getClassForPrimitiveType(attr);
+ } else {
+ attrTypeForGeneric = attrType;
+ }
+
if (!isAssoc && attr.hasAssociationClass()) {
String assocClassName = attr.getAssociationClass().getName();
String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr);
@@ -964,17 +812,45 @@
ObjectModelOperation op;
op = addOperation(result,
+ getJavaBeanMethodName("for", attrName, "In"),
+ "TopiaQueryBuilderRunQueryStep<E>",
+ ObjectModelJavaModifier.PUBLIC);
+ addParameter(op, "Iterable<" + attrTypeForGeneric + ">", "v");
+ setOperationBody(op, ""
+/*{
+ TopiaQueryBuilderRunQueryStep<E> result = forIn(<%=propertyName%>, (Iterable) v);
+ return result;
+ }*/
+ );
+
+ op = addOperation(result,
+ getJavaBeanMethodName("for", attrName, "Equals"),
+ "TopiaQueryBuilderRunQueryStep<E>",
+ ObjectModelJavaModifier.PUBLIC);
+ addParameter(op, attrType, "v");
+ setOperationBody(op, ""
+/*{
+ TopiaQueryBuilderRunQueryStep<E> result = forEquals(<%=propertyName%>, v);
+ return result;
+ }*/
+ );
+
+ String methodToDelegateName = op.getName();
+
+ op = addOperation(result,
getJavaBeanMethodName("findBy", attrName),
"E",
ObjectModelJavaModifier.PUBLIC);
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
- E result = findByProperty(<%=propertyName%>, v);
+ E result = <%=methodToDelegateName%>(v).findAnyOrNull();
return result;
}*/
);
+ addAnnotation(result, op, Deprecated.class);
+
op = addOperation(result,
getJavaBeanMethodName("findAllBy", attrName),
"List<E>",
@@ -982,11 +858,13 @@
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
- List<E> result = findAllByProperty(<%=propertyName%>, v);
+ List<E> result = <%=methodToDelegateName%>(v).findAll();
return result;
}*/
);
+ addAnnotation(result, op, Deprecated.class);
+
if (!isAssoc && attr.hasAssociationClass()) {
String assocClassName = attr.getAssociationClass().getName();
String assocClassFQN = attr.getAssociationClass().getQualifiedName();
@@ -1028,19 +906,34 @@
return;
}
ObjectModelOperation op;
- // Since 2.4 do nothing, findContains and findAllContains are not generated anymore
+
op = addOperation(result,
+ getJavaBeanMethodName("for", attrName, "Contains"),
+ "TopiaQueryBuilderRunQueryStep<E>",
+ ObjectModelJavaModifier.PUBLIC);
+ addParameter(op, attrType, "v");
+ setOperationBody(op, ""
+/*{
+ return forContains(<%=clazzName + "." + getConstantName(attrName)%>, v);
+ }*/
+ );
+
+ String methodToDelegateName = op.getName();
+
+ op = addOperation(result,
getJavaBeanMethodName("findContains", attrName),
"E",
ObjectModelJavaModifier.PUBLIC);
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
- E result = findContains(<%=clazzName + "." + getConstantName(attrName)%>, v);
+ E result = <%=methodToDelegateName%>(v).findAnyOrNull();
return result;
}*/
);
+ addAnnotation(result, op, Deprecated.class);
+
op = addOperation(result,
getJavaBeanMethodName("findAllContains", attrName),
"List<E>",
@@ -1048,10 +941,13 @@
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
- List<E> result = findAllContains(<%=clazzName + "." + getConstantName(attrName)%>, v);
+ List<E> result = <%=methodToDelegateName%>(v).findAll();
return result;
}*/
);
+
+ addAnnotation(result, op, Deprecated.class);
+
}
@@ -1077,6 +973,10 @@
// results.add(op);
// }
// }
+
+ if (log.isWarnEnabled()) {
+ log.warn("dao contract in model will not be supported in topia 3.0");
+ }
Collection<ObjectModelOperation> extra =
extraOperations.get(clazz.getQualifiedName());
return extra;
@@ -1105,66 +1005,50 @@
ObjectModelOperation existByNaturalId = addOperation(result,
"existByNaturalId", "boolean", ObjectModelJavaModifier.PUBLIC);
- // TODO sletellier 20120406 : remove method on 3.0
- ObjectModelOperation create = addOperation(result,
- "create", "E", ObjectModelJavaModifier.PUBLIC);
-
- // sletellier : mark as Deprecated (http://nuiton.org/issues/2051)
- setDocumentation(create, "@deprecated since 2.6.10, prefer use {@link #createByNaturalId}\n");
- addAnnotation(result, create, "Deprecated");
-
ObjectModelOperation createByNaturalId = addOperation(result,
"createByNaturalId", "E", ObjectModelJavaModifier.PUBLIC);
- // used for calling findByProperties in findByNaturalId
- String searchProperties = "";
- // used for calling findByNaturalId in existByNaturalId
-// String params = "";
+ Set<String> properties = Sets.newLinkedHashSet();
String clazzName = clazz.getName();
+
for (ObjectModelAttribute attr : props) {
+
String propName = attr.getName();
- // add property as param in both methods
- addParameter(findByNaturalId, attr.getType(), propName);
- addParameter(existByNaturalId, attr.getType(), propName);
- addParameter(create, attr.getType(), propName);
- addParameter(createByNaturalId, attr.getType(), propName);
+ String type = attr.getType();
- searchProperties +=
- ", " + clazzName + '.' + getConstantName(propName) +
- ", " + propName;
- //params += ", " + propName;
+ addParameter(findByNaturalId, type, propName);
+ addParameter(existByNaturalId, type, propName);
+ addParameter(createByNaturalId, type, propName);
+
+ String property = clazzName + '.' + getConstantName(propName) + ", " + propName;
+ properties.add(property);
+
}
- searchProperties = searchProperties.substring(2);
- //params = params.substring(2);
+ String arguments = StringUtils.join(properties, ", ");
+
setOperationBody(findByNaturalId, ""
/*{
- return findByProperties(<%=searchProperties%>);
+ return forProperties(<%=arguments%>).findUnique();
}*/
);
setOperationBody(existByNaturalId, ""
/*{
- return existByProperties(<%=searchProperties%>);
+ return forProperties(<%=arguments%>).exists();
}*/
);
- setOperationBody(create, ""
-/*{
- return create(<%=searchProperties%>);
- }*/
- );
-
setOperationBody(createByNaturalId, ""
/*{
- return create(<%=searchProperties%>);
+ return create(<%=arguments%>);
}*/
);
}
}
- private void generateNotNull(ObjectModelClass result,
- ObjectModelClass clazz) {
+ protected void generateNotNull(ObjectModelClass result,
+ ObjectModelClass clazz) {
Set<ObjectModelAttribute> props =
TopiaGeneratorUtil.getNotNullAttributes(clazz);
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 16:24:51 UTC (rev 2809)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java 2013-10-03 16:30:27 UTC (rev 2810)
@@ -39,12 +39,9 @@
import org.nuiton.eugene.models.object.ObjectModelModifier;
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;
@@ -143,11 +140,7 @@
generateAbstract = isGenerateAbstract(input);
generateImpl = isGenerateImpl(input);
- String noGenerateBooleanGetMethods =
- TopiaGeneratorUtil.getDoNotGenerateBooleanGetMethods(model, input);
- generateBooleanGetMethods =
- StringUtils.isEmpty(noGenerateBooleanGetMethods) ||
- !"true".equals(noGenerateBooleanGetMethods.trim());
+ generateBooleanGetMethods = TopiaGeneratorUtil.isDoNotGenerateBooleanGetMethods(model, input);
if (generateInterface) {
Copied: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/LegacyEntityDAOTransformer.java (from rev 2809, trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java)
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/LegacyEntityDAOTransformer.java (rev 0)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/LegacyEntityDAOTransformer.java 2013-10-03 16:30:27 UTC (rev 2810)
@@ -0,0 +1,1204 @@
+/*
+ * #%L
+ * ToPIA :: Persistence
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2004 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+package org.nuiton.topia.generator;
+
+/*{generator option: parentheses = false}*/
+/*{generator option: writeString = +}*/
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.eugene.GeneratorUtil;
+import org.nuiton.eugene.java.ObjectModelTransformerToJava;
+import org.nuiton.eugene.models.object.ObjectModel;
+import org.nuiton.eugene.models.object.ObjectModelAssociationClass;
+import org.nuiton.eugene.models.object.ObjectModelAttribute;
+import org.nuiton.eugene.models.object.ObjectModelClass;
+import org.nuiton.eugene.models.object.ObjectModelClassifier;
+import org.nuiton.eugene.models.object.ObjectModelDependency;
+import org.nuiton.eugene.models.object.ObjectModelInterface;
+import org.nuiton.eugene.models.object.ObjectModelJavaModifier;
+import org.nuiton.eugene.models.object.ObjectModelOperation;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.persistence.TopiaDAO;
+import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.util.StringUtil;
+
+import java.security.Permission;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * To generate all <code>DAO</code> related classes for a given entity.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 2.5.4
+ * @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.topia.generator.EntityDAOTransformer"
+ */
+public class LegacyEntityDAOTransformer extends ObjectModelTransformerToJava {
+
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(EntityDAOTransformer.class);
+
+ /**
+ * map of direct usages (values) for each entity (key).
+ * <p/>
+ * This map is used to generate the findUsages methods for DAOAbstract.
+ */
+ protected Map<ObjectModelClass, Set<ObjectModelClass>> usages;
+
+ /**
+ * All entities fqn of the model (used to detect if an attribute is not
+ * an entity).
+ */
+ protected Set<String> allEntitiesFqn;
+
+ /**
+ * The class of abstract dao to use.
+ * @since 2.5
+ */
+ protected Class<?> daoImplementation;
+
+ protected String entityEnumName;
+
+ protected String entityEnumPackage;
+
+ /**
+ * Map of extra operations for DAO. The key of the map is the qualified
+ * name of the entity relative to the DAO.
+ */
+ protected Map<String, Collection<ObjectModelOperation>> extraOperations =
+ new HashMap<String, Collection<ObjectModelOperation>>();
+
+ @Override
+ public void transformFromModel(ObjectModel model) {
+
+ boolean generateStandaloneEnum =
+ TopiaGeneratorUtil.shouldGenerateStandaloneEnumForDAOHelper(model);
+ String modelName = model.getName();
+
+ entityEnumName = modelName + "EntityEnum";
+
+ String packageName =
+ getOutputProperties().getProperty(PROP_DEFAULT_PACKAGE);
+
+ if (generateStandaloneEnum) {
+ entityEnumPackage = packageName + "." + entityEnumName;
+ } else {
+ String daoHelperClazzName = modelName + "DAOHelper";
+ entityEnumPackage = packageName + "." + daoHelperClazzName + "." + entityEnumName;
+ }
+
+ usages = TopiaGeneratorUtil.searchDirectUsages(model);
+
+ daoImplementation = TopiaGeneratorUtil.getDAOImplementation(model);
+
+
+ // keep all classifiers on the model which are entities
+ List<ObjectModelClass> allEntities =
+ TopiaGeneratorUtil.getEntityClasses(model, true);
+ allEntitiesFqn = new HashSet<String>(allEntities.size());
+ for (ObjectModelClass entity : allEntities) {
+ String fqn = entity.getQualifiedName();
+ allEntitiesFqn.add(fqn);
+ Collection<ObjectModelOperation> daoOperations =
+ new HashSet<ObjectModelOperation>();
+ for (ObjectModelOperation op : entity.getOperations()) {
+ if (TopiaGeneratorUtil.hasDaoStereotype(op)) {
+ daoOperations.add(op);
+ }
+ }
+
+ if (daoOperations.isEmpty()) {
+
+ // found some dao operations
+ extraOperations.put(fqn, daoOperations);
+ }
+ }
+ }
+
+ @Override
+ public void transformFromInterface(ObjectModelInterface interfacez) {
+ if (!TopiaGeneratorUtil.hasDaoStereotype(interfacez)) {
+ return;
+ }
+
+ /**
+ * EVO #636 : Manage extra operations for DAO from "dao" dependency
+ * between an interface with stereotype <<dao>> (dependency client) and
+ * a class with stereotype <<entity>> (dependency supplier).
+ */
+
+ ObjectModelDependency dependency =
+ interfacez.getDependency(TopiaGeneratorUtil.DEPENDENCIES_DAO);
+
+ if (dependency == null) {
+ if (log.isWarnEnabled()) {
+ log.warn("Could not find dependency " +
+ TopiaGeneratorUtil.DEPENDENCIES_DAO +
+ " but DAO stereotype was placed on the interface " +
+ interfacez.getName());
+ }
+ return;
+ }
+
+ ObjectModelClassifier classifier = dependency.getSupplier();
+
+ if (!TopiaGeneratorUtil.isEntity(classifier)) {
+
+ // dependency supplier is not an entity...
+ if (log.isWarnEnabled()) {
+ log.warn("Dependency supplier " +
+ classifier.getQualifiedName() +
+ " is not an entity.");
+ }
+ return;
+ }
+
+ // keep only direct operations
+ Collection<ObjectModelOperation> operations =
+ interfacez.getOperations();
+
+ if (CollectionUtils.isEmpty(operations)) {
+
+ // no operations on interface, this is not normal
+ if (log.isWarnEnabled()) {
+ log.warn("No operation found on interface with DAO " +
+ "stereotype "+classifier.getQualifiedName());
+ }
+ return;
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("add "+operations.size()+" extra operation(s) for DAO");
+ }
+
+ extraOperations.put(classifier.getQualifiedName(), operations);
+ }
+
+ @Override
+ public void transformFromClass(ObjectModelClass clazz) {
+ if (!TopiaGeneratorUtil.isEntity(clazz)) {
+ // not an entity
+ return;
+ }
+ String clazzName = clazz.getName();
+ String clazzFQN = clazz.getQualifiedName();
+
+ if (isGenerateDAO(clazz)) {
+
+ // generate DAO
+ generateDAOClass(clazz, clazzName, clazzFQN);
+
+ }
+ if (isGenerateImpl(clazz)) {
+
+ // generate DAOImpl
+ generateDAOImpl(clazz, clazzName, clazzFQN);
+ }
+
+ if (isGenerateDAOAbstract(clazz)) {
+
+ // generate DAOAbstract
+ generateDAOAbstract(clazz, clazzName, clazzFQN);
+ }
+ }
+
+ protected boolean isGenerateDAO(ObjectModelClass input) {
+
+ String fqn = input.getQualifiedName() + "DAO";
+
+ if (isInClassPath(fqn)) {
+
+ // already in class-path
+ return false;
+ }
+
+ // can safely generate the dao impl
+ return true;
+ }
+
+ protected boolean isGenerateDAOAbstract(ObjectModelClass input) {
+
+ String fqn = input.getQualifiedName() + "DAOAbstract";
+
+ if (isInClassPath(fqn)) {
+
+ // already in class-path
+ return false;
+ }
+
+ // can safely generate the dao impl
+ return true;
+ }
+
+ protected boolean isGenerateImpl(ObjectModelClass input) {
+
+ String fqn = input.getQualifiedName() + "DAOImpl";
+
+ if (isInClassPath(fqn)) {
+
+ // already in class-path
+ return false;
+ }
+
+ Collection<ObjectModelOperation> moreOperations =
+ extraOperations.get(input.getQualifiedName());
+
+ if (CollectionUtils.isNotEmpty(moreOperations)) {
+
+ // no user operations, can generate it
+ return false;
+ }
+
+ // can safely generate the dao impl
+ return true;
+ }
+
+ protected void generateDAOClass(ObjectModelClass clazz, String clazzName, String clazzFQN) {
+ ObjectModelClass daoClass = createClass(clazzName + "DAO", clazz.getPackageName());
+ setDocumentation(daoClass, "/**\n" +
+ " * Cette classe etend le DAOImpl pour parametrer la classe avec le bon type\n" +
+ " * Cette classe est marque finale car l'heritage entre les DAO se fait\n" +
+ " * sur les DOAImpl, c-a-d que DAOAbstract peut etendre le DAOImpl\n" +
+ " */");
+ setSuperClass(daoClass, clazzFQN + "DAOImpl<" + clazzName + ">");
+ }
+
+ protected void generateDAOImpl(ObjectModelClass clazz,
+ String clazzName,
+ String clazzFQN) {
+
+ Collection<ObjectModelOperation> moreOperations =
+ extraOperations.get(clazz.getQualifiedName());
+
+ if (CollectionUtils.isEmpty(moreOperations)) {
+
+ // no business dao found, can safely generate the daoImpl class
+
+ ObjectModelClass daoImplClass = createClass(clazzName + "DAOImpl<E extends " + clazzName + ">", clazz.getPackageName());
+ setDocumentation(daoImplClass, "/**\n" +
+ " Implantation du DAO pour l'entité " + clazzName + ".\n" +
+ " * L'utilisateur peut remplacer cette classe par la sienne en la mettant \n" +
+ " * simplement dans ces sources. Cette classe générée sera alors simplement\n" +
+ " * écrasée\n" +
+ " */");
+ setSuperClass(daoImplClass, clazzFQN + "DAOAbstract<E>");
+ }
+ }
+
+ protected void generateDAOAbstract(ObjectModelClass clazz,
+ String clazzName,
+ String clazzFQN) {
+ ObjectModelClass daoAbstractClass = createAbstractClass(
+ clazzName + "DAOAbstract<E extends " + clazzName + '>',
+ clazz.getPackageName());
+
+ // super class
+
+ String extendClass = "";
+ for (ObjectModelClass parent : clazz.getSuperclasses()) {
+ extendClass = parent.getQualifiedName();
+ if (TopiaGeneratorUtil.isEntity(parent)) {
+ extendClass += "DAOImpl<E>";
+ // in java no multi-inheritance
+ break;
+ }
+ }
+ if (extendClass.length() == 0) {
+ extendClass = daoImplementation.getName() + "<E>";
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("super class = " + extendClass);
+ }
+ setSuperClass(daoAbstractClass, extendClass);
+
+ String prefix = getConstantPrefix(clazz, "");
+ setConstantPrefix(prefix);
+
+ // imports
+
+ Collection<ObjectModelOperation> DAOoperations =
+ getDAOOperations(clazz);
+
+ if (TopiaGeneratorUtil.isCollectionNeeded(DAOoperations)) {
+ addImport(daoAbstractClass, Collection.class);
+ }
+ if (TopiaGeneratorUtil.isSetNeeded(DAOoperations)) {
+ addImport(daoAbstractClass, Set.class);
+ }
+ addImport(daoAbstractClass, List.class);
+ addImport(daoAbstractClass, TopiaException.class);
+
+ boolean enableSecurity = TopiaGeneratorUtil.isClassWithSecurity(clazz);
+
+ if (enableSecurity) {
+ addImport(daoAbstractClass, ArrayList.class);
+ addImport(daoAbstractClass, Permission.class);
+ addImport(daoAbstractClass, "org.nuiton.topia.taas.entities.TaasAuthorizationImpl");
+ addImport(daoAbstractClass, "org.nuiton.topia.taas.jaas.TaasPermission");
+ addImport(daoAbstractClass, "org.nuiton.topia.taas.TaasUtil");
+ addImport(daoAbstractClass, TopiaDAO.class);
+
+ //FIXME : how to do static imports ?
+//import static org.nuiton.topia.taas.TaasUtil.CREATE;
+//import static org.nuiton.topia.taas.TaasUtil.DELETE;
+//import static org.nuiton.topia.taas.TaasUtil.LOAD;
+//import static org.nuiton.topia.taas.TaasUtil.UPDATE;
+ }
+
+ ObjectModelOperation op;
+
+ // getEntityClass
+
+ op = addOperation(daoAbstractClass,
+ "getEntityClass",
+ "Class<E>",
+ ObjectModelJavaModifier.PUBLIC);
+ addAnnotation(daoAbstractClass, op,Override.class);
+ setOperationBody(op, ""
+/*{
+ return (Class<E>)<%=clazzName%>.class;
+ }*/
+ );
+
+ // getTopiaEntityEnum
+ addImport(daoAbstractClass, entityEnumPackage);
+ op = addOperation(daoAbstractClass,
+ "getTopiaEntityEnum",
+ entityEnumName,
+ ObjectModelJavaModifier.PUBLIC);
+ addAnnotation(daoAbstractClass, op,Override.class);
+ setOperationBody(op, ""
+/*{
+ return <%=entityEnumName%>.<%=clazzName%>;
+ }*/
+ );
+
+ generateDAOOperations(daoAbstractClass, DAOoperations);
+
+ generateDelete(clazz, daoAbstractClass);
+
+ generateNaturalId(daoAbstractClass, clazz);
+
+ generateNotNull(daoAbstractClass, clazz);
+
+ for (ObjectModelAttribute attr : clazz.getAttributes()) {
+ if (!attr.isNavigable()) {
+ continue;
+ }
+
+ if (!GeneratorUtil.isNMultiplicity(attr)) {
+ generateNoNMultiplicity(clazzName, daoAbstractClass, attr, false);
+ } else {
+ generateNMultiplicity(clazzName, daoAbstractClass, attr);
+ }
+ }
+
+ if (clazz instanceof ObjectModelAssociationClass) {
+ ObjectModelAssociationClass assocClass =
+ (ObjectModelAssociationClass) clazz;
+ for (ObjectModelAttribute attr : assocClass.getParticipantsAttributes()) {
+ if (attr != null) {
+ if (!GeneratorUtil.isNMultiplicity(attr)) {
+ generateNoNMultiplicity(clazzName, daoAbstractClass, attr, true);
+ } else {
+ generateNMultiplicity(clazzName, daoAbstractClass, attr);
+ }
+ }
+ }
+ }
+
+ if (enableSecurity) {
+
+ // getRequestPermission
+
+ op = addOperation(daoAbstractClass,
+ "getRequestPermission",
+ "List<Permission>",
+ ObjectModelJavaModifier.PUBLIC);
+// setDocumentation(op, "Retourne les permissions a verifier pour " +
+// "l'acces a l'entite pour le service Taas");
+ addException(op, TopiaException.class);
+ addParameter(op, String.class, "topiaId");
+ addParameter(op, int.class, "actions");
+ StringBuilder buffer = new StringBuilder();
+ buffer.append(""
+/*{
+ List<Permission> resultPermissions = new ArrayList<Permission>();
+ if ((actions & TaasUtil.CREATE) == TaasUtil.CREATE) {
+}*/
+ );
+ buffer.append(generateSecurity(daoAbstractClass, clazz,
+ TopiaGeneratorUtil.getSecurityCreateTagValue(clazz)));
+ buffer.append(""
+/*{
+ }
+ if ((actions & TaasUtil.LOAD) == TaasUtil.LOAD) {
+}*/
+ );
+ buffer.append(generateSecurity(daoAbstractClass, clazz,
+ TopiaGeneratorUtil.getSecurityLoadTagValue(clazz)));
+ buffer.append(""
+/*{
+ }
+ if ((actions & TaasUtil.UPDATE) == TaasUtil.UPDATE) {
+}*/
+ );
+ buffer.append(generateSecurity(daoAbstractClass, clazz,
+ TopiaGeneratorUtil.getSecurityUpdateTagValue(clazz)));
+ buffer.append(""
+/*{
+ }
+ if ((actions & TaasUtil.DELETE) == TaasUtil.DELETE) {
+}*/
+ );
+ buffer.append(generateSecurity(daoAbstractClass, clazz,
+ TopiaGeneratorUtil.getSecurityDeleteTagValue(clazz)));
+ buffer.append(""
+/*{
+ }
+ return resultPermissions;
+ }*/
+ );
+
+ setOperationBody(op, buffer.toString());
+
+ // THIMEL : Le code suivant doit pouvoir être déplacé dans DAODelegator ?
+
+ // getRequestPermission
+
+
+ op = addOperation(daoAbstractClass,
+ "getRequestPermission",
+ "List<Permission>",
+ ObjectModelJavaModifier.PROTECTED);
+ addParameter(op, String.class, "topiaId");
+ addParameter(op, int.class, "actions");
+ addParameter(op, String.class, "query");
+ addParameter(op, Class.class, "daoClass");
+ addException(op, TopiaException.class);
+// setDocumentation(op, "Retourne les permissions a verifier pour " +
+// "l'acces a l'entite pour le service Taas");
+ setOperationBody(op, ""
+/*{ TopiaContext context = getTopiaContext();
+ List<String> result = context.findAll(query, "id", topiaId);
+
+ List<Permission> resultPermissions = new ArrayList<Permission>();
+ for (String topiaIdPermission : result) {
+ TopiaDAO dao = context.getDAO(daoClass);
+ List<Permission> permissions = dao.getRequestPermission(topiaIdPermission, actions);
+ if(permissions != null) {
+ resultPermissions.addAll(permissions);
+ } else {
+ TaasPermission permission = new TaasPermission(topiaIdPermission, actions);
+ resultPermissions.add(permission);
+ }
+ }
+ return resultPermissions;
+ }*/
+ );
+ }
+
+ Set<ObjectModelClass> usagesForclass = usages.get(clazz);
+ generateFindUsages(clazz, daoAbstractClass, usagesForclass);
+ }
+
+ protected void generateDelete(ObjectModelClass clazz,
+ ObjectModelClass result) {
+
+ StringBuilder body = new StringBuilder();
+ String modelName = StringUtils.capitalize(model.getName());
+ String providerFQN = getOutputProperties().getProperty(
+ PROP_DEFAULT_PACKAGE) + '.' + modelName +
+ "DAOHelper.getImplementationClass";
+
+ for (ObjectModelAttribute attr : clazz.getAttributes()) {
+
+ String attrType = GeneratorUtil.getSimpleName(attr.getType());
+
+ String reverseAttrName = attr.getReverseAttributeName();
+ ObjectModelAttribute reverse = attr.getReverseAttribute();
+ if (attr.hasAssociationClass() ||
+ reverse == null || !reverse.isNavigable()) {
+
+ // never treate a non reverse and navigable attribute
+ // never treate an association class attribute
+ continue;
+ }
+
+ // at this point we are sure to have a attribute which is
+ // - reverse
+ // - navigable
+ // - not from an association class
+ if (!allEntitiesFqn.contains(attr.getType())) {
+
+ // this attribute is not from an entity, don't treate it
+ if (log.isDebugEnabled()) {
+ log.debug("[" + result.getName() + "] Skip attribute [" +
+ attr.getName() + "] with type " + attr.getType());
+ }
+ continue;
+ }
+
+ // At this point, the attribute type is a entity
+ if (GeneratorUtil.isNMultiplicity(attr) &&
+ GeneratorUtil.isNMultiplicity(reverse)) {
+ // On doit absolument supprimer pour les relations many-to-many
+ // le this de la collection de l'autre cote
+
+ String attrDBName = TopiaGeneratorUtil.getDbName(attr);
+ String attrClassifierDBName = TopiaGeneratorUtil.getDbName(attr.getClassifier());
+ String attrJoinTableName = TopiaGeneratorUtil.getManyToManyTableName(attr);
+ String attrReverseDBName = TopiaGeneratorUtil.getReverseDbName(attr);
+
+ //FIXME_-FC-20100413 Use a TopiaQuery (use HQLin elements)
+// // Add DAOHelper
+// String daoHelper = modelName + "DAOHelper";
+// String daoHelperFQN = getOutputProperties().
+// getProperty(PROP_DEFAULT_PACKAGE) + '.' + daoHelper;
+// addImport(result, daoHelperFQN);
+//
+// // Add import for TopiaQuery
+// addImport(result, TopiaQuery.class);
+//
+// // Entity DAO and reversePropertyName
+// String entityDAO = attrType + "DAO";
+// String reverseAttrNameProperty =
+// attrType + "." + getConstantName(reverseAttrName);
+//
+//
+// <%=entityDAO%> dao = <%=daoHelper%>.get<%=entityDAO%>(getTopiaContext());
+// TopiaQuery query = dao.createQuery("B").
+// addFrom(entity.getClass(), "A").
+// add("A", entity).
+// addInElements("A", "B." + <%=reverseAttrNameProperty%>);
+//
+// System.out.println("Query : " + query);
+// List<<%=attrType%>> list = dao.findAllByQuery(query);
+
+ String removeName = getJavaBeanMethodName("remove", reverseAttrName);
+ body.append(""
+/*{
+ {
+ List<<%=attrType%>> list = getTopiaContext().getHibernateSession().createSQLQuery(
+ "SELECT main.topiaid " +
+ "from <%=attrClassifierDBName%> main, <%=attrJoinTableName%> secondary " +
+ "where main.topiaid=secondary.<%=attrDBName%>" +
+ " and secondary.<%=attrReverseDBName%>='" + entity.getTopiaId() + "'")
+ .addEntity("main", <%=providerFQN%>(<%=attrType%>.class)).list();
+
+ for (<%=attrType%> item : list) {
+ item.<%=removeName%>(entity);
+ }
+ }
+}*/
+ );
+ } else if (!GeneratorUtil.isNMultiplicity(reverse)) {
+ // On doit mettre a null les attributs qui ont cet objet sur les
+ // autres entites en one-to-*
+ // TODO peut-etre qu'hibernate est capable de faire ca tout seul ?
+ // THIMEL: J'ai remplacé reverse.getName() par reverseAttrName sans certitude
+ addImport(result, attrType);
+ String attrSimpleType = TopiaGeneratorUtil.getClassNameFromQualifiedName(attrType);
+ String getName = getJavaBeanMethodName("get", reverseAttrName);
+ String setName = getJavaBeanMethodName("set", reverseAttrName);
+
+ body.append(""
+ /*{
+ {
+ List<<%=attrSimpleType%>> list = topiaDAOSupplier
+ .getDAO(<%=attrSimpleType%>.class)
+ .findAllByProperties(<%=attrSimpleType%>.<%=getConstantName(reverseAttrName)%>, entity);
+ for (<%=attrSimpleType%> item : list) {
+
+ // sletellier : Set null only if target is concerned by deletion
+ if (entity.equals(item.<%=getName%>())) {
+ item.<%=setName%>(null);
+ }
+ }*/
+ );
+ if (attr.isAggregate()) {
+ body.append(""
+/*{
+ topiaDAOSupplier.getDAO(<%=attrSimpleType%>.class).delete(item);
+}*/
+ );
+ }
+ body.append(""
+/*{
+ }
+ }
+}*/
+ );
+
+ }
+ }
+
+ if (body.length()>0) {
+ // something specific was done, need to generate the method
+ ObjectModelOperation op;
+ op = addOperation(result, "delete", "void", ObjectModelJavaModifier.PUBLIC);
+ addAnnotation(result, op,Override.class);
+ addParameter(op, "E", "entity");
+ body.append(""
+/*{
+ super.delete(entity);
+ }*/
+ );
+ setOperationBody(op, body.toString());
+ }
+
+
+
+ }
+
+ protected void generateFindUsages(ObjectModelClass clazz,
+ ObjectModelClass result,
+ Set<ObjectModelClass> usagesForclass) {
+
+ builder.addImport(result, ArrayList.class.getName());
+ builder.addImport(result, Map.class.getName());
+ builder.addImport(result, HashMap.class.getName());
+ builder.addImport(result, TopiaEntity.class.getName());
+
+ if (clazz instanceof ObjectModelAssociationClass ||
+ usagesForclass.isEmpty()) {
+ // not for an association class
+ // just let a null method
+ ObjectModelOperation operation;
+ operation = addOperation(result,
+ "findUsages",
+ "<U extends TopiaEntity> List<U>",
+ ObjectModelJavaModifier.PUBLIC);
+
+ addParameter(operation, "Class<U>", "type");
+ addParameter(operation, "E", "entity");
+ addAnnotation(result, operation, Override.class);
+ setOperationBody(operation, ""
+/*{
+ return new ArrayList<U>();
+ }*/
+ );
+
+ operation = addOperation(result,
+ "findAllUsages",
+ "Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>>",
+ ObjectModelJavaModifier.PUBLIC);
+
+ addParameter(operation, "E", "entity");
+ addAnnotation(result, operation, Override.class);
+ setOperationBody(operation, ""
+/*{
+ return new HashMap<Class<? extends TopiaEntity>, List<? extends TopiaEntity>>();
+ }*/
+ );
+
+ return;
+ }
+ List<ObjectModelClass> allEntities;
+ Map<String, ObjectModelClass> allEntitiesByFQN;
+
+ allEntities = TopiaGeneratorUtil.getEntityClasses(model, true);
+ allEntitiesByFQN = new TreeMap<String, ObjectModelClass>();
+
+ // prepare usages map and fill allEntitiesByFQN map
+ for (ObjectModelClass klass : allEntities) {
+ allEntitiesByFQN.put(klass.getQualifiedName(), klass);
+ }
+
+ ObjectModelOperation operation;
+ operation = addOperation(result,
+ "findUsages",
+ "<U extends TopiaEntity> List<U>",
+ ObjectModelJavaModifier.PUBLIC);
+
+ addParameter(operation, "Class<U>", "type");
+ addParameter(operation, "E", "entity");
+ addAnnotation(result, operation, Override.class);
+ StringBuilder buffer = new StringBuilder(300);
+ buffer.append(""
+/*{
+ List<?> result = new ArrayList();
+ List tmp;
+}*/
+ );
+
+ for (ObjectModelClass usageClass : usagesForclass) {
+ String usageType = usageClass.getQualifiedName();
+ builder.addImport(result, usageType);
+ String usageSimpleType =
+ TopiaGeneratorUtil.getClassNameFromQualifiedName(usageType);
+ String usageSimplePropertyMethod = "findAllBy" + usageSimpleType;
+ String usageCollectionPropertyMethod = "findAllContaining" + usageSimpleType;
+ for (ObjectModelAttribute attr : usageClass.getAttributes()) {
+ if (!attr.isNavigable()) {
+ // skip this case
+ continue;
+ }
+ String type;
+ String attrName = attr.getName();
+ if (attr.hasAssociationClass()) {
+ //FIXME-TC20100224 dont known how to do this ?
+ continue;
+// type = attr.getAssociationClass().getQualifiedName();
+// //FIXME-TC20100224 : this is crazy ??? must find the good name
+// // Perhaps need to make different cases?
+// attrName = attrName + "_" + TopiaGeneratorUtil.toLowerCaseFirstLetter(attr.getAssociationClass().getName());
+ } else {
+ type = attr.getType();
+ }
+ if (!allEntitiesByFQN.containsKey(type)) {
+ // not a entity, can skip for this attribute
+ continue;
+ }
+ ObjectModelClass targetEntity = allEntitiesByFQN.get(type);
+// if (!type.equals(clazz.getQualifiedName())) {
+ if (!targetEntity.equals(clazz)) {
+ // not a good attribute reference
+ continue;
+ }
+ // found something to seek
+
+ String methodName;
+ if (TopiaGeneratorUtil.isNMultiplicity(attr)) {
+ methodName = getJavaBeanMethodName("findAllContains", attrName);
+ } else {
+ methodName = getJavaBeanMethodName("findAllBy", attrName);
+ }
+ String daoName = StringUtils.capitalize(usageSimpleType) + "DAO";
+
+ builder.addImport(result, usageClass.getPackageName() + '.' + daoName);
+
+ buffer.append(""
+/*{
+ if (type == <%=usageSimpleType%>.class) {
+ <%=daoName%> dao = (<%=daoName%>)
+ topiaDAOSupplier.getDAO(<%=usageSimpleType%>.class);
+ tmp = dao.<%=methodName%>(entity);
+ result.addAll(tmp);
+ }
+}*/
+ );
+ }
+ }
+
+ buffer.append(""
+/*{
+ return (List<U>) result;
+ }*/
+ );
+ setOperationBody(operation, buffer.toString());
+
+ operation = addOperation(result,
+ "findAllUsages",
+ "Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>>",
+ ObjectModelJavaModifier.PUBLIC);
+
+ addParameter(operation, "E", "entity");
+ addAnnotation(result, operation, Override.class);
+
+ buffer = new StringBuilder(300);
+ buffer.append(""
+/*{
+ Map<Class<? extends TopiaEntity>,List<? extends TopiaEntity>> result;
+ result = new HashMap<Class<? extends TopiaEntity>, List<? extends TopiaEntity>>(<%=usagesForclass.size()%>);
+
+ List<? extends TopiaEntity> list;
+}*/
+ );
+ for (ObjectModelClass usageClass : usagesForclass) {
+
+ String fqn = usageClass.getName();
+ buffer.append(""
+/*{
+ list = findUsages(<%=fqn%>.class, entity);
+ if (!list.isEmpty()) {
+ result.put(<%=fqn%>.class, list);
+ }
+}*/
+ );
+
+ }
+ buffer.append(""
+/*{
+ return result;
+ }*/
+ );
+
+ setOperationBody(operation, buffer.toString());
+ }
+
+ /**
+ * Generation of DAO operations signatures from class. These operations are
+ * abstract and identified by <<dao>> stereotype in the model. The
+ * developper must defined these methods in the DAOImpl associated to this
+ * DAOAbstract.
+ *
+ * @param result clazz where to add operations
+ * @param operations operations to generate
+ */
+ private void generateDAOOperations(ObjectModelClass result,
+ Collection<ObjectModelOperation>
+ operations) {
+ if (CollectionUtils.isEmpty(operations)) {
+
+ // no extra operations to generate
+ return;
+ }
+
+ for (ObjectModelOperation op : operations) {
+
+ Set<String> exceptions = op.getExceptions();
+ cloneOperation(op,
+ result,
+ true,
+ ObjectModelJavaModifier.ABSTRACT,
+ ObjectModelJavaModifier.fromVisibility(op.getVisibility())
+ );
+ }
+ }
+
+
+
+
+ private String generateSecurity(ObjectModelClass result,
+ ObjectModelClass clazz,
+ String tagValue) {
+ StringBuilder buffer = new StringBuilder();
+
+ if (StringUtils.isNotEmpty(tagValue)) {
+ String security = tagValue;
+ Pattern propertiesPattern = Pattern
+ .compile("((?:[_a-zA-Z0-9]+\\.)+(?:_?[A-Z][_a-zA-Z0-9]*\\.)+)attribute\\.(?:([_a-z0-9][_a-zA-Z0-9]*))#(?:(create|load|update|delete))");
+ String[] valuesSecurity = security.split(":");
+
+ for (String valueSecurity : valuesSecurity) {
+ Matcher matcher = propertiesPattern.matcher(valueSecurity);
+ matcher.find();
+ // className is fully qualified name of class
+ String className = matcher.group(1);
+ className = StringUtil.substring(className, 0, -1); // remove ended
+ // .
+ // target is class, attribute or operation
+ String attributeName = matcher.group(2);
+ String actions = matcher.group(3).toUpperCase();
+
+ String query = "";
+ String daoClass = "";
+ if (className.equals(clazz.getQualifiedName())) {
+ query = "select " + attributeName + ".topiaId from " + clazz.getQualifiedName() + " where topiaId = :id";
+ daoClass = clazz.getAttribute(attributeName).getClassifier().getQualifiedName();
+ } else {
+ query = "select at.topiaId from " + className + " at inner join at." + attributeName + " cl where cl.topiaId = :id";
+ daoClass = className;
+ }
+ buffer.append(""
+/*{
+ resultPermissions.addAll(getRequestPermission(topiaId,
+ <%=actions%>,
+ "<%=query%>",
+ <%=daoClass%>.class));
+}*/
+ );
+ }
+ } else {
+ buffer.append(""
+/*{ return null;
+ }*/
+ );
+ }
+ return buffer.toString();
+ }
+
+ protected void generateNoNMultiplicity(String clazzName,
+ ObjectModelClass result,
+ ObjectModelAttribute attr,
+ boolean isAssoc) {
+ String attrName = attr.getName();
+ String attrType = attr.getType();
+ String propertyName = clazzName + "." + getConstantName(attrName);
+ if (!isAssoc && attr.hasAssociationClass()) {
+ String assocClassName = attr.getAssociationClass().getName();
+ String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr);
+ // It is about transitivity : use the property to access the
+ // associationClass + '.' + the property to access the expected
+ // attribute
+ // <class>.<attrAssoc> + '.' + <assocClass>.<attr>
+ propertyName =
+ clazzName + '.' + getConstantName(assocAttrName) +
+ " + '.' + " +
+ assocClassName + '.' + getConstantName(attrName);
+ }
+
+ ObjectModelOperation op;
+ op = addOperation(result,
+ getJavaBeanMethodName("findBy", attrName),
+ "E",
+ ObjectModelJavaModifier.PUBLIC);
+ addParameter(op, attrType, "v");
+ setOperationBody(op, ""
+/*{
+ E result = findByProperty(<%=propertyName%>, v);
+ return result;
+ }*/
+ );
+
+ op = addOperation(result,
+ getJavaBeanMethodName("findAllBy", attrName),
+ "List<E>",
+ ObjectModelJavaModifier.PUBLIC);
+ addParameter(op, attrType, "v");
+ setOperationBody(op, ""
+/*{
+ List<E> result = findAllByProperty(<%=propertyName%>, v);
+ return result;
+ }*/
+ );
+
+ if (!isAssoc && attr.hasAssociationClass()) {
+ String assocClassName = attr.getAssociationClass().getName();
+ String assocClassFQN = attr.getAssociationClass().getQualifiedName();
+ String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr);
+ String assocPropertyConstantName = getConstantName(assocAttrName);
+ op = addOperation(result,
+ getJavaBeanMethodName("findBy", assocClassName),
+ "E",
+ ObjectModelJavaModifier.PUBLIC);
+ addParameter(op, assocClassFQN, "value");
+ setOperationBody(op, ""
+/*{
+ E result = findByProperty(<%=clazzName + "." + assocPropertyConstantName%>, value);
+ return result;
+ }*/
+ );
+
+ op = addOperation(result,
+ getJavaBeanMethodName("findAllBy", assocClassName),
+ "List<E>",
+ ObjectModelJavaModifier.PUBLIC);
+ addParameter(op, assocClassFQN, "value");
+ setOperationBody(op, ""
+/*{
+ List<E> result = findAllByProperty(<%=clazzName + "." + assocPropertyConstantName%>, value);
+ return result;
+ }*/
+ );
+ }
+ }
+
+ protected void generateNMultiplicity(String clazzName,
+ ObjectModelClass result,
+ ObjectModelAttribute attr) {
+ String attrName = attr.getName();
+ String attrType = attr.getType();
+ if (attr.hasAssociationClass()) {
+ // do nothing for association class, too complex...
+ return;
+ }
+ ObjectModelOperation op;
+ // Since 2.4 do nothing, findContains and findAllContains are not generated anymore
+ op = addOperation(result,
+ getJavaBeanMethodName("findContains", attrName),
+ "E",
+ ObjectModelJavaModifier.PUBLIC);
+ addParameter(op, attrType, "v");
+ setOperationBody(op, ""
+/*{
+ E result = findContains(<%=clazzName + "." + getConstantName(attrName)%>, v);
+ return result;
+ }*/
+ );
+
+ op = addOperation(result,
+ getJavaBeanMethodName("findAllContains", attrName),
+ "List<E>",
+ ObjectModelJavaModifier.PUBLIC);
+ addParameter(op, attrType, "v");
+ setOperationBody(op, ""
+/*{
+ List<E> result = findAllContains(<%=clazzName + "." + getConstantName(attrName)%>, v);
+ return result;
+ }*/
+ );
+ }
+
+
+ /**
+ * Obtain business operations of the DAO.
+ *
+ * This operations can not be generated, but must be written by developper.
+ *
+ * @param clazz the clazz to test.
+ * @return collections of extra operations, or empty collection if none found.
+ */
+ public Collection<ObjectModelOperation> getDAOOperations(
+ ObjectModelClass clazz) {
+
+// // Note : this collection will contains extra operations for DAO.
+// // Overriding existing generated methods is not managed yet
+// Collection<ObjectModelOperation> results =
+// new ArrayList<ObjectModelOperation>();
+
+// // This code will be deprecated
+// for (ObjectModelOperation op : clazz.getOperations()) {
+// if (TopiaGeneratorUtil.hasDaoStereotype(op)) {
+// results.add(op);
+// }
+// }
+ Collection<ObjectModelOperation> extra =
+ extraOperations.get(clazz.getQualifiedName());
+ return extra;
+// if (extra != null) {
+// for (ObjectModelOperation op : extra) {
+// results.add(op);
+// }
+// }
+
+// return results;
+ }
+
+ private void generateNaturalId(ObjectModelClass result,
+ ObjectModelClass clazz) {
+ Set<ObjectModelAttribute> props =
+ TopiaGeneratorUtil.getNaturalIdAttributes(clazz);
+
+ if (!props.isEmpty()) {
+
+ if (log.isDebugEnabled()) {
+ log.debug("generateNaturalId for " + props);
+ }
+ ObjectModelOperation findByNaturalId = addOperation(result,
+ "findByNaturalId", "E", ObjectModelJavaModifier.PUBLIC);
+
+ ObjectModelOperation existByNaturalId = addOperation(result,
+ "existByNaturalId", "boolean", ObjectModelJavaModifier.PUBLIC);
+
+ // TODO sletellier 20120406 : remove method on 3.0
+ ObjectModelOperation create = addOperation(result,
+ "create", "E", ObjectModelJavaModifier.PUBLIC);
+
+ // sletellier : mark as Deprecated (http://nuiton.org/issues/2051)
+ setDocumentation(create, "@deprecated since 2.6.10, prefer use {@link #createByNaturalId}\n");
+ addAnnotation(result, create, "Deprecated");
+
+ ObjectModelOperation createByNaturalId = addOperation(result,
+ "createByNaturalId", "E", ObjectModelJavaModifier.PUBLIC);
+
+ // used for calling findByProperties in findByNaturalId
+ String searchProperties = "";
+ // used for calling findByNaturalId in existByNaturalId
+// String params = "";
+ String clazzName = clazz.getName();
+ for (ObjectModelAttribute attr : props) {
+ String propName = attr.getName();
+ // add property as param in both methods
+ addParameter(findByNaturalId, attr.getType(), propName);
+ addParameter(existByNaturalId, attr.getType(), propName);
+ addParameter(create, attr.getType(), propName);
+ addParameter(createByNaturalId, attr.getType(), propName);
+
+ searchProperties +=
+ ", " + clazzName + '.' + getConstantName(propName) +
+ ", " + propName;
+ //params += ", " + propName;
+ }
+ searchProperties = searchProperties.substring(2);
+ //params = params.substring(2);
+
+ setOperationBody(findByNaturalId, ""
+/*{
+ return findByProperties(<%=searchProperties%>);
+ }*/
+ );
+
+ setOperationBody(existByNaturalId, ""
+/*{
+ return existByProperties(<%=searchProperties%>);
+ }*/
+ );
+
+ setOperationBody(create, ""
+/*{
+ return create(<%=searchProperties%>);
+ }*/
+ );
+
+ setOperationBody(createByNaturalId, ""
+/*{
+ return create(<%=searchProperties%>);
+ }*/
+ );
+ }
+ }
+
+ private void generateNotNull(ObjectModelClass result,
+ ObjectModelClass clazz) {
+
+ Set<ObjectModelAttribute> props =
+ TopiaGeneratorUtil.getNotNullAttributes(clazz);
+
+ if (!props.isEmpty()) {
+
+ if (log.isDebugEnabled()) {
+ log.debug("generateNotNull for " + props);
+ }
+
+ ObjectModelOperation createByNotNull = addOperation(result,
+ "createByNotNull", "E", ObjectModelJavaModifier.PUBLIC);
+
+ String createProperties = "";
+// String params = "";
+ String clazzName = clazz.getName();
+ for (ObjectModelAttribute attr : props) {
+ String propName = attr.getName();
+ // add property as param in both methods
+ addParameter(createByNotNull, attr.getType(), propName);
+
+ createProperties +=
+ ", " + clazzName + '.' + getConstantName(propName) +
+ ", " + propName;
+ //params += ", " + propName;
+ }
+ createProperties = createProperties.substring(2);
+ //params = params.substring(2);
+
+ setOperationBody(createByNotNull, ""
+/*{
+ return create(<%=createProperties%>);
+ }*/
+ );
+ }
+ }
+}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2013-10-02 16:24:51 UTC (rev 2809)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2013-10-03 16:30:27 UTC (rev 2810)
@@ -52,6 +52,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -516,9 +517,21 @@
private static final Set<String> primitiveTypes = new HashSet<String>();
+ private static final Map<String, String> primitiveTypeToClass = new HashMap<String, String>();
+
private static final String VOID_TYPE = "void";
static {
+
+ primitiveTypeToClass.put("byte", "java.lang.Byte");
+ primitiveTypeToClass.put("short", "java.lang.Short");
+ primitiveTypeToClass.put("int", "java.lang.Integer");
+ primitiveTypeToClass.put("long", "java.lang.Long");
+ primitiveTypeToClass.put("float", "java.lang.Float");
+ primitiveTypeToClass.put("double", "java.lang.Double");
+ primitiveTypeToClass.put("char", "java.lang.Char");
+ primitiveTypeToClass.put("boolean", "java.lang.Boolean");
+
numberTypes.add("byte");
numberTypes.add("java.lang.Byte");
numberTypes.add("Byte");
@@ -573,6 +586,13 @@
return primitiveTypes.contains(attr.getType());
}
+ public static String getClassForPrimitiveType(ObjectModelAttribute attr) {
+ Preconditions.checkState(isPrimitiveType(attr));
+ String className = primitiveTypeToClass.get(attr.getType());
+ Preconditions.checkNotNull(className);
+ return className;
+ }
+
/**
* Indique si la classe specifiee n'a aucune ou que des methodes abstraites
*
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 16:24:51 UTC (rev 2809)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java 2013-10-03 16:30:27 UTC (rev 2810)
@@ -205,10 +205,10 @@
}
protected String createSimpleQuery() {
- return createSimpleQuery0(null);
+ return newFromClause(null);
}
- protected String createSimpleQuery0(String alias) {
+ protected String newFromClause(String alias) {
String hql = "from " + getTopiaEntityEnum().getImplementationFQN();
if (StringUtils.isNotBlank(alias)) {
hql += " " + alias;
@@ -218,7 +218,7 @@
@Deprecated
public String createSimpleQuery(String alias) {
- return createSimpleQuery0(alias);
+ return newFromClause(alias);
}
public E newInstance() {
@@ -356,6 +356,10 @@
}
}
+ protected HqlAndParametersBuilder<E> newHqlAndParametersBuilder() {
+ return new HqlAndParametersBuilder<E>(getEntityClass());
+ }
+
protected HqlAndParametersBuilder<E> getHqlForProperties(String propertyName,
Object propertyValue,
Object... otherPropertyNamesAndValues) {
@@ -370,7 +374,7 @@
}
protected HqlAndParametersBuilder<E> getHqlForProperties(Map<String, Object> properties) {
- HqlAndParametersBuilder<E> hqlAndParametersBuilder = new HqlAndParametersBuilder<E>(getEntityClass());
+ HqlAndParametersBuilder<E> hqlAndParametersBuilder = newHqlAndParametersBuilder();
for (Map.Entry<String, Object> property : properties.entrySet()) {
hqlAndParametersBuilder.addEquals(property.getKey(), property.getValue());
}
@@ -414,6 +418,18 @@
return newQueryBuilder().forAll();
}
+ public TopiaQueryBuilderRunQueryStep<E> forContains(String propertyName, Object propertyValue) {
+ return forAll().addContains(propertyName, propertyValue).getNextStep();
+ }
+
+ public TopiaQueryBuilderRunQueryStep<E> forEquals(String propertyName, Object propertyValue) {
+ return forAll().addEquals(propertyName, propertyValue).getNextStep();
+ }
+
+ public TopiaQueryBuilderRunQueryStep<E> forIn(String propertyName, Iterable<Object> propertyValues) {
+ return forAll().addIn(propertyName, propertyValues).getNextStep();
+ }
+
public static class TopiaQueryBuilderCreateQueryStep<E extends TopiaEntity> {
protected AbstractTopiaDAO<E> topiaDAO;
@@ -849,14 +865,19 @@
return result;
}
- public TopiaQueryBuilderRunQueryStep<E> byTopiaId(String topiaId) {
+ public TopiaQueryBuilderRunQueryStep<E> forTopiaId(String topiaId) {
Preconditions.checkNotNull(topiaId, "given topiaId is null");
- return newQueryBuilder().forProperties(TopiaEntity.PROPERTY_TOPIA_ID, topiaId).getNextStep();
+ return forEquals(TopiaEntity.PROPERTY_TOPIA_ID, topiaId);
}
+ public TopiaQueryBuilderRunQueryStep<E> forTopiaIds(Iterable<String> topiaIds) {
+ Preconditions.checkNotNull(topiaIds, "given topiaIds is null");
+ return forIn(TopiaEntity.PROPERTY_TOPIA_ID, (Iterable) topiaIds);
+ }
+
@Deprecated
public E findByTopiaId(String id) {
- return byTopiaId(id).findUniqueOrNull();
+ return forTopiaId(id).findUniqueOrNull();
}
@Deprecated
@@ -948,7 +969,7 @@
@Deprecated
public boolean existByTopiaId(String topiaId) {
- boolean exists = byTopiaId(topiaId).exists();
+ boolean exists = forTopiaId(topiaId).exists();
return exists;
}
@@ -1167,7 +1188,7 @@
// get the count (removing the order-by)
long count2 = dao.count("SELECT COUNT(*) " +
- hql.substring(0, i), params);
+ hql.substring(0, i), params);
pager = new TopiaPagerBean();
pager.setRecords(count2);
pager.setPageSize(batchSize);
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java 2013-10-02 16:24:51 UTC (rev 2809)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java 2013-10-03 16:30:27 UTC (rev 2810)
@@ -61,7 +61,9 @@
}
public void addEquals(String property, Object value) {
+ Preconditions.checkNotNull(property);
// TODO brendan 02/10/13 do not use HQL parameters of Object are primitive types
+ // TODO brendan 02/10/13 if value is intanceof TopiaEntity, we can check type
if (value == null) {
addNull(property);
} else {
@@ -71,7 +73,10 @@
}
public void addIn(String property, Iterable<Object> values) {
- // TODO brendan 02/10/13 do not use HQL parameters of Object are primitive types
+ Preconditions.checkNotNull(property);
+ Preconditions.checkNotNull(values);
+ // TODO brendan 02/10/13 if value is intanceof TopiaEntity, we can check type
+ // TODO brendan 02/10/13 do not use HQL parameters of Object are primitive
Preconditions.checkArgument(!Iterables.isEmpty(values));
if (Iterables.size(values) == 1) {
addEquals(property, Iterables.getOnlyElement(values));
@@ -86,7 +91,7 @@
hqlParameterNames.add(hqlParameterName);
}
}
- String inClause = property + " in (" + StringUtils.join(hqlParameterNames, ", ")+ ")";
+ String inClause = property + " in (:" + StringUtils.join(hqlParameterNames, ", :")+ ")";
String whereClause = inClause;
if (propertyMayBeNull) {
whereClause = property + " is null or " + inClause;
@@ -108,6 +113,16 @@
whereClauses.add(":" + hqlParameterName + " in elements(" + property + ")");
}
+ public void addWhereClause(String whereClause) {
+ whereClauses.add(whereClause);
+ }
+
+ public void addWhereClause(String whereClause, Map<String, Object> hqlParameters) {
+ whereClauses.add(whereClause);
+ // TODO brendan 02/10/13 check parameters names are not already used
+ parameters.putAll(hqlParameters);
+ }
+
public String getHql() {
StringBuilder hqlStringBuilder = new StringBuilder();
hqlStringBuilder.append("from ").append(entityClass.getCanonicalName());
Modified: trunk/topia-service-security/src/test/java/org/nuiton/topia/security/TopiaSecurityTest.java
===================================================================
--- trunk/topia-service-security/src/test/java/org/nuiton/topia/security/TopiaSecurityTest.java 2013-10-02 16:24:51 UTC (rev 2809)
+++ trunk/topia-service-security/src/test/java/org/nuiton/topia/security/TopiaSecurityTest.java 2013-10-03 16:30:27 UTC (rev 2810)
@@ -78,6 +78,7 @@
*
* @author ruchaud
*/
+@Ignore
public class TopiaSecurityTest {
private static final Log log = LogFactory.getLog(TopiaSecurityTest.class);
1
0
Jenkins build became unstable: topia » ToPIA :: Service Replication #1521
by admin+hudson@codelutin.com 03 Oct '13
by admin+hudson@codelutin.com 03 Oct '13
03 Oct '13
02 Oct '13
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);
1
0
r2808 - in trunk/topia-persistence/src: main/java/org/nuiton/topia main/java/org/nuiton/topia/persistence test/java/org/nuiton/topia/persistence
by bleny@users.nuiton.org 02 Oct '13
by bleny@users.nuiton.org 02 Oct '13
02 Oct '13
Author: bleny
Date: 2013-10-02 11:02:12 +0200 (Wed, 02 Oct 2013)
New Revision: 2808
Url: http://nuiton.org/projects/topia/repository/revisions/2808
Log:
refs #2087 add some methods inhql builder
Added:
trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/HqlAndParametersBuilderTest.java
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.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-01 13:15:11 UTC (rev 2807)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-10-02 09:02:12 UTC (rev 2808)
@@ -24,6 +24,8 @@
* #L%
*/
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.Query;
@@ -43,6 +45,8 @@
*/
public class HibernateTopiaJpaSupport implements TopiaJpaSupport {
+ private static final Log log = LogFactory.getLog(HibernateTopiaJpaSupport.class);
+
// TODO AThimel 27/09/13 Javadoc
protected TopiaHibernateSupport hibernateSupport;
@@ -115,6 +119,11 @@
} catch (HibernateException eee) {
throw new TopiaException(String.format("An error occurs during query operation: %1$s : %2$s",
jpaql, eee.getMessage()), eee);
+ } catch (RuntimeException e) {
+ if (log.isWarnEnabled()) {
+ log.warn("exception occurred for query \n" + jpaql + "\nwith parameters " + parameters);
+ }
+ throw e;
}
}
@@ -135,6 +144,11 @@
} catch (HibernateException eee) {
throw new TopiaException(String.format("An error occurs during query operation: %1$s : %2$s",
jpaql, eee.getMessage()), eee);
+ } catch (RuntimeException e) {
+ if (log.isWarnEnabled()) {
+ log.warn("exception occurred for query \n" + jpaql + "\nwith parameters " + parameters);
+ }
+ throw e;
}
}
@@ -154,6 +168,11 @@
} catch (HibernateException eee) {
throw new TopiaException(String.format("An error occurs during execute operation: %1$s : %2$s",
jpaql, eee.getMessage()), eee);
+ } catch (RuntimeException e) {
+ if (log.isWarnEnabled()) {
+ log.warn("exception occurred for query \n" + jpaql + "\nwith parameters " + parameters);
+ }
+ throw e;
}
}
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-01 13:15:11 UTC (rev 2807)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java 2013-10-02 09:02:12 UTC (rev 2808)
@@ -516,6 +516,14 @@
return this;
}
+ public void addTopiaIdEquals(String property, String topiaId) {
+ hqlAndParametersBuilder.addTopiaIdEquals(property, topiaId);
+ }
+
+ public void addTopiaIdIn(String property, Iterable<String> topiaIds) {
+ hqlAndParametersBuilder.addTopiaIdIn(property, topiaIds);
+ }
+
// shortcuts to next step
public boolean exists() {
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java 2013-10-01 13:15:11 UTC (rev 2807)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java 2013-10-02 09:02:12 UTC (rev 2808)
@@ -61,16 +61,17 @@
}
public void addEquals(String property, Object value) {
+ // TODO brendan 02/10/13 do not use HQL parameters of Object are primitive types
if (value == null) {
addNull(property);
} else {
- String hqlParameterName = findAvailableHqlParameterName(property);
+ String hqlParameterName = putHqlParameterWithAvailableName(property, value);
whereClauses.add(property + " = :" + hqlParameterName);
- parameters.put(hqlParameterName, value);
}
}
public void addIn(String property, Iterable<Object> values) {
+ // TODO brendan 02/10/13 do not use HQL parameters of Object are primitive types
Preconditions.checkArgument(!Iterables.isEmpty(values));
if (Iterables.size(values) == 1) {
addEquals(property, Iterables.getOnlyElement(values));
@@ -81,8 +82,8 @@
if (value == null) {
propertyMayBeNull = true;
} else {
- String hqlParameterName = findAvailableHqlParameterName(property);
- parameters.put(hqlParameterName, value);
+ String hqlParameterName = putHqlParameterWithAvailableName(property, value);
+ hqlParameterNames.add(hqlParameterName);
}
}
String inClause = property + " in (" + StringUtils.join(hqlParameterNames, ", ")+ ")";
@@ -94,10 +95,17 @@
}
}
+ public void addTopiaIdEquals(String property, String topiaId) {
+ addEquals(property + "." + TopiaEntity.PROPERTY_TOPIA_ID, topiaId);
+ }
+
+ public void addTopiaIdIn(String property, Iterable<String> topiaIds) {
+ addIn(property + "." + TopiaEntity.PROPERTY_TOPIA_ID, (Iterable) topiaIds);
+ }
+
public void addContains(String property, Object value) {
- String hqlParameterName = findAvailableHqlParameterName(property);
+ String hqlParameterName = putHqlParameterWithAvailableName(property, value);
whereClauses.add(":" + hqlParameterName + " in elements(" + property + ")");
- parameters.put(hqlParameterName, value);
}
public String getHql() {
@@ -113,13 +121,22 @@
return hql;
}
- protected String findAvailableHqlParameterName(String propertyName) {
- String parameterName = propertyName;
+ /**
+ * Add a parameter in the parameters map searching with the suitable parameter name
+ * in order to prevent conflicts.
+ *
+ * @return the found key where the parameter has been added, suitable to use in the where clause
+ */
+ protected String putHqlParameterWithAvailableName(String propertyName, Object value) {
+ // TODO brendan 01/10/13 replace survey.topiaId by surveyTopiaId
+ String parameterNamePrefix = propertyName.replaceAll("\\.", "");
int suffix = 0;
+ String parameterName = parameterNamePrefix;
while (parameters.containsKey(parameterName)) {
suffix += 1;
- parameterName = propertyName + suffix;
+ parameterName = parameterNamePrefix + suffix;
}
+ parameters.put(parameterName, value);
return parameterName;
}
Added: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/HqlAndParametersBuilderTest.java
===================================================================
--- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/HqlAndParametersBuilderTest.java (rev 0)
+++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/HqlAndParametersBuilderTest.java 2013-10-02 09:02:12 UTC (rev 2808)
@@ -0,0 +1,23 @@
+package org.nuiton.topia.persistence;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HqlAndParametersBuilderTest {
+
+ @Test
+ public void testFindAvailableHqlParameterName() {
+
+ HqlAndParametersBuilder hqlAndParametersBuilderTest =
+ new HqlAndParametersBuilder(TopiaEntity.class);
+
+ String availableHqlParameterName1 = hqlAndParametersBuilderTest.putHqlParameterWithAvailableName("survey.topiaId", "topiaId1");
+ String availableHqlParameterName2 = hqlAndParametersBuilderTest.putHqlParameterWithAvailableName("survey.topiaId", "topiaId1");
+
+ Assert.assertNotEquals(availableHqlParameterName1, availableHqlParameterName2);
+ Assert.assertFalse(availableHqlParameterName1.contains("."));
+ Assert.assertFalse(availableHqlParameterName2.contains("."));
+
+ }
+
+}
1
0
r2807 - in trunk/topia-persistence/src/main/java/org/nuiton/topia: . framework generator persistence
by bleny@users.nuiton.org 01 Oct '13
by bleny@users.nuiton.org 01 Oct '13
01 Oct '13
Author: bleny
Date: 2013-10-01 15:15:11 +0200 (Tue, 01 Oct 2013)
New Revision: 2807
Url: http://nuiton.org/projects/topia/repository/revisions/2807
Log:
refs #2087 introduce AbstractTopiaDAO and a new query builder, use it to replace TopiaDAOImpl
Added:
trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaDAOSupplier.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/PersistenceContextTransformer.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAO.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAOImpl.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
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -24,10 +24,9 @@
* #L%
*/
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
@@ -37,14 +36,15 @@
import org.hibernate.tool.hbm2ddl.SchemaUpdate;
import org.nuiton.topia.framework.TopiaFiresSupport;
import org.nuiton.topia.framework.TopiaUtil;
+import org.nuiton.topia.persistence.AbstractTopiaDAO;
import org.nuiton.topia.persistence.TopiaDAO;
-import org.nuiton.topia.persistence.TopiaDAOImpl;
import org.nuiton.topia.persistence.TopiaEntity;
import org.nuiton.topia.persistence.TopiaIdFactory;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
/**
* Abstract implementation of the TopiaPersistenceContext. This class will be extended by a generated one in order to
@@ -177,27 +177,42 @@
entityClass.getName()));
}
- TopiaDAOImpl<E> result = (TopiaDAOImpl<E>) daoCache.get(entityClass);
- if (result == null) {
+ TopiaDAO<E> dao = (TopiaDAO<E>) daoCache.get(entityClass);
+ if (dao == null) {
// Looking for specialized DAO
// This DAO is supposed to exist, as created by generation
String daoClassName = entityClass.getName() + "DAO";
try {
- Class<TopiaDAOImpl<E>> daoClass = (Class<TopiaDAOImpl<E>>) Class.forName(daoClassName);
- result = daoClass.getConstructor().newInstance();
- } catch (Exception eee) {
- log.fatal("specialized DAO " + daoClassName +
- " not found, use default TopiaDAOHibernate");
- throw new TopiaException("Specialized DAO " + daoClassName + " not found");
+ Class<TopiaDAO<E>> daoClass = (Class<TopiaDAO<E>>) Class.forName(daoClassName);
+ dao = daoClass.getConstructor().newInstance();
+ } catch (InstantiationException e) {
+ log.fatal("unable to instantiate DAO class " + daoClassName, e);
+ throw new TopiaException("unable to instantiate DAO class " + daoClassName, e);
+ } catch (IllegalAccessException e) {
+ log.fatal("unable to instantiate DAO class " + daoClassName, e);
+ throw new TopiaException("unable to instantiate DAO class " + daoClassName, e);
+ } catch (InvocationTargetException e) {
+ log.fatal("unable to instantiate DAO class " + daoClassName, e);
+ throw new TopiaException("unable to instantiate DAO class " + daoClassName, e);
+ } catch (NoSuchMethodException e) {
+ log.fatal("unable to instantiate DAO class " + daoClassName, e);
+ throw new TopiaException("unable to instantiate DAO class " + daoClassName, e);
+ } catch (ClassNotFoundException e) {
+ log.fatal("unable to find DAO class " + daoClassName, e);
+ throw new TopiaException("unable to find DAO class " + daoClassName, e);
}
- // AThimel 27/09/13 "entityClass" seems not to be needed anymore in DAO init(...) method
- // TODO AThimel 27/09/13 Uncomment the next line
-// result.init(hibernateSupport, jpaSupport, sqlSupport, listenableSupport, topiaIdFactory, firesSupport);
- daoCache.put(entityClass, result);
+ if (dao instanceof AbstractTopiaDAO) {
+ AbstractTopiaDAO abstractTopiaDAO = (AbstractTopiaDAO) dao;
+ abstractTopiaDAO.init(hibernateSupport, jpaSupport, sqlSupport, listenableSupport, topiaIdFactory, firesSupport, this);
+ }
+
+ daoCache.put(entityClass, dao);
+
}
- return result;
+
+ return dao;
}
@Override
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -24,16 +24,15 @@
* #L%
*/
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.nuiton.topia.framework.TopiaFiresSupport;
+import org.nuiton.topia.framework.TopiaUtil;
-import com.google.common.collect.Maps;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
/**
* This class is the Hibernate implementation of TopiaJpaSupport. It realizes the bridge between the JPA specification
@@ -140,28 +139,6 @@
}
@Override
- public <T> T findUnique(String jpaql, Map<String, Object> parameters) {
- checkClosed();
-
- List<T> results = find(jpaql, 0, 1, parameters);
-
- // If there is more than 1 result, throw an exception
- if (results.size() > 1) {
- String message = String.format(
- "The query '%s' returns more than 1 unique result", jpaql);
- // TODO AThimel 02/08/13 Throw another exception if more than 1 result is found
- throw new TopiaException(message);
- }
-
- // otherwise return the first one, or null
- T result = null;
- if (!results.isEmpty()) {
- result = results.get(0);
- }
- return result;
- }
-
- @Override
public int execute(String jpaql, Map<String, Object> parameters) {
checkClosed();
@@ -180,42 +157,30 @@
}
}
- protected Map<String, Object> asMap(Object[] propertyNamesAndValues) {
- Map<String, Object> result = Maps.newHashMap();
- if (propertyNamesAndValues != null) {
- for (int j = 0; j < propertyNamesAndValues.length; j += 2) {
- String name = (String) propertyNamesAndValues[j];
- Object value = propertyNamesAndValues[j + 1];
- result.put(name, value);
- }
- }
- return result;
- }
-
@Override
public <T> List<T> findAll(String jpaql, Object... propertyNamesAndValues) {
- Map<String, Object> parameters = asMap(propertyNamesAndValues);
+ Map<String, Object> parameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
List<T> result = findAll(jpaql, parameters);
return result;
}
@Override
public <T> List<T> find(String jpaql, int startIndex, int endIndex, Object... propertyNamesAndValues) {
- Map<String, Object> parameters = asMap(propertyNamesAndValues);
+ Map<String, Object> parameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
List<T> result = find(jpaql, startIndex, endIndex, parameters);
return result;
}
@Override
public <T> T findUnique(String jpaql, Object... propertyNamesAndValues) {
- Map<String, Object> parameters = asMap(propertyNamesAndValues);
+ Map<String, Object> parameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
T result = findUnique(jpaql, parameters);
return result;
}
@Override
public int execute(String jpaql, Object... propertyNamesAndValues) {
- Map<String, Object> parameters = asMap(propertyNamesAndValues);
+ Map<String, Object> parameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
int result = execute(jpaql, parameters);
return result;
}
Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaDAOSupplier.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaDAOSupplier.java (rev 0)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaDAOSupplier.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -0,0 +1,30 @@
+package org.nuiton.topia;
+
+import org.nuiton.topia.persistence.TopiaDAO;
+import org.nuiton.topia.persistence.TopiaEntity;
+
+/**
+ * @author bleny
+ */
+public interface TopiaDAOSupplier {
+
+ /**
+ * Get DAO for specified class. If Specialized DAO exists then it returned
+ * otherwize TopiaDAO<entityClass> is returned
+ *
+ * @param entityClass type of entity
+ * @return the expected dao
+ */
+ <E extends TopiaEntity> TopiaDAO<E> getDAO(Class<E> entityClass);
+
+ /**
+ * Get DAO for specified class. If Specialized DAO exists then it returned
+ * otherwize TopiaDAO<entityClass> is returned
+ *
+ * @param entityClass type of entity
+ * @param daoClass the concrete dao class to use
+ * @return the expected dao
+ */
+ <E extends TopiaEntity, D extends TopiaDAO<E>> D getDAO(Class<E> entityClass, Class<D> daoClass);
+
+}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -117,25 +117,10 @@
* support something else than queries on TopiaEntity
*
* @param jpaql the JPA-QL query
- * @param parameters a map which keys are the attribute names and values are the attributes expected values
- * @return The result instance or null
- */
- <T> T findUnique(String jpaql,
- Map<String, Object> parameters);
-
- /**
- * Allow to do some JPA-QL query and return an unique result. If nothing if
- * found by the query, will return null. If more than one result is found,
- * will throw an exception.
- * <p/>
- * WARNING : Depending on the registered service, this method may not
- * support something else than queries on TopiaEntity
- *
- * @param jpaql the JPA-QL query
* @param propertyNamesAndValues the query parameters. Arguments are key-value paired :
* [propertyName;value;propertyName;value;...]
* @return The result instance or null
- * @deprecated prefer using {@link #findUnique(String, java.util.Map)}
+ * @deprecated prefer using {@link #find(String, int, int, java.util.Map)}
*/
@Deprecated
<T> T findUnique(String jpaql,
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -24,13 +24,12 @@
* #L%
*/
-import java.util.List;
-import java.util.Properties;
-
-import org.nuiton.topia.persistence.TopiaDAO;
import org.nuiton.topia.persistence.TopiaEntity;
import org.nuiton.topia.persistence.TopiaIdFactory;
+import java.util.List;
+import java.util.Properties;
+
/**
* This API provides all methods related to persistence :
* <ul>
@@ -42,7 +41,7 @@
* @author Arnaud Thimel <thimel(a)codelutin.com>
* @since 3.0
*/
-public interface TopiaPersistenceContext {
+public interface TopiaPersistenceContext extends TopiaDAOSupplier {
/**
* Retrieve {@link org.nuiton.topia.persistence.TopiaEntity} using its unique {@code topiaId}.
@@ -79,25 +78,6 @@
Properties getConfig(); // TODO AThimel 02/08/13 Change type ?
/**
- * Get DAO for specified class. If Specialized DAO exists then it returned
- * otherwize TopiaDAO<entityClass> is returned
- *
- * @param entityClass type of entity
- * @return the expected dao
- */
- <E extends TopiaEntity> TopiaDAO<E> getDAO(Class<E> entityClass);
-
- /**
- * Get DAO for specified class. If Specialized DAO exists then it returned
- * otherwize TopiaDAO<entityClass> is returned
- *
- * @param entityClass type of entity
- * @param daoClass the concrete dao class to use
- * @return the expected dao
- */
- <E extends TopiaEntity, D extends TopiaDAO<E>> D getDAO(Class<E> entityClass, Class<D> daoClass);
-
- /**
* Detects if the db associated to the current context contains at least one
* entity table.
*
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-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -25,29 +25,6 @@
package org.nuiton.topia.framework;
-import java.beans.PropertyChangeListener;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.WeakHashMap;
-import java.util.zip.GZIPInputStream;
-
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -81,12 +58,36 @@
import org.nuiton.topia.event.TopiaSchemaListener;
import org.nuiton.topia.event.TopiaTransactionListener;
import org.nuiton.topia.event.TopiaTransactionVetoable;
+import org.nuiton.topia.persistence.AbstractTopiaDAO;
import org.nuiton.topia.persistence.DefaultTopiaIdFactory;
import org.nuiton.topia.persistence.TopiaDAO;
import org.nuiton.topia.persistence.TopiaDAOImpl;
import org.nuiton.topia.persistence.TopiaEntity;
import org.nuiton.topia.persistence.TopiaIdFactory;
+import java.beans.PropertyChangeListener;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.WeakHashMap;
+import java.util.zip.GZIPInputStream;
+
/**
* Le AbstractTopiaContext est le point d'entre pour acceder aux donnees. Il est
* configurer par un fichier de propriete
@@ -1099,11 +1100,6 @@
}
@Override
- public <T> T findUnique(String jpaql, Map<String, Object> parameters) {
- throw new UnsupportedOperationException("This method is not available on TopiaContext, please use TopiaJpaSupport");
- }
-
- @Override
public int execute(String jpaql, Map<String, Object> parameters) {
throw new UnsupportedOperationException("This method is not available on TopiaContext, please use TopiaJpaSupport");
}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -161,7 +161,7 @@
* @deprecated use method from {@link org.nuiton.topia.TopiaPersistenceContext}
*/
@Deprecated
- <E extends TopiaEntity, D extends TopiaDAO<E>> D getDAO(Class<E> entityClass,Class<D> daoClass)
+ <E extends TopiaEntity, D extends TopiaDAO<E>> D getDAO(Class<E> entityClass, Class<D> daoClass)
throws TopiaException;
/**
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-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -25,16 +25,6 @@
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;
@@ -49,8 +39,6 @@
import org.hibernate.event.spi.PostLoadEventListener;
import org.hibernate.event.spi.PostUpdateEvent;
import org.hibernate.event.spi.PostUpdateEventListener;
-import org.hibernate.event.spi.PreCollectionUpdateEvent;
-import org.hibernate.event.spi.PreCollectionUpdateEventListener;
import org.hibernate.event.spi.PreDeleteEvent;
import org.hibernate.event.spi.PreDeleteEventListener;
import org.hibernate.event.spi.PreInsertEvent;
@@ -77,11 +65,22 @@
import org.nuiton.topia.event.TopiaTransactionEvent;
import org.nuiton.topia.event.TopiaTransactionListener;
import org.nuiton.topia.event.TopiaTransactionVetoable;
+import org.nuiton.topia.persistence.AbstractTopiaDAO;
import org.nuiton.topia.persistence.TopiaEntity;
import org.nuiton.topia.persistence.TopiaEntityContextable;
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/>
@@ -323,7 +322,7 @@
}
}
- public void fireOnPostLoad(TopiaContextImplementor context,
+ public void fireOnPostLoad(AbstractTopiaDAO context,
TopiaEntity entity, Object[] state) {
if (log.isDebugEnabled()) {
log.debug("fireOnPostLoad");
@@ -606,16 +605,16 @@
}
private void attachContext(Object entity,
- TopiaContextImplementor context) {
+ AbstractTopiaDAO dao) {
if (entity instanceof TopiaEntityContextable) {
- TopiaEntityContextable entityAbstract = (TopiaEntityContextable) entity;
- if (entityAbstract.getTopiaContext() == null) {
+ TopiaEntityContextable topiaEntityContextable = (TopiaEntityContextable) entity;
+ if (topiaEntityContextable.getTopiaDAO() == null) {
try {
- entityAbstract.setTopiaContext(context);
+ topiaEntityContextable.setTopiaDAO(dao);
} catch (TopiaException eee) {
if (log.isWarnEnabled()) {
log.warn("Impossible d'initialiser le TopiaContext"
- + " sur cette entité : " + entityAbstract,
+ + " sur cette entité : " + topiaEntityContextable,
eee);
}
}
@@ -675,11 +674,12 @@
@Override
public void onPostLoad(PostLoadEvent event) {
- TopiaContextImplementor context = getContext(rootContext, event
- .getSession());
- if (context != null && event.getEntity() instanceof TopiaEntity) {
- attachContext(event.getEntity(), context);
- context.getFiresSupport().fireOnPostLoad(context,
+// 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);
+ dao.getTopiaFiresSupport().fireOnPostLoad(dao,
(TopiaEntity) event.getEntity(), new Object[]{});
}
}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -24,6 +24,7 @@
*/
package org.nuiton.topia.framework;
+import com.google.common.base.Preconditions;
import com.google.common.base.Supplier;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -49,7 +50,10 @@
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
@@ -481,6 +485,34 @@
return config.getProperty(TopiaContextFactory.CONFIG_DEFAULT_SCHEMA);
}
+ public static Map<String, Object> convertPropertiesArrayToMap(Object... propertyNamesAndValues) throws IllegalArgumentException {
+ int propertiesLength = propertyNamesAndValues.length;
+ Preconditions.checkArgument(propertiesLength % 2 == 0,
+ "Wrong number of argument "
+ + propertiesLength
+ + ", you must have even number.");
+ Map<String, Object> properties = new LinkedHashMap<String, Object>();
+ for (int i = 0; i < propertyNamesAndValues.length; ) {
+ Object aPropertyName = propertyNamesAndValues[i++];
+ Object value = propertyNamesAndValues[i++];
+ Preconditions.checkArgument(
+ aPropertyName instanceof String,
+ "Argument at position [" + (i - 1) + "] " +
+ "should be a property name (says a String) but was " +
+ aPropertyName);
+ properties.put((String) aPropertyName, value);
+ }
+ return properties;
+ }
+
+ public static Map<String, Object> convertPropertiesArrayToMap(
+ String propertyName, Object propertyValue, Object... otherPropertyNamesAndValues) throws IllegalArgumentException {
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put(propertyName, propertyValue);
+ properties.putAll(convertPropertiesArrayToMap(otherPropertyNamesAndValues));
+ return properties;
+ }
+
public static class ConnectionProviderSupplier implements Supplier<ConnectionProvider>, Closeable {
protected ServiceRegistry serviceRegistry;
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -637,30 +637,29 @@
body.append(""
/*{
- {
- List<<%=attrSimpleType%>> list = getTopiaContext()
- .getDAO(<%=attrSimpleType%>.class)
- .findAllByProperties(<%=attrSimpleType%>.<%=getConstantName(reverseAttrName)%>, entity);
- for (<%=attrSimpleType%> item : list) {
+ {
+ List<<%=attrSimpleType%>> list = topiaDAOSupplier
+ .getDAO(<%=attrSimpleType%>.class)
+ .findAllByProperties(<%=attrSimpleType%>.<%=getConstantName(reverseAttrName)%>, entity);
+ for (<%=attrSimpleType%> item : list) {
- // sletellier : Set null only if target is concerned by deletion
- if (entity.equals(item.<%=getName%>())) {
- item.<%=setName%>(null);
- }
- }*/
+ // sletellier : Set null only if target is concerned by deletion
+ if (entity.equals(item.<%=getName%>())) {
+ item.<%=setName%>(null);
+ }
+ }*/
);
if (attr.isAggregate()) {
body.append(""
/*{
- getTopiaContext().getDAO(<%=attrSimpleType%>.class).delete(item);
- //item.delete();
+ topiaDAOSupplier.getDAO(<%=attrSimpleType%>.class).delete(item);
}*/
);
}
body.append(""
/*{
- }
- }
+ }
+ }
}*/
);
@@ -672,7 +671,6 @@
ObjectModelOperation op;
op = addOperation(result, "delete", "void", ObjectModelJavaModifier.PUBLIC);
addAnnotation(result, op,Override.class);
- addException(op, TopiaException.class);
addParameter(op, "E", "entity");
body.append(""
/*{
@@ -707,7 +705,6 @@
addParameter(operation, "Class<U>", "type");
addParameter(operation, "E", "entity");
- addException(operation, TopiaException.class);
addAnnotation(result, operation, Override.class);
setOperationBody(operation, ""
/*{
@@ -721,7 +718,6 @@
ObjectModelJavaModifier.PUBLIC);
addParameter(operation, "E", "entity");
- addException(operation, TopiaException.class);
addAnnotation(result, operation, Override.class);
setOperationBody(operation, ""
/*{
@@ -750,7 +746,6 @@
addParameter(operation, "Class<U>", "type");
addParameter(operation, "E", "entity");
- addException(operation, TopiaException.class);
addAnnotation(result, operation, Override.class);
StringBuilder buffer = new StringBuilder(300);
buffer.append(""
@@ -810,7 +805,7 @@
/*{
if (type == <%=usageSimpleType%>.class) {
<%=daoName%> dao = (<%=daoName%>)
- getTopiaContext().getDAO(<%=usageSimpleType%>.class);
+ topiaDAOSupplier.getDAO(<%=usageSimpleType%>.class);
tmp = dao.<%=methodName%>(entity);
result.addAll(tmp);
}
@@ -832,7 +827,6 @@
ObjectModelJavaModifier.PUBLIC);
addParameter(operation, "E", "entity");
- addException(operation, TopiaException.class);
addAnnotation(result, operation, Override.class);
buffer = new StringBuilder(300);
@@ -887,7 +881,6 @@
for (ObjectModelOperation op : operations) {
Set<String> exceptions = op.getExceptions();
- exceptions.add(TopiaException.class.getName());
cloneOperation(op,
result,
true,
@@ -974,7 +967,6 @@
getJavaBeanMethodName("findBy", attrName),
"E",
ObjectModelJavaModifier.PUBLIC);
- addException(op, TopiaException.class);
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
@@ -987,7 +979,6 @@
getJavaBeanMethodName("findAllBy", attrName),
"List<E>",
ObjectModelJavaModifier.PUBLIC);
- addException(op, TopiaException.class);
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
@@ -1005,7 +996,6 @@
getJavaBeanMethodName("findBy", assocClassName),
"E",
ObjectModelJavaModifier.PUBLIC);
- addException(op, TopiaException.class);
addParameter(op, assocClassFQN, "value");
setOperationBody(op, ""
/*{
@@ -1018,7 +1008,6 @@
getJavaBeanMethodName("findAllBy", assocClassName),
"List<E>",
ObjectModelJavaModifier.PUBLIC);
- addException(op, TopiaException.class);
addParameter(op, assocClassFQN, "value");
setOperationBody(op, ""
/*{
@@ -1044,7 +1033,6 @@
getJavaBeanMethodName("findContains", attrName),
"E",
ObjectModelJavaModifier.PUBLIC);
- addException(op, TopiaException.class);
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
@@ -1057,7 +1045,6 @@
getJavaBeanMethodName("findAllContains", attrName),
"List<E>",
ObjectModelJavaModifier.PUBLIC);
- addException(op, TopiaException.class);
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
@@ -1114,11 +1101,9 @@
}
ObjectModelOperation findByNaturalId = addOperation(result,
"findByNaturalId", "E", ObjectModelJavaModifier.PUBLIC);
- addException(findByNaturalId, TopiaException.class);
ObjectModelOperation existByNaturalId = addOperation(result,
"existByNaturalId", "boolean", ObjectModelJavaModifier.PUBLIC);
- addException(existByNaturalId, TopiaException.class);
// TODO sletellier 20120406 : remove method on 3.0
ObjectModelOperation create = addOperation(result,
@@ -1127,13 +1112,10 @@
// sletellier : mark as Deprecated (http://nuiton.org/issues/2051)
setDocumentation(create, "@deprecated since 2.6.10, prefer use {@link #createByNaturalId}\n");
addAnnotation(result, create, "Deprecated");
- addException(create, TopiaException.class);
ObjectModelOperation createByNaturalId = addOperation(result,
"createByNaturalId", "E", ObjectModelJavaModifier.PUBLIC);
- addException(createByNaturalId, TopiaException.class);
-
// used for calling findByProperties in findByNaturalId
String searchProperties = "";
// used for calling findByNaturalId in existByNaturalId
@@ -1196,8 +1178,6 @@
ObjectModelOperation createByNotNull = addOperation(result,
"createByNotNull", "E", ObjectModelJavaModifier.PUBLIC);
- addException(createByNotNull, TopiaException.class);
-
String createProperties = "";
// String params = "";
String clazzName = clazz.getName();
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/PersistenceContextTransformer.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/PersistenceContextTransformer.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/PersistenceContextTransformer.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -36,7 +36,6 @@
import org.nuiton.eugene.models.object.ObjectModelOperation;
import org.nuiton.topia.AbstractTopiaPersistenceContext;
import org.nuiton.topia.TopiaContext;
-import org.nuiton.topia.TopiaException;
import org.nuiton.topia.persistence.TopiaEntity;
import org.nuiton.topia.persistence.util.EntityOperator;
import org.nuiton.topia.persistence.util.EntityOperatorStore;
@@ -183,10 +182,9 @@
// specialized getXXXDao method
op = addOperation(output, "get" + daoClazzName, clazz.getPackageName() + '.' + daoClazzName);
addImport(output, clazz);
- addException(op, TopiaException.class);
setOperationBody(op, ""
/*{
- <%=daoClazzName%> result = context.getDAO(<%=clazzName%>.class, <%=daoClazzName%>.class);
+ <%=daoClazzName%> result = getDAO(<%=clazzName%>.class, <%=daoClazzName%>.class);
return result;
}*/
);
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -44,6 +44,7 @@
import org.nuiton.eugene.models.object.ObjectModelInterface;
import org.nuiton.eugene.models.object.ObjectModelOperation;
import org.nuiton.eugene.models.object.ObjectModelParameter;
+import org.nuiton.topia.persistence.AbstractTopiaDAO;
import org.nuiton.topia.persistence.TopiaDAOImpl;
import java.util.ArrayList;
@@ -981,7 +982,7 @@
if (StringUtils.isEmpty(daoImpl)) {
// use the default dao implementation of topia
- result = TopiaDAOImpl.class;
+ result = AbstractTopiaDAO.class;
} else {
try {
result = Class.forName(daoImpl);
Copied: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java (from rev 2804, trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAOImpl.java)
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java (rev 0)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDAO.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -0,0 +1,1224 @@
+/*
+ * #%L
+ * ToPIA :: Persistence
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2004 - 2010 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+/* *
+ * TopiaDAOAbstract.java
+ *
+ * Created: 31 déc. 2005 13:10:34
+ *
+ * @author poussin <poussin(a)codelutin.com>
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+
+package org.nuiton.topia.persistence;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.HibernateException;
+import org.hibernate.metadata.ClassMetadata;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaDAOSupplier;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.TopiaHibernateSupport;
+import org.nuiton.topia.TopiaJpaSupport;
+import org.nuiton.topia.TopiaListenableSupport;
+import org.nuiton.topia.TopiaSqlSupport;
+import org.nuiton.topia.event.TopiaEntityListener;
+import org.nuiton.topia.event.TopiaEntityVetoable;
+import org.nuiton.topia.framework.TopiaContextImplementor;
+import org.nuiton.topia.framework.TopiaFiresSupport;
+import org.nuiton.topia.framework.TopiaUtil;
+import org.nuiton.topia.persistence.pager.TopiaPagerBean;
+import org.nuiton.util.PagerBeanUtil;
+
+import java.lang.reflect.InvocationTargetException;
+import java.security.Permission;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * Cette classe permet d'avoir un ensemble de méthode implantée de façon
+ * standard et plus spécifiquement pour Hibernate.
+ * <p/>
+ * Certains accès à Hibernate sont tout de même fait ici, car on a pris le choix
+ * de se baser entièrement sur hibernate pour la persistence, et il est ainsi
+ * possible d'accèder au meta information hibernate sur les classes lorque l'on
+ * en a besoin.
+ *
+ * @param <E> le type de l'entite
+ * @author bpoussin <poussin(a)codelutin.com>
+ * @version $Id$
+ */
+
+public abstract class AbstractTopiaDAO<E extends TopiaEntity> implements TopiaDAO<E> {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ private static Log log = LogFactory.getLog(AbstractTopiaDAO.class);
+
+ /**
+ * Default batch size used to iterate on data.
+ *
+ * @since 2.6.14
+ */
+ protected int batchSize = 1000;
+
+ protected TopiaHibernateSupport topiaHibernateSupport;
+
+ protected TopiaJpaSupport topiaJpaSupport;
+
+ protected TopiaSqlSupport topiaSqlSupport;
+
+ protected TopiaListenableSupport topiaListenableSupport;
+
+ protected TopiaIdFactory topiaIdFactory;
+
+ protected TopiaFiresSupport topiaFiresSupport;
+
+ protected TopiaDAOSupplier topiaDAOSupplier;
+
+ public abstract TopiaEntityEnum getTopiaEntityEnum();
+
+ public abstract Class<E> getEntityClass();
+
+ public Iterator<E> iterator() {
+
+ Iterator<E> iterator = new FindAllIterator<E, E>(
+ this,
+ getEntityClass(),
+ batchSize,
+ "FROM " + getTopiaEntityEnum().getImplementationFQN() + " ORDER BY id",
+ Collections. <String, Object> emptyMap());
+
+ return iterator;
+
+ }
+
+// /**
+// * Retourne l'id de l'entity
+// *
+// * @param e l'entity
+// * @return l'id de l'entity ou null si pas trouvé
+// * @throws org.nuiton.topia.TopiaException Si une erreur survient durant la recherche
+// */
+// protected Serializable getId(E e) {
+// ClassMetadata meta = getClassMetadata();
+// String idPropName = meta.getIdentifierPropertyName();
+//
+// try {
+// Serializable result;
+// result = (Serializable) PropertyUtils.getSimpleProperty(e,
+// idPropName);
+// return result;
+// } catch (Exception eee) {
+// throw new TopiaException("Impossible de récuperer l'identifiant "
+// + idPropName + " de l'entite: " + e);
+// }
+// }
+
+// /**
+// * Retourne l'id de l'entity representer comme une map
+// *
+// * @param map l'entity en representation map
+// * @return l'id de l'entity ou null si pas trouvé
+// * @throws org.nuiton.topia.TopiaException Si une erreur survient durant la recherche
+// */
+// protected Serializable getId(Map map) {
+// try {
+// ClassMetadata meta = getClassMetadata();
+// String idPropName = meta.getIdentifierPropertyName();
+//
+// Serializable id = (Serializable) map.get(idPropName);
+// return id;
+// } catch (HibernateException eee) {
+// throw new TopiaException(eee);
+// }
+// }
+
+ /**
+ * When AbstractTopiaContext create the TopiaDAOHibernate, it must call this
+ * method just after.
+ */
+ public void init(
+ TopiaHibernateSupport topiaHibernateSupport,
+ TopiaJpaSupport topiaJpaSupport,
+ TopiaSqlSupport topiaSqlSupport,
+ TopiaListenableSupport topiaListenableSupport,
+ TopiaIdFactory topiaIdFactory,
+ TopiaFiresSupport topiaFiresSupport,
+ TopiaDAOSupplier topiaDAOSupplier) {
+ log.debug("init dao for " + getEntityClass());
+ this.topiaHibernateSupport = topiaHibernateSupport;
+ this.topiaJpaSupport = topiaJpaSupport;
+ this.topiaSqlSupport = topiaSqlSupport;
+ this.topiaListenableSupport = topiaListenableSupport;
+ this.topiaIdFactory = topiaIdFactory;
+ this.topiaFiresSupport = topiaFiresSupport;
+ this.topiaDAOSupplier = topiaDAOSupplier;
+ }
+
+ public TopiaFiresSupport getTopiaFiresSupport() {
+ return topiaFiresSupport;
+ }
+
+ @Override
+ public int getBatchSize() {
+ return batchSize;
+ }
+
+ @Override
+ public void setBatchSize(int batchSize) {
+ this.batchSize = batchSize;
+ }
+
+ protected String createSimpleQuery() {
+ return createSimpleQuery0(null);
+ }
+
+ protected String createSimpleQuery0(String alias) {
+ String hql = "from " + getTopiaEntityEnum().getImplementationFQN();
+ if (StringUtils.isNotBlank(alias)) {
+ hql += " " + alias;
+ }
+ return hql;
+ }
+
+ @Deprecated
+ public String createSimpleQuery(String alias) {
+ return createSimpleQuery0(alias);
+ }
+
+ public E newInstance() {
+ if (log.isTraceEnabled()) {
+ log.trace("entityClass = " + getEntityClass());
+ }
+ Class<E> implementation = (Class<E>)
+ getTopiaEntityEnum().getImplementation();
+ try {
+ E newInstance = implementation.newInstance();
+ return newInstance;
+ } catch (InstantiationException e) {
+ throw new TopiaException(
+ "Impossible de trouver ou d'instancier la classe "
+ + implementation);
+ } catch (IllegalAccessException e) {
+ throw new TopiaException(
+ "Impossible de trouver ou d'instancier la classe "
+ + implementation);
+ }
+ }
+
+ public void addTopiaEntityListener(TopiaEntityListener listener) {
+ topiaListenableSupport.addTopiaEntityListener(getEntityClass(), listener);
+ }
+
+ public void addTopiaEntityVetoable(TopiaEntityVetoable vetoable) {
+ topiaListenableSupport.addTopiaEntityVetoable(getEntityClass(), vetoable);
+ }
+
+ public void removeTopiaEntityListener(TopiaEntityListener listener) {
+ topiaListenableSupport.removeTopiaEntityListener(getEntityClass(), listener);
+ }
+
+ public void removeTopiaEntityVetoable(TopiaEntityVetoable vetoable) {
+ topiaListenableSupport.removeTopiaEntityVetoable(getEntityClass(), vetoable);
+ }
+
+ public E create(E entity) {
+ try {
+ // first set topiaId
+ if (StringUtils.isBlank(entity.getTopiaId())) {
+
+ // only set id if not already on
+ String topiaId = topiaIdFactory.newTopiaId(getEntityClass(), entity);
+ entity.setTopiaId(topiaId);
+ }
+
+ if (entity instanceof TopiaEntityContextable) {
+ TopiaEntityContextable contextable = (TopiaEntityContextable) entity;
+ contextable.setTopiaDAO(this);
+ }
+
+ // save entity
+ topiaHibernateSupport.getHibernateSession().save(entity);
+ topiaFiresSupport.warnOnCreateEntity(entity);
+ return entity;
+ } catch (HibernateException eee) {
+ throw new TopiaException(eee);
+ }
+ }
+
+ public E create(String propertyName, Object propertyValue, Object... otherPropertyNamesAndValues) {
+ Map<String, Object> properties =
+ TopiaUtil.convertPropertiesArrayToMap(propertyName, propertyValue, otherPropertyNamesAndValues);
+ E result = create(properties);
+ return result;
+ }
+
+ @Override
+ public E create(Object... propertyNamesAndValues) {
+ Map<String, Object> properties = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ E result = create(properties);
+ return result;
+ }
+
+ /**
+ * Cette methode appelle fireVetoableCreate et fireOnCreated Si vous la
+ * surchargé, faites attention a appeler le super ou a appeler vous aussi
+ * ces deux methodes.
+ */
+
+ public E create(Map<String, Object> properties) {
+
+ E result = newInstance();
+
+ try {
+ for (Map.Entry<String, Object> e : properties.entrySet()) {
+ String propertyName = e.getKey();
+ Object value = e.getValue();
+ PropertyUtils.setProperty(result, propertyName, value);
+ }
+ } catch (IllegalAccessException eee) {
+ throw new IllegalArgumentException(
+ "Can't put properties on new Object", eee);
+ } catch (InvocationTargetException eee) {
+ throw new IllegalArgumentException(
+ "Can't put properties on new Object", eee);
+ } catch (NoSuchMethodException eee) {
+ throw new IllegalArgumentException(
+ "Can't put properties on new Object", eee);
+ }
+
+ create(result);
+
+ return result;
+ }
+
+
+ public E update(E e) {
+ try {
+ topiaHibernateSupport.getHibernateSession().saveOrUpdate(e);
+ topiaFiresSupport.warnOnUpdateEntity(e);
+ return e;
+ } catch (HibernateException eee) {
+ throw new TopiaException(eee);
+ }
+ }
+
+
+ public void delete(E e) {
+ try {
+ topiaHibernateSupport.getHibernateSession().delete(e);
+ e.notifyDeleted();
+ topiaFiresSupport.warnOnDeleteEntity(e);
+ } catch (HibernateException eee) {
+ throw new TopiaException(eee);
+ }
+ }
+
+
+ public void deleteAll(Iterable<E> entities) {
+ for (E entity : entities) {
+ delete(entity);
+ }
+ }
+
+ protected HqlAndParametersBuilder<E> getHqlForProperties(String propertyName,
+ Object propertyValue,
+ Object... otherPropertyNamesAndValues) {
+ Map<String, Object> properties =
+ TopiaUtil.convertPropertiesArrayToMap(propertyName, propertyValue, otherPropertyNamesAndValues);
+ return getHqlForProperties(properties);
+ }
+
+ protected HqlAndParametersBuilder<E> getHqlForNoConstraint() {
+ Map<String, Object> properties = Collections.emptyMap();
+ return getHqlForProperties(properties);
+ }
+
+ protected HqlAndParametersBuilder<E> getHqlForProperties(Map<String, Object> properties) {
+ HqlAndParametersBuilder<E> hqlAndParametersBuilder = new HqlAndParametersBuilder<E>(getEntityClass());
+ for (Map.Entry<String, Object> property : properties.entrySet()) {
+ hqlAndParametersBuilder.addEquals(property.getKey(), property.getValue());
+ }
+ return hqlAndParametersBuilder;
+ }
+
+ protected TopiaQueryBuilderRunQueryStep<E> forHql(String hql) {
+ Map<String, Object> properties = Collections.emptyMap();
+ return forHql(hql, properties);
+ }
+
+ protected TopiaQueryBuilderRunQueryStep<E> forHql(String hql, Map<String, Object> hqlParameters) {
+ return new TopiaQueryBuilderRunQueryStep(this, hql, hqlParameters);
+ }
+
+ protected TopiaQueryBuilderRunQueryStep<E> forHql(String hql, String parameterName,
+ Object parameterValue,
+ Object... otherParameterNamesAndValues) {
+ Map<String, Object> hqlParameters =
+ TopiaUtil.convertPropertiesArrayToMap(parameterName, parameterValue, otherParameterNamesAndValues);
+ return forHql(hql, hqlParameters);
+ }
+
+ public TopiaQueryBuilderCreateQueryStep<E> newQueryBuilder() {
+ return new TopiaQueryBuilderCreateQueryStep(this);
+ }
+
+ // shortcuts for first step of builder
+
+ public TopiaQueryBuilderAddCriteriaStep<E> forProperties(Map<String, Object> properties) {
+ return newQueryBuilder().forProperties(properties);
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> forProperties(String propertyName,
+ Object propertyValue,
+ Object... otherPropertyNamesAndValues) {
+ return newQueryBuilder().forProperties(propertyName, propertyValue, otherPropertyNamesAndValues);
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> forAll() {
+ return newQueryBuilder().forAll();
+ }
+
+ public static class TopiaQueryBuilderCreateQueryStep<E extends TopiaEntity> {
+
+ protected AbstractTopiaDAO<E> topiaDAO;
+
+ protected TopiaQueryBuilderCreateQueryStep(AbstractTopiaDAO<E> topiaDAO) {
+ this.topiaDAO = topiaDAO;
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> forProperties(Map<String, Object> properties) {
+ HqlAndParametersBuilder<E> hqlAndParametersBuilder = topiaDAO.getHqlForProperties(properties);
+ return getNextStep(hqlAndParametersBuilder);
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> forProperties(String propertyName,
+ Object propertyValue,
+ Object... otherPropertyNamesAndValues) {
+ HqlAndParametersBuilder<E> hqlAndParametersBuilder = topiaDAO.getHqlForProperties(propertyName, propertyValue, otherPropertyNamesAndValues);
+ return getNextStep(hqlAndParametersBuilder);
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> forAll() {
+ HqlAndParametersBuilder<E> hqlAndParametersBuilder = topiaDAO.getHqlForNoConstraint();
+ return getNextStep(hqlAndParametersBuilder);
+ }
+
+ protected TopiaQueryBuilderAddCriteriaStep<E> getNextStep(HqlAndParametersBuilder<E> hqlAndParametersBuilder) {
+ TopiaQueryBuilderAddCriteriaStep nextStep = new TopiaQueryBuilderAddCriteriaStep(topiaDAO, hqlAndParametersBuilder);
+ return nextStep;
+ }
+
+ // shortcuts to next step
+
+ public TopiaQueryBuilderAddCriteriaStep<E> addEquals(String property, Object value) {
+ return forAll().addEquals(property, value);
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> addIn(String property, Iterable<Object> values) {
+ return forAll().addIn(property, values);
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> addContains(String property, Object value) {
+ return forAll().addContains(property, value);
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> addNull(String property) {
+ return forAll().addNull(property);
+ }
+
+ public TopiaQueryBuilderRunQueryStep<E> setOrderByArguments(Set<String> orderByArguments) {
+ return forAll().setOrderByArguments(orderByArguments);
+ }
+
+ public TopiaQueryBuilderRunQueryStep<E> setOrderByArguments(String... orderByArguments) {
+ return forAll().setOrderByArguments(orderByArguments);
+ }
+
+ }
+
+ public static class TopiaQueryBuilderAddCriteriaStep<E extends TopiaEntity> {
+
+ protected AbstractTopiaDAO<E> topiaDAO;
+
+ protected HqlAndParametersBuilder<E> hqlAndParametersBuilder;
+
+ protected boolean hasOrderByClause = false;
+
+ protected TopiaQueryBuilderAddCriteriaStep(AbstractTopiaDAO<E> topiaDAO, HqlAndParametersBuilder<E> hqlAndParametersBuilder) {
+ this.topiaDAO = topiaDAO;
+ this.hqlAndParametersBuilder = hqlAndParametersBuilder;
+ }
+
+ public TopiaQueryBuilderRunQueryStep<E> setOrderByArguments(Set<String> orderByArguments) {
+ hasOrderByClause = ! Iterables.isEmpty(orderByArguments);
+ hqlAndParametersBuilder.setOrderByArguments(orderByArguments);
+ return getNextStep();
+ }
+
+ public TopiaQueryBuilderRunQueryStep<E> setOrderByArguments(String... orderByArguments) {
+ hqlAndParametersBuilder.setOrderByArguments(orderByArguments);
+ return getNextStep();
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> addEquals(String property, Object value) {
+ hqlAndParametersBuilder.addEquals(property, value);
+ return this;
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> addIn(String property, Iterable<Object> values) {
+ hqlAndParametersBuilder.addIn(property, values);
+ return this;
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> addContains(String property, Object value) {
+ hqlAndParametersBuilder.addContains(property, value);
+ return this;
+ }
+
+ public TopiaQueryBuilderAddCriteriaStep<E> addNull(String property) {
+ hqlAndParametersBuilder.addNull(property);
+ return this;
+ }
+
+ // shortcuts to next step
+
+ public boolean exists() {
+ return getNextStep().exists();
+ }
+
+ public E findAnyOrNull() {
+ return getNextStep().findAnyOrNull();
+ }
+
+ public E findUniqueOrNull() {
+ return getNextStep().findUniqueOrNull();
+ }
+
+ public E findAny() {
+ return getNextStep().findAny();
+ }
+
+ public E findUnique() {
+ return getNextStep().findUnique();
+ }
+
+ public E findFirst() {
+ return getNextStep().findFirst();
+ }
+
+ public E findFirstOrNull() {
+ return getNextStep().findFirstOrNull();
+ }
+
+ public List<E> findAll() {
+ return getNextStep().findAll();
+ }
+
+ public List<E> findAll(int startIndex, int endIndex) {
+ return getNextStep().findAll(startIndex, endIndex);
+ }
+
+ public Iterable<E> findAllLazy() {
+ return getNextStep().findAllLazy();
+ }
+
+ public long count() {
+ return getNextStep().count();
+ }
+
+ public List<String> findAllIds(int startIndex, int endIndex) {
+ return getNextStep().findAllIds(startIndex, endIndex);
+ }
+
+ public List<String> findAllIds() {
+ return getNextStep().findAllIds();
+ }
+
+ protected TopiaQueryBuilderRunQueryStep<E> getNextStep() {
+ String hql = hqlAndParametersBuilder.getHql();
+ Map<String, Object> hqlParameters = hqlAndParametersBuilder.getHqlParameters();
+ TopiaQueryBuilderRunQueryStep nextStep = new TopiaQueryBuilderRunQueryStep(topiaDAO, hql, hqlParameters);
+ return nextStep;
+ }
+
+ }
+
+ public static class TopiaQueryBuilderRunQueryStep<E extends TopiaEntity> {
+
+ protected final String hql;
+
+ protected final Map<String, Object> hqlParameters;
+
+ protected AbstractTopiaDAO<E> topiaDAO;
+
+ protected TopiaQueryBuilderRunQueryStep(AbstractTopiaDAO<E> topiaDAO, String hql, Map<String, Object> hqlParameters) {
+ this.hql = hql;
+ this.hqlParameters = hqlParameters;
+ this.topiaDAO = topiaDAO;
+ }
+
+ public boolean exists() {
+ return topiaDAO.exists(hql, hqlParameters);
+ }
+
+ public long count() {
+ String hqlWithSelectClause = "select count(topiaId) " + hql;
+ return topiaDAO.count(hqlWithSelectClause, hqlParameters);
+ }
+
+ public E findUnique() {
+ return topiaDAO.findUnique(hql, hqlParameters);
+ }
+
+ public E findUniqueOrNull() {
+ return topiaDAO.findUniqueOrNull(hql, hqlParameters);
+ }
+
+ public E findFirst() {
+ return topiaDAO.findFirst(hql, hqlParameters);
+ }
+
+ public E findFirstOrNull() {
+ return topiaDAO.findFirstOrNull(hql, hqlParameters);
+ }
+
+ public E findAny() {
+ return topiaDAO.findAny(hql, hqlParameters);
+ }
+
+ public E findAnyOrNull() {
+ return topiaDAO.findAnyOrNull(hql, hqlParameters);
+ }
+
+ public List<E> findAll() {
+ return topiaDAO.findAll(hql, hqlParameters);
+ }
+
+ public Iterable<E> findAllLazy() {
+ return topiaDAO.findAllLazy(hql, hqlParameters);
+ }
+
+ public List<E> findAll(int startIndex, int endIndex) {
+ return topiaDAO.findAll(hql, hqlParameters, startIndex, endIndex);
+ }
+
+ public List<String> findAllIds() {
+ // XXX brendan 30/09/13 does this truely work ?
+ String hqlWithSelectClause = "select topiaId " + hql;
+ return topiaDAO.findAll(hqlWithSelectClause, hqlParameters, String.class);
+ }
+
+ public List<String> findAllIds(int startIndex, int endIndex) {
+ // XXX brendan 30/09/13 does this truely work ?
+ String hqlWithSelectClause = "select topiaId " + hql;
+ return topiaDAO.findAll(hqlWithSelectClause, hqlParameters, String.class, startIndex, endIndex);
+ }
+
+ }
+
+ protected boolean exists(String hql, Map<String, Object> hqlParameters) {
+ List<E> entities = topiaJpaSupport.find(hql, 0, 0, hqlParameters);
+ boolean exists = !entities.isEmpty();
+ return exists;
+ }
+
+ protected long count(String hql, Map<String, Object> hqlParameters) {
+ Preconditions.checkArgument(hql.toLowerCase().trim().startsWith("select count("));
+ Long count = findUnique(hql, hqlParameters, Long.class);
+ return count;
+ }
+
+ protected E findUnique(String hql, Map<String, Object> hqlParameters) {
+ E unique = findUnique(hql, hqlParameters, getEntityClass());
+ return unique;
+ }
+
+ protected E findUniqueOrNull(String hql, Map<String, Object> hqlParameters) {
+ E uniqueOrNull = findUniqueOrNull(hql, hqlParameters, getEntityClass());
+ return uniqueOrNull;
+ }
+
+ protected E findFirst(String hql, Map<String, Object> hqlParameters) {
+ E firstOrNull = findFirst(hql, hqlParameters, getEntityClass());
+ return firstOrNull;
+ }
+
+ protected E findFirstOrNull(String hql, Map<String, Object> hqlParameters) {
+ E anyOrNull = findFirstOrNull(hql, hqlParameters, getEntityClass());
+ return anyOrNull;
+ }
+
+ protected E findAny(String hql, Map<String, Object> hqlParameters) {
+ E anyOrNull = findAny(hql, hqlParameters, getEntityClass());
+ return anyOrNull;
+ }
+
+ protected E findAnyOrNull(String hql, Map<String, Object> hqlParameters) {
+ E anyOrNull = findAnyOrNull(hql, hqlParameters, getEntityClass());
+ return anyOrNull;
+ }
+
+ protected <R> R findUnique(String hql, Map<String, Object> hqlParameters, Class<R> type) {
+ R uniqueOrNull = findUniqueOrNull(hql, hqlParameters, type);
+ if (uniqueOrNull == null) {
+ // TODO brendan 30/09/13 throw another exception if no result
+ throw new TopiaException("query " + hql + " returns no elements");
+ }
+ return uniqueOrNull;
+ }
+
+ protected <R> R findUniqueOrNull(String hql, Map<String, Object> hqlParameters, Class<R> type) {
+ List<R> results = findAll(hql, hqlParameters, type, 0, 1);
+ // If there is more than 1 result, throw an exception
+ if (results.size() > 1) {
+ String message = String.format(
+ "The query '%s' returns more than 1 unique result", hql);
+ // TODO AThimel 02/08/13 Throw another exception if more than 1 result is found
+ throw new TopiaException(message);
+ }
+ // otherwise return the first one, or null
+ R uniqueOrNull = Iterables.getOnlyElement(results, null);
+ return uniqueOrNull;
+ }
+
+ protected <R> R findFirst(String hql, Map<String, Object> hqlParameters, Class<R> type) {
+ R firstOrNull = findFirstOrNull(hql, hqlParameters, type);
+ if (firstOrNull == null) {
+ // TODO brendan 30/09/13 throw another exception if no result
+ throw new TopiaException("query " + hql + " returns no elements");
+ }
+ return firstOrNull;
+ }
+
+ protected <R> R findFirstOrNull(String hql, Map<String, Object> hqlParameters, Class<R> type) {
+ Preconditions.checkArgument(hql.toLowerCase().contains("order by"));
+ R anyOrNull = findAnyOrNull(hql, hqlParameters, type);
+ return anyOrNull;
+ }
+
+ protected <R> R findAny(String hql, Map<String, Object> hqlParameters, Class<R> type) {
+ R anyOrNull = findAnyOrNull(hql, hqlParameters, type);
+ if (anyOrNull == null) {
+ // TODO brendan 30/09/13 throw another exception if no result
+ throw new TopiaException("query " + hql + " returns no elements");
+ }
+ return anyOrNull;
+ }
+
+ protected <R> R findAnyOrNull(String hql, Map<String, Object> hqlParameters, Class<R> type) {
+ Preconditions.checkNotNull(hql);
+ Preconditions.checkNotNull(hqlParameters);
+ List<R> results = findAll(hql, hqlParameters, type, 0, 0);
+ R anyOrNull = Iterables.getOnlyElement(results, null);
+ return anyOrNull;
+ }
+
+ protected List<E> findAll(String hql, Map<String, Object> hqlParameters) {
+ Preconditions.checkNotNull(hql);
+ Preconditions.checkNotNull(hqlParameters);
+ List<E> all = topiaJpaSupport.findAll(hql, hqlParameters);
+ return all;
+ }
+
+ protected <R> List<R> findAll(String hql, Map<String, Object> hqlParameters, Class<R> type) {
+ Preconditions.checkNotNull(hql);
+ Preconditions.checkNotNull(hqlParameters);
+ Preconditions.checkNotNull(type);
+ List<R> all = topiaJpaSupport.findAll(hql, hqlParameters);
+ return all;
+ }
+
+ protected List<E> findAll(String hql, Map<String, Object> hqlParameters, int startIndex, int endIndex) {
+ Preconditions.checkNotNull(hql);
+ Preconditions.checkNotNull(hqlParameters);
+ List<E> all = topiaJpaSupport.find(hql, startIndex, endIndex, hqlParameters);
+ return all;
+ }
+
+ protected <R> List<R> findAll(String hql, Map<String, Object> hqlParameters, Class<R> type, int startIndex, int endIndex) {
+ Preconditions.checkNotNull(hql);
+ Preconditions.checkNotNull(hqlParameters);
+ Preconditions.checkNotNull(type);
+ List<R> all = topiaJpaSupport.find(hql, startIndex, endIndex, hqlParameters);
+ return all;
+ }
+
+ protected <R> List<R> findAll(String hql, Map<String, Object> hqlParameters, Class<R> type, TopiaPagerBean pager) {
+ Preconditions.checkNotNull(hql);
+ Preconditions.checkNotNull(hqlParameters);
+ Preconditions.checkNotNull(type);
+ Preconditions.checkNotNull(pager);
+
+ if (StringUtils.isNotBlank(pager.getSortColumn())) {
+ hql += " order by " + pager.getSortColumn();
+ if (!pager.isSortAscendant()) {
+ hql += " desc";
+ }
+ }
+
+ List<R> result = topiaJpaSupport.find(
+ hql,
+ (int) pager.getRecordStartIndex(),
+ (int) pager.getRecordEndIndex() - 1,
+ hqlParameters);
+
+ return result;
+
+ }
+
+ protected Iterable<E> findAllLazy(String hql, Map<String, Object> hqlParameters) {
+
+ Preconditions.checkNotNull(hql);
+ Preconditions.checkNotNull(hqlParameters);
+
+ final Iterator<E> iterator = new FindAllIterator<E, E>(this,
+ getEntityClass(),
+ batchSize,
+ hql,
+ hqlParameters);
+ Iterable<E> result = new Iterable<E>() {
+ @Override
+ public Iterator<E> iterator() {
+ return iterator;
+ }
+ };
+ return result;
+ }
+
+ protected <R> Iterable<R> findAllLazy(String hql, Map<String, Object> hqlParameters, Class<R> type) {
+
+ Preconditions.checkNotNull(hql);
+ Preconditions.checkNotNull(hqlParameters);
+ Preconditions.checkNotNull(type);
+
+ final Iterator<R> iterator = new FindAllIterator<E, R>(this,
+ type,
+ batchSize,
+ hql,
+ hqlParameters);
+ Iterable<R> result = new Iterable<R>() {
+ @Override
+ public Iterator<R> iterator() {
+ return iterator;
+ }
+ };
+ return result;
+ }
+
+ public TopiaQueryBuilderRunQueryStep<E> byTopiaId(String topiaId) {
+ Preconditions.checkNotNull(topiaId, "given topiaId is null");
+ return newQueryBuilder().forProperties(TopiaEntity.PROPERTY_TOPIA_ID, topiaId).getNextStep();
+ }
+
+ @Deprecated
+ public E findByTopiaId(String id) {
+ return byTopiaId(id).findUniqueOrNull();
+ }
+
+ @Deprecated
+ public E findByProperty(String propertyName, Object value) {
+ return newQueryBuilder().forProperties(propertyName, value).findUniqueOrNull();
+ }
+
+ @Override
+ public <R> R findByQuery(Class<R> type, String hql, Object... propertyNamesAndValues) throws TopiaException {
+ 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();
+ }
+
+ @Override
+ @Deprecated
+ public E findByPrimaryKey(Object... propertyNamesAndValues) {
+ Map<String, Object> properties = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ E byPrimaryKey = findByPrimaryKey(properties);
+ return byPrimaryKey;
+ }
+
+ @Override
+ public List<E> findAllWithOrder(String... propertyNames) {
+ return newQueryBuilder().forAll().setOrderByArguments(propertyNames).findAll();
+ }
+
+ @Override
+ public <R> List<R> findAllByQuery(Class<R> type, String hql, Object... propertyNamesAndValues) {
+ Map<String, Object> hqlParameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ List<R> all = findAll(hql, hqlParameters, type);
+ return all;
+ }
+
+ @Deprecated
+ public E findByProperties(String propertyName, Object value,
+ Object... propertyNamesAndValues) {
+ return newQueryBuilder().forProperties(propertyName, value, propertyNamesAndValues).findUniqueOrNull();
+ }
+
+ @Deprecated
+ public E findByProperties(Map<String, Object> properties) {
+ return newQueryBuilder().forProperties(properties).findUniqueOrNull();
+ }
+
+ public List<E> findAll() {
+ return newQueryBuilder().forAll().findAll();
+ }
+
+ public List<String> findAllIds() {
+ List<String> find = newQueryBuilder().forAll().findAllIds();
+ return find;
+ }
+
+ @Deprecated
+ public List<E> findAllByProperty(String propertyName, Object value) {
+ List<E> all = newQueryBuilder().forProperties(propertyName, value).findAll();
+ return all;
+ }
+
+ @Deprecated
+ public List<E> findAllByProperties(String propertyName, Object value, Object... propertyNamesAndValues) {
+ List<E> all = newQueryBuilder().forProperties(propertyName, value, propertyNamesAndValues).findAll();
+ return all;
+ }
+
+ @Deprecated
+ public List<E> findAllByProperties(Map<String, Object> properties) {
+ List<E> all = newQueryBuilder().forProperties(properties).findAll();
+ return all;
+ }
+
+
+ public E findContains(String propertyName, Object value) {
+ E find = newQueryBuilder().forAll().addContains(propertyName, value).findAny();
+ return find;
+ }
+
+
+ public List<E> findAllContains(String propertyName,
+ Object value) {
+ List<E> find = newQueryBuilder().forAll().addContains(propertyName, value).findAll();
+ return find;
+ }
+
+ @Deprecated
+ public boolean existByTopiaId(String topiaId) {
+ boolean exists = byTopiaId(topiaId).exists();
+ return exists;
+ }
+
+ @Deprecated
+ public boolean existByProperties(String propertyName, Object propertyValue,
+ Object... propertyNamesAndValues) {
+ boolean exists = newQueryBuilder().forProperties(propertyName, propertyValue, propertyNamesAndValues).exists();
+ return exists;
+ }
+
+ public long count() {
+ long count = newQueryBuilder().forAll().count();
+ return count;
+ }
+
+
+ @Deprecated
+ public boolean existsByQuery(String hql, Object... propertyNamesAndValues) {
+ Map<String, Object> hqlParameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ boolean exists = exists(hql, hqlParameters);
+ return exists;
+ }
+
+
+ @Deprecated
+ public long countByQuery(String hql,
+ Object... propertyNamesAndValues) {
+
+ Preconditions.checkNotNull(StringUtils.isNotBlank(hql));
+ Preconditions.checkArgument(hql.toUpperCase().trim().startsWith("SELECT COUNT("));
+ Map<String, Object> hqlParameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ long count = forHql(hql, hqlParameters).count();
+ return count;
+ }
+
+
+ @Deprecated
+ public E findByQuery(String hql,
+ Object... propertyNamesAndValues) {
+ Map<String, Object> hqlParameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ E uniqueOrNull = forHql(hql, hqlParameters).findUniqueOrNull();
+ return uniqueOrNull;
+ }
+
+
+ @Deprecated
+ public List<E> findAllByQuery(String hql,
+ Object... propertyNamesAndValues) {
+ Map<String, Object> hqlParameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ List<E> all = forHql(hql, hqlParameters).findAll();
+ return all;
+ }
+
+
+ @Deprecated
+ public Iterable<E> findAllLazyByQuery(String hql,
+ Object... propertyNamesAndValues) {
+ Map<String, Object> hqlParameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ Iterable<E> result = findAllLazy(hql, hqlParameters);
+ return result;
+ }
+
+
+ @Deprecated
+ public <R> Iterable<R> findAllLazyByQuery(Class<R> type,
+ String hql,
+ Object... propertyNamesAndValues) {
+ Map<String, Object> hqlParameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ Iterable<R> result = findAllLazy(hql, hqlParameters, type);
+ return result;
+ }
+
+
+ @Deprecated
+ public Iterable<E> findAllLazyByQuery(int batchSize,
+ String hql,
+ Object... propertyNamesAndValues) {
+ return findAllLazyByQuery(getEntityClass(), batchSize, hql, propertyNamesAndValues);
+ }
+
+
+ /**
+ * @deprecated use {@link #findAllLazy(String, java.util.Map, Class)}
+ */
+ @Deprecated
+ public <R> Iterable<R> findAllLazyByQuery(Class<R> type,
+ int batchSize,
+ String hql,
+ Object... propertyNamesAndValues) {
+ setBatchSize(batchSize);
+ Map<String, Object> hqlParameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ Iterable<R> allLazy = findAllLazy(hql, hqlParameters, type);
+ return allLazy;
+ }
+
+
+ @Deprecated
+ public <R> List<R> findAllByQueryWithBound(Class<R> type,
+ String hql,
+ int startIndex,
+ int endIndex,
+ Object... propertyNamesAndValues) {
+ Map<String, Object> hqlParameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues);
+ List<R> all = findAll(hql, hqlParameters, type, startIndex, endIndex);
+ return all;
+ }
+
+
+ @Deprecated
+ public List<E> findAllByQueryWithBound(String hql,
+ int startIndex,
+ int endIndex,
+ Object... propertyNamesAndValues) {
+ List<E> result = findAllByQueryWithBound(getEntityClass(),
+ hql,
+ startIndex,
+ endIndex,
+ propertyNamesAndValues);
+ return result;
+ }
+
+
+ @Deprecated
+ public <R> List<R> findAllByQueryAndPager(Class<R> type,
+ String hql,
+ TopiaPagerBean pager,
+ Object... propertyNamesAndValues) {
+ Preconditions.checkNotNull(pager);
+ Preconditions.checkNotNull(hql);
+
+ if (StringUtils.isNotBlank(pager.getSortColumn())) {
+ hql += " ORDER BY " + pager.getSortColumn();
+ if (!pager.isSortAscendant()) {
+ hql += " DESC";
+ }
+ }
+ List<R> result = findAllByQueryWithBound(type, hql,
+ (int) pager.getRecordStartIndex(),
+ (int) pager.getRecordEndIndex() - 1,
+ propertyNamesAndValues);
+ return result;
+ }
+
+
+ @Deprecated
+ public List<E> findAllByQueryAndPager(String hql,
+ TopiaPagerBean pager,
+ Object... propertyNamesAndValues) {
+
+ List<E> result = findAllByQueryAndPager(getEntityClass(),
+ hql,
+ pager,
+ propertyNamesAndValues);
+ return result;
+ }
+
+
+ public void computeAndAddRecordsToPager(String hql,
+ TopiaPagerBean pager,
+ Object... propertyNamesAndValues) {
+
+ long records = countByQuery(hql, propertyNamesAndValues);
+
+ pager.setRecords(records);
+ PagerBeanUtil.computeRecordIndexesAndPagesNumber(pager);
+ }
+
+ /**
+ * package locale method because this is hibernate specific method and
+ * we don't want expose it.
+ *
+ * @return the meta-data of the entity
+ * @throws org.nuiton.topia.TopiaException if any pb
+ */
+ protected ClassMetadata getClassMetadata() {
+ ClassMetadata meta = topiaHibernateSupport.getHibernateFactory()
+ .getClassMetadata(getEntityClass());
+ if (meta == null) {
+ meta = topiaHibernateSupport.getHibernateFactory().getClassMetadata(
+ getTopiaEntityEnum().getImplementationFQN());
+ }
+ return meta;
+ }
+
+ public static class FindAllIterator<E extends TopiaEntity, R> implements Iterator<R> {
+
+ protected Iterator<R> data;
+
+ protected final AbstractTopiaDAO<E> dao;
+
+ protected final Class<R> type;
+
+ protected final String hql;
+
+ protected final Map<String, Object> params;
+
+ protected TopiaPagerBean pager;
+
+ public FindAllIterator(AbstractTopiaDAO<E> dao,
+ Class<R> type,
+ int batchSize,
+ String hql,
+ Map<String, Object> params) {
+ this.dao = dao;
+ this.type = type;
+ this.hql = hql;
+ this.params = params;
+
+ String hql2 = hql.toLowerCase();
+ int i = hql2.indexOf("order by");
+ if (i == -1) {
+ throw new IllegalStateException(
+ "must have a *order by* in hql, " +
+ "but did not find it in " + hql);
+ }
+
+ // get the count (removing the order-by)
+ long count2 = dao.countByQuery("SELECT COUNT(*) " +
+ hql.substring(0, i), params);
+ pager = new TopiaPagerBean();
+ pager.setRecords(count2);
+ pager.setPageSize(batchSize);
+ PagerBeanUtil.computeRecordIndexesAndPagesNumber(pager);
+
+ // empty iterator (will be changed at first next call)
+ data = Iterators.emptyIterator();
+ }
+
+
+ public boolean hasNext() {
+ boolean result = data.hasNext() || // no more data
+ pager.getPageIndex() < pager.getPagesNumber();
+ return result;
+ }
+
+
+ public R next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+
+ if (!data.hasNext()) {
+
+ // must load iterator
+
+ // increments page index
+ pager.setPageIndex(pager.getPageIndex() + 1);
+ PagerBeanUtil.computeRecordIndexesAndPagesNumber(pager);
+
+ // load new window of data
+ data = dao.findAll(hql, params, type, pager).iterator();
+
+ }
+
+ R next = data.next();
+ return next;
+ }
+
+
+ public void remove() {
+ throw new UnsupportedOperationException(
+ "This iterator does not support remove operation.");
+ }
+ }
+
+ @Override
+ public List<Permission> getRequestPermission(String topiaId, int actions) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public TopiaContextImplementor getContext() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public TopiaContext getTopiaContext() {
+ throw new UnsupportedOperationException();
+ }
+
+} //TopiaDAOImpl
Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java (rev 0)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -0,0 +1,134 @@
+package org.nuiton.topia.persistence;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A builder to create syntactically correct hql and associated parameters
+ * given properties or after various constraint adds.
+ *
+ * It may be used in a dao to ease dynamic construction of queries.
+ *
+ * @since 3.0
+ * @param <E>
+ */
+public class HqlAndParametersBuilder<E extends TopiaEntity> {
+
+ protected Class<E> entityClass;
+
+ protected Set<String> whereClauses = Sets.newLinkedHashSet();
+
+ protected Map<String, Object> parameters = Maps.newLinkedHashMap();
+
+ protected Set<String> orderByArguments;
+
+ public HqlAndParametersBuilder(Class<E> entityClass) {
+ this.entityClass = entityClass;
+ }
+
+ public Set<String> getWhereClauses() {
+ return whereClauses;
+ }
+
+ public void setWhereClauses(Set<String> whereClauses) {
+ this.whereClauses = whereClauses;
+ }
+
+ public void addNull(String property) {
+ whereClauses.add(property + " is null");
+ }
+
+ public void setParameters(Map<String, Object> parameters) {
+ this.parameters = parameters;
+ }
+
+ public void setOrderByArguments(Set<String> orderByArguments) {
+ this.orderByArguments = orderByArguments;
+ }
+
+ public void setOrderByArguments(String... orderByArguments) {
+ Set<String> orderByArgumentsAsSet = Sets.newLinkedHashSet();
+ orderByArgumentsAsSet.addAll(Arrays.asList(orderByArguments));
+ this.orderByArguments = orderByArgumentsAsSet;
+ }
+
+ public void addEquals(String property, Object value) {
+ if (value == null) {
+ addNull(property);
+ } else {
+ String hqlParameterName = findAvailableHqlParameterName(property);
+ whereClauses.add(property + " = :" + hqlParameterName);
+ parameters.put(hqlParameterName, value);
+ }
+ }
+
+ public void addIn(String property, Iterable<Object> values) {
+ Preconditions.checkArgument(!Iterables.isEmpty(values));
+ if (Iterables.size(values) == 1) {
+ addEquals(property, Iterables.getOnlyElement(values));
+ } else {
+ boolean propertyMayBeNull = false;
+ Set<String> hqlParameterNames = Sets.newLinkedHashSet();
+ for (Object value : values) {
+ if (value == null) {
+ propertyMayBeNull = true;
+ } else {
+ String hqlParameterName = findAvailableHqlParameterName(property);
+ parameters.put(hqlParameterName, value);
+ }
+ }
+ String inClause = property + " in (" + StringUtils.join(hqlParameterNames, ", ")+ ")";
+ String whereClause = inClause;
+ if (propertyMayBeNull) {
+ whereClause = property + " is null or " + inClause;
+ }
+ whereClauses.add(whereClause);
+ }
+ }
+
+ public void addContains(String property, Object value) {
+ String hqlParameterName = findAvailableHqlParameterName(property);
+ whereClauses.add(":" + hqlParameterName + " in elements(" + property + ")");
+ parameters.put(hqlParameterName, value);
+ }
+
+ public String getHql() {
+ StringBuilder hqlStringBuilder = new StringBuilder();
+ hqlStringBuilder.append("from ").append(entityClass.getCanonicalName());
+ if ( ! whereClauses.isEmpty()) {
+ hqlStringBuilder.append(" where ").append(StringUtils.join(whereClauses, " and "));
+ }
+ if (CollectionUtils.isNotEmpty(orderByArguments)) {
+ hqlStringBuilder.append(" order by ").append(StringUtils.join(orderByArguments, ", "));
+ }
+ String hql = hqlStringBuilder.toString();
+ return hql;
+ }
+
+ protected String findAvailableHqlParameterName(String propertyName) {
+ String parameterName = propertyName;
+ int suffix = 0;
+ while (parameters.containsKey(parameterName)) {
+ suffix += 1;
+ parameterName = propertyName + suffix;
+ }
+ return parameterName;
+ }
+
+ public Map<String, Object> getHqlParameters() {
+ return parameters;
+ }
+
+ public boolean isOrderByClausePresent() {
+ return CollectionUtils.isNotEmpty(orderByArguments);
+ }
+
+}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAO.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAO.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAO.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -701,7 +701,9 @@
* @param alias optional alias to use in query
* @return the hql query
* @since 2.6.14
+ * @deprecated no longer accessible from outside DAO
*/
+ @Deprecated
String createSimpleQuery(String alias);
//------------------------------------------------------------------------//
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAOImpl.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAOImpl.java 2013-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAOImpl.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -341,7 +341,7 @@
if (entity instanceof TopiaEntityContextable) {
TopiaEntityContextable contextable = (TopiaEntityContextable)entity;
- contextable.setTopiaContext(getContext());
+ // contextable.setTopiaContext(getContext());
}
// save entity
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-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityAbstract.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -25,6 +25,9 @@
package org.nuiton.topia.persistence;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.framework.TopiaFiresSupport;
+
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.VetoableChangeListener;
@@ -32,11 +35,6 @@
import java.util.Date;
import java.util.List;
-import org.nuiton.topia.TopiaContext;
-import org.nuiton.topia.TopiaException;
-import org.nuiton.topia.framework.TopiaContextImplementor;
-import org.nuiton.topia.framework.TopiaFiresSupport;
-
/**
* Classe de base de toutes les entités, cela permet de concentrer le code
* technique dans cette classe. L'identifiant peut-etre n'importe quoi Aucune
@@ -210,11 +208,8 @@
if (fireSupport == null) {
if (this instanceof TopiaEntityContextable) {
TopiaEntityContextable contextable = (TopiaEntityContextable) this;
- TopiaContext context = contextable.getTopiaContext();
- if (context instanceof TopiaContextImplementor) {
- TopiaContextImplementor contextImpl = (TopiaContextImplementor) context;
- fireSupport = contextImpl.getFiresSupport();
- }
+ AbstractTopiaDAO topiaDAO = contextable.getTopiaDAO();
+ fireSupport = topiaDAO.getTopiaFiresSupport();
}
}
return fireSupport;
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-09-27 18:43:30 UTC (rev 2806)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntityContextable.java 2013-10-01 13:15:11 UTC (rev 2807)
@@ -26,7 +26,6 @@
package org.nuiton.topia.persistence;
import org.nuiton.topia.TopiaContext;
-import org.nuiton.topia.TopiaException;
/**
* {@link TopiaEntity} with {@link TopiaContext} support (injected by
@@ -40,28 +39,7 @@
*/
public interface TopiaEntityContextable extends TopiaEntity {
- String PROPERTY_TOPIA_CONTEXT = "topiaContext";
-
- /** @deprecated since 3.0, will be removed in 3.1, use {@link TopiaEntityContextable#PROPERTY_TOPIA_CONTEXT} instead */
- @Deprecated
- String TOPIA_CONTEXT = PROPERTY_TOPIA_CONTEXT;
-
/**
- * Set topia context.
- *
- * @param topiaContext topia context
- * @throws TopiaException if current topia entity context is not null
- */
- void setTopiaContext(TopiaContext topiaContext) throws TopiaException;
-
- /**
- * Get topia context.
- *
- * @return topia context
- */
- TopiaContext getTopiaContext();
-
- /**
* Update entity in persistence context.
*/
void update();
@@ -71,4 +49,8 @@
*/
void delete();
+ void setTopiaDAO(AbstractTopiaDAO topiaDAO);
+
+ AbstractTopiaDAO getTopiaDAO();
+
}
1
0
r2806 - in trunk/topia-persistence/src/main/java/org/nuiton/topia: . framework generator
by athimel@users.nuiton.org 27 Sep '13
by athimel@users.nuiton.org 27 Sep '13
27 Sep '13
Author: athimel
Date: 2013-09-27 20:43:30 +0200 (Fri, 27 Sep 2013)
New Revision: 2806
Url: http://nuiton.org/projects/topia/repository/revisions/2806
Log:
refs #552 Introduce the new TopiaPersistenceContext abstract implementation and the Hibernate implementation of TopiaJpaSupport
Added:
trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/PersistenceContextTransformer.java
Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java (rev 0)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java 2013-09-27 18:43:30 UTC (rev 2806)
@@ -0,0 +1,193 @@
+package org.nuiton.topia;
+
+/*
+ * #%L
+ * ToPIA :: Persistence
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2004 - 2013 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+import java.beans.PropertyChangeListener;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.lang3.StringUtils;
+import org.nuiton.topia.event.TopiaEntitiesVetoable;
+import org.nuiton.topia.event.TopiaEntityListener;
+import org.nuiton.topia.event.TopiaEntityVetoable;
+import org.nuiton.topia.event.TopiaSchemaListener;
+import org.nuiton.topia.event.TopiaTransactionListener;
+import org.nuiton.topia.event.TopiaTransactionVetoable;
+import org.nuiton.topia.framework.TopiaService;
+import org.nuiton.topia.persistence.DefaultTopiaIdFactory;
+import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.topia.persistence.TopiaIdFactory;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * The application context is the main class in ToPIA usage. This class is a kind of equivalent of the RootTopiaContext.
+ * It contains only high level methods and new contexts creation (transaction begin, ...). This class has to be extended
+ * by the user, even if some default one could be automatically generated.
+ *
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ * @since 3.0
+ */
+public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistenceContext> implements TopiaReplicationSupport, TopiaListenableSupport, TopiaServiceSupport {
+
+ protected TopiaIdFactory topiaIdFactory;
+
+ public abstract K newPersistenceContext();
+// {
+// // TODO AThimel 27/09/13 Instantiate project specific TopiaPersistenceContext
+// return null;
+// }
+
+ public abstract Properties getConfig();
+
+ protected TopiaIdFactory getTopiaIdFactory() {
+ if (topiaIdFactory == null) {
+
+ String topiaIdFactoryClassName =
+ getConfig().getProperty(TopiaContextFactory.CONFIG_PERSISTENCE_TOPIA_ID_FACTORY_CLASS_NAME, "");
+ if (StringUtils.isEmpty(topiaIdFactoryClassName)) {
+ topiaIdFactory = new DefaultTopiaIdFactory();
+ } else {
+ try {
+ Class topiaIdFactoryClass = Class.forName(topiaIdFactoryClassName);
+ Preconditions.checkState(TopiaIdFactory.class.isAssignableFrom(topiaIdFactoryClass),
+ topiaIdFactoryClassName + " is not a valid class name. The class must implements "
+ + TopiaIdFactory.class.getSimpleName());
+
+ topiaIdFactory = (TopiaIdFactory) topiaIdFactoryClass.newInstance();
+ } catch (ClassNotFoundException e) {
+ throw new TopiaException("Unable to create user specified TopiaIdFactory", e);
+ } catch (InstantiationException e) {
+ throw new TopiaException("Unable to create user specified TopiaIdFactory", e);
+ } catch (IllegalAccessException e) {
+ throw new TopiaException("Unable to create user specified TopiaIdFactory", e);
+ }
+ }
+
+ }
+ return topiaIdFactory;
+ }
+
+
+ @Override
+ public void addTopiaEntityListener(TopiaEntityListener listener) {
+ }
+
+ @Override
+ public void addTopiaEntityListener(Class<? extends TopiaEntity> entityClass, TopiaEntityListener listener) {
+ }
+
+ @Override
+ public void removeTopiaEntityListener(TopiaEntityListener listener) {
+ }
+
+ @Override
+ public void removeTopiaEntityListener(Class<? extends TopiaEntity> entityClass, TopiaEntityListener listener) {
+ }
+
+ @Override
+ public void addTopiaEntityVetoable(TopiaEntityVetoable vetoable) {
+ }
+
+ @Override
+ public void addTopiaEntityVetoable(Class<? extends TopiaEntity> entityClass, TopiaEntityVetoable vetoable) {
+ }
+
+ @Override
+ public void removeTopiaEntityVetoable(TopiaEntityVetoable vetoable) {
+ }
+
+ @Override
+ public void removeTopiaEntityVetoable(Class<? extends TopiaEntity> entityClass, TopiaEntityVetoable vetoable) {
+ }
+
+ @Override
+ public void addTopiaEntitiesVetoable(TopiaEntitiesVetoable vetoable) {
+ }
+
+ @Override
+ public void removeTopiaEntitiesVetoable(TopiaEntitiesVetoable vetoable) {
+ }
+
+ @Override
+ public void addTopiaTransactionListener(TopiaTransactionListener listener) {
+ }
+
+ @Override
+ public void removeTopiaTransactionListener(TopiaTransactionListener listener) {
+ }
+
+ @Override
+ public void addTopiaTransactionVetoable(TopiaTransactionVetoable vetoable) {
+ }
+
+ @Override
+ public void removeTopiaTransactionVetoable(TopiaTransactionVetoable vetoable) {
+ }
+
+ @Override
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ }
+
+ @Override
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ }
+
+ @Override
+ public void addTopiaSchemaListener(TopiaSchemaListener listener) {
+ }
+
+ @Override
+ public void removeTopiaSchemaListener(TopiaSchemaListener listener) {
+ }
+
+ @Override
+ public void replicate(TopiaContext destinationContext, Object... entityAndCondition) throws IllegalArgumentException {
+ }
+
+ @Override
+ public <T extends TopiaEntity> void replicateEntity(TopiaContext destinationContext, T entity) throws IllegalArgumentException {
+ }
+
+ @Override
+ public <T extends TopiaEntity> void replicateEntities(TopiaContext destinationContext, List<T> entities) throws IllegalArgumentException {
+ }
+
+ @Override
+ public <E extends TopiaService> boolean serviceEnabled(Class<E> interfaceService) {
+ return false;
+ }
+
+ @Override
+ public <E extends TopiaService> E getService(Class<E> interfaceService) throws TopiaNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Map<String, TopiaService> getServices() {
+ return null;
+ }
+}
Property changes on: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java (rev 0)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java 2013-09-27 18:43:30 UTC (rev 2806)
@@ -0,0 +1,296 @@
+package org.nuiton.topia;
+
+/*
+ * #%L
+ * ToPIA :: Persistence
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2004 - 2013 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.HibernateException;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+import org.hibernate.tool.hbm2ddl.SchemaUpdate;
+import org.nuiton.topia.framework.TopiaFiresSupport;
+import org.nuiton.topia.framework.TopiaUtil;
+import org.nuiton.topia.persistence.TopiaDAO;
+import org.nuiton.topia.persistence.TopiaDAOImpl;
+import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.topia.persistence.TopiaIdFactory;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * Abstract implementation of the TopiaPersistenceContext. This class will be extended by a generated one in order to
+ * generate getXxxDao methods.
+ *
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ * @since 3.0
+ */
+public abstract class AbstractTopiaPersistenceContext implements TopiaPersistenceContext {
+
+ private static final Log log = LogFactory.getLog(AbstractTopiaPersistenceContext.class);
+
+ /**
+ * List of persistent classes
+ */
+ protected List<Class<?>> persistenceClasses = Lists.newArrayList();
+
+ /**
+ * Already loaded DAO cache within this persistence context
+ */
+ protected Map<Class<? extends TopiaEntity>, TopiaDAO<? extends TopiaEntity>> daoCache = Maps.newHashMap(); // TODO AThimel 27/09/13 Concurrent map ?
+
+ // TODO AThimel 27/09/13 Javadoc
+ protected TopiaFiresSupport firesSupport;
+
+ // TODO AThimel 27/09/13 Javadoc
+ protected TopiaHibernateSupport hibernateSupport;
+
+ // TODO AThimel 27/09/13 Javadoc
+ protected TopiaJpaSupport jpaSupport;
+
+ // TODO AThimel 27/09/13 Javadoc
+ protected TopiaSqlSupport sqlSupport;
+
+ // TODO AThimel 27/09/13 Javadoc
+ protected TopiaListenableSupport listenableSupport;
+
+ /**
+ * Used to affect a new topiaId when create is called.
+ *
+ * @since 3.0
+ */
+ protected TopiaIdFactory topiaIdFactory;
+
+ /**
+ * Current context configuration
+ */
+ protected Properties config;
+
+ public AbstractTopiaPersistenceContext(TopiaHibernateSupport hibernateSupport,
+ TopiaSqlSupport sqlSupport,
+ TopiaListenableSupport listenableSupport,
+ TopiaIdFactory topiaIdFactory,
+ Properties config) {
+ this.hibernateSupport = hibernateSupport;
+ this.sqlSupport = sqlSupport;
+ this.listenableSupport = listenableSupport;
+ this.topiaIdFactory = topiaIdFactory;
+ this.config = config;
+
+ this.firesSupport = new TopiaFiresSupport();
+ this.jpaSupport = new HibernateTopiaJpaSupport(hibernateSupport, firesSupport);
+
+ }
+
+ protected void checkClosed() throws TopiaException {
+ // TODO AThimel 27/09/13 IS it still useful ?
+// if (closed) {
+// throw new TopiaException("This context is closed, it is not possible to use it anymore");
+// }
+ }
+
+ protected TopiaFiresSupport getFiresSupport() {
+ return firesSupport;
+ }
+
+ @Override
+ public <E extends TopiaEntity> E findByTopiaId(String topiaId) {
+ checkClosed();
+
+ Class<E> entityClass = getTopiaIdFactory().getClassName(topiaId);
+ TopiaDAO<E> dao = getDAO(entityClass);
+ E result = dao.findByTopiaId(topiaId);
+ return result;
+ }
+
+ @Override
+ public void update(TopiaEntity entity) {
+ checkClosed();
+
+ String topiaId = entity.getTopiaId();
+ Class<TopiaEntity> entityClass = getTopiaIdFactory().getClassName(topiaId);
+ TopiaDAO<TopiaEntity> dao = getDAO(entityClass);
+ dao.update(entity);
+
+ }
+
+ @Override
+ public TopiaIdFactory getTopiaIdFactory() {
+ return topiaIdFactory;
+ }
+
+ @Override
+ public List<Class<?>> getPersistenceClasses() {
+ return null; // TODO AThimel 27/09/13 May be moved to TopiaHibernateSupport ?
+ }
+
+ @Override
+ public Properties getConfig() {
+ return config;
+ }
+
+ @Override
+ public <E extends TopiaEntity> TopiaDAO<E> getDAO(Class<E> entityClass) {
+ Preconditions.checkArgument(entityClass != null, "The method 'getDAO' requires a non null 'entityClass' parameter");
+
+// if (equals(getRootContext())) {
+// throw new TopiaException(
+// "You are on root context, you MUST open a transaction to perform any database access.");
+// }
+ SessionFactory hibernateFactory = hibernateSupport.getHibernateFactory();
+ if (hibernateFactory.getClassMetadata(entityClass) == null &&
+ hibernateFactory.getClassMetadata(entityClass.getName() + "Impl") == null &&
+ hibernateFactory.getClassMetadata(entityClass.getName() + "Abstract") == null) {
+
+ log.info(String.format("List of supported persistence classes: %s",
+ hibernateFactory.getAllClassMetadata().keySet()));
+ throw new TopiaException(
+ String.format("The following entity type %s is not managed by this context, you probably forgot to declare it.",
+ entityClass.getName()));
+ }
+
+ TopiaDAOImpl<E> result = (TopiaDAOImpl<E>) daoCache.get(entityClass);
+ if (result == null) {
+
+ // Looking for specialized DAO
+ // This DAO is supposed to exist, as created by generation
+ String daoClassName = entityClass.getName() + "DAO";
+ try {
+ Class<TopiaDAOImpl<E>> daoClass = (Class<TopiaDAOImpl<E>>) Class.forName(daoClassName);
+ result = daoClass.getConstructor().newInstance();
+ } catch (Exception eee) {
+ log.fatal("specialized DAO " + daoClassName +
+ " not found, use default TopiaDAOHibernate");
+ throw new TopiaException("Specialized DAO " + daoClassName + " not found");
+ }
+
+ // AThimel 27/09/13 "entityClass" seems not to be needed anymore in DAO init(...) method
+ // TODO AThimel 27/09/13 Uncomment the next line
+// result.init(hibernateSupport, jpaSupport, sqlSupport, listenableSupport, topiaIdFactory, firesSupport);
+ daoCache.put(entityClass, result);
+ }
+ return result;
+ }
+
+ @Override
+ public <E extends TopiaEntity, D extends TopiaDAO<E>> D getDAO(Class<E> entityClass, Class<D> daoClass) {
+ return (D) getDAO(entityClass);
+ }
+
+ @Override
+ public boolean isSchemaEmpty() {
+ Configuration configuration = hibernateSupport.getHibernateConfiguration();
+ boolean result = TopiaUtil.isSchemaEmpty(configuration);
+ return result;
+ }
+
+ @Override
+ public boolean isTableExists(Class<?> clazz) {
+ checkClosed();
+
+ Configuration configuration = hibernateSupport.getHibernateConfiguration();
+ boolean result = TopiaUtil.isSchemaExist(configuration, clazz.getName());
+ return result;
+ }
+
+ @Override
+ public String getSchemaName() {
+ // TODO AThimel 02/08/13 I absolutely don't know if it works
+ return getConfig().getProperty(TopiaContextFactory.CONFIG_DEFAULT_SCHEMA);
+ }
+
+ @Override
+ public void createSchema() {
+ try {
+ boolean showSchema = false;
+ if (log.isDebugEnabled()) {
+ showSchema = true;
+ }
+ getFiresSupport().firePreCreateSchema(this);
+ new SchemaExport(hibernateSupport.getHibernateConfiguration()).execute(showSchema, true, false, true);
+ getFiresSupport().firePostCreateSchema(this);
+ } catch (HibernateException eee) {
+ throw new TopiaException(
+ String.format("Could not create schema for reason: %s",
+ eee.getMessage()), eee);
+ }
+
+ }
+
+ @Override
+ public void showCreateSchema() {
+ try {
+ new SchemaExport(hibernateSupport.getHibernateConfiguration()).
+ execute(true, false, false, true);
+ } catch (HibernateException eee) {
+ throw new TopiaException(
+ String.format("Could not show create schema for reason: %s",
+ eee.getMessage()), eee);
+ }
+
+ }
+
+ @Override
+ public void updateSchema() {
+ try {
+ boolean showSchema = false;
+ if (log.isDebugEnabled()) {
+ showSchema = true;
+ }
+ getFiresSupport().firePreUpdateSchema(this);
+ new SchemaUpdate(hibernateSupport.getHibernateConfiguration()).execute(showSchema,
+ true);
+ getFiresSupport().firePostUpdateSchema(this);
+ } catch (HibernateException eee) {
+ throw new TopiaException(
+ String.format("Could not update schema for reason: %s",
+ eee.getMessage()), eee);
+ }
+ }
+
+ @Override
+ public void dropSchema() {
+ try {
+ boolean showSchema = false;
+ if (log.isDebugEnabled()) {
+ showSchema = true;
+ }
+ getFiresSupport().firePreDropSchema(this);
+ new SchemaExport(hibernateSupport.getHibernateConfiguration()).execute(showSchema, true, true, false);
+ getFiresSupport().firePostDropSchema(this);
+ } catch (HibernateException eee) {
+ throw new TopiaException(
+ String.format("Could not drop schema for reason: %s",
+ eee.getMessage()), eee);
+ }
+ }
+
+}
Property changes on: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java (rev 0)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-09-27 18:43:30 UTC (rev 2806)
@@ -0,0 +1,223 @@
+package org.nuiton.topia;
+
+/*
+ * #%L
+ * ToPIA :: Persistence
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2004 - 2013 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.FlushMode;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.nuiton.topia.framework.TopiaFiresSupport;
+
+import com.google.common.collect.Maps;
+
+/**
+ * This class is the Hibernate implementation of TopiaJpaSupport. It realizes the bridge between the JPA specification
+ * and the technical choice made for its implementation : Hibernate.
+ *
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ * @since 3.0
+ */
+public class HibernateTopiaJpaSupport implements TopiaJpaSupport {
+
+ // TODO AThimel 27/09/13 Javadoc
+ protected TopiaHibernateSupport hibernateSupport;
+
+ // TODO AThimel 27/09/13 Javadoc
+ protected TopiaFiresSupport firesSupport;
+
+ /**
+ * This flag permits to use (or not) the flush mode when doing queries.
+ * <p/>
+ * The normal usage is to says yes (that's why the default value is
+ * {@code true}), in that case whebn doing queries (says in method
+ * {@link #findAll(String, Object...)} or {@link #find(String, int, int, Object...)})
+ * it will use the flush mode {@link FlushMode#AUTO}).
+ * <p/>
+ * But sometimes, when doing a lot of queries (for some imports for example),
+ * we do NOT want the session to be flushed each time we do a find, then you
+ * can set this flag to {@code false} using the method {@link #setUseFlushMode(boolean)}
+ *
+ * @since 2.5
+ */
+ protected boolean useFlushMode = true;
+
+ public HibernateTopiaJpaSupport(TopiaHibernateSupport hibernateSupport, TopiaFiresSupport firesSupport) {
+ this.hibernateSupport = hibernateSupport;
+ this.firesSupport = firesSupport;
+ }
+
+ protected void checkClosed() throws TopiaException {
+ // TODO AThimel 27/09/13 IS it still useful ?
+// if (closed) {
+// throw new TopiaException("This jpaSupport is closed, it is not possible to use it anymore");
+// }
+ }
+
+ @Override
+ public void setUseFlushMode(boolean useFlushMode) {
+ this.useFlushMode = useFlushMode;
+ }
+
+ protected Query prepareQuery(String jpaql, Map<String, Object> parameters) {
+ Query query = hibernateSupport.getHibernateSession().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();
+
+ try {
+ 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 during query operation: %1$s : %2$s",
+ jpaql, eee.getMessage()), eee);
+ }
+ }
+
+ @Override
+ public <T> List<T> find(String jpaql, int startIndex, int endIndex, Map<String, Object> parameters) {
+ checkClosed();
+
+ try {
+ Query query = prepareQuery(jpaql, parameters);
+
+ // Set bounds
+ 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 during query operation: %1$s : %2$s",
+ jpaql, eee.getMessage()), eee);
+ }
+ }
+
+ @Override
+ public <T> T findUnique(String jpaql, Map<String, Object> parameters) {
+ checkClosed();
+
+ List<T> results = find(jpaql, 0, 1, parameters);
+
+ // If there is more than 1 result, throw an exception
+ if (results.size() > 1) {
+ String message = String.format(
+ "The query '%s' returns more than 1 unique result", jpaql);
+ // TODO AThimel 02/08/13 Throw another exception if more than 1 result is found
+ throw new TopiaException(message);
+ }
+
+ // otherwise return the first one, or null
+ T result = null;
+ if (!results.isEmpty()) {
+ result = results.get(0);
+ }
+ return result;
+ }
+
+ @Override
+ public int execute(String jpaql, Map<String, Object> parameters) {
+ 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);
+ }
+ int result = query.executeUpdate();
+ return result;
+ } catch (HibernateException eee) {
+ throw new TopiaException(String.format("An error occurs during execute operation: %1$s : %2$s",
+ jpaql, eee.getMessage()), eee);
+ }
+ }
+
+ protected Map<String, Object> asMap(Object[] propertyNamesAndValues) {
+ Map<String, Object> result = Maps.newHashMap();
+ if (propertyNamesAndValues != null) {
+ for (int j = 0; j < propertyNamesAndValues.length; j += 2) {
+ String name = (String) propertyNamesAndValues[j];
+ Object value = propertyNamesAndValues[j + 1];
+ result.put(name, value);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public <T> List<T> findAll(String jpaql, Object... propertyNamesAndValues) {
+ Map<String, Object> parameters = asMap(propertyNamesAndValues);
+ List<T> result = findAll(jpaql, parameters);
+ return result;
+ }
+
+ @Override
+ public <T> List<T> find(String jpaql, int startIndex, int endIndex, Object... propertyNamesAndValues) {
+ Map<String, Object> parameters = asMap(propertyNamesAndValues);
+ List<T> result = find(jpaql, startIndex, endIndex, parameters);
+ return result;
+ }
+
+ @Override
+ public <T> T findUnique(String jpaql, Object... propertyNamesAndValues) {
+ Map<String, Object> parameters = asMap(propertyNamesAndValues);
+ T result = findUnique(jpaql, parameters);
+ return result;
+ }
+
+ @Override
+ public int execute(String jpaql, Object... propertyNamesAndValues) {
+ Map<String, Object> parameters = asMap(propertyNamesAndValues);
+ int result = execute(jpaql, parameters);
+ return result;
+ }
+
+} // HibernateTopiaJpaSupport
Property changes on: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java 2013-09-27 18:27:15 UTC (rev 2805)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java 2013-09-27 18:43:30 UTC (rev 2806)
@@ -35,7 +35,6 @@
* This API provides all methods related to persistence :
* <ul>
* <li>Generic entity find</li>
- * <li>Persistence customization</li>
* <li>DAO factory</li>
* <li>Schema management</li>
* </ul>
@@ -75,17 +74,6 @@
List<Class<?>> getPersistenceClasses();
/**
- * Tells to the context if it has to use a flush mode before each query.
- * <p/>
- * By default, we use a flush mode, but in some case it costs to much doing
- * this, that's why you can disable it setting the value to {@code false}.
- *
- * @param useFlushMode the new value to set
- * @since 2.5
- */
- void setUseFlushMode(boolean useFlushMode);
-
- /**
* @return Returns the config.
*/
Properties getConfig(); // TODO AThimel 02/08/13 Change type ?
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java 2013-09-27 18:27:15 UTC (rev 2805)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java 2013-09-27 18:43:30 UTC (rev 2806)
@@ -119,7 +119,7 @@
*
* @param useFlushMode the new value to set
* @since 2.5
- * @deprecated use method from {@link org.nuiton.topia.TopiaPersistenceContext}
+ * @deprecated use method from {@link org.nuiton.topia.TopiaJpaSupport}
*/
@Deprecated
void setUseFlushMode(boolean useFlushMode);
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-09-27 18:27:15 UTC (rev 2805)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java 2013-09-27 18:43:30 UTC (rev 2806)
@@ -63,6 +63,8 @@
import org.hibernate.event.spi.SaveOrUpdateEventListener;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.TopiaJpaSupport;
+import org.nuiton.topia.TopiaPersistenceContext;
import org.nuiton.topia.TopiaVetoException;
import org.nuiton.topia.event.TopiaContextEvent;
import org.nuiton.topia.event.TopiaContextListener;
@@ -769,7 +771,7 @@
*
* @param context topia context
*/
- public void firePreCreateSchema(TopiaContext context) {
+ public void firePreCreateSchema(TopiaPersistenceContext context) {
if (log.isDebugEnabled()) {
log.debug("firePreCreateSchema");
}
@@ -788,7 +790,7 @@
*
* @param context topia context
*/
- public void firePostCreateSchema(TopiaContext context) {
+ public void firePostCreateSchema(TopiaPersistenceContext context) {
if (log.isDebugEnabled()) {
log.debug("firePostCreateSchema");
}
@@ -807,7 +809,7 @@
*
* @param context topia context
*/
- public void firePreUpdateSchema(TopiaContext context) {
+ public void firePreUpdateSchema(TopiaPersistenceContext context) {
if (log.isDebugEnabled()) {
log.debug("firePostCreateSchema");
}
@@ -826,7 +828,7 @@
*
* @param context topia context
*/
- public void firePostUpdateSchema(TopiaContext context) {
+ public void firePostUpdateSchema(TopiaPersistenceContext context) {
if (log.isDebugEnabled()) {
log.debug("firePostCreateSchema");
}
@@ -884,7 +886,7 @@
* @param context topia context
* @since 3.0
*/
- public void firePreDropSchema(TopiaContext context) {
+ public void firePreDropSchema(TopiaPersistenceContext context) {
if (log.isDebugEnabled()) {
log.debug("firePreDropSchema");
}
@@ -904,7 +906,7 @@
* @param context topia context
* @since 3.0
*/
- public void firePostDropSchema(TopiaContext context) {
+ public void firePostDropSchema(TopiaPersistenceContext context) {
if (log.isDebugEnabled()) {
log.debug("firePostDropSchema");
}
@@ -928,7 +930,7 @@
* @return the list of entities loaded
*/
public <E extends TopiaEntity> List<E> fireEntitiesLoad(
- TopiaContext context, List<E> entities) {
+ TopiaJpaSupport context, List<E> entities) {
if (log.isDebugEnabled()) {
log.debug("fireEntitiesLoad");
}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/PersistenceContextTransformer.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/PersistenceContextTransformer.java 2013-09-27 18:27:15 UTC (rev 2805)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/PersistenceContextTransformer.java 2013-09-27 18:43:30 UTC (rev 2806)
@@ -34,6 +34,7 @@
import org.nuiton.eugene.models.object.ObjectModelClass;
import org.nuiton.eugene.models.object.ObjectModelJavaModifier;
import org.nuiton.eugene.models.object.ObjectModelOperation;
+import org.nuiton.topia.AbstractTopiaPersistenceContext;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
import org.nuiton.topia.persistence.TopiaEntity;
@@ -84,19 +85,19 @@
protected void generateAbstract(String packageName,
String className) {
-// // try to find a super class by tag-value
-// String superClass = TopiaGeneratorUtil.getPersistenceContextSuperClassTagValue(
-// model);
-//
-// if (superClass == null) {
-//
-// // no super-class, use default one
-// superClass = AbstractTopiaPersistenceContext.class.getName();
-// }
+ // try to find a super class by tag-value
+// String superClass = TopiaGeneratorUtil.getPersistenceContextSuperClassTagValue(model);
+ String superClass = null;
+ if (superClass == null) {
+
+ // no super-class, use default one
+ superClass = AbstractTopiaPersistenceContext.class.getName();
+ }
+
ObjectModelClass output = createAbstractClass(className, packageName);
-// setSuperClass(output, superClass);
+ setSuperClass(output, superClass);
// detect if there is a contract to set on abstract
String contractName = TopiaGeneratorUtil.getPersistenceContextInterfaceName(model);
@@ -151,6 +152,7 @@
addParameter(constructor, TopiaContext.class, "context");
setOperationBody(constructor, ""
/*{
+ super(context, context, context, context.getTopiaIdFactory(), context.getConfig());
this.context = context;
}*/
);
1
0
r2805 - in trunk/topia-persistence/src/main/java/org/nuiton/topia: . framework
by athimel@users.nuiton.org 27 Sep '13
by athimel@users.nuiton.org 27 Sep '13
27 Sep '13
Author: athimel
Date: 2013-09-27 20:27:15 +0200 (Fri, 27 Sep 2013)
New Revision: 2805
Url: http://nuiton.org/projects/topia/repository/revisions/2805
Log:
refs #552 Improve TopiaJpaSupport : add find methods using Map instead of Object...
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java 2013-09-17 16:55:51 UTC (rev 2804)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java 2013-09-27 18:27:15 UTC (rev 2805)
@@ -25,6 +25,7 @@
*/
import java.util.List;
+import java.util.Map;
/**
* This API provides methods to use persistence using JPA queries
@@ -41,11 +42,26 @@
* WARNING : Depending on the registered service, this method may not
* support something else than queries on TopiaEntity
*
+ * @param jpaql the JPA-QL query
+ * @param parameters a map which keys are the attribute names and values are the attributes expected values
+ * @return The result list
+ */
+ <T> List<T> findAll(String jpaql,
+ Map<String, Object> parameters);
+
+ /**
+ * Allow to do some JPA-QL query
+ * <p/>
+ * WARNING : Depending on the registered service, this method may not
+ * support something else than queries on TopiaEntity
+ *
* @param jpaql the JPA-QL query
* @param propertyNamesAndValues the query parameters. Arguments are key-value paired :
* [propertyName;value;propertyName;value;...]
* @return The result list
+ * @deprecated prefer using {@link #findAll(String, java.util.Map)}
*/
+ @Deprecated
<T> List<T> findAll(String jpaql,
Object... propertyNamesAndValues);
@@ -61,10 +77,32 @@
* @param jpaql the JPA-QL query
* @param startIndex first index of entity to return
* @param endIndex last index of entity to return
+ * @param parameters a map which keys are the attribute names and values are the attributes expected values
+ * @return The result list
+ */
+ <T> List<T> find(String jpaql,
+ int startIndex,
+ int endIndex,
+ Map<String, Object> parameters);
+
+ /**
+ * Allow to do some JPA-QL query using the given bounds.
+ * <p/>
+ * No lower bound : <code>startIndex</code> = 0.<br/>
+ * No upper bound : <code>endIndex</code> = -1.
+ * <p/>
+ * WARNING : Depending on the registered service, this method may not
+ * support something else than queries on TopiaEntity
+ *
+ * @param jpaql the JPA-QL query
+ * @param startIndex first index of entity to return
+ * @param endIndex last index of entity to return
* @param propertyNamesAndValues the query parameters. Arguments are key-value paired :
* [propertyName;value;propertyName;value;...]
* @return The result list
+ * @deprecated prefer using {@link #find(String, int, int, java.util.Map)}
*/
+ @Deprecated
<T> List<T> find(String jpaql,
int startIndex,
int endIndex,
@@ -79,11 +117,27 @@
* support something else than queries on TopiaEntity
*
* @param jpaql the JPA-QL query
+ * @param parameters a map which keys are the attribute names and values are the attributes expected values
+ * @return The result instance or null
+ */
+ <T> T findUnique(String jpaql,
+ Map<String, Object> parameters);
+
+ /**
+ * Allow to do some JPA-QL query and return an unique result. If nothing if
+ * found by the query, will return null. If more than one result is found,
+ * will throw an exception.
+ * <p/>
+ * WARNING : Depending on the registered service, this method may not
+ * support something else than queries on TopiaEntity
+ *
+ * @param jpaql the JPA-QL query
* @param propertyNamesAndValues the query parameters. Arguments are key-value paired :
* [propertyName;value;propertyName;value;...]
* @return The result instance or null
+ * @deprecated prefer using {@link #findUnique(String, java.util.Map)}
*/
- // TODO AThimel 02/08/13 Throw another exception if more than 1 result is found
+ @Deprecated
<T> T findUnique(String jpaql,
Object... propertyNamesAndValues);
@@ -91,11 +145,34 @@
* Execute JPA-QL operation on data (Update, Delete).
*
* @param jpaql the JPA-QL query
+ * @param parameters a map which keys are the attribute names and values are the attributes expected values
+ * @return The number of entities updated or deleted.
+ */
+ int execute(String jpaql,
+ Map<String, Object> parameters);
+
+ /**
+ * Execute JPA-QL operation on data (Update, Delete).
+ *
+ * @param jpaql the JPA-QL query
* @param propertyNamesAndValues the query parameters. Arguments are key-value paired :
* [propertyName;value;propertyName;value;...]
* @return The number of entities updated or deleted.
+ * @deprecated prefer using {@link #execute(String, java.util.Map)}
*/
+ @Deprecated
int execute(String jpaql,
Object... propertyNamesAndValues);
+ /**
+ * Tells to the context if it has to use a flush mode before each query.
+ * <p/>
+ * By default, we use a flush mode, but in some case it costs to much doing
+ * this, that's why you can disable it setting the value to {@code false}.
+ *
+ * @param useFlushMode the new value to set
+ * @since 2.5
+ */
+ void setUseFlushMode(boolean useFlushMode); // XXX AThimel 27/09/13 Maybe this method has to be renamed
+
}
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-09-17 16:55:51 UTC (rev 2804)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java 2013-09-27 18:27:15 UTC (rev 2805)
@@ -1087,7 +1087,28 @@
}
}
+
@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");
+ }
+
+ @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");
+ }
+
+ @Override
+ public <T> T findUnique(String jpaql, Map<String, Object> parameters) {
+ throw new UnsupportedOperationException("This method is not available on TopiaContext, please use TopiaJpaSupport");
+ }
+
+ @Override
+ public int execute(String jpaql, Map<String, Object> parameters) {
+ throw new UnsupportedOperationException("This method is not available on TopiaContext, please use TopiaJpaSupport");
+ }
+
+ @Override
public void add(TopiaEntity e) throws TopiaException {
update(e);
}
1
0
The ToPIA team is pleased to announce the topia-3.0-alpha-3 release!
Tools for Portable and Independent Architecture :
Framework de persistance et de distribution d'application.
Documentation of the project can be found here:
http://maven-site.nuiton.org/topia
Changes
-------
Changes in this version include:
New features:
o Improve TopiaIdFactory Issue: 2825. Thanks to Tony Chemit. Resolved by tchemit.
Changes:
o Updates eugene to 2.7.1 Issue: 2828. Thanks to Tony Chemit. Resolved by tchemit.
o updates mavenpom to 4.1 Issue: 2849. Thanks to Tony Chemit. Resolved by tchemit.
Downloads
---------
No release file deployed. (all files are deployed in the maven repository)
Maven artifacts
---------------
Artifacts are deployed in Maven Central Repository
http://repo1.maven.org/maven2/
Find us at
* http://search.maven.org/#artifactdetails|org.nuiton.topia|topia-service-sec…
Have fun!
-ToPIA team
1
0
r2804 - in trunk: . topia-persistence topia-service-migration topia-service-replication topia-service-security
by maven-release@users.nuiton.org 17 Sep '13
by maven-release@users.nuiton.org 17 Sep '13
17 Sep '13
Author: maven-release
Date: 2013-09-17 18:55:51 +0200 (Tue, 17 Sep 2013)
New Revision: 2804
Url: http://nuiton.org/projects/topia/repository/revisions/2804
Log:
[maven-release-plugin] prepare for next development iteration
Modified:
trunk/pom.xml
trunk/topia-persistence/pom.xml
trunk/topia-service-migration/pom.xml
trunk/topia-service-replication/pom.xml
trunk/topia-service-security/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2013-09-17 16:55:49 UTC (rev 2803)
+++ trunk/pom.xml 2013-09-17 16:55:51 UTC (rev 2804)
@@ -33,7 +33,7 @@
</parent>
<artifactId>topia</artifactId>
- <version>3.0-alpha-3</version>
+ <version>3.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>ToPIA</name>
@@ -208,10 +208,10 @@
</modules>
<scm>
- <connection>scm:svn:http://svn.nuiton.org/svn/topia/tags/topia-3.0-alpha-3</connection>
- <developerConnection>scm:svn:http://svn.nuiton.org/svn/topia/tags/topia-3.0-alpha-3
+ <connection>scm:svn:http://svn.nuiton.org/svn/topia/trunk</connection>
+ <developerConnection>scm:svn:http://svn.nuiton.org/svn/topia/trunk
</developerConnection>
- <url>http://nuiton.org/projects/topia/repository/show/branches/tags/topia-3.0-al…</url>
+ <url>http://nuiton.org/projects/topia/repository/show/branches/trunk</url>
</scm>
<distributionManagement>
<site>
Modified: trunk/topia-persistence/pom.xml
===================================================================
--- trunk/topia-persistence/pom.xml 2013-09-17 16:55:49 UTC (rev 2803)
+++ trunk/topia-persistence/pom.xml 2013-09-17 16:55:51 UTC (rev 2804)
@@ -30,7 +30,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>topia</artifactId>
- <version>3.0-alpha-3</version>
+ <version>3.0-SNAPSHOT</version>
</parent>
<groupId>org.nuiton.topia</groupId>
Modified: trunk/topia-service-migration/pom.xml
===================================================================
--- trunk/topia-service-migration/pom.xml 2013-09-17 16:55:49 UTC (rev 2803)
+++ trunk/topia-service-migration/pom.xml 2013-09-17 16:55:51 UTC (rev 2804)
@@ -30,7 +30,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>topia</artifactId>
- <version>3.0-alpha-3</version>
+ <version>3.0-SNAPSHOT</version>
</parent>
<groupId>org.nuiton.topia</groupId>
Modified: trunk/topia-service-replication/pom.xml
===================================================================
--- trunk/topia-service-replication/pom.xml 2013-09-17 16:55:49 UTC (rev 2803)
+++ trunk/topia-service-replication/pom.xml 2013-09-17 16:55:51 UTC (rev 2804)
@@ -30,7 +30,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>topia</artifactId>
- <version>3.0-alpha-3</version>
+ <version>3.0-SNAPSHOT</version>
</parent>
<groupId>org.nuiton.topia</groupId>
Modified: trunk/topia-service-security/pom.xml
===================================================================
--- trunk/topia-service-security/pom.xml 2013-09-17 16:55:49 UTC (rev 2803)
+++ trunk/topia-service-security/pom.xml 2013-09-17 16:55:51 UTC (rev 2804)
@@ -30,7 +30,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>topia</artifactId>
- <version>3.0-alpha-3</version>
+ <version>3.0-SNAPSHOT</version>
</parent>
<groupId>org.nuiton.topia</groupId>
1
0
Author: maven-release
Date: 2013-09-17 18:55:49 +0200 (Tue, 17 Sep 2013)
New Revision: 2803
Url: http://nuiton.org/projects/topia/repository/revisions/2803
Log:
[maven-release-plugin] copy for tag topia-3.0-alpha-3
Added:
tags/topia-3.0-alpha-3/
Property changes on: tags/topia-3.0-alpha-3
___________________________________________________________________
Added: svn:ignore
+ *.ipr
*.iws
.classpath
*.iml
.project
target
.settings
.idea
atlassian-ide-plugin.xml
Added: svn:mergeinfo
+ /branches/from2.2.2-eugene2-beta:1662-1714
/branches/topia-2.6.x:2293-2300
1
0