Cantharella-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
- 279 discussions
r233 - trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/document/panel
by echatellier@users.forge.codelutin.com 28 May '13
by echatellier@users.forge.codelutin.com 28 May '13
28 May '13
Author: echatellier
Date: 2013-05-28 14:17:05 +0200 (Tue, 28 May 2013)
New Revision: 233
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/233
Log:
Force attachement download
Modified:
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/document/panel/DocumentLinkPanel.java
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/document/panel/DocumentLinkPanel.java
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/document/panel/DocumentLinkPanel.java 2013-05-28 10:15:32 UTC (rev 232)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/document/panel/DocumentLinkPanel.java 2013-05-28 12:17:05 UTC (rev 233)
@@ -51,7 +51,7 @@
final Document document = model.getObject();
ResourceLink<Document> link = new ResourceLink<Document>("link", new ByteArrayResource(document
- .getFileMimetype(), document.getFileContent()));
+ .getFileMimetype(), document.getFileContent(), document.getFileName()));
add(link);
// les images ne doivent pas être mise en cache car les liens
1
0
28 May '13
Author: echatellier
Date: 2013-05-28 12:15:32 +0200 (Tue, 28 May 2013)
New Revision: 232
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/232
Log:
Hide menu on mouse out
Modified:
trunk/cantharella.web/src/main/webapp/js/slidemenu.js
Modified: trunk/cantharella.web/src/main/webapp/js/slidemenu.js
===================================================================
--- trunk/cantharella.web/src/main/webapp/js/slidemenu.js 2013-05-27 08:18:51 UTC (rev 231)
+++ trunk/cantharella.web/src/main/webapp/js/slidemenu.js 2013-05-28 10:15:32 UTC (rev 232)
@@ -4,7 +4,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
+ * Copyright (C) 2009 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
@@ -21,7 +21,7 @@
* #L%
*/
var slideMenu=function(){
- var sp,st,t,m,sa,l,w,sw,ot;
+ var sp,st,t,m,sa,l,w,sw,ot,ssl;
return{
build:function(sm,sw,mt,s,sl,h){
sp=s; st=sw; t=mt;
@@ -30,9 +30,13 @@
l=sa.length; w=m.offsetWidth; sw=w/l;
ot=Math.floor((w-st)/(l-1)); var i=0;
for(i;i<l;i++){x=sa[i]; x.style.width=sw+'px'; this.timer(x)}
- if(sl!=null){m.timer=setInterval(function(){slideMenu.slide(sa[sl-1])},t)}
+ if(sl!=null){ssl=sl;m.timer=setInterval(function(){slideMenu.slide(sa[sl-1])},t)}
},
- timer:function(s){s.onmouseover=function(){clearInterval(m.timer);m.timer=setInterval(function(){slideMenu.slide(s)},t)}},
+ timer:function(s){
+ s.onmouseover=function(){clearInterval(m.timer);m.timer=setInterval(function(){slideMenu.slide(s)},t)};
+ s.onmouseout=function(e){clearInterval(m.timer);m.timer=setInterval(function(){slideMenu.slide(sa[ssl-1])},t)};
+ },
+
slide:function(s){
var cw=parseInt(s.style.width,'10');
if(cw<st){
1
0
r231 - in trunk/cantharella.web/src/main: java/nc/ird/cantharella/web/pages resources
by echatellier@users.forge.codelutin.com 27 May '13
by echatellier@users.forge.codelutin.com 27 May '13
27 May '13
Author: echatellier
Date: 2013-05-27 10:18:51 +0200 (Mon, 27 May 2013)
New Revision: 231
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/231
Log:
Add molecule count on home page
Modified:
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/HomePage.html
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/HomePage.java
trunk/cantharella.web/src/main/resources/web_en.properties
trunk/cantharella.web/src/main/resources/web_fr.properties
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/HomePage.html
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/HomePage.html 2013-05-27 08:17:59 UTC (rev 230)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/HomePage.html 2013-05-27 08:18:51 UTC (rev 231)
@@ -103,6 +103,7 @@
<li><span wicket:id="HomePage.Statistics.Lots"/> <wicket:message key="Lots.stat" /></li>
<li><span wicket:id="HomePage.Statistics.Extractions"/> <wicket:message key="Extractions.stat" /></li>
<li><span wicket:id="HomePage.Statistics.Purifications"/> <wicket:message key="Purifications.stat" /></li>
+ <li><span wicket:id="HomePage.Statistics.Molecules"/> <wicket:message key="Molecules.stat" /></li>
<li><span wicket:id="HomePage.Statistics.TestsBio"/> <wicket:message key="ResultatsTestsBio.stat" /></li>
</ul>
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/HomePage.java
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/HomePage.java 2013-05-27 08:17:59 UTC (rev 230)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/HomePage.java 2013-05-27 08:18:51 UTC (rev 231)
@@ -33,11 +33,14 @@
import nc.ird.cantharella.service.services.CampagneService;
import nc.ird.cantharella.service.services.ExtractionService;
import nc.ird.cantharella.service.services.LotService;
+import nc.ird.cantharella.service.services.MoleculeService;
import nc.ird.cantharella.service.services.PersonneService;
import nc.ird.cantharella.service.services.PurificationService;
import nc.ird.cantharella.service.services.SpecimenService;
import nc.ird.cantharella.service.services.StationService;
import nc.ird.cantharella.service.services.TestBioService;
+import nc.ird.cantharella.utils.BeanTools.AccessType;
+import nc.ird.cantharella.utils.CollectionTools;
import nc.ird.cantharella.web.pages.domain.utilisateur.ManageUtilisateurPage;
import nc.ird.cantharella.web.pages.domain.utilisateur.ReadUtilisateurPage;
import nc.ird.cantharella.web.pages.domain.utilisateur.RegisterPage;
@@ -50,11 +53,7 @@
import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider;
import nc.ird.cantharella.web.utils.security.AuthContainer;
import nc.ird.cantharella.web.utils.security.AuthRole;
-import nc.ird.cantharella.utils.BeanTools.AccessType;
-import nc.ird.cantharella.utils.CollectionTools;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
@@ -73,6 +72,8 @@
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Home page
@@ -115,6 +116,10 @@
@SpringBean
private PurificationService purificationService;
+ /** Service : molecule */
+ @SpringBean
+ private MoleculeService moleculeService;
+
/** Service : test biologique */
@SpringBean
private TestBioService testBioService;
@@ -239,6 +244,8 @@
.countExtractions())));
userContent.add(new Label(getResource() + ".Statistics.Purifications", String.valueOf(purificationService
.countPurifications())));
+ userContent.add(new Label(getResource() + ".Statistics.Molecules", String.valueOf(moleculeService
+ .countMolecules())));
userContent.add(new Label(getResource() + ".Statistics.TestsBio", String.valueOf(testBioService
.countResultatsTestsBio())));
Modified: trunk/cantharella.web/src/main/resources/web_en.properties
===================================================================
--- trunk/cantharella.web/src/main/resources/web_en.properties 2013-05-27 08:17:59 UTC (rev 230)
+++ trunk/cantharella.web/src/main/resources/web_en.properties 2013-05-27 08:18:51 UTC (rev 231)
@@ -4,7 +4,7 @@
# $Id$
# $HeadURL$
# %%
-# Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
+# Copyright (C) 2009 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
# %%
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -66,6 +66,7 @@
Lots.stat=Samples
Extractions.stat=Extractions
Purifications.stat=Purifications
+Molecules.stat=Molecules
ResultatsTestsBio.stat=Bioassay results
Modified: trunk/cantharella.web/src/main/resources/web_fr.properties
===================================================================
--- trunk/cantharella.web/src/main/resources/web_fr.properties 2013-05-27 08:17:59 UTC (rev 230)
+++ trunk/cantharella.web/src/main/resources/web_fr.properties 2013-05-27 08:18:51 UTC (rev 231)
@@ -4,7 +4,7 @@
# $Id$
# $HeadURL$
# %%
-# Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
+# Copyright (C) 2009 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
# %%
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -65,6 +65,7 @@
Lots.stat=Lots
Extractions.stat=Extractions
Purifications.stat=Purifications
+Molecules.stat=Molécules
ResultatsTestsBio.stat=Résultats de tests biologiques
1
0
r230 - trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model
by echatellier@users.forge.codelutin.com 27 May '13
by echatellier@users.forge.codelutin.com 27 May '13
27 May '13
Author: echatellier
Date: 2013-05-27 10:17:59 +0200 (Mon, 27 May 2013)
New Revision: 230
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/230
Log:
Add 'formuleBrute' field in index
Modified:
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java 2013-05-27 08:01:35 UTC (rev 229)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java 2013-05-27 08:17:59 UTC (rev 230)
@@ -94,6 +94,7 @@
/** Formule brute */
@Length(max = LENGTH_MEDIUM_TEXT)
@NotEmpty
+ @Field
private String formuleBrute;
/** Masse molaire */
1
0
Author: echatellier
Date: 2013-05-27 10:01:35 +0200 (Mon, 27 May 2013)
New Revision: 229
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/229
Log:
Update libs
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2013-05-24 15:39:12 UTC (rev 228)
+++ trunk/pom.xml 2013-05-27 08:01:35 UTC (rev 229)
@@ -5,7 +5,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.4.10</version>
+ <version>3.4.11</version>
</parent>
<groupId>nc.ird</groupId>
@@ -121,7 +121,7 @@
<version.commons-collections>3.2.1</version.commons-collections>
<version.commons-codec>1.8</version.commons-codec>
<version.postgresql>9.1-901-1.jdbc4</version.postgresql>
- <version.h2>1.3.171</version.h2>
+ <version.h2>1.3.172</version.h2>
<version.validation-api>1.1.0.Final</version.validation-api>
<version.hibernate-jpa-2.0-api>1.0.1.Final</version.hibernate-jpa-2.0-api>
<version.hibernate>4.2.2.Final</version.hibernate>
1
0
r228 - in trunk: cantharella.utils/src/main/java/nc/ird/cantharella/utils cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur
by echatellier@users.forge.codelutin.com 24 May '13
by echatellier@users.forge.codelutin.com 24 May '13
24 May '13
Author: echatellier
Date: 2013-05-24 17:39:12 +0200 (Fri, 24 May 2013)
New Revision: 228
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/228
Log:
Add document mamanagement for User (same as personne)
Modified:
trunk/cantharella.utils/src/main/java/nc/ird/cantharella/utils/BeanTools.java
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ManageUtilisateurPage.html
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ManageUtilisateurPage.java
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ReadUtilisateurPage.html
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ReadUtilisateurPage.java
Modified: trunk/cantharella.utils/src/main/java/nc/ird/cantharella/utils/BeanTools.java
===================================================================
--- trunk/cantharella.utils/src/main/java/nc/ird/cantharella/utils/BeanTools.java 2013-05-24 15:38:34 UTC (rev 227)
+++ trunk/cantharella.utils/src/main/java/nc/ird/cantharella/utils/BeanTools.java 2013-05-24 15:39:12 UTC (rev 228)
@@ -307,7 +307,8 @@
switch (accessType) {
case GETTER:
try {
- PropertyDescriptor prodDesc = new PropertyDescriptor(property, bean.getClass(), "is" + StringUtils.capitalize(property), null);
+ PropertyDescriptor prodDesc = new PropertyDescriptor(property, bean.getClass(), "is"
+ + StringUtils.capitalize(property), null);
Method method = prodDesc.getReadMethod();
value = method.invoke(bean);
} catch (RuntimeException e) {
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ManageUtilisateurPage.html
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ManageUtilisateurPage.html 2013-05-24 15:38:34 UTC (rev 227)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ManageUtilisateurPage.html 2013-05-24 15:39:12 UTC (rev 228)
@@ -77,6 +77,8 @@
</fieldset>
+ <wicket:panel wicket:id="ManageListDocumentsPanel" />
+
<div class="actions">
<input type="submit" wicket:message="value:Submit" wicket:id="Update" />
<input type="submit" wicket:message="value:Submit" wicket:id="Valid" />
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ManageUtilisateurPage.java
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ManageUtilisateurPage.java 2013-05-24 15:38:34 UTC (rev 227)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ManageUtilisateurPage.java 2013-05-24 15:39:12 UTC (rev 228)
@@ -45,6 +45,7 @@
import nc.ird.cantharella.utils.BeanTools.AccessType;
import nc.ird.cantharella.utils.CollectionTools;
import nc.ird.cantharella.web.pages.TemplatePage;
+import nc.ird.cantharella.web.pages.domain.document.panel.ManageListDocumentsPanel;
import nc.ird.cantharella.web.pages.domain.personne.panels.ManagePersonnePanel;
import nc.ird.cantharella.web.pages.model.ManageUtilisateurModel;
import nc.ird.cantharella.web.utils.CallerPage;
@@ -148,6 +149,7 @@
*/
public ManageUtilisateurPage(Integer idPersonne, final CallerPage callerPage) {
super(ManageUtilisateurPage.class);
+ final CallerPage currentPage = new CallerPage(this);
// Initialisation des modèles
try {
@@ -346,6 +348,11 @@
updateAvailableCampagnes();
formView.add(campagnesContainer);
+ // add list document panel
+ ManageListDocumentsPanel manageListDocumentsPanel = new ManageListDocumentsPanel("ManageListDocumentsPanel",
+ utilisateurModel, currentPage);
+ formView.add(manageListDocumentsPanel);
+
// Action : mise à jour de l'utilisateur
Button updateButton = new SubmittableButton(ACTION_UPDATE, new SubmittableButtonEvents() {
@Override
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ReadUtilisateurPage.html
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ReadUtilisateurPage.html 2013-05-24 15:38:34 UTC (rev 227)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ReadUtilisateurPage.html 2013-05-24 15:39:12 UTC (rev 228)
@@ -44,7 +44,9 @@
<legend><wicket:message key="ManageUtilisateurPage.Authorizations" /></legend>
<wicket:panel wicket:id="ReadDroitsUtilisateurPanel" />
</fieldset>
-
+
+ <wicket:panel wicket:id="ReadListDocumentsPanel" />
+
<form wicket:id="Form">
<div class="actions">
<a class="edit" wicket:id="ReadUtilisateurPage.Personne.Update" wicket:message="title:Update">
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ReadUtilisateurPage.java
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ReadUtilisateurPage.java 2013-05-24 15:38:34 UTC (rev 227)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/utilisateur/ReadUtilisateurPage.java 2013-05-24 15:39:12 UTC (rev 228)
@@ -28,6 +28,7 @@
import nc.ird.cantharella.data.model.Utilisateur.TypeDroit;
import nc.ird.cantharella.service.services.PersonneService;
import nc.ird.cantharella.web.pages.TemplatePage;
+import nc.ird.cantharella.web.pages.domain.document.panel.ReadListDocumentsPanel;
import nc.ird.cantharella.web.pages.domain.personne.panels.ReadPersonnePanel;
import nc.ird.cantharella.web.pages.domain.utilisateur.panels.ReadDroitsUtilisateurPanel;
import nc.ird.cantharella.web.utils.CallerPage;
@@ -104,6 +105,11 @@
autorizationsFieldset.add(new ReadDroitsUtilisateurPanel("ReadDroitsUtilisateurPanel", utilisateurModel));
add(autorizationsFieldset);
+ // add list document panel
+ ReadListDocumentsPanel readListDocumentsPanel = new ReadListDocumentsPanel("ReadListDocumentsPanel",
+ utilisateurModel, currentPage);
+ add(readListDocumentsPanel);
+
// Action : mise à jour (redirection vers le formulaire)
Link<Utilisateur> updateLink = new Link<Utilisateur>(getResource() + ".Personne.Update", utilisateurModel) {
@Override
1
0
r227 - trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model
by echatellier@users.forge.codelutin.com 24 May '13
by echatellier@users.forge.codelutin.com 24 May '13
24 May '13
Author: echatellier
Date: 2013-05-24 17:38:34 +0200 (Fri, 24 May 2013)
New Revision: 227
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/227
Log:
Fix lazy problems during hibernate search indexing
Add some missing field indexing
Modified:
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Extraction.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Lot.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MethodeExtraction.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MethodePurification.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Partie.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Purification.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Specimen.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Station.java
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Extraction.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Extraction.java 2013-05-24 15:37:24 UTC (rev 226)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Extraction.java 2013-05-24 15:38:34 UTC (rev 227)
@@ -91,6 +91,7 @@
/** Méthode pour l'extraction **/
@NotNull
@ManyToOne(fetch = FetchType.EAGER, optional = false)
+ @IndexedEmbedded
private MethodeExtraction methode;
/** Date de la manip */
@@ -119,7 +120,6 @@
/** Créateur */
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
- @IndexedEmbedded
private Personne createur;
/** Extraits produits par l'extraction */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Lot.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Lot.java 2013-05-24 15:37:24 UTC (rev 226)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Lot.java 2013-05-24 15:38:34 UTC (rev 227)
@@ -101,7 +101,6 @@
/** createur */
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
- @IndexedEmbedded
private Personne createur;
/** Date */
@@ -141,6 +140,7 @@
/** Partie */
@ManyToOne(fetch = FetchType.EAGER, optional = true)
+ @IndexedEmbedded
private Partie partie;
/** Droits attribués aux personnes */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MethodeExtraction.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MethodeExtraction.java 2013-05-24 15:37:24 UTC (rev 226)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MethodeExtraction.java 2013-05-24 15:38:34 UTC (rev 227)
@@ -27,6 +27,7 @@
import java.util.List;
import javax.persistence.Column;
+import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
@@ -40,6 +41,7 @@
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Type;
+import org.hibernate.search.annotations.Field;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
@@ -49,6 +51,7 @@
* @author Adrien Cheype
*/
@Entity
+@Embeddable
public class MethodeExtraction extends AbstractModel implements Comparable<MethodeExtraction> {
/** Id de la méthode */
@@ -60,6 +63,7 @@
@Length(max = LENGTH_MEDIUM_TEXT)
@Column(unique = true)
@NotEmpty
+ @Field
private String nom;
/** Description de la méthode */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MethodePurification.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MethodePurification.java 2013-05-24 15:37:24 UTC (rev 226)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MethodePurification.java 2013-05-24 15:38:34 UTC (rev 227)
@@ -27,6 +27,7 @@
import java.util.List;
import javax.persistence.Column;
+import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
@@ -41,6 +42,7 @@
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Type;
+import org.hibernate.search.annotations.Field;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
@@ -49,6 +51,7 @@
* @author Adrien Cheype
*/
@Entity
+@Embeddable
public class MethodePurification extends AbstractModel implements Comparable<MethodePurification> {
/** Id de la méthode */
@@ -60,6 +63,7 @@
@Length(max = LENGTH_MEDIUM_TEXT)
@Column(unique = true)
@NotEmpty
+ @Field
private String nom;
/** Description de la méthode */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java 2013-05-24 15:37:24 UTC (rev 226)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java 2013-05-24 15:38:34 UTC (rev 227)
@@ -130,7 +130,6 @@
/** Créateur */
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
- @IndexedEmbedded
private Personne createur;
/** Produit utilisé obtenir le résultat */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Partie.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Partie.java 2013-05-24 15:37:24 UTC (rev 226)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Partie.java 2013-05-24 15:38:34 UTC (rev 227)
@@ -23,6 +23,7 @@
package nc.ird.cantharella.data.model;
import javax.persistence.Column;
+import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@@ -31,6 +32,7 @@
import nc.ird.cantharella.data.model.utils.AbstractModel;
import org.apache.commons.beanutils.BeanComparator;
+import org.hibernate.search.annotations.Field;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
@@ -41,6 +43,7 @@
*/
@Entity
@Table
+@Embeddable
public class Partie extends AbstractModel implements Comparable<Partie> {
/** Id de la partie */
@@ -52,6 +55,7 @@
@Length(max = LENGTH_MEDIUM_TEXT)
@NotEmpty
@Column(unique = true)
+ @Field
private String nom;
/** {@inheritDoc} */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Purification.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Purification.java 2013-05-24 15:37:24 UTC (rev 226)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Purification.java 2013-05-24 15:38:34 UTC (rev 227)
@@ -98,6 +98,7 @@
/** Méthode pour la purification **/
@NotNull
@ManyToOne(fetch = FetchType.EAGER, optional = false)
+ @IndexedEmbedded
private MethodePurification methode;
/** Paramètres qui caractérisent la méthode pour cette purification */
@@ -135,7 +136,6 @@
/** Créateur */
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
- @IndexedEmbedded
private Personne createur;
/** Fractions produites par la purification */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Specimen.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Specimen.java 2013-05-24 15:37:24 UTC (rev 226)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Specimen.java 2013-05-24 15:38:34 UTC (rev 227)
@@ -166,7 +166,6 @@
/** Créateur */
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
- @IndexedEmbedded
private Personne createur;
/** Attached documents. */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Station.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Station.java 2013-05-24 15:37:24 UTC (rev 226)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Station.java 2013-05-24 15:38:34 UTC (rev 227)
@@ -100,7 +100,6 @@
/** Créateur */
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
- @IndexedEmbedded
private Personne createur;
/** Localité */
@@ -128,7 +127,10 @@
/** Stations */
@NotNull
- @ManyToMany(mappedBy = "stations", fetch = FetchType.LAZY)
+ @ManyToMany(mappedBy = "stations", fetch = FetchType.EAGER)
+ // FIXME echatellier 20130524 EAGER for hibernate search (no other simple solution)
+ @Fetch(value = FetchMode.SUBSELECT)
+ // see HHH-1718
@IndexedEmbedded
private List<Campagne> campagnes;
1
0
Author: echatellier
Date: 2013-05-24 17:37:24 +0200 (Fri, 24 May 2013)
New Revision: 226
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/226
Log:
Update hibernate
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2013-05-23 12:24:45 UTC (rev 225)
+++ trunk/pom.xml 2013-05-24 15:37:24 UTC (rev 226)
@@ -124,7 +124,7 @@
<version.h2>1.3.171</version.h2>
<version.validation-api>1.1.0.Final</version.validation-api>
<version.hibernate-jpa-2.0-api>1.0.1.Final</version.hibernate-jpa-2.0-api>
- <version.hibernate>4.2.1.Final</version.hibernate>
+ <version.hibernate>4.2.2.Final</version.hibernate>
<version.hibernate-validator>5.0.1.Final</version.hibernate-validator>
<version.hibernate-search>4.2.0.Final</version.hibernate-search>
<version.lucene>3.6.2</version.lucene>
1
0
r225 - trunk/cantharella.utils/src/main/java/nc/ird/cantharella/utils
by echatellier@users.forge.codelutin.com 23 May '13
by echatellier@users.forge.codelutin.com 23 May '13
23 May '13
Author: echatellier
Date: 2013-05-23 14:24:45 +0200 (Thu, 23 May 2013)
New Revision: 225
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/225
Log:
Fix NPE when sort property become null
Modified:
trunk/cantharella.utils/src/main/java/nc/ird/cantharella/utils/BeanTools.java
Modified: trunk/cantharella.utils/src/main/java/nc/ird/cantharella/utils/BeanTools.java
===================================================================
--- trunk/cantharella.utils/src/main/java/nc/ird/cantharella/utils/BeanTools.java 2013-05-21 12:36:43 UTC (rev 224)
+++ trunk/cantharella.utils/src/main/java/nc/ird/cantharella/utils/BeanTools.java 2013-05-23 12:24:45 UTC (rev 225)
@@ -25,6 +25,7 @@
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
@@ -61,9 +62,6 @@
/** Error message for field not found in a class */
private static final String FIELD = "Argument of type %s must have an accessible %s property";
- /** Parameters */
- private static final Object[] PARAMETERS = new Object[0];
-
/**
* Equals method
* @param thiz First object ("this", not null)
@@ -309,8 +307,9 @@
switch (accessType) {
case GETTER:
try {
- value = new PropertyDescriptor(property, bean.getClass(), "is" + StringUtils.capitalize(property), null)
- .getReadMethod().invoke(bean, PARAMETERS);
+ PropertyDescriptor prodDesc = new PropertyDescriptor(property, bean.getClass(), "is" + StringUtils.capitalize(property), null);
+ Method method = prodDesc.getReadMethod();
+ value = method.invoke(bean);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
@@ -346,7 +345,9 @@
List<String> beanNames = createAccessBeanList(pathToProperty);
Object curBean = bean;
for (String beanName : beanNames) {
- curBean = BeanTools.getValue(curBean, AccessType.GETTER, beanName);
+ if (curBean != null) {
+ curBean = BeanTools.getValue(curBean, AccessType.GETTER, beanName);
+ }
}
return curBean;
}
1
0
21 May '13
Author: echatellier
Date: 2013-05-21 14:36:43 +0200 (Tue, 21 May 2013)
New Revision: 224
Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/224
Log:
fixes #2353: Moteur de recherche: Test Securit?\195?\169 > resultats sur lesquels je n'ai pas les droits...
fixes #2354: Moteur de recherche: manque les r?\195?\169sultats pour Lots
fixes #2355: Moteur de recherche: Pb recherche par pays
fixes #2357: Moteur de recherche: Mol?\195?\169cules des r?\195?\169sultats en trop
fixes #2358: Moteur de Recherche: Pb recherche par nom de Campagne
fixes #2359: Moteur de recherche: recherche par pays: R?\195?\169sultats incomplets en Utilisateur / Admin
fixes #2363: Gestion des droits: Pb pour donner des droits sur un lot en particulier
Added:
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaAnalyzer.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemFilter.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemmer.java
Removed:
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/HibernateSearchIntegrator.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CampagnePersonneBridge.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/IndexEventListener.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/LotPersonneBridge.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/UtilisateurSearchFilter.java
Modified:
trunk/cantharella.data/pom.xml
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/DataContext.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Campagne.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/CampagnePersonneDroits.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Extraction.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Lot.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/LotPersonneDroits.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Produit.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Purification.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/ResultatTestBio.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Specimen.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Station.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/TestBio.java
trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/ProduitBridge.java
trunk/cantharella.data/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
trunk/cantharella.data/src/main/resources/cantharella.conf
trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/DocumentService.java
trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/SearchServiceImpl.java
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ListExtractionsPage.java
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/station/ListStationsPage.java
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/testBio/ListTestsBioPage.java
trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/panels/PropertyLabelLinkProduitPanel.java
Modified: trunk/cantharella.data/pom.xml
===================================================================
--- trunk/cantharella.data/pom.xml 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/pom.xml 2013-05-21 12:36:43 UTC (rev 224)
@@ -118,12 +118,12 @@
<artifactId>hibernate-search-engine</artifactId>
</dependency>
<dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-search-orm</artifactId>
+ <groupId>org.apache.lucene</groupId>
+ <artifactId>lucene-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
- <artifactId>lucene-core</artifactId>
+ <artifactId>lucene-analyzers</artifactId>
</dependency>
<dependency>
<groupId>c3p0</groupId>
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/DataContext.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/DataContext.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/DataContext.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -38,6 +38,7 @@
import javax.validation.ValidatorFactory;
import nc.ird.cantharella.data.exceptions.UnexpectedException;
+import nc.ird.cantharella.data.model.search.CantharellaAnalyzer;
import nc.ird.cantharella.data.validation.utils.ModelValidator;
import nc.ird.cantharella.data.validation.utils.ModelValidatorImpl;
import nc.ird.cantharella.utils.CantharellaConfig;
@@ -313,8 +314,10 @@
// Hibernate search
hibernateProperties.setProperty("hibernate.search.default.directory_provider", "filesystem");
hibernateProperties.setProperty("hibernate.search.default.indexBase", hibernateSearchIndexBase);
- hibernateProperties.setProperty("hibernate.search.analyzer", hibernateSearchAnalyzer);
- hibernateProperties.setProperty("hibernate.search.enable_dirty_check", "false");
+ hibernateProperties.setProperty(org.hibernate.search.Environment.ANALYZER_CLASS, CantharellaAnalyzer.class
+ .getName());
+ hibernateProperties.setProperty(org.hibernate.search.Environment.ENABLE_DIRTY_CHECK, "false");
+ hibernateProperties.setProperty(org.hibernate.search.Environment.LUCENE_MATCH_VERSION, "LUCENE_36");
// Hibernate: Session
//hibernateProperties.setProperty("hibernate.current_session_context_class", "thread");
//hibernateProperties.setProperty(Environment.JTA_PLATFORM, "hibernate.transaction.factory_class", SpringTransactionFactory.class.getName());
Deleted: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/HibernateSearchIntegrator.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/HibernateSearchIntegrator.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/HibernateSearchIntegrator.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -1,142 +0,0 @@
-package nc.ird.cantharella.data.config;
-
-/*
- * #%L
- * Cantharella :: Data
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2009 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero 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 Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-
-import java.util.List;
-
-import nc.ird.cantharella.data.model.Campagne;
-import nc.ird.cantharella.data.model.CampagnePersonneDroits;
-import nc.ird.cantharella.data.model.Lot;
-import nc.ird.cantharella.data.model.LotPersonneDroits;
-import nc.ird.cantharella.data.model.search.IndexEventListener;
-
-import org.hibernate.Session;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.engine.spi.SessionFactoryImplementor;
-import org.hibernate.event.service.spi.EventListenerRegistry;
-import org.hibernate.event.spi.EventType;
-import org.hibernate.event.spi.PostDeleteEvent;
-import org.hibernate.event.spi.PostDeleteEventListener;
-import org.hibernate.event.spi.PostInsertEvent;
-import org.hibernate.event.spi.PostInsertEventListener;
-import org.hibernate.event.spi.PostUpdateEvent;
-import org.hibernate.event.spi.PostUpdateEventListener;
-import org.hibernate.integrator.spi.Integrator;
-import org.hibernate.metamodel.source.MetadataImplementor;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.Search;
-import org.hibernate.service.spi.SessionFactoryServiceRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Register cantharella validator into hibernate using integrator.
- *
- * @author echatellier
- */
-public class HibernateSearchIntegrator implements Integrator, PostDeleteEventListener, PostUpdateEventListener,
- PostInsertEventListener {
-
- /** Logger */
- private static final Logger LOG = LoggerFactory.getLogger(HibernateSearchIntegrator.class);
-
- /** {@inheritDoc} */
- @Override
- public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory,
- SessionFactoryServiceRegistry serviceRegistry) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Registering custom search listener into hibernate");
- }
-
- // register validator
- EventListenerRegistry eventRegistry = serviceRegistry.getService(EventListenerRegistry.class);
-
- IndexEventListener listener = new IndexEventListener(IndexEventListener.Installation.SINGLE_INSTANCE);
- eventRegistry.prependListeners(EventType.POST_DELETE, listener);
- eventRegistry.prependListeners(EventType.POST_UPDATE, listener);
- eventRegistry.prependListeners(EventType.POST_INSERT, listener);
- listener.initialize(configuration);
- }
-
- /** {@inheritDoc} */
- @Override
- public void integrate(MetadataImplementor metadata, SessionFactoryImplementor sessionFactory,
- SessionFactoryServiceRegistry serviceRegistry) {
- integrate((Configuration) null, sessionFactory, serviceRegistry);
- }
-
- /** {@inheritDoc} */
- @Override
- public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
-
- }
-
- /** {@inheritDoc} */
- @Override
- public void onPostInsert(PostInsertEvent event) {
- Object entity = event.getEntity();
- LOG.debug("[Event] onPostInsert on : " + entity);
- reIndexEntity(event.getSession(), event.getEntity());
- }
-
- /** {@inheritDoc} */
- @Override
- public void onPostUpdate(PostUpdateEvent event) {
- Object entity = event.getEntity();
- LOG.debug("[Event] onPostUpdate on : " + entity);
- reIndexEntity(event.getSession(), event.getEntity());
- }
-
- /** {@inheritDoc} */
- @Override
- public void onPostDelete(PostDeleteEvent event) {
- Object entity = event.getEntity();
- LOG.debug("[Event] onPostDelete on : " + entity);
- reIndexEntity(event.getSession(), event.getEntity());
- }
-
- /**
- * Reindex entity associated with event entity depending on
- * entity type.
- *
- * @param session current session
- * @param entity current entity
- */
- protected void reIndexEntity(Session session, Object entity) {
- if (entity instanceof LotPersonneDroits) {
- Lot lot = ((LotPersonneDroits) entity).getId().getPk1();
- lot = (Lot) session.merge(lot);
- FullTextSession fullTextSession = Search.getFullTextSession(session);
- fullTextSession.index(lot);
- } else if (entity instanceof CampagnePersonneDroits) {
- Campagne campagne = ((CampagnePersonneDroits) entity).getId().getPk1();
- campagne = (Campagne) session.merge(campagne);
- FullTextSession fullTextSession = Search.getFullTextSession(session);
- List<Lot> lots = campagne.getLots();
- for (Lot lot : lots) {
- fullTextSession.index(lot);
- }
- }
- }
-}
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Campagne.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Campagne.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Campagne.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -52,12 +52,9 @@
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
-import org.hibernate.annotations.LazyCollection;
-import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.Type;
import org.hibernate.search.annotations.ContainedIn;
import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Store;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
@@ -142,9 +139,6 @@
/** Droits personnes */
@NotNull
@OneToMany(mappedBy = "id.pk1", fetch = FetchType.LAZY)
- @IndexedEmbedded
- // FIXME echatellier 20130320 EAGER du to HSEARCH-1260 bug, but should be lazy fetch
- @LazyCollection(LazyCollectionOption.FALSE)
private List<CampagnePersonneDroits> personnesDroits;
/** Stations prospectées **/
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/CampagnePersonneDroits.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/CampagnePersonneDroits.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/CampagnePersonneDroits.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -28,15 +28,9 @@
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
-import nc.ird.cantharella.data.model.search.CampagnePersonneBridge;
import nc.ird.cantharella.data.model.utils.AbstractModel;
import nc.ird.cantharella.data.model.utils.CompositeId;
-import org.hibernate.search.annotations.ClassBridge;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.IndexedEmbedded;
-import org.hibernate.search.annotations.Store;
-
/**
* Modèle : droits d'une personne sur une campagne
* @author Mickael Tricot
@@ -44,7 +38,6 @@
@Entity
@Table
@Embeddable
-@ClassBridge(name = "campagne", index = Index.YES, store = Store.YES, impl = CampagnePersonneBridge.class)
public class CampagnePersonneDroits extends AbstractModel {
/** Droits */
@@ -54,7 +47,6 @@
/** ID */
@EmbeddedId
@NotNull
- @IndexedEmbedded
private CompositeId<Campagne, Personne> id;
/**
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Extraction.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Extraction.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Extraction.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -45,7 +45,6 @@
import nc.ird.cantharella.data.config.DataContext;
import nc.ird.cantharella.data.model.comparators.ExtraitsOfExtractionComp;
-import nc.ird.cantharella.data.model.search.UtilisateurSearchFilter;
import nc.ird.cantharella.data.model.utils.AbstractModel;
import nc.ird.cantharella.data.model.utils.DocumentAttachable;
@@ -56,11 +55,8 @@
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Type;
-import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.ContainedIn;
import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.FullTextFilterDef;
-import org.hibernate.search.annotations.FullTextFilterDefs;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Store;
@@ -73,7 +69,6 @@
*/
@Entity
@Indexed
-@FullTextFilterDefs( { @FullTextFilterDef(name = "utilisateur-Extraction", impl = UtilisateurSearchFilter.class) })
public class Extraction extends AbstractModel implements Comparable<Extraction>, DocumentAttachable {
/** Id de l'extraction */
@@ -85,7 +80,7 @@
@Length(max = LENGTH_MEDIUM_TEXT)
@Column(unique = true)
@NotEmpty
- @Field(store = Store.YES, analyze = Analyze.NO)
+ @Field(store = Store.YES)
private String ref;
/** Manipulateur */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Lot.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Lot.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Lot.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -46,7 +46,6 @@
import javax.validation.constraints.Past;
import nc.ird.cantharella.data.config.DataContext;
-import nc.ird.cantharella.data.model.search.UtilisateurSearchFilter;
import nc.ird.cantharella.data.model.utils.AbstractModel;
import nc.ird.cantharella.data.model.utils.DocumentAttachable;
@@ -55,13 +54,9 @@
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
-import org.hibernate.annotations.LazyCollection;
-import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.Type;
import org.hibernate.search.annotations.ContainedIn;
import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.FullTextFilterDef;
-import org.hibernate.search.annotations.FullTextFilterDefs;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Store;
@@ -77,7 +72,6 @@
@Table
@Indexed
@Embeddable
-@FullTextFilterDefs( { @FullTextFilterDef(name = "utilisateur-Lot", impl = UtilisateurSearchFilter.class) })
public class Lot extends AbstractModel implements Comparable<Lot>, DocumentAttachable {
/** ID */
@@ -152,9 +146,6 @@
/** Droits attribués aux personnes */
@OneToMany(mappedBy = "id.pk1", fetch = FetchType.LAZY)
@NotNull
- @IndexedEmbedded
- // FIXME echatellier 20130320 EAGER du to HSEARCH-1260 bug, but should be lazy fetch
- @LazyCollection(LazyCollectionOption.FALSE)
private List<LotPersonneDroits> personnesDroits;
/** Spécimen source */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/LotPersonneDroits.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/LotPersonneDroits.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/LotPersonneDroits.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -28,15 +28,9 @@
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
-import nc.ird.cantharella.data.model.search.LotPersonneBridge;
import nc.ird.cantharella.data.model.utils.AbstractModel;
import nc.ird.cantharella.data.model.utils.CompositeId;
-import org.hibernate.search.annotations.ClassBridge;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.IndexedEmbedded;
-import org.hibernate.search.annotations.Store;
-
/**
* Modèle : droits d'une personne sur un lot
* @author Mickael Tricot
@@ -44,7 +38,6 @@
@Entity
@Table
@Embeddable
-@ClassBridge(name = "lot", index = Index.YES, store = Store.YES, impl = LotPersonneBridge.class)
public class LotPersonneDroits extends AbstractModel {
/** Droits */
@@ -54,7 +47,6 @@
/** ID */
@EmbeddedId
@NotNull
- @IndexedEmbedded
private CompositeId<Lot, Personne> id;
/**
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Produit.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Produit.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Produit.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -43,7 +43,6 @@
import nc.ird.cantharella.data.model.utils.AbstractModel;
import org.apache.commons.beanutils.BeanComparator;
-import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.ClassBridge;
import org.hibernate.search.annotations.ContainedIn;
import org.hibernate.search.annotations.Field;
@@ -70,7 +69,7 @@
@Length(max = LENGTH_MEDIUM_TEXT)
@NotEmpty
@Column(unique = true)
- @Field(store = Store.YES, analyze = Analyze.NO)
+ @Field(store = Store.YES)
private String ref;
/** Masse obtenue pour le produit **/
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Purification.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Purification.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Purification.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -46,7 +46,6 @@
import nc.ird.cantharella.data.config.DataContext;
import nc.ird.cantharella.data.model.comparators.FractionsOfPurificationComp;
-import nc.ird.cantharella.data.model.search.UtilisateurSearchFilter;
import nc.ird.cantharella.data.model.utils.AbstractModel;
import nc.ird.cantharella.data.model.utils.DocumentAttachable;
import nc.ird.cantharella.utils.AssertTools;
@@ -58,11 +57,8 @@
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Type;
-import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.ContainedIn;
import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.FullTextFilterDef;
-import org.hibernate.search.annotations.FullTextFilterDefs;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Store;
@@ -75,7 +71,6 @@
*/
@Entity
@Indexed
-@FullTextFilterDefs( { @FullTextFilterDef(name = "utilisateur-Purification", impl = UtilisateurSearchFilter.class) })
public class Purification extends AbstractModel implements Comparable<Purification>, DocumentAttachable {
/** Id de la purification */
@@ -87,7 +82,7 @@
@Length(max = LENGTH_MEDIUM_TEXT)
@Column(unique = true)
@NotEmpty
- @Field(store = Store.YES, analyze = Analyze.NO)
+ @Field(store = Store.YES)
private String ref;
/** Manipulateur */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/ResultatTestBio.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/ResultatTestBio.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/ResultatTestBio.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -38,7 +38,6 @@
import javax.validation.constraints.NotNull;
import nc.ird.cantharella.data.config.DataContext;
-import nc.ird.cantharella.data.model.search.UtilisateurSearchFilter;
import nc.ird.cantharella.data.model.utils.AbstractModel;
import nc.ird.cantharella.data.model.utils.DocumentAttachable;
import nc.ird.cantharella.data.validation.CollectionUniqueField;
@@ -47,8 +46,6 @@
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ComparatorChain;
import org.hibernate.annotations.Index;
-import org.hibernate.search.annotations.FullTextFilterDef;
-import org.hibernate.search.annotations.FullTextFilterDefs;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.validator.constraints.Length;
@@ -65,7 +62,6 @@
@Entity
@CollectionUniqueField(fieldName = "repere", pathToCollection = "testBio.resultats")
@Indexed
-@FullTextFilterDefs( { @FullTextFilterDef(name = "utilisateur-ResultatTestBio", impl = UtilisateurSearchFilter.class) })
public class ResultatTestBio extends AbstractModel implements Cloneable, Comparable<ResultatTestBio>,
DocumentAttachable {
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Specimen.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Specimen.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Specimen.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -43,7 +43,6 @@
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
-import nc.ird.cantharella.data.model.search.UtilisateurSearchFilter;
import nc.ird.cantharella.data.model.utils.AbstractModel;
import nc.ird.cantharella.data.model.utils.DocumentAttachable;
@@ -53,10 +52,7 @@
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Type;
-import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.FullTextFilterDef;
-import org.hibernate.search.annotations.FullTextFilterDefs;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Store;
@@ -72,7 +68,6 @@
@Table
@Indexed
@Embeddable
-@FullTextFilterDefs( { @FullTextFilterDef(name = "utilisateur-Specimen", impl = UtilisateurSearchFilter.class) })
public class Specimen extends AbstractModel implements Comparable<Specimen>, DocumentAttachable {
/**
@@ -104,7 +99,7 @@
@Column(unique = true)
@NotEmpty
@Length(max = LENGTH_TINY_TEXT)
- @Field(store = Store.YES, analyze = Analyze.NO)
+ @Field(store = Store.YES)
private String ref;
/** Embranchement */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Station.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Station.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Station.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -39,7 +39,6 @@
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
-import nc.ird.cantharella.data.model.search.UtilisateurSearchFilter;
import nc.ird.cantharella.data.model.utils.AbstractModel;
import nc.ird.cantharella.data.model.utils.DocumentAttachable;
import nc.ird.cantharella.data.validation.CountryCode;
@@ -56,8 +55,6 @@
import org.hibernate.annotations.Type;
import org.hibernate.search.annotations.ContainedIn;
import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.FullTextFilterDef;
-import org.hibernate.search.annotations.FullTextFilterDefs;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.validator.constraints.Length;
@@ -73,7 +70,6 @@
@AccessType("field")
@Indexed
@Embeddable
-@FullTextFilterDefs( { @FullTextFilterDef(name = "utilisateur-Station", impl = UtilisateurSearchFilter.class) })
public class Station extends AbstractModel implements Cloneable, Comparable<Station>, DocumentAttachable {
/** ID */
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/TestBio.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/TestBio.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/TestBio.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -60,7 +60,6 @@
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Type;
-import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.ContainedIn;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.IndexedEmbedded;
@@ -85,7 +84,7 @@
@Length(max = LENGTH_MEDIUM_TEXT)
@Column(unique = true)
@NotEmpty
- @Field(store = Store.YES, analyze = Analyze.NO)
+ @Field(store = Store.YES)
private String ref;
/** Manipulateur */
Deleted: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CampagnePersonneBridge.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CampagnePersonneBridge.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CampagnePersonneBridge.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -1,68 +0,0 @@
-package nc.ird.cantharella.data.model.search;
-
-/*
- * #%L
- * Cantharella :: Data
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero 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 Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-
-import nc.ird.cantharella.data.model.Campagne;
-import nc.ird.cantharella.data.model.CampagnePersonneDroits;
-import nc.ird.cantharella.data.model.Personne;
-import nc.ird.cantharella.data.model.utils.CompositeId;
-
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.hibernate.search.bridge.FieldBridge;
-import org.hibernate.search.bridge.LuceneOptions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Hibernate search can't index CompositeId by himself.
- *
- * To index right on entities, we add a field "droit.pk2" containing user
- * id, meaning "this user can see this indexed document".
- *
- * @author Eric Chatellier
- */
-public class CampagnePersonneBridge implements FieldBridge {
-
- /** Logger */
- private static final Logger LOG = LoggerFactory.getLogger(CampagnePersonneBridge.class);
-
- /** {@inheritDoc} */
- @Override
- public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
-
- CampagnePersonneDroits campagnePersonneDroits = (CampagnePersonneDroits) value;
- if (LOG.isTraceEnabled()) {
- LOG.trace("Custom indexing of CampagnePersonneDroits : "
- + campagnePersonneDroits.getId().getPk1().getIdCampagne() + ","
- + campagnePersonneDroits.getId().getPk2().getIdPersonne());
- }
-
- CompositeId<Campagne, Personne> compositeId = campagnePersonneDroits.getId();
-
- // commons information for all produit
- document.add(new Field("droit.pk2", String.valueOf(compositeId.getPk2().getIdPersonne()), luceneOptions
- .getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()));
- }
-}
Added: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaAnalyzer.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaAnalyzer.java (rev 0)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaAnalyzer.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -0,0 +1,165 @@
+/*
+ * #%L
+ * Cantharella :: Data
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package nc.ird.cantharella.data.model.search;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Set;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.CharArraySet;
+import org.apache.lucene.analysis.KeywordMarkerFilter;
+import org.apache.lucene.analysis.LowerCaseFilter;
+import org.apache.lucene.analysis.StopFilter;
+import org.apache.lucene.analysis.StopwordAnalyzerBase;
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.Tokenizer;
+import org.apache.lucene.analysis.WordlistLoader;
+import org.apache.lucene.analysis.fr.ElisionFilter;
+import org.apache.lucene.analysis.fr.FrenchLightStemFilter;
+import org.apache.lucene.analysis.snowball.SnowballFilter;
+import org.apache.lucene.analysis.standard.StandardAnalyzer; // for javadoc
+import org.apache.lucene.analysis.standard.StandardFilter;
+import org.apache.lucene.analysis.standard.StandardTokenizer;
+import org.apache.lucene.util.IOUtils;
+import org.apache.lucene.util.Version;
+
+/**
+ * {@link Analyzer} for French language.
+ * <p>
+ * Supports an external list of stopwords (words that
+ * will not be indexed at all) and an external list of exclusions (word that will
+ * not be stemmed, but indexed).
+ * A default set of stopwords is used unless an alternative list is specified, but the
+ * exclusion list is empty by default.
+ * </p>
+ *
+ * <a name="version"/>
+ * <p>You must specify the required {@link Version}
+ * compatibility when creating FrenchAnalyzer:
+ * <ul>
+ * <li> As of 3.6, FrenchLightStemFilter is used for less aggressive stemming.
+ * <li> As of 3.1, Snowball stemming is done with SnowballFilter,
+ * LowerCaseFilter is used prior to StopFilter, and ElisionFilter and
+ * Snowball stopwords are used by default.
+ * <li> As of 2.9, StopFilter preserves position
+ * increments
+ * </ul>
+ *
+ * <p><b>NOTE</b>: This class uses the same {@link Version}
+ * dependent settings as {@link StandardAnalyzer}.</p>
+ */
+public final class CantharellaAnalyzer extends StopwordAnalyzerBase {
+
+ /** File containing default French stopwords. */
+ public final static String DEFAULT_STOPWORD_FILE = "french_stop.txt";
+
+ /**
+ * Contains words that should be indexed but not stemmed.
+ */
+ private Set<?> excltable = CharArraySet.EMPTY_SET;
+
+ /**
+ * Returns an unmodifiable instance of the default stop-words set.
+ * @return an unmodifiable instance of the default stop-words set.
+ */
+ public static Set<?> getDefaultStopSet() {
+ return DefaultSetHolder.DEFAULT_STOP_SET;
+ }
+
+ @SuppressWarnings("deprecation")
+ private static class DefaultSetHolder {
+
+ static final Set<?> DEFAULT_STOP_SET;
+ static {
+ try {
+ DEFAULT_STOP_SET = WordlistLoader.getSnowballWordSet(IOUtils.getDecodingReader(SnowballFilter.class,
+ DEFAULT_STOPWORD_FILE, IOUtils.CHARSET_UTF_8), Version.LUCENE_CURRENT);
+ } catch (IOException ex) {
+ // default set should always be present as it is part of the
+ // distribution (JAR)
+ throw new RuntimeException("Unable to load default stopword set");
+ }
+ }
+ }
+
+ /**
+ * Builds an analyzer with the default stop words ({@link #getDefaultStopSet}).
+ * @param matchVersion lucene match version
+ */
+ public CantharellaAnalyzer(Version matchVersion) {
+ this(matchVersion, DefaultSetHolder.DEFAULT_STOP_SET);
+ }
+
+ /**
+ * Builds an analyzer with the given stop words
+ *
+ * @param matchVersion
+ * lucene compatibility version
+ * @param stopwords
+ * a stopword set
+ */
+ public CantharellaAnalyzer(Version matchVersion, Set<?> stopwords) {
+ this(matchVersion, stopwords, CharArraySet.EMPTY_SET);
+ }
+
+ /**
+ * Builds an analyzer with the given stop words
+ *
+ * @param matchVersion
+ * lucene compatibility version
+ * @param stopwords
+ * a stopword set
+ * @param stemExclutionSet
+ * a stemming exclusion set
+ */
+ public CantharellaAnalyzer(Version matchVersion, Set<?> stopwords, Set<?> stemExclutionSet) {
+ super(matchVersion, stopwords);
+ this.excltable = CharArraySet.unmodifiableSet(CharArraySet.copy(matchVersion, stemExclutionSet));
+ }
+
+ /**
+ * Creates
+ * {@link org.apache.lucene.analysis.ReusableAnalyzerBase.TokenStreamComponents}
+ * used to tokenize all the text in the provided {@link Reader}.
+ *
+ * @return {@link org.apache.lucene.analysis.ReusableAnalyzerBase.TokenStreamComponents}
+ * built from a {@link StandardTokenizer} filtered with
+ * {@link StandardFilter}, {@link ElisionFilter},
+ * {@link LowerCaseFilter}, {@link StopFilter},
+ * {@link KeywordMarkerFilter} if a stem exclusion set is
+ * provided, and {@link FrenchLightStemFilter}
+ */
+ @Override
+ protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
+ final Tokenizer source = new StandardTokenizer(matchVersion, reader);
+ TokenStream result = new StandardFilter(matchVersion, source);
+ result = new ElisionFilter(matchVersion, result);
+ result = new LowerCaseFilter(matchVersion, result);
+ result = new StopFilter(matchVersion, result, stopwords);
+ if (!excltable.isEmpty())
+ result = new KeywordMarkerFilter(result, excltable);
+ result = new CantharellaStemFilter(result);
+ return new TokenStreamComponents(source, result);
+ }
+}
Property changes on: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaAnalyzer.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemFilter.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemFilter.java (rev 0)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemFilter.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -0,0 +1,72 @@
+/*
+ * #%L
+ * Cantharella :: Data
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package nc.ird.cantharella.data.model.search;
+
+import java.io.IOException;
+
+import org.apache.lucene.analysis.TokenFilter;
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
+import org.apache.lucene.analysis.tokenattributes.KeywordAttribute;
+
+/**
+ * Custom stem filter to use {@link CantharellaStemmer} instead of lucene's
+ * default French Stemmer.
+ *
+ * @author Eric Chatellier
+ */
+public class CantharellaStemFilter extends TokenFilter {
+ /** Character sequence stemmer. */
+ private final CantharellaStemmer stemmer = new CantharellaStemmer();
+
+ /** Char term attribute. */
+ private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
+
+ /** Keyword attribute. */
+ private final KeywordAttribute keywordAttr = addAttribute(KeywordAttribute.class);
+
+ /**
+ * Constructor.
+ *
+ * @param input token stream.
+ */
+ public CantharellaStemFilter(TokenStream input) {
+ super(input);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean incrementToken() throws IOException {
+ if (input.incrementToken()) {
+ if (!keywordAttr.isKeyword()) {
+ final int newlen = stemmer.stem(termAtt.buffer(), termAtt.length());
+ termAtt.setLength(newlen);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
\ No newline at end of file
Property changes on: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemFilter.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemmer.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemmer.java (rev 0)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemmer.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -0,0 +1,260 @@
+/*
+ * #%L
+ * Cantharella :: Data
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package nc.ird.cantharella.data.model.search;
+
+import static org.apache.lucene.analysis.util.StemmerUtil.*;
+
+/**
+ * Light Stemmer for French.
+ * <p>
+ * This stemmer implements the "UniNE" algorithm in:
+ * <i>Light Stemming Approaches for the French, Portuguese, German and Hungarian Languages</i>
+ * Jacques Savoy
+ */
+public class CantharellaStemmer {
+
+ /**
+ * Stem a char sequence.
+ *
+ * @param s char sequence to stem
+ * @param len char sequence length
+ * @return char sequence final length
+ */
+ public int stem(char s[], int len) {
+ if (len > 5 && s[len - 1] == 'x') {
+ if (s[len - 3] == 'a' && s[len - 2] == 'u' && s[len - 4] != 'e')
+ s[len - 2] = 'l';
+ len--;
+ }
+
+ if (len > 3 && s[len - 1] == 'x')
+ len--;
+
+ if (len > 3 && s[len - 1] == 's')
+ len--;
+
+ if (len > 9 && endsWith(s, len, "issement")) {
+ len -= 6;
+ s[len - 1] = 'r';
+ return norm(s, len);
+ }
+
+ if (len > 8 && endsWith(s, len, "issant")) {
+ len -= 4;
+ s[len - 1] = 'r';
+ return norm(s, len);
+ }
+
+ if (len > 6 && endsWith(s, len, "ement")) {
+ len -= 4;
+ if (len > 3 && endsWith(s, len, "ive")) {
+ len--;
+ s[len - 1] = 'f';
+ }
+ return norm(s, len);
+ }
+
+ if (len > 11 && endsWith(s, len, "ficatrice")) {
+ len -= 5;
+ s[len - 2] = 'e';
+ s[len - 1] = 'r';
+ return norm(s, len);
+ }
+
+ if (len > 10 && endsWith(s, len, "ficateur")) {
+ len -= 4;
+ s[len - 2] = 'e';
+ s[len - 1] = 'r';
+ return norm(s, len);
+ }
+
+ if (len > 9 && endsWith(s, len, "catrice")) {
+ len -= 3;
+ s[len - 4] = 'q';
+ s[len - 3] = 'u';
+ s[len - 2] = 'e';
+ //s[len-1] = 'r' <-- unnecessary, already 'r'.
+ return norm(s, len);
+ }
+
+ if (len > 8 && endsWith(s, len, "cateur")) {
+ len -= 2;
+ s[len - 4] = 'q';
+ s[len - 3] = 'u';
+ s[len - 2] = 'e';
+ s[len - 1] = 'r';
+ return norm(s, len);
+ }
+
+ if (len > 8 && endsWith(s, len, "atrice")) {
+ len -= 4;
+ s[len - 2] = 'e';
+ s[len - 1] = 'r';
+ return norm(s, len);
+ }
+
+ if (len > 7 && endsWith(s, len, "ateur")) {
+ len -= 3;
+ s[len - 2] = 'e';
+ s[len - 1] = 'r';
+ return norm(s, len);
+ }
+
+ if (len > 6 && endsWith(s, len, "trice")) {
+ len--;
+ s[len - 3] = 'e';
+ s[len - 2] = 'u';
+ s[len - 1] = 'r';
+ }
+
+ if (len > 5 && endsWith(s, len, "ième"))
+ return norm(s, len - 4);
+
+ if (len > 7 && endsWith(s, len, "teuse")) {
+ len -= 2;
+ s[len - 1] = 'r';
+ return norm(s, len);
+ }
+
+ if (len > 6 && endsWith(s, len, "teur")) {
+ len--;
+ s[len - 1] = 'r';
+ return norm(s, len);
+ }
+
+ if (len > 5 && endsWith(s, len, "euse"))
+ return norm(s, len - 2);
+
+ if (len > 8 && endsWith(s, len, "ère")) {
+ len--;
+ s[len - 2] = 'e';
+ return norm(s, len);
+ }
+
+ if (len > 7 && endsWith(s, len, "ive")) {
+ len--;
+ s[len - 1] = 'f';
+ return norm(s, len);
+ }
+
+ if (len > 4 && (endsWith(s, len, "folle") || endsWith(s, len, "molle"))) {
+ len -= 2;
+ s[len - 1] = 'u';
+ return norm(s, len);
+ }
+
+ if (len > 9 && endsWith(s, len, "nnelle"))
+ return norm(s, len - 5);
+
+ if (len > 9 && endsWith(s, len, "nnel"))
+ return norm(s, len - 3);
+
+ if (len > 4 && endsWith(s, len, "ète")) {
+ len--;
+ s[len - 2] = 'e';
+ }
+
+ if (len > 8 && endsWith(s, len, "ique"))
+ len -= 4;
+
+ if (len > 8 && endsWith(s, len, "esse"))
+ return norm(s, len - 3);
+
+ if (len > 7 && endsWith(s, len, "inage"))
+ return norm(s, len - 3);
+
+ if (len > 9 && endsWith(s, len, "isation")) {
+ len -= 7;
+ if (len > 5 && endsWith(s, len, "ual"))
+ s[len - 2] = 'e';
+ return norm(s, len);
+ }
+
+ if (len > 9 && endsWith(s, len, "isateur"))
+ return norm(s, len - 7);
+
+ if (len > 8 && endsWith(s, len, "ation"))
+ return norm(s, len - 5);
+
+ if (len > 8 && endsWith(s, len, "ition"))
+ return norm(s, len - 5);
+
+ return norm(s, len);
+ }
+
+ private int norm(char s[], int len) {
+ if (len > 4) {
+ for (int i = 0; i < len; i++)
+ switch (s[i]) {
+ case 'à':
+ case 'á':
+ case 'â':
+ s[i] = 'a';
+ break;
+ case 'ô':
+ s[i] = 'o';
+ break;
+ case 'è':
+ case 'é':
+ case 'ê':
+ s[i] = 'e';
+ break;
+ case 'ù':
+ case 'û':
+ s[i] = 'u';
+ break;
+ case 'î':
+ s[i] = 'i';
+ break;
+ case 'ç':
+ s[i] = 'c';
+ break;
+ }
+
+ /* XXX chatellier 20130516 disabled for cantharella because
+ duplicated characters are usefull in some refs identifiers
+ char ch = s[0];
+ for (int i = 1; i < len; i++) {
+ if (s[i] == ch)
+ len = delete(s, i--, len);
+ else
+ ch = s[i];
+ }*/
+ }
+
+ if (len > 4 && endsWith(s, len, "ie"))
+ len -= 2;
+
+ if (len > 4) {
+ if (s[len - 1] == 'r')
+ len--;
+ if (s[len - 1] == 'e')
+ len--;
+ if (s[len - 1] == 'e')
+ len--;
+ if (s[len - 1] == s[len - 2])
+ len--;
+ }
+ return len;
+ }
+}
Property changes on: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/CantharellaStemmer.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Deleted: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/IndexEventListener.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/IndexEventListener.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/IndexEventListener.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -1,112 +0,0 @@
-/*
- * #%L
- * Cantharella :: Data
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero 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 Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package nc.ird.cantharella.data.model.search;
-
-import java.io.Serializable;
-
-import nc.ird.cantharella.data.model.Campagne;
-import nc.ird.cantharella.data.model.CampagnePersonneDroits;
-import nc.ird.cantharella.data.model.Lot;
-import nc.ird.cantharella.data.model.LotPersonneDroits;
-import nc.ird.cantharella.data.model.Personne;
-import nc.ird.cantharella.data.model.utils.CompositeId;
-
-import org.hibernate.Session;
-import org.hibernate.event.spi.AbstractEvent;
-import org.hibernate.event.spi.PostDeleteEvent;
-import org.hibernate.event.spi.PostInsertEvent;
-import org.hibernate.event.spi.PostUpdateEvent;
-import org.hibernate.search.backend.spi.WorkType;
-import org.hibernate.search.event.impl.FullTextIndexEventListener;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Hibernate event listener to force reindexation on custom indexed entity:
- * {@link LotPersonneDroits} and {@link CampagnePersonneDroits}.
- *
- * @author Eric Chatellier
- */
-public class IndexEventListener extends FullTextIndexEventListener {
-
- /** Logger */
- private static final Logger LOG = LoggerFactory.getLogger(IndexEventListener.class);
-
- /**
- * Constructor.
- * @param installation installation strategy
- */
- public IndexEventListener(Installation installation) {
- super(installation);
- }
-
- /** {@inheritDoc}. */
- @Override
- public void onPostDelete(PostDeleteEvent event) {
- Object entity = event.getEntity();
- LOG.debug("[Event] onPostDelete on : " + entity);
- reIndexEntity(event, event.getEntity(), event.getId());
- }
-
- /** {@inheritDoc}. */
- @Override
- public void onPostInsert(PostInsertEvent event) {
- Object entity = event.getEntity();
- LOG.debug("[Event] onPostInsert on : " + entity);
- reIndexEntity(event, event.getEntity(), event.getId());
- }
-
- /** {@inheritDoc}. */
- @Override
- public void onPostUpdate(PostUpdateEvent event) {
- Object entity = event.getEntity();
- LOG.debug("[Event] onPostUpdate on : " + entity);
- reIndexEntity(event, event.getEntity(), event.getId());
- }
-
- /**
- * Reindex entity associated with event entity depending on
- * entity type.
- *
- * @param event event
- * @param entity current entity
- * @param id entity id
- */
- @SuppressWarnings("unchecked")
- protected void reIndexEntity(AbstractEvent event, Object entity, Serializable id) {
- Session session = event.getSession();
- if (entity instanceof LotPersonneDroits) {
- Lot lot = ((CompositeId<Lot, Personne>) id).getPk1();
- // must do refresh to avoid lazy or no entity with given identifier
- // exception
- session.refresh(lot);
- super.processWork(lot, lot.getIdLot(), WorkType.INDEX, event, false);
- } else if (entity instanceof CampagnePersonneDroits) {
- Campagne campagne = ((CompositeId<Campagne, Personne>) id).getPk1();
- // must do refresh to avoid lazy or no entity with given identifier
- // exception
- session.refresh(campagne);
- super.processWork(campagne, campagne.getIdCampagne(), WorkType.INDEX, event, false);
- }
- }
-}
Deleted: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/LotPersonneBridge.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/LotPersonneBridge.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/LotPersonneBridge.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -1,67 +0,0 @@
-package nc.ird.cantharella.data.model.search;
-
-/*
- * #%L
- * Cantharella :: Data
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero 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 Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-
-import nc.ird.cantharella.data.model.Lot;
-import nc.ird.cantharella.data.model.LotPersonneDroits;
-import nc.ird.cantharella.data.model.Personne;
-import nc.ird.cantharella.data.model.utils.CompositeId;
-
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.hibernate.search.bridge.FieldBridge;
-import org.hibernate.search.bridge.LuceneOptions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Hibernate search can't index CompositeId by himself.
- *
- * To index right on entities, we add a field "droit.pk2" containing user
- * id, meaning "this user can see this indexed document".
- *
- * @author Eric Chatellier
- */
-public class LotPersonneBridge implements FieldBridge {
-
- /** Logger */
- private static final Logger LOG = LoggerFactory.getLogger(LotPersonneBridge.class);
-
- /** {@inheritDoc} */
- @Override
- public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
-
- LotPersonneDroits lotPersonneDroits = (LotPersonneDroits) value;
- if (LOG.isTraceEnabled()) {
- LOG.trace("Custom indexing of LotPersonneDroits : " + lotPersonneDroits.getId().getPk1().getIdLot() + ","
- + lotPersonneDroits.getId().getPk2().getIdPersonne());
- }
-
- CompositeId<Lot, Personne> compositeId = lotPersonneDroits.getId();
-
- // commons information for all produit
- document.add(new Field("droit.pk2", String.valueOf(compositeId.getPk2().getIdPersonne()), luceneOptions
- .getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()));
- }
-}
Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/ProduitBridge.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/ProduitBridge.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/ProduitBridge.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -23,13 +23,9 @@
* #L%
*/
-import java.util.List;
-
-import nc.ird.cantharella.data.model.CampagnePersonneDroits;
import nc.ird.cantharella.data.model.Extrait;
import nc.ird.cantharella.data.model.Fraction;
import nc.ird.cantharella.data.model.Lot;
-import nc.ird.cantharella.data.model.LotPersonneDroits;
import nc.ird.cantharella.data.model.Produit;
import nc.ird.cantharella.data.model.ResultatTestBio;
@@ -62,8 +58,6 @@
}
// commons information for all produit
- //document.add(new Field("produit.ref", produit.getRef(), luceneOptions.getStore(), luceneOptions.getIndex(),
- // luceneOptions.getTermVector()));
Lot lot = null;
if (produit instanceof Extrait) {
if (LOG.isTraceEnabled()) {
@@ -79,28 +73,33 @@
lot = fraction.getPurification().getLotSource();
}
- document.add(new Field("produit.lot.ref", lot.getRef(), luceneOptions.getStore(), luceneOptions.getIndex(),
+ // ref field tokenized with a non fr analyzer
+ // to avoid duplicated letter removal (00)
+ document.add(new Field(name + ".lot.ref", lot.getRef(), luceneOptions.getStore(), luceneOptions.getIndex(),
luceneOptions.getTermVector()));
- document.add(new Field("produit.lot.speciment.embranchement", lot.getSpecimenRef().getEmbranchement(),
- luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()));
+
+ if (StringUtils.isNotBlank(lot.getSpecimenRef().getEmbranchement())) {
+ document.add(new Field(name + ".lot.specimen.embranchement", lot.getSpecimenRef().getEmbranchement(),
+ luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()));
+ }
if (StringUtils.isNotBlank(lot.getSpecimenRef().getFamille())) {
- document.add(new Field("produit.lot.speciment.famille", lot.getSpecimenRef().getFamille(), luceneOptions
+ document.add(new Field(name + ".lot.specimen.famille", lot.getSpecimenRef().getFamille(), luceneOptions
.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()));
}
if (StringUtils.isNotBlank(lot.getSpecimenRef().getGenre())) {
- document.add(new Field("produit.lot.speciment.genre", lot.getSpecimenRef().getGenre(), luceneOptions
+ document.add(new Field(name + ".lot.specimen.genre", lot.getSpecimenRef().getGenre(), luceneOptions
.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()));
}
if (StringUtils.isNotBlank(lot.getSpecimenRef().getEspece())) {
- document.add(new Field("produit.lot.speciment.espece", lot.getSpecimenRef().getEspece(), luceneOptions
+ document.add(new Field(name + ".lot.specimen.espece", lot.getSpecimenRef().getEspece(), luceneOptions
.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()));
}
- document.add(new Field("produit.lot.campagne.nom", lot.getCampagne().getNom(), luceneOptions.getStore(),
+ document.add(new Field(name + ".lot.campagne.nom", lot.getCampagne().getNom(), luceneOptions.getStore(),
luceneOptions.getIndex(), luceneOptions.getTermVector()));
- document.add(new Field("produit.lot.campagne.codePays", lot.getCampagne().getCodePays(), luceneOptions
+ document.add(new Field(name + ".lot.campagne.codePays", lot.getCampagne().getCodePays(), luceneOptions
.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()));
- // commons information for all produit
+ /* commons information for all produit
List<LotPersonneDroits> personnesDroits = lot.getPersonnesDroits();
for (LotPersonneDroits lotPersonneDroit : personnesDroits) {
document.add(new Field("droit.pk2", String.valueOf(lotPersonneDroit.getId().getPk2().getIdPersonne()),
@@ -110,6 +109,6 @@
for (CampagnePersonneDroits campagnesDroit : campagnesDroits) {
document.add(new Field("droit.pk2", String.valueOf(campagnesDroit.getId().getPk2().getIdPersonne()),
luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()));
- }
+ }*/
}
}
Deleted: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/UtilisateurSearchFilter.java
===================================================================
--- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/UtilisateurSearchFilter.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/search/UtilisateurSearchFilter.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -1,129 +0,0 @@
-/*
- * #%L
- * Cantharella :: Data
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2009 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below)
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero 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 Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package nc.ird.cantharella.data.model.search;
-
-import java.io.IOException;
-
-import nc.ird.cantharella.data.model.Utilisateur;
-import nc.ird.cantharella.data.model.Utilisateur.TypeDroit;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.index.TermDocs;
-import org.apache.lucene.search.DocIdSet;
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.util.OpenBitSet;
-import org.hibernate.search.annotations.Key;
-import org.hibernate.search.filter.FilterKey;
-import org.hibernate.search.filter.StandardFilterKey;
-
-/**
- * Filtre lucene utilisé par hibernate search pour filtrer les resultats
- * suivant l'utilisateur connecté.
- *
- * @author Eric Chatellier
- */
-public class UtilisateurSearchFilter extends Filter {
-
- /** serialVersionUID.*/
- private static final long serialVersionUID = 5599764509232575010L;
-
- /** Logger */
- private static final Logger LOG = LoggerFactory.getLogger(UtilisateurSearchFilter.class);
-
- /** Utilisateur performing the query. */
- protected Utilisateur utilisateur;
-
- /**
- * Utilisateur getter.
- *
- * @return utilisateur
- */
- public Utilisateur getUtilisateur() {
- return utilisateur;
- }
-
- /**
- * Utilisateur setter.
- *
- * @param utilisateur utilisateur
- */
- public void setUtilisateur(Utilisateur utilisateur) {
- this.utilisateur = utilisateur;
- }
-
- /**
- * Return filter parameters key.
- *
- * @return filter parameters
- */
- @Key
- public FilterKey getKey() {
- StandardFilterKey key = new StandardFilterKey();
- key.addParameter(utilisateur);
- return key;
- }
-
- /** {@inheritDoc} */
- @Override
- public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
- OpenBitSet bitSet = new OpenBitSet(reader.maxDoc());
-
- if (utilisateur.getTypeDroit() == TypeDroit.ADMINISTRATEUR) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Filtering term docs for administrator");
- }
- // all docs
- for (int idx = 0; idx < reader.maxDoc(); idx++) {
- if (!reader.isDeleted(idx)) {
- bitSet.set(idx);
- }
- }
- } else {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Filtering term docs for utilisateur");
- }
- // only docs where user is creator
- TermDocs termDocsCreateur = reader.termDocs(new Term("createur.idPersonne", String.valueOf(utilisateur
- .getIdPersonne())));
- while (termDocsCreateur.next()) {
- if (!reader.isDeleted(termDocsCreateur.doc())) {
- bitSet.set(termDocsCreateur.doc());
- }
- }
-
- // and docs where user has rights on
- TermDocs termDocsDroits = reader
- .termDocs(new Term("droit.pk2", String.valueOf(utilisateur.getIdPersonne())));
- while (termDocsDroits.next()) {
- if (!reader.isDeleted(termDocsCreateur.doc())) {
- bitSet.set(termDocsDroits.doc());
- }
- }
- }
-
- return bitSet;
- }
-}
Modified: trunk/cantharella.data/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
===================================================================
--- trunk/cantharella.data/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator 2013-05-21 12:36:43 UTC (rev 224)
@@ -1,2 +1 @@
-nc.ird.cantharella.data.config.ValidationIntegrator
-nc.ird.cantharella.data.config.HibernateSearchIntegrator
\ No newline at end of file
+nc.ird.cantharella.data.config.ValidationIntegrator
\ No newline at end of file
Modified: trunk/cantharella.data/src/main/resources/cantharella.conf
===================================================================
--- trunk/cantharella.data/src/main/resources/cantharella.conf 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.data/src/main/resources/cantharella.conf 2013-05-21 12:36:43 UTC (rev 224)
@@ -35,4 +35,4 @@
# Hibernate search lucene index location on filesystem.
hibernate.search.indexBase=/tmp/cantharella
# Hibernate search analyzer
-hibernate.search.analyzer=org.apache.lucene.analysis.fr.FrenchAnalyzer
\ No newline at end of file
+hibernate.search.analyzer=org.apache.lucene.analysis.fr.FrenchAnalyzer
Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/DocumentService.java
===================================================================
--- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/DocumentService.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/DocumentService.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -27,10 +27,8 @@
import nc.ird.cantharella.data.exceptions.DataConstraintException;
import nc.ird.cantharella.data.exceptions.DataNotFoundException;
import nc.ird.cantharella.data.model.Document;
-import nc.ird.cantharella.data.model.Lot;
import nc.ird.cantharella.data.model.TypeDocument;
import nc.ird.cantharella.data.model.Utilisateur;
-import nc.ird.cantharella.data.model.Utilisateur.TypeDroit;
import nc.ird.cantharella.data.model.utils.DocumentAttachable;
import nc.ird.cantharella.service.exceptions.InvalidFileExtensionException;
import nc.ird.cantharella.service.utils.normalizers.TypeDocumentNormalizer;
Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/SearchServiceImpl.java
===================================================================
--- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/SearchServiceImpl.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/SearchServiceImpl.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -24,11 +24,14 @@
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import javax.annotation.Resource;
import nc.ird.cantharella.data.exceptions.UnexpectedException;
+import nc.ird.cantharella.data.model.Campagne;
import nc.ird.cantharella.data.model.Extraction;
import nc.ird.cantharella.data.model.Lot;
import nc.ird.cantharella.data.model.Molecule;
@@ -37,10 +40,15 @@
import nc.ird.cantharella.data.model.Specimen;
import nc.ird.cantharella.data.model.Station;
import nc.ird.cantharella.data.model.Utilisateur;
+import nc.ird.cantharella.data.model.Utilisateur.TypeDroit;
import nc.ird.cantharella.service.model.SearchBean;
import nc.ird.cantharella.service.model.SearchResult;
+import nc.ird.cantharella.service.services.LotService;
import nc.ird.cantharella.service.services.SearchService;
+import nc.ird.cantharella.service.services.SpecimenService;
+import nc.ird.cantharella.service.services.StationService;
+import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.FieldInfos;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
@@ -52,15 +60,14 @@
import org.apache.lucene.util.Version;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
-import org.hibernate.search.FullTextFilter;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.MassIndexer;
import org.hibernate.search.Search;
import org.hibernate.search.SearchFactory;
-import org.hibernate.search.annotations.FullTextFilterDefs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
@@ -78,6 +85,18 @@
@Resource
private SessionFactory sessionFactory;
+ /** Lot service for permissions **/
+ @Autowired
+ private LotService lotService;
+
+ /** Station service for permissions **/
+ @Autowired
+ private StationService stationService;
+
+ /** Specimen service for permission **/
+ @Autowired
+ private SpecimenService specimenService;
+
/** {@inheritDoc} */
@Override
public void reIndex() {
@@ -90,6 +109,8 @@
FullTextSession fullTextSession = Search.getFullTextSession(session);
try {
MassIndexer indexer = fullTextSession.createIndexer();
+ indexer.batchSizeToLoadObjects(1);
+ indexer.threadsToLoadObjects(1);
indexer.threadsForSubsequentFetching(1);
indexer.startAndWait();
@@ -172,6 +193,9 @@
result.setStations(resultatStations);
result.setMolecules(resultatMolecules);
+ // security manually managed
+ result = filterResults(result, utilisateur);
+
} catch (ParseException ex) {
throw new UnexpectedException("Can't parse query", ex);
}
@@ -206,12 +230,13 @@
String fieldName = fieldInfos.fieldName(i);
// il semble impossible de ne pas recuperer l'id du document
// on l'exclut donc manuellement
- if (!fieldName.startsWith("id") && !fieldName.contains(".id") && !fieldName.endsWith(".pk2")) {
- fieldList.add(fieldInfos.fieldName(i));
+ if (!fieldName.startsWith("id") && !fieldName.contains(".id") /*&& !fieldName.endsWith(".pk2")*/) {
+ fieldList.add(fieldName);
}
}
+ Analyzer analyzer = searchFactory.getAnalyzer(clazz);
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, fieldList.toArray(new String[fieldList.size()]),
- searchFactory.getAnalyzer(clazz));
+ analyzer);
searchFactory.getIndexReaderAccessor().close(reader);
// autorisation de "*" en premier caractere
@@ -224,12 +249,79 @@
// convert lucene query to hibernate query
FullTextQuery hibQuery = fullTextSession.createFullTextQuery(query, clazz);
- // add security filter (if class has filter defined)
- if (clazz.getAnnotation(FullTextFilterDefs.class) != null) {
- FullTextFilter filter = hibQuery.enableFullTextFilter("utilisateur-" + clazz.getSimpleName());
- filter.setParameter("utilisateur", utilisateur);
+ return hibQuery;
+ }
+
+ /**
+ * Iterate over all results and remove those that user is not allowed to see.
+ *
+ * @see Utilisateur#getLotsDroits()
+ * @see Utilisateur#getCampagnesDroits()
+ */
+ private SearchResult filterResults(SearchResult result, Utilisateur utilisateur) {
+
+ // no filtering
+ if (utilisateur.getTypeDroit() == TypeDroit.ADMINISTRATEUR) {
+ return result;
}
- return hibQuery;
+ // get campagnes and lots data to manage rigths
+ List<Campagne> campagnes = new ArrayList<Campagne>();
+ campagnes.addAll(utilisateur.getCampagnesCreees());
+ campagnes.addAll(utilisateur.getCampagnesDroits().keySet());
+ List<Lot> lots = new ArrayList<Lot>();
+ lots.addAll(utilisateur.getLotsCrees());
+ lots.addAll(utilisateur.getLotsDroits().keySet());
+
+ // SearchResult#lots
+ Iterator<Lot> itLots = result.getLots().iterator();
+ while (itLots.hasNext()) {
+ Lot lot = itLots.next();
+ if (!lotService.isLotAccessibleByUser(lot, utilisateur)) {
+ itLots.remove();
+ }
+ }
+
+ // SearchResult#extractions
+ Iterator<Extraction> itExtractions = result.getExtractions().iterator();
+ while (itExtractions.hasNext()) {
+ Extraction extraction = itExtractions.next();
+ Lot lot = extraction.getLot();
+ if (!lotService.isLotAccessibleByUser(lot, utilisateur)) {
+ itExtractions.remove();
+ }
+ }
+
+ // SearchResult#purifications
+ Iterator<Purification> itPurifications = result.getPurifications().iterator();
+ while (itPurifications.hasNext()) {
+ Purification purification = itPurifications.next();
+ Lot lot = purification.getLotSource();
+ if (!lotService.isLotAccessibleByUser(lot, utilisateur)) {
+ itPurifications.remove();
+ }
+ }
+
+ // SearchResult#resultatTestBios
+ Iterator<ResultatTestBio> itResultatTestBios = result.getResultatTestBios().iterator();
+ while (itResultatTestBios.hasNext()) {
+ ResultatTestBio resultatTestBio = itResultatTestBios.next();
+ Lot lot = resultatTestBio.getLotSource();
+ if (!lotService.isLotAccessibleByUser(lot, utilisateur)) {
+ itResultatTestBios.remove();
+ }
+ }
+
+ // SearchResult#stations
+ Set<Station> userStations = stationService.listStationsForUser(utilisateur);
+ result.getStations().retainAll(userStations);
+
+ // SearchResult#specimens
+ Set<Specimen> userSpecimens = specimenService.listSpecimensForUser(utilisateur);
+ result.getSpecimens().retainAll(userSpecimens);
+
+ // SearchResult#molecules : all visible, no filtering
+
+ return result;
}
}
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ListExtractionsPage.java
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ListExtractionsPage.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ListExtractionsPage.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -54,7 +54,6 @@
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
/**
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/station/ListStationsPage.java
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/station/ListStationsPage.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/station/ListStationsPage.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -51,7 +51,6 @@
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
/**
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/testBio/ListTestsBioPage.java
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/testBio/ListTestsBioPage.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/testBio/ListTestsBioPage.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -61,7 +61,6 @@
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
/**
Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/panels/PropertyLabelLinkProduitPanel.java
===================================================================
--- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/panels/PropertyLabelLinkProduitPanel.java 2013-05-21 09:32:37 UTC (rev 223)
+++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/panels/PropertyLabelLinkProduitPanel.java 2013-05-21 12:36:43 UTC (rev 224)
@@ -32,7 +32,6 @@
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
/**
* Panel which display a "produit" link with inside the correspondig value of the model. If the produit is an Extrait,
1
0