r1298 - topia/trunk/topia-persistence topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/framework topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/generator topia/trunk/topia-persistence/src/site/fr/rst topia/trunk/topia-soa/src/main/java/org/codelutin/topia/service topia-service/trunk topia-service/trunk/src/main/java/org/codelutin/topia/security/util topia-service/trunk/src/main/java/org/codelutin/topia/taas/event topia-service/trunk/src/test/java/org/codelutin
Author: tchemit Date: 2009-01-14 23:01:45 +0000 (Wed, 14 Jan 2009) New Revision: 1298 Modified: topia-service/trunk/pom.xml topia-service/trunk/src/main/java/org/codelutin/topia/security/util/TopiaSecurityUtil.java topia-service/trunk/src/main/java/org/codelutin/topia/taas/event/TaasEntityVetoable.java topia-service/trunk/src/main/java/org/codelutin/topia/taas/event/TaasEntityVetoableRequestPermission.java topia-service/trunk/src/test/java/org/codelutin/topia/security/ScriptInitialisationDataBase.java topia-service/trunk/src/test/java/org/codelutin/topia/security/TopiaSecurityTest.java topia/trunk/topia-persistence/changelog.txt topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/framework/TopiaContextImpl.java topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/generator/EntityHibernateMappingGenerator.java topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/generator/GeneratorUtil.java topia/trunk/topia-persistence/src/site/fr/rst/howto.rst topia/trunk/topia-soa/src/main/java/org/codelutin/topia/service/TopiaApplicationServiceFactory.java Log: improve exportXML in TopiaContextImpl : do export when params are ok javadoc plus besoin d'invoquer le plugin javadoc avec le lutinproject 3.3 :) des tests qui n'ont jamais du pass?\195?\169s :) generics... des accents perdus dans les javadocs il y a bien longtemps Modified: topia/trunk/topia-persistence/changelog.txt =================================================================== --- topia/trunk/topia-persistence/changelog.txt 2009-01-14 22:58:33 UTC (rev 1297) +++ topia/trunk/topia-persistence/changelog.txt 2009-01-14 23:01:45 UTC (rev 1298) @@ -1,4 +1,5 @@ 2.1.2 ??? 200901?? +* 20090114 [chemit] - improve exportXML (prepare queries then executes then when parameters are known to be fine) * 20090106 [chemit] - amélioration du générateur de mapping hibernate : - génération des clefs metier dans le mapping hibernate via la tag value naturalId - mise en constantes des tagValues utiliser dans le génératuer du mapping hibernate Modified: topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/framework/TopiaContextImpl.java =================================================================== --- topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/framework/TopiaContextImpl.java 2009-01-14 22:58:33 UTC (rev 1297) +++ topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/framework/TopiaContextImpl.java 2009-01-14 23:01:45 UTC (rev 1298) @@ -17,42 +17,18 @@ /******************************************************************************* * TopiaContextImpl.java - * + * * Created: 23 déc. 2005 16:58:50 - * + * * @author poussin - * + * * @version $Revision$ - * + * * Last update: $Date$ by : $Author$ */ package org.codelutin.topia.framework; -import java.beans.PropertyChangeListener; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.io.Writer; -import java.lang.reflect.Field; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -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.collections.set.MapBackedSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -99,6 +75,30 @@ import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaUpdate; +import java.beans.PropertyChangeListener; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.io.Writer; +import java.lang.reflect.Field; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +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 TopiaContextImpl est le point d'entre pour acceder aux donnees. Il est * configurer par un fichier de propriete @@ -107,21 +107,21 @@ * <dl> * <dt> topia.persistence.properties.file * <dd> le fichier de propriété a utiliser pour configurer hibernate - * + * * <dt> topia.persistence.directories * <dd> la liste des repertoires contenant les mappings hibernates (.hbm.xml) la * liste de repertoire est separer par des virgules ',' - * + * * <dt> topia.persistence.classes * <dd> la liste des classes que doit géré hibernate. On peut tres bien utiliser * topia.persistence.directories pour un ensemble d'entié du meme repertoire et * topia.persistence.classes pour d'autres classes * </dl> - * - * @see TopiaSecurityManager - * @see TopiaIndexService - * @see TopiaHistoryService - * + * + * //@see TopiaSecurityManager + * //@see TopiaIndexService + * //@see TopiaHistoryService + * * @author poussin */ public class TopiaContextImpl implements TopiaContext, TopiaContextImplementor { @@ -189,9 +189,9 @@ /** * constructeur utilisé par la factory pour creer les contexts initiaux - * + * * @param config - * @throws TopiaNotFoundException + * @throws TopiaNotFoundException */ public TopiaContextImpl(Properties config) throws TopiaNotFoundException { this.config = config; @@ -258,7 +258,7 @@ public Map<String, TopiaService> getServices() { TopiaContextImplementor parent = getParentContext(); - + Map<String, TopiaService> result = null; if (parent != null) { result = parent.getServices(); @@ -297,10 +297,10 @@ } /** - * Take one service, this service must be valid service interface with + * Take one service, this service must be valid service interface with * public static final SERVICE_NAME declaration. * @param <E> - * @throws TopiaNotFoundException + * @throws TopiaNotFoundException */ public <E extends TopiaService> E getService(Class<E> interfaceService) throws TopiaNotFoundException { @@ -329,7 +329,7 @@ /** * Constructeur utilisé par le beginTransaction pour créer le context fils. - * + * * @param parentContext * @throws HibernateException * @throws TopiaNotFoundException @@ -676,10 +676,10 @@ // 20081217 : add child AFTER hibernate session is opened addChildContext(result); - + // fire event getFiresSupport().fireOnBeginTransaction(result); - + return result; } @@ -959,23 +959,57 @@ public void exportXML(Writer xml, Object... entityAndcondition) throws TopiaException { checkClosed("Ce contexte a ete ferme, impossible d'effectuer l'export"); - try { - Class entityClass; - String condition; - // si entityAndcondition est vide alors il faut le remplir - // avec toutes les entités du mapping (class, null) - if (entityAndcondition.length == 0) { - entityAndcondition = new Object[getHibernateFactory() - .getAllClassMetadata().size() * 2]; - int i = 0; - for (Object className : getHibernateFactory() - .getAllClassMetadata().keySet()) { + Class entityClass; + String condition; + + // si entityAndcondition est vide alors il faut le remplir + // avec toutes les entités du mapping (class, null) + if (entityAndcondition.length == 0) { + entityAndcondition = new Object[getHibernateFactory() + .getAllClassMetadata().size() * 2]; + int i = 0; + for (Object className : getHibernateFactory() + .getAllClassMetadata().keySet()) { + try { entityAndcondition[i++] = Class.forName((String) className); entityAndcondition[i++] = null; + } catch (ClassNotFoundException e) { + // cette exception ne devrait pas survenir + throw new TopiaException("Can't export XML", e); } } + } + // prepare queries to perform beofre opening any transaction + if (entityAndcondition.length % 2 != 0) { + throw new IllegalArgumentException("entityAndcondition muts be a couple of (Class, String)"); + } + String queries[] = new String[entityAndcondition.length / 2]; + for (int i = 0; i < entityAndcondition.length;) { + try { + entityClass = (Class) entityAndcondition[i++]; + condition = (String) entityAndcondition[i++]; + String query = "from " + entityClass.getName(); + if (condition != null && !condition.isEmpty()) { + query += " where " + condition; + } + queries[(i-1) / 2] = query; + } catch (ClassCastException e) { + if (i % 2 == 0) { + throw new IllegalArgumentException( + "Others arguement must be String not " + + entityAndcondition[i - 1], e); + } else { + throw new IllegalArgumentException( + "Others arguement must be Class not " + + entityAndcondition[i - 1], e); + } + } + } + + // performs queries + try { Session sessionDom4j = getHibernate().getSession(EntityMode.DOM4J); Document doc = DocumentFactory.getInstance().createDocument(); @@ -984,13 +1018,20 @@ String date = format.format(new Date(System.currentTimeMillis())); rootElement.addAttribute("date", date); - for (int i = 0; i < entityAndcondition.length;) { + for (String query : queries) { + List list = sessionDom4j.createQuery(query).list(); + for (Object o : list) { + rootElement.add((Element) o); + } + } + + /*for (int i = 0; i < entityAndcondition.length;) { try { entityClass = (Class) entityAndcondition[i++]; condition = (String) entityAndcondition[i++]; String query = "from " + entityClass.getName(); - if (condition != null && "".equals(condition) == false) { + if (condition != null && !condition.isEmpty()) { query += " where " + condition; } @@ -1012,7 +1053,7 @@ "Others arguement must be couple of (Class, String)", eee); } - } + }*/ XMLWriter result = new XMLWriter(xml, OutputFormat .createPrettyPrint()); @@ -1023,9 +1064,6 @@ throw new TopiaException("Can't export XML", eee); } catch (IOException eee) { throw new TopiaException("Can't export XML", eee); - } catch (ClassNotFoundException eee) { - // cette exception ne devrait pas survenir - throw new TopiaException("Can't export XML", eee); } } @@ -1040,10 +1078,10 @@ /** * Backup database in gzip compressed file * Only work for h2 database - * + * * @param file file to write backup * @param compress if true then use gzip to compress file - * + * * @see TopiaContext#backup(java.io.File,boolean) */ public void backup(File file, boolean compress) throws TopiaException { @@ -1096,9 +1134,9 @@ /** * Read database from gzip compressed file - * + * * Only work for h2 database - * + * * @see org.codelutin.topia.TopiaContext#restore(java.io.File) */ public void restore(File file) throws TopiaException { Modified: topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/generator/EntityHibernateMappingGenerator.java =================================================================== --- topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/generator/EntityHibernateMappingGenerator.java 2009-01-14 22:58:33 UTC (rev 1297) +++ topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/generator/EntityHibernateMappingGenerator.java 2009-01-14 23:01:45 UTC (rev 1298) @@ -93,7 +93,10 @@ <hibernate-mapping default-access="field" auto-import="true" package="<%=clazz.getPackageName()%>"> }*/ boolean haveSuper = clazz.getSuperclasses().size() > 0; - List<ObjectModelAttribute> noneNaturalAttributes = new ArrayList<ObjectModelAttribute >(); + // la liste des attributs faisant parti de la clef metier + List<ObjectModelAttribute> naturalAttributes = new ArrayList<ObjectModelAttribute>(); + // la liste des autres attributs + List<ObjectModelAttribute> noneNaturalAttributes = new ArrayList<ObjectModelAttribute>(); if (haveSuper) { ObjectModelClass superClass = clazz.getSuperclasses().iterator().next(); String superClassname = superClass.getQualifiedName(); @@ -128,31 +131,29 @@ /*{> <id name="topiaId" type="string" length="255" node="@topiaId"/> }*/ - List<String> attributes = GeneratorUtil.getNaturalId(clazz); - if (log.isDebugEnabled()) { - log.debug("natural-id for class "+clazz.getName()+" : "+attributes); + // on detecte les attributs des clef metiers + for (ObjectModelAttribute attr : clazz.getAttributes()) { + if (GeneratorUtil.isNaturalId(attr)) { + // attribut metier + naturalAttributes.add(attr); + } else { + // attribut normal + noneNaturalAttributes.add(attr); + } } - - if (attributes.isEmpty()) { - // pas de clef metiers sur la classe - noneNaturalAttributes.addAll(clazz.getAttributes()); - } else { - // une clef métier sur la classe a ete detectee - List<ObjectModelAttribute> naturalAttributes = new ArrayList<ObjectModelAttribute >(attributes.size()); - for (ObjectModelAttribute attr : clazz.getAttributes()) { - if (attributes.contains(attr.getName())) { - naturalAttributes.add(attr); - } else { - noneNaturalAttributes.add(attr); - } + if (!naturalAttributes.isEmpty()) { + // generation de la clef metier + boolean mutable = GeneratorUtil.isNaturalIdMutable(clazz); + String mutableStr = mutable ? " mutable=\"true\"" : ""; + if (log.isDebugEnabled()) { + log.debug("natural-id detected for class " + clazz.getName() + " (" + mutableStr + ") attributes : " + naturalAttributes); } -/*{ <natural-id> +/*{ <natural-id<%=mutableStr%>> }*/ generateAttributes(output, clazz, naturalAttributes," "); /*{ </natural-id> }*/ } - /*{ <version name="topiaVersion" type="long" node="@topiaVersion"/> <property name="topiaCreateDate" type="date" node="@topiaCreateDate"/> }*/ @@ -217,10 +218,10 @@ // } */ // } else { String notNull = attr.getTagValue(GeneratorUtil.TAG_NOT_NULL); - if (notNull!=null) { - notNull = "not-null=\""+notNull.trim()+"\""; + if (notEmpty(notNull)) { + notNull = " not-null=\""+notNull.trim()+"\""; } -/*{<%=prefix%> <many-to-one name="<%=getName(attr, true)%>" class="<%=getType(attr, true)%>" column="<%=GeneratorUtil.getDBName(attr)%>" node="<%=getName(attr, true)%>/@topiaId" embed-xml="false" <%=notNull%> /> +/*{<%=prefix%> <many-to-one name="<%=getName(attr, true)%>" class="<%=getType(attr, true)%>" column="<%=GeneratorUtil.getDBName(attr)%>" node="<%=getName(attr, true)%>/@topiaId" embed-xml="false"<%=notNull%> /> }*/ // } //Ne sert plus grâce à l'utilisation de la navigabilité @@ -354,16 +355,16 @@ if (orderBy == null) { orderBy = ""; } else { - orderBy = "order-by=\"" + orderBy + "\""; + orderBy = " order-by=\"" + orderBy + "\""; } String cascade = ""; if (attr.isComposite() || attr.hasAssociationClass()) { - cascade += "cascade=\"all,delete-orphan\""; + cascade += " cascade=\"all,delete-orphan\""; } - String lazy = "lazy=\""; - if (attr.getTagValue(GeneratorUtil.TAG_LAZY) != null){ + String lazy = " lazy=\""; + if (notEmpty(attr.getTagValue(GeneratorUtil.TAG_LAZY))){ lazy += attr.getTagValue(GeneratorUtil.TAG_LAZY); } else { @@ -372,19 +373,28 @@ lazy += "\""; String fetch = ""; - if (attr.getTagValue(GeneratorUtil.TAG_FETCH) != null){ - fetch = "fetch=\"" + attr.getTagValue(GeneratorUtil.TAG_FETCH) + "\""; + if (notEmpty(attr.getTagValue(GeneratorUtil.TAG_FETCH))){ + fetch = " fetch=\"" + attr.getTagValue(GeneratorUtil.TAG_FETCH) + "\""; } String collType = GeneratorUtil.getNMultiplicityHibernateType(attr); if (!needsIndex) { -/*{<%=prefix%> <<%=collType%> name="<%=getName(attr)%>" <%=orderBy%> <%=((!isInverse)?"":"inverse=\"true\"")%> <%=fetch%> <%=lazy%> <%=cascade%> node="<%=getName(attr)%>" embed-xml="true"> + //fixme pour le moment, on ne calcule pas si on doit autoriser le embed-xml à true + // on le positionne manuellement + String embedXml = attr.getTagValue(GeneratorUtil.TAG_EMBED_XML); + if (notEmpty(embedXml)) { + embedXml = embedXml.trim(); + } else { + embedXml="true"; + } + +/*{<%=prefix%> <<%=collType%> name="<%=getName(attr)%>"<%=orderBy%><%=((!isInverse)?"":" inverse=\"true\"")%><%=fetch%><%=lazy%><%=cascade%> node="<%=getName(attr)%>" embed-xml="<%=embedXml%>"> <%=prefix%> <key column="<%=GeneratorUtil.getReverseDBName(attr)%>"/> <%=prefix%> <one-to-many class="<%=getType(attr)%>" node="topiaId" embed-xml="false"/> <%=prefix%> </<%=collType%>> }*/ }else { -/*{<%=prefix%> <<%=collType%> name="<%=getName(attr)%>"<%=((!isInverse)?"":" inverse=\"true\"")%> <%=lazy%> <%=cascade%> node="<%=getName(attr)%>" embed-xml="false"> +/*{<%=prefix%> <<%=collType%> name="<%=getName(attr)%>"<%=((!isInverse)?"":" inverse=\"true\"")%><%=lazy%><%=cascade%> node="<%=getName(attr)%>" embed-xml="false"> <%=prefix%> <key column="<%=GeneratorUtil.getReverseDBName(attr)%>"/> <%=prefix%> <list-index column="<%=GeneratorUtil.getReverseDBName(attr)%>_idx"/> <%=prefix%> <one-to-many class="<%=getType(attr)%>" node="topiaId" embed-xml="false"/> @@ -398,10 +408,10 @@ String collType = GeneratorUtil.getNMultiplicityHibernateType(attr); String lazy = ""; if (attr.getTagValue(GeneratorUtil.TAG_LAZY) != null) { - lazy = "lazy=\"" + attr.getTagValue(GeneratorUtil.TAG_LAZY) + "\""; + lazy = " lazy=\"" + attr.getTagValue(GeneratorUtil.TAG_LAZY) + "\""; } -/*{<%=prefix%> <<%=collType%> name="<%=getName(attr)%>" node="<%=getName(attr)%>" embed-xml="true" <%=lazy%>> +/*{<%=prefix%> <<%=collType%> name="<%=getName(attr)%>" node="<%=getName(attr)%>" embed-xml="true"<%=lazy%>> <%=prefix%> <key column="OWNER"/> }*/ if (needsIndex) { @@ -434,7 +444,7 @@ /*{ node="<%=getName(attr)%>/@topiaId" embed-xml="false"}*/ // vérifier si le tag lazy est defini par defaut dans le fichier de proprietes - if (attr.getTagValue("lazy") != null){ + if (attr.getTagValue(GeneratorUtil.TAG_LAZY) != null){ /*{ lazy="<%=attr.getTagValue("lazy")%>"}*/ } String notNull = attr.getTagValue(GeneratorUtil.TAG_NOT_NULL); @@ -457,13 +467,16 @@ boolean needsIndex = attr.isIndexed(); String cascade = ""; if (attr.isComposite() || attr.hasAssociationClass()) { - cascade += "cascade=\"delete,delete-orphan\""; + // a quoi ca sert ? de concatener "" avec autre chose ??? + //cascade += "cascade=\"delete,delete-orphan\""; + cascade = " cascade=\"delete,delete-orphan\""; } - cascade += ""; + // a quoi ca sert ? :) + //cascade += ""; - String lazy = "lazy=\""; - if (attr.getTagValue("lazy") != null){ - lazy += attr.getTagValue("lazy"); + String lazy = " lazy=\""; + if (attr.getTagValue(GeneratorUtil.TAG_LAZY) != null){ + lazy += attr.getTagValue(GeneratorUtil.TAG_LAZY); } else { lazy += "true"; @@ -471,7 +484,7 @@ lazy += "\""; String collType = GeneratorUtil.getNMultiplicityHibernateType(attr); -/*{<%=prefix%> <<%=collType%> name="<%=getName(attr)%>" table="<%=GeneratorUtil.getManyToManyTableName(attr)%>" <%=(isInverse?"inverse=\"true\" ":"")%> <%=lazy%> <%=cascade%> node="<%=getName(attr)%>" embed-xml="true"> +/*{<%=prefix%> <<%=collType%> name="<%=getName(attr)%>" table="<%=GeneratorUtil.getManyToManyTableName(attr)%>"<%=(isInverse?" inverse=\"true\" ":"")%><%=lazy%><%=cascade%> node="<%=getName(attr)%>" embed-xml="true"> <%=prefix%> <key column="<%=GeneratorUtil.getReverseDBName(attr)%>"/> }*/ if (needsIndex) { Modified: topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/generator/GeneratorUtil.java =================================================================== --- topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/generator/GeneratorUtil.java 2009-01-14 22:58:33 UTC (rev 1297) +++ topia/trunk/topia-persistence/src/main/java/org/codelutin/topia/generator/GeneratorUtil.java 2009-01-14 23:01:45 UTC (rev 1298) @@ -105,6 +105,9 @@ /** Tag pour ajouter un attribut dans une clef métier */ public static final String TAG_NATURAL_ID = "naturalId"; + /** Tag pour specifier si une clef metier est mutable */ + public static final String TAG_NATURAL_ID_MUTABLE = "naturalIdMutable"; + /** Tag pour spécifier la caractèrelazy d'une association multiple */ public static final String TAG_LAZY = "lazy"; @@ -117,6 +120,9 @@ /** Tag pour spécifier la caractère not-null d'un attribut */ public static final String TAG_NOT_NULL = "notNull"; + /** Tag pour spécifier la caractère embed-xml d'une association */ + public static final String TAG_EMBED_XML = "embedXml"; + /** Type de persistence Hibernate */ public static final String PERSISTENCE_TYPE_HIBERNATE = "hibernate"; @@ -257,7 +263,6 @@ * @return la liste des attributs de la clef métier ou null si pas de clef métier. */ public static List<String> getNaturalId(ObjectModelClass clazz) { - String value = clazz.getTagValue(TAG_NATURAL_ID); if (value == null || value.trim().isEmpty()) { return java.util.Collections.emptyList(); @@ -270,6 +275,27 @@ } /** + * Detecte si un attribut fait partie d'une clef metier. + * + * @param attribute l'attribut à tester + * @return <code>true</code> si l'attribut fait partie d'une clef metier, <code>false</cdoe> sinon. + */ + public static boolean isNaturalId(ObjectModelAttribute attribute) { + String value = attribute.getTagValue(TAG_NATURAL_ID); + if (!notEmpty(value)) { + // valeur null, donc pas positionnee + return false; + } + try { + return Boolean.valueOf(value.trim()); + } catch (Exception e) { + // on a pas reussi a convertir en boolean. + //todo peut-être declancher une exception ? + return false; + } + } + + /** * Cherches et renvoie le copyright a utiliser sur le model. * * @param model le modele utilisé @@ -632,4 +658,28 @@ } return classes; } + + /** + * Detecte si la clef metier d'une classe est mutable ou pas. + * <p/> + * On respecte la valeur par defaut d'hibernate, à savoir que par default une clef metier est non mutable. + * + * @param clazz la classe a tester + * @return <code>true</code> si le tag value a ete positionne sur la classe via le tag + * {@link #TAG_NATURAL_ID_MUTABLE}, , <code>false</code> sinon. + */ + public static boolean isNaturalIdMutable(ObjectModelClass clazz) { + String value = clazz.getTagValue(TAG_NATURAL_ID_MUTABLE); + if (!notEmpty(value)) { + // valeur null, donc par default positionnee + return false; + } + try { + return Boolean.valueOf(value.trim()); + } catch (Exception e) { + // on a pas reussi a convertir en boolean. + //todo peut-être declancher une exception ? + return false; + } + } } // GeneratorUtil Modified: topia/trunk/topia-persistence/src/site/fr/rst/howto.rst =================================================================== --- topia/trunk/topia-persistence/src/site/fr/rst/howto.rst 2009-01-14 22:58:33 UTC (rev 1297) +++ topia/trunk/topia-persistence/src/site/fr/rst/howto.rst 2009-01-14 23:01:45 UTC (rev 1298) @@ -12,8 +12,8 @@ (http://argouml.tigris.org) soit avec Poséidon (http://www.gentleware.com). Le stérotype «entity» sur les classes permet de préciser que la classe est -persister par Topia. D'autre stérotypes (extern, service, ...) sont disponiples -mais ne sont pas présenté. +persistée par Topia. D'autre stérotypes (extern, service, ...) sont disponiples +mais ne sont pas présentés. Le fichier de modélisation peut être compléter par un fichier de configuration nommé <nom fichier modélisation>.properties. Il contient des informations Modified: topia/trunk/topia-soa/src/main/java/org/codelutin/topia/service/TopiaApplicationServiceFactory.java =================================================================== --- topia/trunk/topia-soa/src/main/java/org/codelutin/topia/service/TopiaApplicationServiceFactory.java 2009-01-14 22:58:33 UTC (rev 1297) +++ topia/trunk/topia-soa/src/main/java/org/codelutin/topia/service/TopiaApplicationServiceFactory.java 2009-01-14 23:01:45 UTC (rev 1298) @@ -20,15 +20,6 @@ */ package org.codelutin.topia.service; -import java.lang.reflect.Proxy; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codelutin.topia.TopiaContext; @@ -39,6 +30,15 @@ import org.codelutin.topia.service.clients.SOAPProxy; import org.codelutin.topia.service.clients.XMLRPCProxy; +import java.lang.reflect.Proxy; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + /** * TopiaServiceFactory.java * @@ -98,6 +98,7 @@ * * @throws TopiaNotFoundException * si le fichier de configuration ne peut pas etre charge + * @return la configuration (et la charge si cela n'est pas déjà fait) */ static Properties getConfiguration() throws TopiaNotFoundException { if (config == null) { @@ -114,7 +115,7 @@ * les proprietes du fichier de configuration * @param context * le contexte pere des contextes fournis aux services - * @throws TopiaException + * @throws TopiaException if any pb with topia */ public static void loadServices(Properties config, TopiaContext context) throws TopiaException { Modified: topia-service/trunk/pom.xml =================================================================== --- topia-service/trunk/pom.xml 2009-01-14 22:58:33 UTC (rev 1297) +++ topia-service/trunk/pom.xml 2009-01-14 23:01:45 UTC (rev 1298) @@ -155,11 +155,6 @@ </executions> </plugin> - - <plugin> - <artifactId>maven-javadoc-plugin</artifactId> - </plugin> - </plugins> </build> Modified: topia-service/trunk/src/main/java/org/codelutin/topia/security/util/TopiaSecurityUtil.java =================================================================== --- topia-service/trunk/src/main/java/org/codelutin/topia/security/util/TopiaSecurityUtil.java 2009-01-14 22:58:33 UTC (rev 1297) +++ topia-service/trunk/src/main/java/org/codelutin/topia/security/util/TopiaSecurityUtil.java 2009-01-14 23:01:45 UTC (rev 1298) @@ -29,15 +29,6 @@ package org.codelutin.topia.security.util; -import java.security.AccessController; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.Principal; -import java.util.Properties; -import java.util.StringTokenizer; - -import javax.security.auth.Subject; - import org.apache.commons.lang.ArrayUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -54,9 +45,16 @@ import org.codelutin.topia.security.entities.user.TopiaUser; import org.codelutin.topia.security.entities.user.TopiaUserImpl; import org.codelutin.topia.security.jaas.TopiaLoginModule; - import sun.misc.BASE64Encoder; +import javax.security.auth.Subject; +import java.security.AccessController; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.Principal; +import java.util.Properties; +import java.util.StringTokenizer; + /** * Classe utilitaire * @@ -91,20 +89,20 @@ }; /** - * Applique un algorithme de hashage sur la chaine de carat�re pass�e en - * param�tre - * @param msg la chaine de carat�re sur laquelle on veut op�rer le hashage - * @return La chaine de caract�re une fois l'algorithme appliqu� + * Applique un algorithme de hashage sur la chaine de caratère passée en + * paramètre + * @param msg la chaine de caractère sur laquelle on veut opérer le hashage + * @return La chaine de caractère une fois l'algorithme appliqué */ public static String hash(String msg) { return digestSHAHex(msg); } /** - * Applique un algorithme de hashage sur la chaine de carat�re pass�e en - * param�tre - * @param msg la chaine de carat�re sur laquelle on veut op�rer le hashage - * @return La chaine de caract�re une fois l'algorithme appliqu� + * Applique un algorithme de hashage sur la chaine de caratère passée en + * paramètre + * @param msg la chaine de caratère sur laquelle on veut opérer le hashage + * @return La chaine de caractère une fois l'algorithme appliqué */ public static String digestSHABase64(String msg) { if (msg == null) { @@ -125,6 +123,8 @@ /** * Fait le checksum SHA de la chaine de caractere le resultat est retourne * sous forme de chaine Hexadecimal. + * @param ch ? + * @return ? */ static public String digestSHAHex(String ch){ if(ch == null){ @@ -139,7 +139,7 @@ for (int i=0; i < digest.length; i++) { String hex = Integer.toHexString(0xFF & digest[i]); if (hex.length() == 1) { - result.append("0" + hex); + result.append("0").append(hex); } else { result.append(hex); } @@ -181,9 +181,9 @@ } /** - * Transforme actions en une cha�ne de caract�res + * Transforme actions en une chaine de caractères * @param actions les actions sous forme d'un entier - * @return La chaine des actions pass� en param�tre + * @return La chaine des actions passé en paramètre */ public static String actionsInt2String(int actions) { StringBuffer result = new StringBuffer(); @@ -212,7 +212,7 @@ } /** - * Permet de r�cup�rer parmis la liste des principals, le principal de type + * Permet de récupérer parmis la liste des principals, le principal de type * TopiaUser * @return topiaId du principal de l'utilisateur */ @@ -230,9 +230,10 @@ } /** - * Cr�ation d'un context sans s�curit� - * @param transaction TopiaContext avec lequel le nouveau contexte est cr�e - * @return retourne un contexte sans s�curit� + * Création d'un context sans sécurité + * @param transaction TopiaContext avec lequel le nouveau contexte est crée + * @return retourne un contexte sans sécurité + * @throws TopiaException if any topia pb */ public static TopiaContext beginTransactionWithoutSecurity(TopiaContext transaction) throws TopiaException { TopiaContextImpl context = (TopiaContextImpl) transaction; @@ -250,7 +251,7 @@ } /** - * D�termine si la classe impl�mente une interface + * Détermine si la classe implémente une interface * <p> * interface A <---- class B <---- class C * <p> @@ -262,13 +263,14 @@ * * @param klass la classe * @param iface l'interface - * @return vrai si la classe impl�mente l'interface sinon faux + * @return vrai si la classe implémente l'interface sinon faux + * @deprecated je pense que {@link Class#isAssignableFrom(Class)} doit faire l'affaire :) */ public static boolean isImplement(Class klass, Class iface) { boolean result = false; Class[] interfaces = klass.getInterfaces(); - result |= ArrayUtils.contains(interfaces, iface); + result = ArrayUtils.contains(interfaces, iface); Class superclass = klass.getSuperclass(); if(!result && superclass != null) { Modified: topia-service/trunk/src/main/java/org/codelutin/topia/taas/event/TaasEntityVetoable.java =================================================================== --- topia-service/trunk/src/main/java/org/codelutin/topia/taas/event/TaasEntityVetoable.java 2009-01-14 22:58:33 UTC (rev 1297) +++ topia-service/trunk/src/main/java/org/codelutin/topia/taas/event/TaasEntityVetoable.java 2009-01-14 23:01:45 UTC (rev 1298) @@ -18,23 +18,22 @@ */ package org.codelutin.topia.taas.event; -import static org.codelutin.topia.security.util.TopiaSecurityUtil.UPDATE; -import static org.codelutin.topia.taas.TaasUtil.CREATE; -import static org.codelutin.topia.taas.TaasUtil.DELETE; -import static org.codelutin.topia.taas.TaasUtil.LOAD; - -import java.util.List; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codelutin.topia.event.TopiaEntitiesEvent; import org.codelutin.topia.event.TopiaEntityEvent; import org.codelutin.topia.persistence.TopiaEntity; +import static org.codelutin.topia.security.util.TopiaSecurityUtil.UPDATE; import org.codelutin.topia.taas.TaasService; +import static org.codelutin.topia.taas.TaasUtil.CREATE; +import static org.codelutin.topia.taas.TaasUtil.DELETE; +import static org.codelutin.topia.taas.TaasUtil.LOAD; import org.codelutin.topia.taas.entities.TaasAuthorization; import org.codelutin.topia.taas.entities.TaasPrincipal; import org.codelutin.topia.taas.entities.TaasUser; +import java.util.List; + public class TaasEntityVetoable implements TaasAccessEntity { private static Log log = LogFactory.getLog(TaasEntityVetoable.class); @@ -106,7 +105,7 @@ * (non-Javadoc) * @see org.codelutin.topia.event.TopiaEntitiesVetoable#load(org.codelutin.topia.event.TopiaEntitiesEvent) */ - public <E extends TopiaEntity> List<E> load(TopiaEntitiesEvent event) { + public <E extends TopiaEntity> List<E> load(TopiaEntitiesEvent<E> event) { if (log.isDebugEnabled()) { log.debug("[Security] load entities"); } @@ -123,4 +122,5 @@ } return entities; } + } Modified: topia-service/trunk/src/main/java/org/codelutin/topia/taas/event/TaasEntityVetoableRequestPermission.java =================================================================== --- topia-service/trunk/src/main/java/org/codelutin/topia/taas/event/TaasEntityVetoableRequestPermission.java 2009-01-14 22:58:33 UTC (rev 1297) +++ topia-service/trunk/src/main/java/org/codelutin/topia/taas/event/TaasEntityVetoableRequestPermission.java 2009-01-14 23:01:45 UTC (rev 1298) @@ -18,20 +18,19 @@ */ package org.codelutin.topia.taas.event; -import static org.codelutin.topia.security.util.TopiaSecurityUtil.UPDATE; -import static org.codelutin.topia.taas.TaasUtil.CREATE; -import static org.codelutin.topia.taas.TaasUtil.DELETE; -import static org.codelutin.topia.taas.TaasUtil.LOAD; - -import java.util.List; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codelutin.topia.event.TopiaEntitiesEvent; import org.codelutin.topia.event.TopiaEntityEvent; import org.codelutin.topia.persistence.TopiaEntity; +import static org.codelutin.topia.security.util.TopiaSecurityUtil.UPDATE; import org.codelutin.topia.taas.TaasService; +import static org.codelutin.topia.taas.TaasUtil.CREATE; +import static org.codelutin.topia.taas.TaasUtil.DELETE; +import static org.codelutin.topia.taas.TaasUtil.LOAD; +import java.util.List; + public class TaasEntityVetoableRequestPermission implements TaasAccessEntity { private static Log log = LogFactory.getLog(TaasEntityVetoableRequestPermission.class); @@ -76,7 +75,7 @@ * (non-Javadoc) * @see org.codelutin.topia.event.TopiaVetoableEntityLoadListener#loadEntity(org.codelutin.topia.event.TopiaVetoableEntityLoadEvent) */ - public void load(TopiaEntityEvent event) { + public void load(TopiaEntityEvent event) { // TopiaEntity entity = event.getEntity(); // String topiaId = entity.getTopiaId(); // @@ -103,7 +102,7 @@ * (non-Javadoc) * @see org.codelutin.topia.event.TopiaEntitiesVetoable#load(org.codelutin.topia.event.TopiaEntitiesEvent) */ - public <E extends TopiaEntity> List<E> load(TopiaEntitiesEvent event) { + public <E extends TopiaEntity> List<E> load(TopiaEntitiesEvent<E> event) { if (log.isDebugEnabled()) { log.debug("[Security] load entities"); } Modified: topia-service/trunk/src/test/java/org/codelutin/topia/security/ScriptInitialisationDataBase.java =================================================================== --- topia-service/trunk/src/test/java/org/codelutin/topia/security/ScriptInitialisationDataBase.java 2009-01-14 22:58:33 UTC (rev 1297) +++ topia-service/trunk/src/test/java/org/codelutin/topia/security/ScriptInitialisationDataBase.java 2009-01-14 23:01:45 UTC (rev 1298) @@ -17,13 +17,6 @@ package org.codelutin.topia.security; -import static org.codelutin.topia.security.util.TopiaSecurityUtil.LOAD; -import static org.codelutin.topia.security.util.TopiaSecurityUtil.TOPIA_SECURITY_PERSISTENCE_CLASSES; -import static org.codelutin.topia.security.util.TopiaSecurityUtil.UPDATE; - -import java.util.ArrayList; -import java.util.Properties; - import org.codelutin.topia.TopiaContext; import org.codelutin.topia.TopiaContextFactory; import org.codelutin.topia.TopiaException; @@ -38,11 +31,19 @@ import org.codelutin.topia.security.entities.user.TopiaGroupDAO; import org.codelutin.topia.security.entities.user.TopiaUser; import org.codelutin.topia.security.entities.user.TopiaUserDAO; +import static org.codelutin.topia.security.util.TopiaSecurityUtil.LOAD; +import static org.codelutin.topia.security.util.TopiaSecurityUtil.TOPIA_SECURITY_PERSISTENCE_CLASSES; +import static org.codelutin.topia.security.util.TopiaSecurityUtil.UPDATE; import org.codelutin.topia.test.entities.Person; import org.codelutin.topia.test.entities.PersonDAO; import org.codelutin.topia.test.entities.Pet; import org.codelutin.topia.test.entities.PetDAO; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; + /** * Script pour l'initialisation de la base de données pour pouvoir exécuter les * tests unitaires. @@ -50,24 +51,34 @@ */ public class ScriptInitialisationDataBase { - protected static String entitiesList = TOPIA_SECURITY_PERSISTENCE_CLASSES + "," + - "org.codelutin.topia.test.entities.PersonImpl," + - "org.codelutin.topia.test.entities.PetImpl"; + protected static String entitiesList; + static { + List<Class> list = Arrays.asList(TOPIA_SECURITY_PERSISTENCE_CLASSES); + list.add(org.codelutin.topia.test.entities.PersonImpl.class); + list.add(org.codelutin.topia.test.entities.PetImpl.class); + StringBuilder buffer = new StringBuilder(); + for (Class aClass : list) { + buffer.append(",").append(aClass.getName()); + } + entitiesList = buffer.substring(1); + } + + protected static Properties getProperties() { Properties config = new Properties(); config.setProperty("hibernate.hbm2ddl.auto", "create"); config.setProperty("hibernate.show_sql", "true"); config.setProperty("topia.persistence.classes", entitiesList); - + config.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect"); config.setProperty("hibernate.connection.username", "sa"); config.setProperty("hibernate.connection.password", ""); config.setProperty("hibernate.connection.driver_class", "org.h2.Driver"); config.setProperty("hibernate.connection.url", "jdbc:h2:data/topia-security;LOCK_METHOD=NO"); - + return config; } @@ -76,17 +87,17 @@ /* Transaction */ TopiaContext context = TopiaContextFactory.getContext(getProperties()); TopiaContext childContext = context.beginTransaction(); - + /* DAOs */ PersonDAO personDAO = TopiaServiceDAOHelper.getPersonDAO(childContext); PetDAO petDAO = TopiaServiceDAOHelper.getPetDAO(childContext); - + TopiaUserDAO topiaUserDAO = TopiaServiceDAOHelper.getTopiaUserDAO(childContext); TopiaGroupDAO topiaGroupDAO = TopiaServiceDAOHelper.getTopiaGroupDAO(childContext); TopiaEntityAuthorizationDAO topiaEntityAuthorizationDAO = TopiaServiceDAOHelper.getTopiaEntityAuthorizationDAO(childContext); TopiaExpressionLinkDAO linkDAO = TopiaServiceDAOHelper.getTopiaExpressionLinkDAO(childContext); TopiaAssociationAuthorizationDAO topiaAssociationAuthorizationDAO = TopiaServiceDAOHelper.getTopiaAssociationAuthorizationDAO(childContext); - + /* Création d'un admin */ TopiaUser admin = topiaUserDAO.create(); admin.setLogin("admin"); @@ -100,7 +111,7 @@ thimel.setPassword("zou;bi@da"); thimel.update(); childContext.commitTransaction(); - + /* Création d'un groupe avec un utilisateur */ TopiaUser ruchaud = topiaUserDAO.create(); ruchaud.setLogin("ruchaud"); @@ -110,7 +121,7 @@ groupRuchaud.setTopiaUser(new ArrayList<TopiaUser>()); ruchaud.addTopiaGroup(groupRuchaud); - + groupRuchaud.update(); ruchaud.update(); childContext.commitTransaction(); @@ -133,7 +144,7 @@ mylene.setFirstname("mylene"); personDAO.update(mylene); childContext.commitTransaction(); - + /* Création des annimaux */ Pet debux = petDAO.create(); debux.setName("debux"); @@ -141,7 +152,7 @@ debux.setPerson(jacques); debux.update(); childContext.commitTransaction(); - + Pet pluto = petDAO.create(); pluto.setName("pluto"); pluto.setType("chien"); @@ -155,7 +166,7 @@ fliper.setPerson(mylene); fliper.update(); childContext.commitTransaction(); - + /* Création des autorisations Entity */ TopiaEntityAuthorization authorizationForAdmin = topiaEntityAuthorizationDAO.create(); authorizationForAdmin.setExpression("*"); @@ -177,14 +188,14 @@ authorizationForThimel.setPrincipals(thimel.getTopiaId()); authorizationForThimel.update(); childContext.commitTransaction(); - + /* Création d'une autorisation Link */ TopiaExpressionLink link = linkDAO.create(); link.setReplace(mylene.getTopiaId()); link.setBy(jacques.getTopiaId()); link.update(); childContext.commitTransaction(); - + /* Création d'une authorisation association */ TopiaAssociationAuthorization associationAuthorization = topiaAssociationAuthorizationDAO.create(); associationAuthorization.setIdBeginAssociation(jacques.getTopiaId()); @@ -193,7 +204,7 @@ associationAuthorization.setPrincipals(ruchaud.getTopiaId()); associationAuthorization.update(); childContext.commitTransaction(); - + associationAuthorization = topiaAssociationAuthorizationDAO.create(); associationAuthorization.setIdBeginAssociation(mylene.getTopiaId()); associationAuthorization.setNameAssociation("pet"); Modified: topia-service/trunk/src/test/java/org/codelutin/topia/security/TopiaSecurityTest.java =================================================================== --- topia-service/trunk/src/test/java/org/codelutin/topia/security/TopiaSecurityTest.java 2009-01-14 22:58:33 UTC (rev 1297) +++ topia-service/trunk/src/test/java/org/codelutin/topia/security/TopiaSecurityTest.java 2009-01-14 23:01:45 UTC (rev 1298) @@ -19,9 +19,9 @@ import org.codelutin.topia.TopiaContext; import org.codelutin.topia.TopiaContextFactory; +import org.codelutin.topia.TopiaException; import org.codelutin.topia.TopiaNotFoundException; import org.codelutin.topia.TopiaServiceDAOHelper; -import org.codelutin.topia.TopiaException; import org.codelutin.topia.security.jaas.TopiaCallbackHandler; import org.codelutin.topia.security.util.TopiaSecurityFactoryFilter; import static org.codelutin.topia.security.util.TopiaSecurityUtil.LOAD; @@ -30,10 +30,10 @@ import org.codelutin.topia.test.entities.PersonDAO; import org.codelutin.topia.test.entities.Pet; import org.codelutin.topia.test.entities.PetDAO; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.junit.AfterClass; import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; @@ -126,7 +126,7 @@ Subject subject = loginContext.getSubject(); /* Tests */ - Subject.doAsPrivileged(subject, new PrivilegedExceptionAction() { + Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { TopiaContext childContext = context.beginTransaction(); @@ -166,7 +166,7 @@ Subject subject = loginContext.getSubject(); /* Tests */ - Subject.doAsPrivileged(subject, new PrivilegedExceptionAction() { + Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { TopiaContext childContext = context.beginTransaction(); @@ -205,7 +205,7 @@ Subject subject = loginContext.getSubject(); /* Tests */ - Subject.doAsPrivileged(subject, new PrivilegedExceptionAction() { + Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { TopiaContext childContext = context.beginTransaction();
participants (1)
-
tchemit@users.labs.libre-entreprise.org