r1715 - in trunk: . wao-services/src/main/java/fr/ifremer/wao/services wao-services/src/main/java/fr/ifremer/wao/services/service wao-services/src/main/java/fr/ifremer/wao/services/service/administration wao-services/src/main/java/fr/ifremer/wao/services/service/mail wao-services/src/main/resources wao-services/src/main/resources/email wao-services/src/main/resources/i18n wao-services/src/test/java/fr/ifremer/wao/services wao-services/src/test/java/fr/ifremer/wao/services/service wao-services/
Author: bleny Date: 2014-03-06 14:50:31 +0100 (Thu, 06 Mar 2014) New Revision: 1715 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1715 Log: introduce EmailService, make some i18n, update stack to make service layer locale aware Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoPermissions.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/CompaniesService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/NewsService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialState.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UpdateWaoUserCommand.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UpdateWaoUserCommandPasswordStrategy.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/EmailService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/UserCredentialsEmail.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/WaoMail.java trunk/wao-services/src/main/resources/email/ trunk/wao-services/src/main/resources/email/UserCredentialsEmail_en_GB.mustache trunk/wao-services/src/main/resources/email/UserCredentialsEmail_fr-FR.mustache trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/WaoUsersServiceTest.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/mail/ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/mail/EmailServiceTest.java Removed: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompaniesService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/NewsService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialState.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommandPasswordStrategy.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/AuthenticatedWaoUser.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoPermissions.java Modified: trunk/README.txt trunk/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/InitWaoService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoServiceSupport.java trunk/wao-services/src/main/resources/i18n/wao-services_en_GB.properties trunk/wao-services/src/main/resources/i18n/wao-services_fr_FR.properties trunk/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoServiceContext.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoApplicationContext.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoInterceptor.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoJspActionSupport.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoRealm.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoSession.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/AbstractImportReferentialAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/CompaniesAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteCompanyAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteWaoUserAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditCompanyAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/ReferentialManagementAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/WaoUsersAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/DeleteNewsAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditNewsAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/NewsAction.java trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp Modified: trunk/README.txt =================================================================== --- trunk/README.txt 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/README.txt 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,38 +0,0 @@ -Launch application with winstone --------------------------------- - -java -jar wao-xxx.war - -ou - -lancement à partir du script go.bat (pour Windows) - -Default admin user ------------------- - -login = admin -password = password - -Format des fichiers en CSV --------------------------- - -Encodage UTF-8 obligatoire. Préconisation d'OpenOffice pour la sauvegarde des fichiers. - -Configuration au lancement --------------------------- - --Dwao.config.path=/path/to/properties/file (file named Wao.properties) --Dwao.log.home=/path/to/log/folder - -Déploiement sous TOMCAT ------------------------ - -Il est nécessaire d'ajouter, dans /etc/default/tomcat : - -JAVA_OPTS="$JAVA_OPTS -XX:MaxPermSize=256M" - -Liens ------ - -Site du projet : https://labs.libre-entreprise.org/projects/suiviobsmer/ -Site de documentation : http://suiviobsmer.labs.libre-entreprise.org/wao/ Copied: trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java (from rev 1713, trunk/wao-web/src/main/java/fr/ifremer/wao/web/AuthenticatedWaoUser.java) =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,100 @@ +package fr.ifremer.wao.services; + +import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.UserProfile; +import fr.ifremer.wao.entity.UserRole; +import fr.ifremer.wao.entity.WaoUser; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; + +public class AuthenticatedWaoUser { + + protected WaoUser waoUser; + + protected UserProfile userProfile; + + protected transient WaoPermissions permissions; + + public AuthenticatedWaoUser(WaoUser waoUser, UserProfile userProfile) { + this.waoUser = waoUser; + this.userProfile = userProfile; + } + + protected WaoPermissions getPermissions() { + if (permissions == null) { + permissions = new WaoPermissions(); + } + return permissions; + } + + protected boolean isPermitted(String permission) { + return getCurrentUser().isPermitted(permission); + } + + protected Subject getCurrentUser() { + Subject currentUser = SecurityUtils.getSubject(); + return currentUser; + } + + public WaoUser getWaoUser() { + return waoUser; + } + + public void logout() { + getCurrentUser().logout(); + } + + public boolean isAdmin() { + return userProfile.isAdmin(); + } + + public boolean isCoordinator() { + return userProfile.isCoordinator(); + } + + public boolean isGuest() { + return userProfile.isGuest(); + } + + public boolean isObserver() { + return userProfile.isObserver(); + } + + public boolean isProfessional() { + return userProfile.isProfessional(); + } + + public boolean isReadOnly() { + return userProfile.isReadOnly(); + } + + public boolean isObsMer() { + return userProfile.isObsMer(); + } + + public boolean isObsVente() { + return userProfile.isObsVente(); + } + + public boolean isCoordinatorOrObserver() { + return userProfile.isCoordinatorOrObserver(); + } + + public ObsProgram getObsProgram() { + return userProfile.getObsProgram(); + } + + public Boolean getCanWrite() { + return userProfile.getCanWrite(); + } + + public UserRole getUserRole() { + return userProfile.getUserRole(); + } + + public Company getCompany() { + return waoUser.getCompany(); + } + +} Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -7,7 +7,9 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Date; +import java.util.Locale; import java.util.Random; +import java.util.UUID; public class DefaultWaoServiceContext implements WaoServiceContext { @@ -19,6 +21,8 @@ protected Random random; + protected Locale locale; + @Override public WaoApplicationConfig getApplicationConfig() { return applicationConfig; @@ -95,4 +99,17 @@ this.webApplicationContext = webApplicationContext; } + public Locale getLocale() { + return locale; + } + + public void setLocale(Locale locale) { + this.locale = locale; + } + + @Override + public String newUuid() { + return UUID.randomUUID().toString(); + } + } Copied: trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoPermissions.java (from rev 1713, trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoPermissions.java) =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoPermissions.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoPermissions.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,52 @@ +package fr.ifremer.wao.services; + +import com.google.common.collect.Iterables; +import fr.ifremer.wao.WaoTopiaPersistenceContext; +import fr.ifremer.wao.entity.WaoUser; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.util.HashSet; +import java.util.Set; + +/** + * Représente tout le système de permissions de l'extranet. + */ +public class WaoPermissions { + + private static final Log log = LogFactory.getLog(WaoPermissions.class); + + protected <E extends TopiaEntity> String getTopiaIds(Iterable<E> topiaEntities) { + Iterable<String> topiaIds = Iterables.transform(topiaEntities, TopiaEntities.getTopiaIdFunction()); + return join(topiaIds); + } + + protected String join(Iterable<String> topiaIds) { + return StringUtils.join(topiaIds, ','); + } + + /** + * Permet d'obtenir toutes les permissions accordée à l'utilisateur donné. + */ + public Set<String> getPermissions(WaoTopiaPersistenceContext topiaPersistenceContext, WaoUser waoUser) { + + Set<String> permissions = new HashSet<>(); + + if (waoUser.isActive()) { + + + + } + + if (log.isDebugEnabled()) { + log.debug("permissions for " + waoUser + " are " + permissions); + } + + return permissions; + + } + +} Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -4,6 +4,7 @@ import fr.ifremer.wao.WaoTopiaPersistenceContext; import java.util.Date; +import java.util.Locale; import java.util.Random; /** @@ -23,4 +24,8 @@ Random getRandom(); + Locale getLocale(); + + String newUuid(); + } Deleted: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompaniesService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompaniesService.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompaniesService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,75 +0,0 @@ -package fr.ifremer.wao.services.service; - -import fr.ifremer.wao.entity.Company; -import fr.ifremer.wao.entity.CompanyImpl; -import fr.ifremer.wao.entity.CompanyTopiaDao; -import org.nuiton.topia.persistence.TopiaEntity; - -import java.util.List; -import java.util.Map; - -public class CompaniesService extends WaoServiceSupport { - - public List<Company> getCompanies() { - - CompanyTopiaDao dao = getPersistenceContext().getCompanyDao(); - - List<Company> companies = dao.newQueryBuilder().setOrderByArguments(Company.PROPERTY_ACTIVE + " desc", Company.PROPERTY_NAME).findAll(); - - return companies; - - } - - public Company getCompany(String companyId) { - - CompanyTopiaDao dao = getPersistenceContext().getCompanyDao(); - - Company company = dao.findByTopiaId(companyId); - - return company; - - } - - public Company newCompany() { - - CompanyImpl newCompany = new CompanyImpl(); - - newCompany.setActive(true); - - return newCompany; - - } - - public void save(Company company) { - - CompanyTopiaDao dao = getPersistenceContext().getCompanyDao(); - - if (company.isPersisted()) { - dao.update(company); - } else { - dao.create(company); - } - - commit(); - - } - - public void deleteCompany(String companyId) throws IllegalDeletionException { - - CompanyTopiaDao dao = getPersistenceContext().getCompanyDao(); - - Company company = dao.findByTopiaId(companyId); - - Map<Class<? extends TopiaEntity>,List<? extends TopiaEntity>> allUsages = dao.findAllUsages(company); - - if (allUsages.isEmpty()) { - dao.delete(company); - } else { - throw new IllegalDeletionException(allUsages.keySet()); - } - - commit(); - - } - -} Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/InitWaoService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/InitWaoService.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/InitWaoService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,5 +1,7 @@ package fr.ifremer.wao.services.service; +import fr.ifremer.wao.services.service.administration.ReferentialService; + public class InitWaoService extends WaoServiceSupport { public void init() { Deleted: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/NewsService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/NewsService.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/NewsService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,89 +0,0 @@ -package fr.ifremer.wao.services.service; - -import com.google.common.collect.Lists; -import fr.ifremer.wao.entity.News; -import fr.ifremer.wao.entity.NewsImpl; -import fr.ifremer.wao.entity.NewsTopiaDao; -import fr.ifremer.wao.entity.UserProfile; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; - -import java.util.List; - -public class NewsService extends WaoServiceSupport { - - public List<News> getRecentNews(UserProfile userProfile, int maxCount) { - - NewsTopiaDao newsDao = getPersistenceContext().getNewsDao(); - - TopiaQueryBuilderAddCriteriaOrRunQueryStep<News> query = newsDao.newQueryBuilder(); - - // on ne veut que les news pour le programme et 'null' pour les news publiées pour tous les programmes - query.addIn(News.PROPERTY_OBS_PROGRAM, Lists.newArrayList(userProfile.getObsProgram(), null)); - - // on ne veut que les news publiées par le programme et les news publiées par la même société que l'utilisateur connecté - if ( ! userProfile.isAdmin()) { - // TODO brendan 25/02/14 - //properties.put(News.PROPERTY_COMPANY, userProfile); - } - - // de la plus récente à la plus ancienne - query.setOrderByArguments(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE + " desc"); - - List<News> news = query.find(0, maxCount); - - return news; - - } - - public void delete(String newsId) { - - NewsTopiaDao newsDao = getPersistenceContext().getNewsDao(); - - News news = newsDao.findByTopiaId(newsId); - - newsDao.delete(news); - - commit(); - - } - - public News getNews(String newsId) { - - NewsTopiaDao newsDao = getPersistenceContext().getNewsDao(); - - News news = newsDao.findByTopiaId(newsId); - - return news; - - } - - public News newNews() { - - News newNews = new NewsImpl(); - - // TODO brendan 25/02/14 -// if (!user.isAdmin()) { -// newNews.setCompany(user.getCompany()); -// } -// -// newNews.setObsProgram(user.getProfile().getObsProgram()); - - return newNews; - - } - - public void save(News news) { - - if ( ! news.isPersisted()) { - - NewsTopiaDao newsDao = getPersistenceContext().getNewsDao(); - - newsDao.create(news); - - } - - commit(); - - } -} Deleted: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,1000 +0,0 @@ -/* - * #%L - * Wao :: Business - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer - * %% - * 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 fr.ifremer.wao.services.service; - -import com.google.common.base.Preconditions; -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableSet; -import fr.ifremer.wao.WaoTechnicalException; -import fr.ifremer.wao.entity.Boat; -import fr.ifremer.wao.entity.BoatGroup; -import fr.ifremer.wao.entity.BoatGroupTopiaDao; -import fr.ifremer.wao.entity.BoatTopiaDao; -import fr.ifremer.wao.entity.ContactState; -import fr.ifremer.wao.entity.ContactStateMotif; -import fr.ifremer.wao.entity.ContactStateMotifTopiaDao; -import fr.ifremer.wao.entity.DCF5Code; -import fr.ifremer.wao.entity.FishingGearDCF; -import fr.ifremer.wao.entity.FishingGearDCFTopiaDao; -import fr.ifremer.wao.entity.FishingZone; -import fr.ifremer.wao.entity.FishingZoneTopiaDao; -import fr.ifremer.wao.entity.Fleet; -import fr.ifremer.wao.entity.FleetTopiaDao; -import fr.ifremer.wao.entity.LocationType; -import fr.ifremer.wao.entity.ObsDebCode; -import fr.ifremer.wao.entity.ObsDebCodeDetails; -import fr.ifremer.wao.entity.ObsDebCodeDetailsImpl; -import fr.ifremer.wao.entity.ObsDebCodeDetailsTopiaDao; -import fr.ifremer.wao.entity.ObsDebCodeImpl; -import fr.ifremer.wao.entity.ObsDebCodeTopiaDao; -import fr.ifremer.wao.entity.ObsProgram; -import fr.ifremer.wao.entity.ReferentialMeta; -import fr.ifremer.wao.entity.ReferentialMetaImpl; -import fr.ifremer.wao.entity.ReferentialMetaTopiaDao; -import fr.ifremer.wao.entity.SampleRow; -import fr.ifremer.wao.entity.SampleRowTopiaDao; -import fr.ifremer.wao.entity.ShipOwner; -import fr.ifremer.wao.entity.ShipOwnerTopiaDao; -import fr.ifremer.wao.entity.TargetSpeciesDCF; -import fr.ifremer.wao.entity.TargetSpeciesDCFTopiaDao; -import fr.ifremer.wao.entity.TerrestrialDivision; -import fr.ifremer.wao.entity.TerrestrialDivisionImpl; -import fr.ifremer.wao.entity.TerrestrialDivisionTopiaDao; -import fr.ifremer.wao.entity.TerrestrialLocation; -import fr.ifremer.wao.entity.TerrestrialLocationImpl; -import fr.ifremer.wao.entity.TerrestrialLocationTopiaDao; -import fr.ifremer.wao.services.service.csv.BoatGroupImportModel; -import fr.ifremer.wao.services.service.csv.BoatImportExportModel; -import fr.ifremer.wao.services.service.csv.ContactStateMotivesImportModel; -import fr.ifremer.wao.services.service.csv.FishingZoneImportModel; -import fr.ifremer.wao.services.service.csv.RawObsDebCode; -import fr.ifremer.wao.services.service.csv.RawObsDebCodesImportModel; -import fr.ifremer.wao.services.service.csv.TerrestrialDivisionImportModel; -import fr.ifremer.wao.services.service.csv.TerrestrialLocationImportModel; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.csv.Import; -import org.nuiton.csv.ImportModel; -import org.nuiton.csv.ImportRuntimeException; -import org.nuiton.i18n.I18n; -import org.nuiton.topia.persistence.TopiaDao; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; - -import java.io.InputStream; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; - -/** - * Service permettant la gestion des différents référentiels. - */ -public class ReferentialService extends WaoServiceSupport { - - private static final Log log = LogFactory.getLog(ReferentialService.class); - - /** Splitter qui permet de détecter toutes les immatriculations dans une chaîne (que le séparateur soit ' ', ',' ou autre). */ - protected static final Splitter BOAT_IMMATRICULATIONS_SPLITTER = Splitter.on(Pattern.compile("[^0-9]+")); - - /** Pour chaque programme, les référentiels utilisés par ce programme. */ - protected static final Map<ObsProgram, List<String>> PER_PROGRAM_REFERENTIAL; - - static { - Map<ObsProgram, List<String>> perProgramReferential = new HashMap<>(); - - perProgramReferential.put(ObsProgram.OBSMER, Arrays.asList( - FishingZone.class.getName(), - ContactStateMotif.class.getName(), - TerrestrialLocation.class.getName(), - Boat.class.getName())); - - perProgramReferential.put(ObsProgram.OBSVENTE, Arrays.asList( - FishingZone.class.getName(), - TerrestrialLocation.class.getName(), - Boat.class.getName())); - - perProgramReferential.put(ObsProgram.OBSDEB, Arrays.asList( - FishingZone.class.getName(), - TerrestrialLocation.class.getName(), - TerrestrialDivision.class.getName(), - ObsDebCode.class.getName(), - Boat.class.getName(), - BoatGroup.class.getName())); - - PER_PROGRAM_REFERENTIAL = Collections.unmodifiableMap(perProgramReferential); - } - - - /** - * Permet de maintenir à jour les informations sur les référentiels. À - * chaque import de référentiel par Wao, il faut appeler cette méthode en - * indiquant quel référentiel a été mis à jour. - * - * Cela aura pour effet de sauvegarder la date de dernière mise à jour du - * référentiel lorsqu'il faudra l'indiquer aux administrateurs plus tard. - * - * @param entityClassFqn le FQN de la classe-entité du référentiel modifié. - * Il doit être parmi les classe listées dans #PER_PROGRAM_REFERENTIAL - */ - protected void updateReferentialMeta(String entityClassFqn) { - - Class<?> entityClass; - try { - entityClass = getClass().getClassLoader().loadClass(entityClassFqn); - } catch (ClassNotFoundException e) { - throw new IllegalArgumentException(entityClassFqn); - } - - if ( ! TopiaEntity.class.isAssignableFrom(entityClass)) { - throw new IllegalArgumentException("il faut passer le FQN d'une classe d'entité"); - } - - ReferentialMetaTopiaDao dao = getPersistenceContext().getReferentialMetaDao(); - ReferentialMeta referentialMeta = dao.findByEntityClassFqn(entityClassFqn); - - if (referentialMeta == null) { - referentialMeta = dao.create( - ReferentialMeta.PROPERTY_ENTITY_CLASS_FQN, entityClassFqn); - } - - referentialMeta.setLastUpdate(getNow()); - - dao.update(referentialMeta); - - } - - /** - * Import des zones de pêche. - */ - public void importFishingZones(InputStream input) throws ImportErrorException { - - FishingZoneImportModel model = new FishingZoneImportModel(); - Import<FishingZone> fishingZoneImport = Import.newImport(model, input); - - FishingZoneTopiaDao dao = getPersistenceContext().getFishingZoneDao(); - - try { - for (FishingZone fishingZone : fishingZoneImport) { - - FishingZone existingFishingZone = - dao.forDistrictCodeEquals(fishingZone.getDistrictCode()).findUniqueOrNull(); - - if (existingFishingZone == null) { - dao.create(fishingZone); - } else { - existingFishingZone.setFacadeName(fishingZone.getFacadeName()); - existingFishingZone.setSectorName(fishingZone.getSectorName()); - existingFishingZone.setLatitude(fishingZone.getLatitude()); - existingFishingZone.setLongitude(fishingZone.getLongitude()); - dao.update(existingFishingZone); - } - - } - } catch (ImportRuntimeException e) { - throw new ImportErrorException(e); - } - - updateReferentialMeta(FishingZone.class.getName()); - - commit(); - - } - - /** - * Import des lieux terrestres (ports et criées). - */ - public void importTerrestrialLocations(InputStream input) throws ImportErrorException { - - TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); - - // first, we will read the CSV file, line by line - // at, each line, we will look if the location is already in database - // if yes, some attribute may have change, so we use a binder to copy all field - // if no, add the new location in database - - ImportModel<TerrestrialLocation> model = new TerrestrialLocationImportModel(); - Import<TerrestrialLocation> terrestrialLocationImport = Import.newImport(model, input); - - // we will need a binder, to copy location for an update - Binder<TerrestrialLocation, TerrestrialLocation> locationBinder = - BinderFactory.newBinder(TerrestrialLocation.class); - // some counts for logging purpose - int locationAdded = 0, locationUpdated = 0; - - // for each line of the CSV - try { - Iterator<TerrestrialLocation> locationIterator = terrestrialLocationImport.iterator(); - while (locationIterator.hasNext()) { - // location is a line of the CSV - TerrestrialLocation location = locationIterator.next(); - - // look if already exists and update existing or add new - TerrestrialLocation existingLocation = dao.forProperties( - TerrestrialLocation.PROPERTY_CODE, location.getCode(), - TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, location.getLocationTypeOrdinal()).findUniqueOrNull(); - if (existingLocation == null) { - dao.create(location); - locationAdded += 1; - } else { - locationBinder.copyExcluding(location, existingLocation,TopiaEntity.PROPERTY_TOPIA_ID, - TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); - dao.update(existingLocation); - locationUpdated += 1; - } - } - } catch (ImportRuntimeException e) { - throw new ImportErrorException(e); - } - - // now, all the CSV file has been read and dumped into database, - // Now, we need to update database by adding any missing district - // Each location has a district (identified by a district code) - // We must find all the distinct district ids and check that - // we have an entity representing it. In database a disctrict can - // be distinguished from a location by having it's - // locationTypeOrdinal null. - List<String> districtCodes = dao.findAllDistinctDistrictCodesUsedInLocations(); - - // a binder, needed for update - Binder<TerrestrialLocation, TerrestrialLocation> districtBinder = - BinderFactory.newBinder(TerrestrialLocation.class); - // counts for logging - int districtAdded = 0, districtUpdated = 0; - int regionAdded = 0, regionUpdated = 0; - - for (String districtCode : districtCodes) { // for each district code found - - // let's find a location which is in this particular district - TerrestrialLocation location = dao.forDistrictCodeEquals(districtCode).findAny(); - - // create the district by copying region, country etc. from location - TerrestrialLocation district = new TerrestrialLocationImpl(); - districtBinder.copyExcluding(location, district, TerrestrialLocation.PROPERTY_NAME, - TerrestrialLocation.PROPERTY_CODE, TerrestrialLocation.PROPERTY_PORT_CODE, - TerrestrialLocation.PROPERTY_PORT_NAME, TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, - TopiaEntity.PROPERTY_TOPIA_ID, TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, - TerrestrialLocation.PROPERTY_TOPIA_VERSION); - district.setLocationType(LocationType.DISTRICT); - - // A particular case, some location (not in France) has no - // district (district code null), so we must add a district - // for them - if (StringUtils.isEmpty(district.getDistrictCode())) { - // distinct will select a random place with no district code - // it can be in England, Sweden or whatever. It's bad for us - // because we don't want some data not to be filtered when looking - // for England while we want to filter on all country except France - district.setCountryCode(null); - district.setCountryName("Hors France"); - district.setSeaboardCode(null); - district.setSeaboardName(null); - district.setCoastFAOCode(null); - district.setCoastFAOName(null); - district.setDistrictCode(null); - } - - // now, we have the 'district' object we want to have in the - // database. Now let's add it if not already in or update - // it already in - TerrestrialLocation existingDistrict = - dao.forProperties( - TerrestrialLocation.PROPERTY_DISTRICT_CODE, district.getDistrictCode(), - TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, LocationType.DISTRICT.ordinal()).findUniqueOrNull(); - if (existingDistrict == null) { - dao.create(district); - districtAdded += 1; - } else { - locationBinder.copyExcluding(district, existingDistrict, TopiaEntity.PROPERTY_TOPIA_ID, - TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); - dao.update(existingDistrict); - districtUpdated += 1; - } - - // creating a region object for this district - TerrestrialLocation region = dao.newInstance(); - locationBinder.copyExcluding(district, region, TopiaEntity.PROPERTY_TOPIA_ID, - TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION, - TerrestrialLocation.PROPERTY_DISTRICT_CODE, TerrestrialLocation.PROPERTY_DISTRICT_NAME, - TerrestrialLocation.PROPERTY_DEPARTMENT_CODE, TerrestrialLocation.PROPERTY_DEPARTMENT_NAME, - TerrestrialLocation.PROPERTY_SUB_REGION_IFREMER_CODE, TerrestrialLocation.PROPERTY_SUB_REGION_IFREMER_NAME); - region.setLocationType(LocationType.REGION); - - // prevent to deal with case "Hors France" - if (region.getRegionIfremerCode() != null) { - - // try to find it if it's already in DB - TerrestrialLocation existingRegion = dao.forProperties( - TerrestrialLocation.PROPERTY_REGION_IFREMER_CODE, region.getRegionIfremerCode(), - TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, LocationType.REGION.ordinal()).findUniqueOrNull(); - - // create or update - if (existingRegion == null) { - dao.create(region); - regionAdded += 1; - } else { - locationBinder.copyExcluding(region, existingRegion, TopiaEntity.PROPERTY_TOPIA_ID, - TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); - dao.update(existingRegion); - regionUpdated += 1; - } - } - } - - if (log.isInfoEnabled()) { - log.info(locationAdded + " terrestrial locations added, " + locationUpdated + " updated"); - log.info(districtAdded + " terrestrial district added, " + districtUpdated + " updated"); - log.info(regionAdded + " terrestrial region added, " + regionUpdated + " updated"); - } - - updateReferentialMeta(TerrestrialLocation.class.getName()); - - commit(); - - } - - /** Find ports and auctions in a given district */ - public List<TerrestrialLocation> getAllPortsAndAuctions(TerrestrialLocation district) { - - Preconditions.checkArgument(district.isDistrict(), "terrestrial location " + district + " is not district"); - - TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); - - TopiaQueryBuilderAddCriteriaOrRunQueryStep<TerrestrialLocation> query = dao.newQueryBuilder(); - - query.addIn(TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, ImmutableSet.of(LocationType.PORT.ordinal(), LocationType.AUCTION.ordinal())); - - query.addEquals(TerrestrialLocation.PROPERTY_DISTRICT_CODE, district.getDistrictCode()); - - List<TerrestrialLocation> result = query.findAll(); - - return result; - - } - - public List<TerrestrialLocation> executeGetAllRegionIfremers() { - - TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); - - List<TerrestrialLocation> allRegionIfremers = dao.forLocationTypeOrdinalEquals(LocationType.REGION.ordinal()).findAll(); - - return allRegionIfremers; - - } - - public TerrestrialLocation getTerrestrialDistrict(String districtCode) { - - Preconditions.checkArgument(StringUtils.isNotBlank(districtCode)); - - TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); - - TerrestrialLocation terrestrialDistrict = dao.forProperties( - TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, LocationType.DISTRICT.ordinal(), - TerrestrialLocation.PROPERTY_DISTRICT_CODE, districtCode).findUnique(); - - return terrestrialDistrict; - - } - - /** - * @param contactState if null, return motifs for all contact states - */ - public List<ContactStateMotif> getAllContactStateMotifs(ContactState contactState) throws Exception { - - ContactStateMotifTopiaDao dao = getPersistenceContext().getContactStateMotifDao(); - - List<ContactStateMotif> result; - if (contactState == null) { - result = dao.findAll(); - } else { - ContactState substituteState = ContactState.getSubstituteForMotif(contactState); - result = dao.forContactStateOrdinalEquals(substituteState.ordinal()).findAll(); - } - - if (log.isDebugEnabled()) { - log.debug(result.size() + " motifs found for state " + contactState); - } - - return result; - - } - - public void importContactStateMotives(InputStream input) throws ImportErrorException { - - ImportModel<ContactStateMotif> model = new ContactStateMotivesImportModel(); - Import<ContactStateMotif> motivesImport = Import.newImport(model, input); - - ContactStateMotifTopiaDao dao = getPersistenceContext().getContactStateMotifDao(); - - try { - for (ContactStateMotif motif : motivesImport) { - ContactStateMotif existingMotif = dao.forCodeEquals(motif.getCode()).findUniqueOrNull(); - if (existingMotif == null) { - dao.create(motif); - } else { - existingMotif.setName(motif.getName()); - existingMotif.setContactState(motif.getContactState()); - existingMotif.setColor(motif.getColor()); - dao.update(existingMotif); - } - } - } catch (ImportRuntimeException e) { - throw new ImportErrorException(e); - } - - updateReferentialMeta(ContactStateMotif.class.getName()); - - commit(); - - } - - public void importTerrestrialDivisions(InputStream input) throws ImportErrorException { - - TerrestrialLocationTopiaDao terrestrialLocationDao = getPersistenceContext().getTerrestrialLocationDao(); - - // let's find all ports in terrestrial location reference - List<TerrestrialLocation> ports = terrestrialLocationDao.forLocationTypeEquals(LocationType.PORT).findAll(); - List<TerrestrialLocation> regions = terrestrialLocationDao.forLocationTypeEquals(LocationType.REGION).findAll(); - - if (log.isDebugEnabled()) { - log.debug(ports.size() + " ports, " + regions.size() + " regions"); - } - - // the import itself - ImportModel<TerrestrialDivision> importModel = new TerrestrialDivisionImportModel(ports, regions); - Import<TerrestrialDivision> terrestrialDivisionImport = Import.newImport(importModel, input); - - TerrestrialDivisionTopiaDao dao = getPersistenceContext().getTerrestrialDivisionDao(); - - Binder<TerrestrialDivision, TerrestrialDivision> terrestrialDivisionBinder = BinderFactory.newBinder(TerrestrialDivision.class); - - try { - for (TerrestrialDivision terrestrialDivision : terrestrialDivisionImport) { - - TerrestrialDivision existingTerrestrialDivision = dao.forCodeEquals(terrestrialDivision.getCode()).findUniqueOrNull(); - if (existingTerrestrialDivision == null) { - // add as new - dao.create(terrestrialDivision); - } else { - // update the old one - terrestrialDivisionBinder.copyExcluding(terrestrialDivision, existingTerrestrialDivision, - TopiaEntity.PROPERTY_TOPIA_ID, TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); - dao.update(existingTerrestrialDivision); - } - - TerrestrialDivision observationUnit = new TerrestrialDivisionImpl(); - terrestrialDivisionBinder.copyExcluding( - terrestrialDivision, observationUnit, - TopiaEntity.PROPERTY_TOPIA_ID, TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, - TopiaEntity.PROPERTY_TOPIA_VERSION, - TerrestrialDivision.PROPERTY_CODE, - TerrestrialDivision.PROPERTY_PORT); - - TerrestrialDivision existingObservationUnit = dao.forProperties( - TerrestrialDivision.PROPERTY_CODE, observationUnit.getCode(), - TerrestrialDivision.PROPERTY_PORT, observationUnit.getPort(), - TerrestrialDivision.PROPERTY_REGION_IFREMER, observationUnit.getRegionIfremer(), - TerrestrialDivision.PROPERTY_OBSERVATION_UNIT_CODE, observationUnit.getObservationUnitCode()).findUniqueOrNull(); - - if (existingObservationUnit == null) { - dao.create(observationUnit); - } else { - terrestrialDivisionBinder.copyExcluding( - observationUnit, existingObservationUnit, TopiaEntity.PROPERTY_TOPIA_ID, - TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); - dao.update(existingObservationUnit); - } - - } - } catch (ImportRuntimeException e) { - throw new ImportErrorException(e); - } - - if (log.isDebugEnabled()) { - log.debug(dao.count() + " terrestrial divisions in database"); - } - - updateReferentialMeta(TerrestrialDivision.class.getName()); - - commit(); - - } - - public List<TerrestrialDivision> getAllObservationUnits() { - - TerrestrialDivisionTopiaDao dao = getPersistenceContext().getTerrestrialDivisionDao(); - - // having code null make TerrestrialDivision.isObservationUnit - List<TerrestrialDivision> observationUnits = dao.forCodeEquals(null).findAll(); - - if (log.isDebugEnabled()) { - log.debug("will return " + observationUnits.size() + " observation units"); - } - - return observationUnits; - - } - - /** - * @param region may be null, and all ports will be returned - * @returns all the ports that are in a region - */ - public List<TerrestrialLocation> getAllPorts(TerrestrialLocation region) { - - Preconditions.checkArgument(region == null || region.isRegion(), region + " is not a region"); - - TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); - - Map<String, Object> properties = new HashMap<>(); - - // we are looking for ports only - properties.put(TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, LocationType.PORT.ordinal()); - - // ports in a specific region - properties.put(TerrestrialLocation.PROPERTY_REGION_IFREMER_CODE, region.getRegionIfremerCode()); - - // run query - List<TerrestrialLocation> ports = dao.forProperties(properties).findAll(); - - return ports; - - } - - public void importObsDebCodes(InputStream input) throws ImportErrorException { - - TerrestrialLocationTopiaDao terrestrialLocationDao = - getPersistenceContext().getTerrestrialLocationDao(); - - List<TerrestrialLocation> allRegions = - terrestrialLocationDao.forLocationTypeEquals(LocationType.REGION).findAll(); - - ObsDebCodeTopiaDao dao = getPersistenceContext().getObsDebCodeDao(); - ObsDebCodeDetailsTopiaDao obsDebCodeDetailsDAO = getPersistenceContext().getObsDebCodeDetailsDao(); - - ImportModel<RawObsDebCode> model = new RawObsDebCodesImportModel(allRegions); - Import<RawObsDebCode> rawObsDebCodeImport = Import.newImport(model, input); - - // start reading the CSV file line by line - try { - for (RawObsDebCode rawObsDebCode : rawObsDebCodeImport) { - - // try to find an already existing entity to update - // or create one - ObsDebCode existingCode = dao.forCodeEquals(rawObsDebCode.getCode()).findUniqueOrNull(); - if (existingCode == null) { - existingCode = new ObsDebCodeImpl(); - existingCode.setCode(rawObsDebCode.getCode()); - existingCode = dao.create(existingCode); - } - ObsDebCodeDetails existingDetails = null; - if (existingCode.getObsDebCodeDetails() != null) { - for (ObsDebCodeDetails obsDebCodeDetails : existingCode.getObsDebCodeDetails()) { - if (rawObsDebCode.getRegion().getRegionIfremerCode().equals(obsDebCodeDetails.getRegion().getRegionIfremerCode())) { - existingDetails = obsDebCodeDetails; - } - } - } - - if (existingDetails == null) { - existingDetails = new ObsDebCodeDetailsImpl(); - existingDetails.setLabel(rawObsDebCode.getLabel()); - existingDetails.setRegion(rawObsDebCode.getRegion()); - existingCode.addObsDebCodeDetails(existingDetails); - obsDebCodeDetailsDAO.create(existingDetails); - } else { - existingDetails.setLabel(rawObsDebCode.getLabel()); - obsDebCodeDetailsDAO.update(existingDetails); - } - - dao.update(existingCode); - - } - } catch (ImportRuntimeException e) { - throw new ImportErrorException(e); - } - - updateReferentialMeta(ObsDebCode.class.getName()); - - commit(); - - } - - protected void initialDCF5CodesImport() { - - FishingGearDCFTopiaDao fishingGearDCFDao = getPersistenceContext().getFishingGearDCFDao(); - TargetSpeciesDCFTopiaDao targetSpeciesDCFDao = getPersistenceContext().getTargetSpeciesDCFDao(); - - final String[] gearCodesBase = {"DRB", "DRH", - "FPN", "FPO", "FSN", "FWR", "FYK", "GES", "GNC", - "GND", "GNF", "GNS", "GTN", "GTR", "HAR", "HMD", "HMP", - "LA", "LHM", "LHP", "LLD", "LLS", "LNB", "LNP", "LNS", - "LTL", "LX", "OTB", "OTM", "OTT", "PS", - "PTB", "PTM", "RG", "SB", "SDN", "SPR", "SSC", "SV", - "TBB", "TBN", "TBS", "TMS"}; - - final String[] speciesCodesBase = {"ALG", "ANA", "CAT", "CRU", - "DEF", "DWS", "LPF", "MOL", "SPF", "FIF"}; - - long nbCodes = fishingGearDCFDao.count() + targetSpeciesDCFDao.count(); - - if (nbCodes == 0) { - - if (log.isInfoEnabled()) { - log.info("no DCF in database, mass import"); - } - - for (String code : gearCodesBase) { - fishingGearDCFDao.create(FishingGearDCF.PROPERTY_CODE, code); - } - - for (String code : speciesCodesBase) { - targetSpeciesDCFDao.create(TargetSpeciesDCF.PROPERTY_CODE, code); - } - - } else { - - if (log.isInfoEnabled()) { - log.info("some DCF in database, import only missing ones"); - } - - for (String code : gearCodesBase) { - FishingGearDCF fishingGearDCF = fishingGearDCFDao.forCodeEquals(code).findUniqueOrNull(); - if (fishingGearDCF == null) { - log.info("add missing fishing gear DCF: '" + code + "'"); - fishingGearDCFDao.create(FishingGearDCF.PROPERTY_CODE, code); - } - } - - for (String code : speciesCodesBase) { - TargetSpeciesDCF targetSpeciesDCF = targetSpeciesDCFDao.forCodeEquals(code).findUniqueOrNull(); - if (targetSpeciesDCF == null) { - log.info("add missing target species DCF: '" + code + "'"); - targetSpeciesDCFDao.create(TargetSpeciesDCF.PROPERTY_CODE, code); - } - } - - // on supprime ce qu'il y a en trop - for (FishingGearDCF fishingGearDCF : fishingGearDCFDao.findAll()) { - if ( ! ArrayUtils.contains(gearCodesBase, fishingGearDCF.getCode())) { - List<DCF5Code> usages = fishingGearDCFDao.findUsages(DCF5Code.class, fishingGearDCF); - if (usages.isEmpty()) { - log.info("will delete code " + fishingGearDCF); - fishingGearDCFDao.delete(fishingGearDCF); - } else { - log.warn("will not delete " + fishingGearDCF); - SampleRowTopiaDao sampleRowDao = getPersistenceContext().getSampleRowDao(); - for (DCF5Code usage : usages) { - List<SampleRow> sampleRows = sampleRowDao.fordCF5CodeContains(usage).findAll(); - for (SampleRow sampleRow : sampleRows) { - log.warn("sampleRow " + sampleRow.getCode() + " use " + usage); - } - } - } - } - } - - for (TargetSpeciesDCF targetSpeciesDCF : targetSpeciesDCFDao.findAll()) { - if ( ! ArrayUtils.contains(speciesCodesBase, targetSpeciesDCF.getCode())) { - List<DCF5Code> usages = targetSpeciesDCFDao.findUsages(DCF5Code.class, targetSpeciesDCF); - if (usages.isEmpty()) { - log.info("will delete code " + targetSpeciesDCF); - targetSpeciesDCFDao.delete(targetSpeciesDCF); - } else { - log.warn("will not delete " + targetSpeciesDCF); - } - } - } - } - - if (log.isInfoEnabled()) { - nbCodes = fishingGearDCFDao.count() + targetSpeciesDCFDao.count(); - log.info(nbCodes + " dcf codes in database"); - } - - commit(); - - } - - public void initialImport() { - - initialDCF5CodesImport(); - - InputStream input = null; - - TerrestrialLocationTopiaDao terrestrialLocationDao = getPersistenceContext().getTerrestrialLocationDao(); - ObsDebCodeTopiaDao obsDebCodeDao = getPersistenceContext().getObsDebCodeDao(); - ContactStateMotifTopiaDao contactStateMotifDao = getPersistenceContext().getContactStateMotifDao(); - - if (terrestrialLocationDao.count() == 0) { - try { - input = getClass().getResourceAsStream("/terrestrialLocations.csv"); - importTerrestrialLocations(input); - } catch (ImportErrorException e) { - throw new WaoTechnicalException(e); - } finally { - IOUtils.closeQuietly(input); - } - } - - if (obsDebCodeDao.count() == 0) { - try { - input = getClass().getResourceAsStream("/obsDebCodes.csv"); - importObsDebCodes(input); - } catch (ImportErrorException e) { - throw new WaoTechnicalException(e); - } finally { - IOUtils.closeQuietly(input); - } - } - - if (contactStateMotifDao.count() == 0) { - try { - input = getClass().getResourceAsStream("/motifs.csv"); - importContactStateMotives(input); - } catch (ImportErrorException e) { - throw new WaoTechnicalException(e); - } finally { - IOUtils.closeQuietly(input); - } - } - - } - - /** - * Pour un programme donné, permet d'obtenir des informations sur tous les - * référentiels utilisés par ce programme. Notamment la date de dernière - * mise à jour ainsi que le nombre d'entités en base. - */ - public List<ReferentialState> getReferentialStates(ObsProgram obsProgram) { - - List<ReferentialState> referentialStates = new LinkedList<>(); - - for (String entityClassFqn : PER_PROGRAM_REFERENTIAL.get(obsProgram)) { - - Class<?> entityClass; - try { - entityClass = getClass().getClassLoader().loadClass(entityClassFqn); - } catch (ClassNotFoundException e) { - throw new WaoTechnicalException("cannot load class " + entityClassFqn, e); - } - - if ( ! TopiaEntity.class.isAssignableFrom(entityClass)) { - throw new IllegalArgumentException("il faut passer le FQN d'une classe d'entité"); - } - - long count; - - if (TerrestrialDivision.class.equals(entityClass)) { - // Pour les stratification géographique, on compte le nombre de strate - // (on ne compte pas les unités d'observations, etc qui prennent - // des lignes en base) - TerrestrialDivisionTopiaDao dao = getPersistenceContext().getTerrestrialDivisionDao(); - count = dao.countDistinctTerrestrialDivision(); - } else { - TopiaDao<? extends TopiaEntity> dao = getPersistenceContext().getDao((Class<? extends TopiaEntity>) entityClass); - count = dao.count(); - } - - ReferentialMetaTopiaDao referentialMetaDao = getPersistenceContext().getReferentialMetaDao(); - ReferentialMeta referentialMeta = referentialMetaDao.forEntityClassFqnEquals(entityClassFqn).findUniqueOrNull(); - if (referentialMeta == null) { - referentialMeta = new ReferentialMetaImpl(); - } - - ReferentialState referentialState = new ReferentialState(); - referentialState.setReferentialName(I18n.t(entityClassFqn)); - referentialState.setLastUpdate(referentialMeta.getLastUpdate()); - referentialState.setSize(count); - - referentialStates.add(referentialState); - } - - return referentialStates; - } - - public List<FishingGearDCF> getAllFishingGearDCF() { - FishingGearDCFTopiaDao dao = getPersistenceContext().getFishingGearDCFDao(); - List<FishingGearDCF> all = dao.findAll(); - return all; - } - - public List<TargetSpeciesDCF> getAllTargetSpeciesDCF() { - TargetSpeciesDCFTopiaDao dao = getPersistenceContext().getTargetSpeciesDCFDao(); - List<TargetSpeciesDCF> all = dao.findAll(); - return all; - } - - /** - * Import boats from CSV file, given data will be merged with data already - * in the DB. All shipowner or district code mentioned will be added to - * the database on the fly - */ - public void importBoats(InputStream input) throws ImportErrorException { - - // Before importing, we need to retrieve all ports that may be mentioned - // in the CSV file - TerrestrialLocationTopiaDao terrestrialLocationDao = - getPersistenceContext().getTerrestrialLocationDao(); - List<TerrestrialLocation> ports = terrestrialLocationDao.forLocationTypeEquals(LocationType.PORT).findAll(); - List<TerrestrialLocation> districts = terrestrialLocationDao.forLocationTypeEquals(LocationType.DISTRICT).findAll(); - - // Building the model, providing ports - BoatImportExportModel model = new BoatImportExportModel(ports, districts); - Import<Boat> boatImport = Import.newImport(model, input); - - // Getting some DAOs - BoatTopiaDao boatDao = getPersistenceContext().getBoatDao(); - ShipOwnerTopiaDao shipOwnerDao = getPersistenceContext().getShipOwnerDao(); - FleetTopiaDao fleetDao = getPersistenceContext().getFleetDao(); - - // load data that will be linked to the boat - Map<String, ShipOwner> shipOwners = new HashMap<>(); - for (ShipOwner shipOwner : shipOwnerDao.findAll()) { - shipOwners.put(shipOwner.getCode(), shipOwner); - } - Map<String, Fleet> fleets = new HashMap<>(); - for (Fleet fleet : fleetDao.findAll()) { - fleets.put(fleet.getCode(), fleet); - } - - // now iterating over the lines of the CSV - try { - for (Boat boat : boatImport) { - - // first each boat read, merge with data already in database or add - // all new boats encountered. New district codes or shipowners may be - // added on the fly too. - - // first, find and reuse existing ship owner - String shipOwnerCode = boat.getShipOwner().getCode(); - ShipOwner shipOwner = shipOwners.get(shipOwnerCode); - if (shipOwner == null) { - shipOwner = shipOwnerDao.create(boat.getShipOwner()); - shipOwners.put(shipOwnerCode, shipOwner); - } - boat.setShipOwner(shipOwner); - - // secondly, find and reuse fleet - String fleetCode = boat.getFleet().getCode(); - if (fleetCode == null) { - boat.setFleet(null); - } else { - Fleet fleet = fleets.get(fleetCode); - if (fleet == null) { - fleet = fleetDao.create(boat.getFleet()); - fleets.put(fleetCode, fleet); - } - boat.setFleet(fleet); - } - - // now boat object is ready - Boat existingBoat = boatDao.forImmatriculationEquals(boat.getImmatriculation()).findUniqueOrNull(); - if (existingBoat == null) { - boatDao.create(boat); - } else { - // copy new values in found entity and save changes - existingBoat.setName(boat.getName()); - existingBoat.setBoatLength(boat.getBoatLength()); - existingBoat.setBuildYear(boat.getBuildYear()); - existingBoat.setActive(boat.isActive()); - existingBoat.setShipOwner(boat.getShipOwner()); - existingBoat.setDistrict(boat.getDistrict()); - existingBoat.setPortOfRegistry(boat.getPortOfRegistry()); - existingBoat.setFleet(boat.getFleet()); - boatDao.update(existingBoat); - } - - } - } catch (ImportRuntimeException e) { - throw new ImportErrorException(e); - } - - updateReferentialMeta(Boat.class.getName()); - - commit(); - - } - - public void importBoatGroups(InputStream input) throws ImportErrorException { - // Building the model, providing ports - BoatGroupImportModel model = new BoatGroupImportModel(); - Import<Boat> boatImport = Import.newImport(model, input); - - // Getting some DAOs - BoatTopiaDao boatDao = getPersistenceContext().getBoatDao(); - BoatGroupTopiaDao boatGroupDao = getPersistenceContext().getBoatGroupDao(); - - Map<String, BoatGroup> boatGroups = new HashMap<>(); - for (BoatGroup boatGroup : boatGroupDao.findAll()) { - boatGroups.put(boatGroup.getCode(), boatGroup); - } - - // now iterating over the lines of the CSV - try { - for (Boat boat : boatImport) { - - // fourth, the group - String boatGroupCode = boat.getBoatGroup().getCode(); - if (boatGroupCode == null) { - boat.setBoatGroup(null); - } else { - BoatGroup boatGroup = boatGroups.get(boatGroupCode); - if (boatGroup == null) { - boatGroup = boatGroupDao.create(boat.getBoatGroup()); - boatGroups.put(boatGroupCode, boatGroup); - } - boat.setBoatGroup(boatGroup); - } - - // now boat object is ready - Boat existingBoat = boatDao.forImmatriculationEquals(boat.getImmatriculation()).findUniqueOrNull(); - if (existingBoat == null) { - throw new ImportRuntimeException(I18n.t("wao.import.contact.failure.wrongBoat", String.valueOf(boat.getImmatriculation()))); - } else { - // copy new values in found entity and save changes - existingBoat.setBoatGroup(boat.getBoatGroup()); - boatDao.update(existingBoat); - } - - } - } catch (ImportRuntimeException e) { - throw new ImportErrorException(e); - } - - updateReferentialMeta(Boat.class.getName()); - - commit(); - - } - - public List<Boat> getBoatsFromImmatriculations(String joinedImmatriculations) { - - Iterable<String> splitImmatriculations = BOAT_IMMATRICULATIONS_SPLITTER.split(joinedImmatriculations); - - Set<Integer> immatriculations = new HashSet<>(); - for (String splitImmatriculation : splitImmatriculations) { - if (StringUtils.isNotBlank(splitImmatriculation)) { - immatriculations.add(Integer.parseInt(splitImmatriculation)); - } - } - - List<Boat> boats = getBoatDao().forImmatriculationIn(immatriculations).findAll(); - - return boats; - - } - -} Deleted: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialState.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialState.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialState.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,41 +0,0 @@ -package fr.ifremer.wao.services.service; - -import java.util.Date; - -/** - * Répresente l'état d'une référential à un instant donné. (Date de dernière - * mise à jour par exemple). - */ -public class ReferentialState { - - protected String referentialName; - - protected long size; - - protected Date lastUpdate; - - public String getReferentialName() { - return referentialName; - } - - public void setReferentialName(String referentialName) { - this.referentialName = referentialName; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public Date getLastUpdate() { - return lastUpdate; - } - - public void setLastUpdate(Date lastUpdate) { - this.lastUpdate = lastUpdate; - } - -} Deleted: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,224 +0,0 @@ -package fr.ifremer.wao.services.service; - -import com.google.common.collect.ImmutableMap; -import fr.ifremer.wao.entity.Company; -import fr.ifremer.wao.entity.ObsProgram; -import fr.ifremer.wao.entity.UserProfile; -import fr.ifremer.wao.entity.UserProfileImpl; -import fr.ifremer.wao.entity.UserRole; -import fr.ifremer.wao.entity.WaoUser; -import org.apache.commons.lang3.StringUtils; - -public class UpdateWaoUserCommand { - - protected ObsProgram obsProgram; - - protected WaoUser waoUser; - - protected String clearPassword; - - protected String clearPasswordConfirmation; - - protected UpdateWaoUserCommandPasswordStrategy passwordStrategy; - - protected ImmutableMap<String, Company> allCompanies; - - /** - * Si l'utilisateur est professionnel, on doit savoir à quelle - * liste de navires il est restreint, Cette information est saisie - * en mettant à la suite les immatriculations des navires. - */ - protected String canReadBoats; - - public String getCanReadBoats() { - return canReadBoats; - } - - public void setCanReadBoats(String canReadBoats) { - this.canReadBoats = canReadBoats; - } - - public String getCompanyId() { - String companyId = null; - if (waoUser.getCompany() != null) { - companyId = waoUser.getCompany().getTopiaId(); - } - return companyId; - } - - public void setCompanyId(String companyId) { - if (StringUtils.isBlank(companyId)) { - waoUser.setCompany(null); - } else { - Company company = allCompanies.get(companyId); - waoUser.setCompany(company); - } - } - - public ImmutableMap<String, Company> getAllCompanies() { - return allCompanies; - } - - public void setAllCompanies(ImmutableMap<String, Company> allCompanies) { - this.allCompanies = allCompanies; - } - - protected UserProfile getUserProfile(UserRole userRole, boolean readOnly) { - if (waoUser.isUserProfileNotEmpty()) { - for (UserProfile userProfile : waoUser.getUserProfile(obsProgram)) { - if (userRole.equals(userProfile.getUserRole()) && readOnly == userProfile.isReadOnly()) { - return userProfile; - } - } - } - return null; - } - - protected void updateUserProfile(UserRole userRole, boolean readOnly, boolean userMustHaveProfile) { - UserProfile userProfile = getUserProfile(userRole, readOnly); - if (userMustHaveProfile) { - if (userProfile == null) { - // on l'ajoute - userProfile = new UserProfileImpl(); - userProfile.setUserRole(userRole); - userProfile.setCanWrite(!readOnly); - userProfile.setObsProgram(obsProgram); - waoUser.addUserProfile(userProfile); - } else { - // il l'a déjà - } - } else { - if (userProfile == null) { - // il ne l'a pas - } else { - // on le retire - waoUser.removeUserProfile(userProfile); - } - } - } - - protected boolean hasProfile(UserRole userRole, boolean readOnly) { - boolean hasProfile = getUserProfile(userRole, readOnly) != null; - return hasProfile; - } - - public boolean isAdmin() { - return hasProfile(UserRole.ADMIN, false); - } - - public void setAdmin(boolean admin) { - updateUserProfile(UserRole.ADMIN, false, admin); - } - - public boolean isCoordinator() { - return hasProfile(UserRole.COORDINATOR, false); - } - - public void setCoordinator(boolean coordinator) { - updateUserProfile(UserRole.COORDINATOR, false, coordinator); - } - - public boolean isObserver() { - return hasProfile(UserRole.OBSERVER, false); - } - - public void setObserver(boolean observer) { - updateUserProfile(UserRole.OBSERVER, false, observer); - } - - public boolean isGuest() { - return hasProfile(UserRole.GUEST, false); - } - - public void setGuest(boolean guest) { - updateUserProfile(UserRole.GUEST, false, guest); - } - - public boolean isProfessional() { - return hasProfile(UserRole.PROFESSIONAL, false); - } - - public void setProfessional(boolean professional) { - updateUserProfile(UserRole.PROFESSIONAL, false, professional); - } - - public boolean isAdminReadOnly() { - return hasProfile(UserRole.ADMIN, true); - } - - public void setAdminReadOnly(boolean adminReadOnly) { - updateUserProfile(UserRole.ADMIN, true, adminReadOnly); - } - - public boolean isCoordinatorReadOnly() { - return hasProfile(UserRole.COORDINATOR, true); - } - - public void setCoordinatorReadOnly(boolean coordinatorReadOnly) { - updateUserProfile(UserRole.COORDINATOR, true, coordinatorReadOnly); - } - - public boolean isObserverReadOnly() { - return hasProfile(UserRole.OBSERVER, true); - } - - public void setObserverReadOnly(boolean observerReadOnly) { - updateUserProfile(UserRole.OBSERVER, true, observerReadOnly); - } - - public boolean isGuestReadOnly() { - return hasProfile(UserRole.GUEST, true); - } - - public void setGuestReadOnly(boolean guestReadOnly) { - updateUserProfile(UserRole.GUEST, true, guestReadOnly); - } - - public boolean isProfessionalReadOnly() { - return hasProfile(UserRole.PROFESSIONAL, true); - } - - public void setProfessionalReadOnly(boolean professionalReadOnly) { - updateUserProfile(UserRole.ADMIN, true, professionalReadOnly); - } - - public UpdateWaoUserCommandPasswordStrategy getPasswordStrategy() { - return passwordStrategy; - } - - public void setPasswordStrategy(UpdateWaoUserCommandPasswordStrategy passwordStrategy) { - this.passwordStrategy = passwordStrategy; - } - - public String getClearPassword() { - return clearPassword; - } - - public void setClearPassword(String clearPassword) { - this.clearPassword = clearPassword; - } - - public String getClearPasswordConfirmation() { - return clearPasswordConfirmation; - } - - public void setClearPasswordConfirmation(String clearPasswordConfirmation) { - this.clearPasswordConfirmation = clearPasswordConfirmation; - } - - public WaoUser getWaoUser() { - return waoUser; - } - - public void setWaoUser(WaoUser waoUser) { - this.waoUser = waoUser; - } - - public ObsProgram getObsProgram() { - return obsProgram; - } - - public void setObsProgram(ObsProgram obsProgram) { - this.obsProgram = obsProgram; - } -} Deleted: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommandPasswordStrategy.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommandPasswordStrategy.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommandPasswordStrategy.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,30 +0,0 @@ -package fr.ifremer.wao.services.service; - -import org.nuiton.i18n.I18n; - -public enum UpdateWaoUserCommandPasswordStrategy { - - KEEP_SAME_PASSWORD(I18n.n("UpdateWaoUserCommandPasswordStrategy.KEEP_SAME_PASSWORD")), - - GENERATE_NEW_PASSWORD(I18n.n("UpdateWaoUserCommandPasswordStrategy.GENERATE_NEW_PASSWORD")), - - DEFINE_PASSWORD(I18n.n("UpdateWaoUserCommandPasswordStrategy.DEFINE_PASSWORD")); - - protected String i18nKey; - - UpdateWaoUserCommandPasswordStrategy(String i18nKey) { - this.i18nKey = i18nKey; - } - - public String getI18nKey() { - return i18nKey; - } - - public boolean isDefinePassword() { - return this == DEFINE_PASSWORD; - } - - public boolean isGeneratePassword() { - return this == GENERATE_NEW_PASSWORD; - } -} Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoServiceSupport.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoServiceSupport.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoServiceSupport.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -33,8 +33,12 @@ import fr.ifremer.wao.services.WaoService; import fr.ifremer.wao.services.WaoServiceContext; import fr.ifremer.wao.services.WaoWebApplicationContext; +import fr.ifremer.wao.services.service.administration.CompaniesService; +import fr.ifremer.wao.services.service.administration.ReferentialService; +import fr.ifremer.wao.services.service.mail.EmailService; import java.util.Date; +import java.util.Locale; public abstract class WaoServiceSupport implements WaoService { @@ -65,8 +69,8 @@ return serviceContext.newService(serviceClass); } - protected SamplingPlanService getSamplingPlanService() { - return newService(SamplingPlanService.class); + protected Locale getLocale() { + return serviceContext.getLocale(); } protected void commit() { @@ -81,6 +85,14 @@ return newService(CompaniesService.class); } + protected SamplingPlanService getSamplingPlanService() { + return newService(SamplingPlanService.class); + } + + protected EmailService getEmailService() { + return newService(EmailService.class); + } + protected BoatTopiaDao getBoatDao() { return getPersistenceContext().getBoatDao(); } Deleted: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,168 +0,0 @@ -package fr.ifremer.wao.services.service; - -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; -import fr.ifremer.wao.entity.Boat; -import fr.ifremer.wao.entity.Boats; -import fr.ifremer.wao.entity.Company; -import fr.ifremer.wao.entity.ObsProgram; -import fr.ifremer.wao.entity.UserRole; -import fr.ifremer.wao.entity.WaoUser; -import fr.ifremer.wao.entity.WaoUserImpl; -import fr.ifremer.wao.entity.WaoUserTopiaDao; -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; -import org.nuiton.topia.persistence.TopiaEntities; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; -import org.nuiton.util.StringUtil; - -import java.util.List; -import java.util.Map; - -public class WaoUsersService extends WaoServiceSupport { - - public List<WaoUser> getWaoUsers(Optional<String> optionalCompanyId) { - - WaoUserTopiaDao dao = getWaoUserDao(); - - TopiaQueryBuilderAddCriteriaOrRunQueryStep<WaoUser> query = dao.newQueryBuilder(); - - if (optionalCompanyId.isPresent()) { - query.addTopiaIdEquals(WaoUser.PROPERTY_COMPANY, optionalCompanyId.get()); - } - - query.setOrderByArguments(WaoUser.PROPERTY_ACTIVE + " desc", WaoUser.PROPERTY_LOGIN); - - List<WaoUser> waoUsers = query.findAll(); - - return waoUsers; - - } - - public WaoUser getWaoUser(String waoUserId) { - - WaoUserTopiaDao dao = getWaoUserDao(); - - WaoUser waouser = dao.findByTopiaId(waoUserId); - - return waouser; - - } - - public WaoUser newWaoUser() { - - WaoUserImpl newWaoUser = new WaoUserImpl(); - - newWaoUser.setActive(true); - - return newWaoUser; - - } - - public UpdateWaoUserCommand newUpdateWaoUserCommand(ObsProgram obsProgram, Optional<String> optionalUserId) { - - UpdateWaoUserCommand updateWaoUserCommand = new UpdateWaoUserCommand(); - - updateWaoUserCommand.setObsProgram(obsProgram); - - ImmutableMap<String, Company> allCompanies = Maps.uniqueIndex( - getCompaniesService().getCompanies(), - TopiaEntities.getTopiaIdFunction()); - - updateWaoUserCommand.setAllCompanies(allCompanies); - - if (optionalUserId.isPresent()) { - - WaoUser waoUser = getWaoUser(optionalUserId.get()); - - updateWaoUserCommand.setWaoUser(waoUser); - - updateWaoUserCommand.setPasswordStrategy(UpdateWaoUserCommandPasswordStrategy.KEEP_SAME_PASSWORD); - - if (waoUser.isCanReadBoatsNotEmpty()) { - - String canReadBoats = StringUtils.join( - Iterables.transform(waoUser.getCanReadBoats(), Boats.getImmatriculation()), - ' ' - ); - - updateWaoUserCommand.setCanReadBoats(canReadBoats); - - } - - } else { - - updateWaoUserCommand.setWaoUser(newWaoUser()); - - updateWaoUserCommand.setPasswordStrategy(UpdateWaoUserCommandPasswordStrategy.GENERATE_NEW_PASSWORD); - - } - - return updateWaoUserCommand; - - } - - public void save(UpdateWaoUserCommand updateWaoUserCommand) { - - ObsProgram obsProgram = updateWaoUserCommand.getObsProgram(); - WaoUser waoUser = updateWaoUserCommand.getWaoUser(); - - waoUser.clearCanReadBoats(); - if (waoUser.hasUserRole(UserRole.PROFESSIONAL, obsProgram)) { - List<Boat> boatsFromImmatriculations = getReferentialService().getBoatsFromImmatriculations(updateWaoUserCommand.getCanReadBoats()); - waoUser.setCanReadBoats(boatsFromImmatriculations); - } - - String newPassword; - switch (updateWaoUserCommand.getPasswordStrategy()) { - case GENERATE_NEW_PASSWORD: - newPassword = RandomStringUtils.random(8); - break; - case DEFINE_PASSWORD: - newPassword = updateWaoUserCommand.getClearPassword(); - break; - default: - newPassword = null; - } - - if (newPassword != null) { - String hashedNewPassword = StringUtil.encodeMD5(newPassword); - waoUser.setPassword(hashedNewPassword); - } - - if (updateWaoUserCommand.getPasswordStrategy().isGeneratePassword()) { - // TODO brendan 04/03/14 envoyer le mot de passe par mail - } - - WaoUserTopiaDao dao = getWaoUserDao(); - if (waoUser.isPersisted()) { - dao.update(waoUser); - } else { - dao.create(waoUser); - } - commit(); - - } - - public void deleteWaoUser(String waoUserId) throws IllegalDeletionException { - - WaoUserTopiaDao dao = getWaoUserDao(); - - WaoUser waoUser = dao.findByTopiaId(waoUserId); - - Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> allUsages = dao.findAllUsages(waoUser); - - if (allUsages.isEmpty()) { - dao.delete(waoUser); - } else { - throw new IllegalDeletionException(allUsages.keySet()); - } - - commit(); - - } - -} Copied: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/CompaniesService.java (from rev 1713, trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompaniesService.java) =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/CompaniesService.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/CompaniesService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,77 @@ +package fr.ifremer.wao.services.service.administration; + +import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.entity.CompanyImpl; +import fr.ifremer.wao.entity.CompanyTopiaDao; +import fr.ifremer.wao.services.service.IllegalDeletionException; +import fr.ifremer.wao.services.service.WaoServiceSupport; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.util.List; +import java.util.Map; + +public class CompaniesService extends WaoServiceSupport { + + public List<Company> getCompanies() { + + CompanyTopiaDao dao = getPersistenceContext().getCompanyDao(); + + List<Company> companies = dao.newQueryBuilder().setOrderByArguments(Company.PROPERTY_ACTIVE + " desc", Company.PROPERTY_NAME).findAll(); + + return companies; + + } + + public Company getCompany(String companyId) { + + CompanyTopiaDao dao = getPersistenceContext().getCompanyDao(); + + Company company = dao.findByTopiaId(companyId); + + return company; + + } + + public Company newCompany() { + + CompanyImpl newCompany = new CompanyImpl(); + + newCompany.setActive(true); + + return newCompany; + + } + + public void save(Company company) { + + CompanyTopiaDao dao = getPersistenceContext().getCompanyDao(); + + if (company.isPersisted()) { + dao.update(company); + } else { + dao.create(company); + } + + commit(); + + } + + public void deleteCompany(String companyId) throws IllegalDeletionException { + + CompanyTopiaDao dao = getPersistenceContext().getCompanyDao(); + + Company company = dao.findByTopiaId(companyId); + + Map<Class<? extends TopiaEntity>,List<? extends TopiaEntity>> allUsages = dao.findAllUsages(company); + + if (allUsages.isEmpty()) { + dao.delete(company); + } else { + throw new IllegalDeletionException(allUsages.keySet()); + } + + commit(); + + } + +} Copied: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/NewsService.java (from rev 1713, trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/NewsService.java) =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/NewsService.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/NewsService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,90 @@ +package fr.ifremer.wao.services.service.administration; + +import com.google.common.collect.Lists; +import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.entity.News; +import fr.ifremer.wao.entity.NewsImpl; +import fr.ifremer.wao.entity.NewsTopiaDao; +import fr.ifremer.wao.services.AuthenticatedWaoUser; +import fr.ifremer.wao.services.service.WaoServiceSupport; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; + +import java.util.List; + +public class NewsService extends WaoServiceSupport { + + public List<News> getRecentNews(AuthenticatedWaoUser authenticatedWaoUser, int maxCount) { + + NewsTopiaDao newsDao = getNewsDao(); + + TopiaQueryBuilderAddCriteriaOrRunQueryStep<News> query = newsDao.newQueryBuilder(); + + // on ne veut que les news pour le programme et 'null' pour les news publiées pour tous les programmes + query.addIn(News.PROPERTY_OBS_PROGRAM, Lists.newArrayList(authenticatedWaoUser.getObsProgram(), null)); + + // on ne veut que les news publiées par le programme et les news publiées par la même société que l'utilisateur connecté + if ( ! authenticatedWaoUser.isAdmin()) { + Company company = authenticatedWaoUser.getWaoUser().getCompany(); + query.addIn(News.PROPERTY_COMPANY, Lists.newArrayList(company, null)); + } + + // de la plus récente à la plus ancienne + query.setOrderByArguments(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE + " desc"); + + List<News> news = query.find(0, maxCount); + + return news; + + } + + public void delete(String newsId) { + + NewsTopiaDao newsDao = getNewsDao(); + + News news = newsDao.findByTopiaId(newsId); + + newsDao.delete(news); + + commit(); + + } + + public News getNews(String newsId) { + + NewsTopiaDao newsDao = getNewsDao(); + + News news = newsDao.findByTopiaId(newsId); + + return news; + + } + + public News newNews(AuthenticatedWaoUser authenticatedWaoUser) { + + News newNews = new NewsImpl(); + + if ( ! authenticatedWaoUser.isAdmin()) { + newNews.setCompany(authenticatedWaoUser.getCompany()); + } + + newNews.setObsProgram(authenticatedWaoUser.getObsProgram()); + + return newNews; + + } + + public void save(News news) { + + NewsTopiaDao newsDao = getNewsDao(); + + if (news.isPersisted()) { + newsDao.update(news); + } else { + newsDao.create(news); + } + + commit(); + + } +} Copied: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java (from rev 1714, trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java) =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,1002 @@ +/* + * #%L + * Wao :: Business + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2010 Ifremer + * %% + * 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 fr.ifremer.wao.services.service.administration; + +import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableSet; +import fr.ifremer.wao.WaoTechnicalException; +import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.entity.BoatGroup; +import fr.ifremer.wao.entity.BoatGroupTopiaDao; +import fr.ifremer.wao.entity.BoatTopiaDao; +import fr.ifremer.wao.entity.ContactState; +import fr.ifremer.wao.entity.ContactStateMotif; +import fr.ifremer.wao.entity.ContactStateMotifTopiaDao; +import fr.ifremer.wao.entity.DCF5Code; +import fr.ifremer.wao.entity.FishingGearDCF; +import fr.ifremer.wao.entity.FishingGearDCFTopiaDao; +import fr.ifremer.wao.entity.FishingZone; +import fr.ifremer.wao.entity.FishingZoneTopiaDao; +import fr.ifremer.wao.entity.Fleet; +import fr.ifremer.wao.entity.FleetTopiaDao; +import fr.ifremer.wao.entity.LocationType; +import fr.ifremer.wao.entity.ObsDebCode; +import fr.ifremer.wao.entity.ObsDebCodeDetails; +import fr.ifremer.wao.entity.ObsDebCodeDetailsImpl; +import fr.ifremer.wao.entity.ObsDebCodeDetailsTopiaDao; +import fr.ifremer.wao.entity.ObsDebCodeImpl; +import fr.ifremer.wao.entity.ObsDebCodeTopiaDao; +import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.ReferentialMeta; +import fr.ifremer.wao.entity.ReferentialMetaImpl; +import fr.ifremer.wao.entity.ReferentialMetaTopiaDao; +import fr.ifremer.wao.entity.SampleRow; +import fr.ifremer.wao.entity.SampleRowTopiaDao; +import fr.ifremer.wao.entity.ShipOwner; +import fr.ifremer.wao.entity.ShipOwnerTopiaDao; +import fr.ifremer.wao.entity.TargetSpeciesDCF; +import fr.ifremer.wao.entity.TargetSpeciesDCFTopiaDao; +import fr.ifremer.wao.entity.TerrestrialDivision; +import fr.ifremer.wao.entity.TerrestrialDivisionImpl; +import fr.ifremer.wao.entity.TerrestrialDivisionTopiaDao; +import fr.ifremer.wao.entity.TerrestrialLocation; +import fr.ifremer.wao.entity.TerrestrialLocationImpl; +import fr.ifremer.wao.entity.TerrestrialLocationTopiaDao; +import fr.ifremer.wao.services.service.ImportErrorException; +import fr.ifremer.wao.services.service.WaoServiceSupport; +import fr.ifremer.wao.services.service.csv.BoatGroupImportModel; +import fr.ifremer.wao.services.service.csv.BoatImportExportModel; +import fr.ifremer.wao.services.service.csv.ContactStateMotivesImportModel; +import fr.ifremer.wao.services.service.csv.FishingZoneImportModel; +import fr.ifremer.wao.services.service.csv.RawObsDebCode; +import fr.ifremer.wao.services.service.csv.RawObsDebCodesImportModel; +import fr.ifremer.wao.services.service.csv.TerrestrialDivisionImportModel; +import fr.ifremer.wao.services.service.csv.TerrestrialLocationImportModel; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.Import; +import org.nuiton.csv.ImportModel; +import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaDao; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +import java.io.InputStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * Service permettant la gestion des différents référentiels. + */ +public class ReferentialService extends WaoServiceSupport { + + private static final Log log = LogFactory.getLog(ReferentialService.class); + + /** Splitter qui permet de détecter toutes les immatriculations dans une chaîne (que le séparateur soit ' ', ',' ou autre). */ + protected static final Splitter BOAT_IMMATRICULATIONS_SPLITTER = Splitter.on(Pattern.compile("[^0-9]+")); + + /** Pour chaque programme, les référentiels utilisés par ce programme. */ + protected static final Map<ObsProgram, List<String>> PER_PROGRAM_REFERENTIAL; + + static { + Map<ObsProgram, List<String>> perProgramReferential = new HashMap<>(); + + perProgramReferential.put(ObsProgram.OBSMER, Arrays.asList( + FishingZone.class.getName(), + ContactStateMotif.class.getName(), + TerrestrialLocation.class.getName(), + Boat.class.getName())); + + perProgramReferential.put(ObsProgram.OBSVENTE, Arrays.asList( + FishingZone.class.getName(), + TerrestrialLocation.class.getName(), + Boat.class.getName())); + + perProgramReferential.put(ObsProgram.OBSDEB, Arrays.asList( + FishingZone.class.getName(), + TerrestrialLocation.class.getName(), + TerrestrialDivision.class.getName(), + ObsDebCode.class.getName(), + Boat.class.getName(), + BoatGroup.class.getName())); + + PER_PROGRAM_REFERENTIAL = Collections.unmodifiableMap(perProgramReferential); + } + + + /** + * Permet de maintenir à jour les informations sur les référentiels. À + * chaque import de référentiel par Wao, il faut appeler cette méthode en + * indiquant quel référentiel a été mis à jour. + * + * Cela aura pour effet de sauvegarder la date de dernière mise à jour du + * référentiel lorsqu'il faudra l'indiquer aux administrateurs plus tard. + * + * @param entityClassFqn le FQN de la classe-entité du référentiel modifié. + * Il doit être parmi les classe listées dans #PER_PROGRAM_REFERENTIAL + */ + protected void updateReferentialMeta(String entityClassFqn) { + + Class<?> entityClass; + try { + entityClass = getClass().getClassLoader().loadClass(entityClassFqn); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException(entityClassFqn); + } + + if ( ! TopiaEntity.class.isAssignableFrom(entityClass)) { + throw new IllegalArgumentException("il faut passer le FQN d'une classe d'entité"); + } + + ReferentialMetaTopiaDao dao = getPersistenceContext().getReferentialMetaDao(); + ReferentialMeta referentialMeta = dao.findByEntityClassFqn(entityClassFqn); + + if (referentialMeta == null) { + referentialMeta = dao.create( + ReferentialMeta.PROPERTY_ENTITY_CLASS_FQN, entityClassFqn); + } + + referentialMeta.setLastUpdate(getNow()); + + dao.update(referentialMeta); + + } + + /** + * Import des zones de pêche. + */ + public void importFishingZones(InputStream input) throws ImportErrorException { + + FishingZoneImportModel model = new FishingZoneImportModel(); + Import<FishingZone> fishingZoneImport = Import.newImport(model, input); + + FishingZoneTopiaDao dao = getPersistenceContext().getFishingZoneDao(); + + try { + for (FishingZone fishingZone : fishingZoneImport) { + + FishingZone existingFishingZone = + dao.forDistrictCodeEquals(fishingZone.getDistrictCode()).findUniqueOrNull(); + + if (existingFishingZone == null) { + dao.create(fishingZone); + } else { + existingFishingZone.setFacadeName(fishingZone.getFacadeName()); + existingFishingZone.setSectorName(fishingZone.getSectorName()); + existingFishingZone.setLatitude(fishingZone.getLatitude()); + existingFishingZone.setLongitude(fishingZone.getLongitude()); + dao.update(existingFishingZone); + } + + } + } catch (ImportRuntimeException e) { + throw new ImportErrorException(e); + } + + updateReferentialMeta(FishingZone.class.getName()); + + commit(); + + } + + /** + * Import des lieux terrestres (ports et criées). + */ + public void importTerrestrialLocations(InputStream input) throws ImportErrorException { + + TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); + + // first, we will read the CSV file, line by line + // at, each line, we will look if the location is already in database + // if yes, some attribute may have change, so we use a binder to copy all field + // if no, add the new location in database + + ImportModel<TerrestrialLocation> model = new TerrestrialLocationImportModel(); + Import<TerrestrialLocation> terrestrialLocationImport = Import.newImport(model, input); + + // we will need a binder, to copy location for an update + Binder<TerrestrialLocation, TerrestrialLocation> locationBinder = + BinderFactory.newBinder(TerrestrialLocation.class); + // some counts for logging purpose + int locationAdded = 0, locationUpdated = 0; + + // for each line of the CSV + try { + Iterator<TerrestrialLocation> locationIterator = terrestrialLocationImport.iterator(); + while (locationIterator.hasNext()) { + // location is a line of the CSV + TerrestrialLocation location = locationIterator.next(); + + // look if already exists and update existing or add new + TerrestrialLocation existingLocation = dao.forProperties( + TerrestrialLocation.PROPERTY_CODE, location.getCode(), + TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, location.getLocationTypeOrdinal()).findUniqueOrNull(); + if (existingLocation == null) { + dao.create(location); + locationAdded += 1; + } else { + locationBinder.copyExcluding(location, existingLocation,TopiaEntity.PROPERTY_TOPIA_ID, + TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); + dao.update(existingLocation); + locationUpdated += 1; + } + } + } catch (ImportRuntimeException e) { + throw new ImportErrorException(e); + } + + // now, all the CSV file has been read and dumped into database, + // Now, we need to update database by adding any missing district + // Each location has a district (identified by a district code) + // We must find all the distinct district ids and check that + // we have an entity representing it. In database a disctrict can + // be distinguished from a location by having it's + // locationTypeOrdinal null. + List<String> districtCodes = dao.findAllDistinctDistrictCodesUsedInLocations(); + + // a binder, needed for update + Binder<TerrestrialLocation, TerrestrialLocation> districtBinder = + BinderFactory.newBinder(TerrestrialLocation.class); + // counts for logging + int districtAdded = 0, districtUpdated = 0; + int regionAdded = 0, regionUpdated = 0; + + for (String districtCode : districtCodes) { // for each district code found + + // let's find a location which is in this particular district + TerrestrialLocation location = dao.forDistrictCodeEquals(districtCode).findAny(); + + // create the district by copying region, country etc. from location + TerrestrialLocation district = new TerrestrialLocationImpl(); + districtBinder.copyExcluding(location, district, TerrestrialLocation.PROPERTY_NAME, + TerrestrialLocation.PROPERTY_CODE, TerrestrialLocation.PROPERTY_PORT_CODE, + TerrestrialLocation.PROPERTY_PORT_NAME, TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, + TopiaEntity.PROPERTY_TOPIA_ID, TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, + TerrestrialLocation.PROPERTY_TOPIA_VERSION); + district.setLocationType(LocationType.DISTRICT); + + // A particular case, some location (not in France) has no + // district (district code null), so we must add a district + // for them + if (StringUtils.isEmpty(district.getDistrictCode())) { + // distinct will select a random place with no district code + // it can be in England, Sweden or whatever. It's bad for us + // because we don't want some data not to be filtered when looking + // for England while we want to filter on all country except France + district.setCountryCode(null); + district.setCountryName("Hors France"); + district.setSeaboardCode(null); + district.setSeaboardName(null); + district.setCoastFAOCode(null); + district.setCoastFAOName(null); + district.setDistrictCode(null); + } + + // now, we have the 'district' object we want to have in the + // database. Now let's add it if not already in or update + // it already in + TerrestrialLocation existingDistrict = + dao.forProperties( + TerrestrialLocation.PROPERTY_DISTRICT_CODE, district.getDistrictCode(), + TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, LocationType.DISTRICT.ordinal()).findUniqueOrNull(); + if (existingDistrict == null) { + dao.create(district); + districtAdded += 1; + } else { + locationBinder.copyExcluding(district, existingDistrict, TopiaEntity.PROPERTY_TOPIA_ID, + TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); + dao.update(existingDistrict); + districtUpdated += 1; + } + + // creating a region object for this district + TerrestrialLocation region = dao.newInstance(); + locationBinder.copyExcluding(district, region, TopiaEntity.PROPERTY_TOPIA_ID, + TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION, + TerrestrialLocation.PROPERTY_DISTRICT_CODE, TerrestrialLocation.PROPERTY_DISTRICT_NAME, + TerrestrialLocation.PROPERTY_DEPARTMENT_CODE, TerrestrialLocation.PROPERTY_DEPARTMENT_NAME, + TerrestrialLocation.PROPERTY_SUB_REGION_IFREMER_CODE, TerrestrialLocation.PROPERTY_SUB_REGION_IFREMER_NAME); + region.setLocationType(LocationType.REGION); + + // prevent to deal with case "Hors France" + if (region.getRegionIfremerCode() != null) { + + // try to find it if it's already in DB + TerrestrialLocation existingRegion = dao.forProperties( + TerrestrialLocation.PROPERTY_REGION_IFREMER_CODE, region.getRegionIfremerCode(), + TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, LocationType.REGION.ordinal()).findUniqueOrNull(); + + // create or update + if (existingRegion == null) { + dao.create(region); + regionAdded += 1; + } else { + locationBinder.copyExcluding(region, existingRegion, TopiaEntity.PROPERTY_TOPIA_ID, + TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); + dao.update(existingRegion); + regionUpdated += 1; + } + } + } + + if (log.isInfoEnabled()) { + log.info(locationAdded + " terrestrial locations added, " + locationUpdated + " updated"); + log.info(districtAdded + " terrestrial district added, " + districtUpdated + " updated"); + log.info(regionAdded + " terrestrial region added, " + regionUpdated + " updated"); + } + + updateReferentialMeta(TerrestrialLocation.class.getName()); + + commit(); + + } + + /** Find ports and auctions in a given district */ + public List<TerrestrialLocation> getAllPortsAndAuctions(TerrestrialLocation district) { + + Preconditions.checkArgument(district.isDistrict(), "terrestrial location " + district + " is not district"); + + TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); + + TopiaQueryBuilderAddCriteriaOrRunQueryStep<TerrestrialLocation> query = dao.newQueryBuilder(); + + query.addIn(TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, ImmutableSet.of(LocationType.PORT.ordinal(), LocationType.AUCTION.ordinal())); + + query.addEquals(TerrestrialLocation.PROPERTY_DISTRICT_CODE, district.getDistrictCode()); + + List<TerrestrialLocation> result = query.findAll(); + + return result; + + } + + public List<TerrestrialLocation> executeGetAllRegionIfremers() { + + TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); + + List<TerrestrialLocation> allRegionIfremers = dao.forLocationTypeOrdinalEquals(LocationType.REGION.ordinal()).findAll(); + + return allRegionIfremers; + + } + + public TerrestrialLocation getTerrestrialDistrict(String districtCode) { + + Preconditions.checkArgument(StringUtils.isNotBlank(districtCode)); + + TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); + + TerrestrialLocation terrestrialDistrict = dao.forProperties( + TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, LocationType.DISTRICT.ordinal(), + TerrestrialLocation.PROPERTY_DISTRICT_CODE, districtCode).findUnique(); + + return terrestrialDistrict; + + } + + /** + * @param contactState if null, return motifs for all contact states + */ + public List<ContactStateMotif> getAllContactStateMotifs(ContactState contactState) throws Exception { + + ContactStateMotifTopiaDao dao = getPersistenceContext().getContactStateMotifDao(); + + List<ContactStateMotif> result; + if (contactState == null) { + result = dao.findAll(); + } else { + ContactState substituteState = ContactState.getSubstituteForMotif(contactState); + result = dao.forContactStateOrdinalEquals(substituteState.ordinal()).findAll(); + } + + if (log.isDebugEnabled()) { + log.debug(result.size() + " motifs found for state " + contactState); + } + + return result; + + } + + public void importContactStateMotives(InputStream input) throws ImportErrorException { + + ImportModel<ContactStateMotif> model = new ContactStateMotivesImportModel(); + Import<ContactStateMotif> motivesImport = Import.newImport(model, input); + + ContactStateMotifTopiaDao dao = getPersistenceContext().getContactStateMotifDao(); + + try { + for (ContactStateMotif motif : motivesImport) { + ContactStateMotif existingMotif = dao.forCodeEquals(motif.getCode()).findUniqueOrNull(); + if (existingMotif == null) { + dao.create(motif); + } else { + existingMotif.setName(motif.getName()); + existingMotif.setContactState(motif.getContactState()); + existingMotif.setColor(motif.getColor()); + dao.update(existingMotif); + } + } + } catch (ImportRuntimeException e) { + throw new ImportErrorException(e); + } + + updateReferentialMeta(ContactStateMotif.class.getName()); + + commit(); + + } + + public void importTerrestrialDivisions(InputStream input) throws ImportErrorException { + + TerrestrialLocationTopiaDao terrestrialLocationDao = getPersistenceContext().getTerrestrialLocationDao(); + + // let's find all ports in terrestrial location reference + List<TerrestrialLocation> ports = terrestrialLocationDao.forLocationTypeEquals(LocationType.PORT).findAll(); + List<TerrestrialLocation> regions = terrestrialLocationDao.forLocationTypeEquals(LocationType.REGION).findAll(); + + if (log.isDebugEnabled()) { + log.debug(ports.size() + " ports, " + regions.size() + " regions"); + } + + // the import itself + ImportModel<TerrestrialDivision> importModel = new TerrestrialDivisionImportModel(ports, regions); + Import<TerrestrialDivision> terrestrialDivisionImport = Import.newImport(importModel, input); + + TerrestrialDivisionTopiaDao dao = getPersistenceContext().getTerrestrialDivisionDao(); + + Binder<TerrestrialDivision, TerrestrialDivision> terrestrialDivisionBinder = BinderFactory.newBinder(TerrestrialDivision.class); + + try { + for (TerrestrialDivision terrestrialDivision : terrestrialDivisionImport) { + + TerrestrialDivision existingTerrestrialDivision = dao.forCodeEquals(terrestrialDivision.getCode()).findUniqueOrNull(); + if (existingTerrestrialDivision == null) { + // add as new + dao.create(terrestrialDivision); + } else { + // update the old one + terrestrialDivisionBinder.copyExcluding(terrestrialDivision, existingTerrestrialDivision, + TopiaEntity.PROPERTY_TOPIA_ID, TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); + dao.update(existingTerrestrialDivision); + } + + TerrestrialDivision observationUnit = new TerrestrialDivisionImpl(); + terrestrialDivisionBinder.copyExcluding( + terrestrialDivision, observationUnit, + TopiaEntity.PROPERTY_TOPIA_ID, TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, + TopiaEntity.PROPERTY_TOPIA_VERSION, + TerrestrialDivision.PROPERTY_CODE, + TerrestrialDivision.PROPERTY_PORT); + + TerrestrialDivision existingObservationUnit = dao.forProperties( + TerrestrialDivision.PROPERTY_CODE, observationUnit.getCode(), + TerrestrialDivision.PROPERTY_PORT, observationUnit.getPort(), + TerrestrialDivision.PROPERTY_REGION_IFREMER, observationUnit.getRegionIfremer(), + TerrestrialDivision.PROPERTY_OBSERVATION_UNIT_CODE, observationUnit.getObservationUnitCode()).findUniqueOrNull(); + + if (existingObservationUnit == null) { + dao.create(observationUnit); + } else { + terrestrialDivisionBinder.copyExcluding( + observationUnit, existingObservationUnit, TopiaEntity.PROPERTY_TOPIA_ID, + TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, TopiaEntity.PROPERTY_TOPIA_VERSION); + dao.update(existingObservationUnit); + } + + } + } catch (ImportRuntimeException e) { + throw new ImportErrorException(e); + } + + if (log.isDebugEnabled()) { + log.debug(dao.count() + " terrestrial divisions in database"); + } + + updateReferentialMeta(TerrestrialDivision.class.getName()); + + commit(); + + } + + public List<TerrestrialDivision> getAllObservationUnits() { + + TerrestrialDivisionTopiaDao dao = getPersistenceContext().getTerrestrialDivisionDao(); + + // having code null make TerrestrialDivision.isObservationUnit + List<TerrestrialDivision> observationUnits = dao.forCodeEquals(null).findAll(); + + if (log.isDebugEnabled()) { + log.debug("will return " + observationUnits.size() + " observation units"); + } + + return observationUnits; + + } + + /** + * @param region may be null, and all ports will be returned + * @returns all the ports that are in a region + */ + public List<TerrestrialLocation> getAllPorts(TerrestrialLocation region) { + + Preconditions.checkArgument(region == null || region.isRegion(), region + " is not a region"); + + TerrestrialLocationTopiaDao dao = getPersistenceContext().getTerrestrialLocationDao(); + + Map<String, Object> properties = new HashMap<>(); + + // we are looking for ports only + properties.put(TerrestrialLocation.PROPERTY_LOCATION_TYPE_ORDINAL, LocationType.PORT.ordinal()); + + // ports in a specific region + properties.put(TerrestrialLocation.PROPERTY_REGION_IFREMER_CODE, region.getRegionIfremerCode()); + + // run query + List<TerrestrialLocation> ports = dao.forProperties(properties).findAll(); + + return ports; + + } + + public void importObsDebCodes(InputStream input) throws ImportErrorException { + + TerrestrialLocationTopiaDao terrestrialLocationDao = + getPersistenceContext().getTerrestrialLocationDao(); + + List<TerrestrialLocation> allRegions = + terrestrialLocationDao.forLocationTypeEquals(LocationType.REGION).findAll(); + + ObsDebCodeTopiaDao dao = getPersistenceContext().getObsDebCodeDao(); + ObsDebCodeDetailsTopiaDao obsDebCodeDetailsDAO = getPersistenceContext().getObsDebCodeDetailsDao(); + + ImportModel<RawObsDebCode> model = new RawObsDebCodesImportModel(allRegions); + Import<RawObsDebCode> rawObsDebCodeImport = Import.newImport(model, input); + + // start reading the CSV file line by line + try { + for (RawObsDebCode rawObsDebCode : rawObsDebCodeImport) { + + // try to find an already existing entity to update + // or create one + ObsDebCode existingCode = dao.forCodeEquals(rawObsDebCode.getCode()).findUniqueOrNull(); + if (existingCode == null) { + existingCode = new ObsDebCodeImpl(); + existingCode.setCode(rawObsDebCode.getCode()); + existingCode = dao.create(existingCode); + } + ObsDebCodeDetails existingDetails = null; + if (existingCode.getObsDebCodeDetails() != null) { + for (ObsDebCodeDetails obsDebCodeDetails : existingCode.getObsDebCodeDetails()) { + if (rawObsDebCode.getRegion().getRegionIfremerCode().equals(obsDebCodeDetails.getRegion().getRegionIfremerCode())) { + existingDetails = obsDebCodeDetails; + } + } + } + + if (existingDetails == null) { + existingDetails = new ObsDebCodeDetailsImpl(); + existingDetails.setLabel(rawObsDebCode.getLabel()); + existingDetails.setRegion(rawObsDebCode.getRegion()); + existingCode.addObsDebCodeDetails(existingDetails); + obsDebCodeDetailsDAO.create(existingDetails); + } else { + existingDetails.setLabel(rawObsDebCode.getLabel()); + obsDebCodeDetailsDAO.update(existingDetails); + } + + dao.update(existingCode); + + } + } catch (ImportRuntimeException e) { + throw new ImportErrorException(e); + } + + updateReferentialMeta(ObsDebCode.class.getName()); + + commit(); + + } + + protected void initialDCF5CodesImport() { + + FishingGearDCFTopiaDao fishingGearDCFDao = getPersistenceContext().getFishingGearDCFDao(); + TargetSpeciesDCFTopiaDao targetSpeciesDCFDao = getPersistenceContext().getTargetSpeciesDCFDao(); + + final String[] gearCodesBase = {"DRB", "DRH", + "FPN", "FPO", "FSN", "FWR", "FYK", "GES", "GNC", + "GND", "GNF", "GNS", "GTN", "GTR", "HAR", "HMD", "HMP", + "LA", "LHM", "LHP", "LLD", "LLS", "LNB", "LNP", "LNS", + "LTL", "LX", "OTB", "OTM", "OTT", "PS", + "PTB", "PTM", "RG", "SB", "SDN", "SPR", "SSC", "SV", + "TBB", "TBN", "TBS", "TMS"}; + + final String[] speciesCodesBase = {"ALG", "ANA", "CAT", "CRU", + "DEF", "DWS", "LPF", "MOL", "SPF", "FIF"}; + + long nbCodes = fishingGearDCFDao.count() + targetSpeciesDCFDao.count(); + + if (nbCodes == 0) { + + if (log.isInfoEnabled()) { + log.info("no DCF in database, mass import"); + } + + for (String code : gearCodesBase) { + fishingGearDCFDao.create(FishingGearDCF.PROPERTY_CODE, code); + } + + for (String code : speciesCodesBase) { + targetSpeciesDCFDao.create(TargetSpeciesDCF.PROPERTY_CODE, code); + } + + } else { + + if (log.isInfoEnabled()) { + log.info("some DCF in database, import only missing ones"); + } + + for (String code : gearCodesBase) { + FishingGearDCF fishingGearDCF = fishingGearDCFDao.forCodeEquals(code).findUniqueOrNull(); + if (fishingGearDCF == null) { + log.info("add missing fishing gear DCF: '" + code + "'"); + fishingGearDCFDao.create(FishingGearDCF.PROPERTY_CODE, code); + } + } + + for (String code : speciesCodesBase) { + TargetSpeciesDCF targetSpeciesDCF = targetSpeciesDCFDao.forCodeEquals(code).findUniqueOrNull(); + if (targetSpeciesDCF == null) { + log.info("add missing target species DCF: '" + code + "'"); + targetSpeciesDCFDao.create(TargetSpeciesDCF.PROPERTY_CODE, code); + } + } + + // on supprime ce qu'il y a en trop + for (FishingGearDCF fishingGearDCF : fishingGearDCFDao.findAll()) { + if ( ! ArrayUtils.contains(gearCodesBase, fishingGearDCF.getCode())) { + List<DCF5Code> usages = fishingGearDCFDao.findUsages(DCF5Code.class, fishingGearDCF); + if (usages.isEmpty()) { + log.info("will delete code " + fishingGearDCF); + fishingGearDCFDao.delete(fishingGearDCF); + } else { + log.warn("will not delete " + fishingGearDCF); + SampleRowTopiaDao sampleRowDao = getPersistenceContext().getSampleRowDao(); + for (DCF5Code usage : usages) { + List<SampleRow> sampleRows = sampleRowDao.fordCF5CodeContains(usage).findAll(); + for (SampleRow sampleRow : sampleRows) { + log.warn("sampleRow " + sampleRow.getCode() + " use " + usage); + } + } + } + } + } + + for (TargetSpeciesDCF targetSpeciesDCF : targetSpeciesDCFDao.findAll()) { + if ( ! ArrayUtils.contains(speciesCodesBase, targetSpeciesDCF.getCode())) { + List<DCF5Code> usages = targetSpeciesDCFDao.findUsages(DCF5Code.class, targetSpeciesDCF); + if (usages.isEmpty()) { + log.info("will delete code " + targetSpeciesDCF); + targetSpeciesDCFDao.delete(targetSpeciesDCF); + } else { + log.warn("will not delete " + targetSpeciesDCF); + } + } + } + } + + if (log.isInfoEnabled()) { + nbCodes = fishingGearDCFDao.count() + targetSpeciesDCFDao.count(); + log.info(nbCodes + " dcf codes in database"); + } + + commit(); + + } + + public void initialImport() { + + initialDCF5CodesImport(); + + InputStream input = null; + + TerrestrialLocationTopiaDao terrestrialLocationDao = getPersistenceContext().getTerrestrialLocationDao(); + ObsDebCodeTopiaDao obsDebCodeDao = getPersistenceContext().getObsDebCodeDao(); + ContactStateMotifTopiaDao contactStateMotifDao = getPersistenceContext().getContactStateMotifDao(); + + if (terrestrialLocationDao.count() == 0) { + try { + input = getClass().getResourceAsStream("/terrestrialLocations.csv"); + importTerrestrialLocations(input); + } catch (ImportErrorException e) { + throw new WaoTechnicalException(e); + } finally { + IOUtils.closeQuietly(input); + } + } + + if (obsDebCodeDao.count() == 0) { + try { + input = getClass().getResourceAsStream("/obsDebCodes.csv"); + importObsDebCodes(input); + } catch (ImportErrorException e) { + throw new WaoTechnicalException(e); + } finally { + IOUtils.closeQuietly(input); + } + } + + if (contactStateMotifDao.count() == 0) { + try { + input = getClass().getResourceAsStream("/motifs.csv"); + importContactStateMotives(input); + } catch (ImportErrorException e) { + throw new WaoTechnicalException(e); + } finally { + IOUtils.closeQuietly(input); + } + } + + } + + /** + * Pour un programme donné, permet d'obtenir des informations sur tous les + * référentiels utilisés par ce programme. Notamment la date de dernière + * mise à jour ainsi que le nombre d'entités en base. + */ + public List<ReferentialState> getReferentialStates(ObsProgram obsProgram) { + + List<ReferentialState> referentialStates = new LinkedList<>(); + + for (String entityClassFqn : PER_PROGRAM_REFERENTIAL.get(obsProgram)) { + + Class<?> entityClass; + try { + entityClass = getClass().getClassLoader().loadClass(entityClassFqn); + } catch (ClassNotFoundException e) { + throw new WaoTechnicalException("cannot load class " + entityClassFqn, e); + } + + if ( ! TopiaEntity.class.isAssignableFrom(entityClass)) { + throw new IllegalArgumentException("il faut passer le FQN d'une classe d'entité"); + } + + long count; + + if (TerrestrialDivision.class.equals(entityClass)) { + // Pour les stratification géographique, on compte le nombre de strate + // (on ne compte pas les unités d'observations, etc qui prennent + // des lignes en base) + TerrestrialDivisionTopiaDao dao = getPersistenceContext().getTerrestrialDivisionDao(); + count = dao.countDistinctTerrestrialDivision(); + } else { + TopiaDao<? extends TopiaEntity> dao = getPersistenceContext().getDao((Class<? extends TopiaEntity>) entityClass); + count = dao.count(); + } + + ReferentialMetaTopiaDao referentialMetaDao = getPersistenceContext().getReferentialMetaDao(); + ReferentialMeta referentialMeta = referentialMetaDao.forEntityClassFqnEquals(entityClassFqn).findUniqueOrNull(); + if (referentialMeta == null) { + referentialMeta = new ReferentialMetaImpl(); + } + + ReferentialState referentialState = new ReferentialState(); + referentialState.setReferentialName(I18n.t(entityClassFqn)); + referentialState.setLastUpdate(referentialMeta.getLastUpdate()); + referentialState.setSize(count); + + referentialStates.add(referentialState); + } + + return referentialStates; + } + + public List<FishingGearDCF> getAllFishingGearDCF() { + FishingGearDCFTopiaDao dao = getPersistenceContext().getFishingGearDCFDao(); + List<FishingGearDCF> all = dao.findAll(); + return all; + } + + public List<TargetSpeciesDCF> getAllTargetSpeciesDCF() { + TargetSpeciesDCFTopiaDao dao = getPersistenceContext().getTargetSpeciesDCFDao(); + List<TargetSpeciesDCF> all = dao.findAll(); + return all; + } + + /** + * Import boats from CSV file, given data will be merged with data already + * in the DB. All shipowner or district code mentioned will be added to + * the database on the fly + */ + public void importBoats(InputStream input) throws ImportErrorException { + + // Before importing, we need to retrieve all ports that may be mentioned + // in the CSV file + TerrestrialLocationTopiaDao terrestrialLocationDao = + getPersistenceContext().getTerrestrialLocationDao(); + List<TerrestrialLocation> ports = terrestrialLocationDao.forLocationTypeEquals(LocationType.PORT).findAll(); + List<TerrestrialLocation> districts = terrestrialLocationDao.forLocationTypeEquals(LocationType.DISTRICT).findAll(); + + // Building the model, providing ports + BoatImportExportModel model = new BoatImportExportModel(ports, districts); + Import<Boat> boatImport = Import.newImport(model, input); + + // Getting some DAOs + BoatTopiaDao boatDao = getPersistenceContext().getBoatDao(); + ShipOwnerTopiaDao shipOwnerDao = getPersistenceContext().getShipOwnerDao(); + FleetTopiaDao fleetDao = getPersistenceContext().getFleetDao(); + + // load data that will be linked to the boat + Map<String, ShipOwner> shipOwners = new HashMap<>(); + for (ShipOwner shipOwner : shipOwnerDao.findAll()) { + shipOwners.put(shipOwner.getCode(), shipOwner); + } + Map<String, Fleet> fleets = new HashMap<>(); + for (Fleet fleet : fleetDao.findAll()) { + fleets.put(fleet.getCode(), fleet); + } + + // now iterating over the lines of the CSV + try { + for (Boat boat : boatImport) { + + // first each boat read, merge with data already in database or add + // all new boats encountered. New district codes or shipowners may be + // added on the fly too. + + // first, find and reuse existing ship owner + String shipOwnerCode = boat.getShipOwner().getCode(); + ShipOwner shipOwner = shipOwners.get(shipOwnerCode); + if (shipOwner == null) { + shipOwner = shipOwnerDao.create(boat.getShipOwner()); + shipOwners.put(shipOwnerCode, shipOwner); + } + boat.setShipOwner(shipOwner); + + // secondly, find and reuse fleet + String fleetCode = boat.getFleet().getCode(); + if (fleetCode == null) { + boat.setFleet(null); + } else { + Fleet fleet = fleets.get(fleetCode); + if (fleet == null) { + fleet = fleetDao.create(boat.getFleet()); + fleets.put(fleetCode, fleet); + } + boat.setFleet(fleet); + } + + // now boat object is ready + Boat existingBoat = boatDao.forImmatriculationEquals(boat.getImmatriculation()).findUniqueOrNull(); + if (existingBoat == null) { + boatDao.create(boat); + } else { + // copy new values in found entity and save changes + existingBoat.setName(boat.getName()); + existingBoat.setBoatLength(boat.getBoatLength()); + existingBoat.setBuildYear(boat.getBuildYear()); + existingBoat.setActive(boat.isActive()); + existingBoat.setShipOwner(boat.getShipOwner()); + existingBoat.setDistrict(boat.getDistrict()); + existingBoat.setPortOfRegistry(boat.getPortOfRegistry()); + existingBoat.setFleet(boat.getFleet()); + boatDao.update(existingBoat); + } + + } + } catch (ImportRuntimeException e) { + throw new ImportErrorException(e); + } + + updateReferentialMeta(Boat.class.getName()); + + commit(); + + } + + public void importBoatGroups(InputStream input) throws ImportErrorException { + // Building the model, providing ports + BoatGroupImportModel model = new BoatGroupImportModel(); + Import<Boat> boatImport = Import.newImport(model, input); + + // Getting some DAOs + BoatTopiaDao boatDao = getPersistenceContext().getBoatDao(); + BoatGroupTopiaDao boatGroupDao = getPersistenceContext().getBoatGroupDao(); + + Map<String, BoatGroup> boatGroups = new HashMap<>(); + for (BoatGroup boatGroup : boatGroupDao.findAll()) { + boatGroups.put(boatGroup.getCode(), boatGroup); + } + + // now iterating over the lines of the CSV + try { + for (Boat boat : boatImport) { + + // fourth, the group + String boatGroupCode = boat.getBoatGroup().getCode(); + if (boatGroupCode == null) { + boat.setBoatGroup(null); + } else { + BoatGroup boatGroup = boatGroups.get(boatGroupCode); + if (boatGroup == null) { + boatGroup = boatGroupDao.create(boat.getBoatGroup()); + boatGroups.put(boatGroupCode, boatGroup); + } + boat.setBoatGroup(boatGroup); + } + + // now boat object is ready + Boat existingBoat = boatDao.forImmatriculationEquals(boat.getImmatriculation()).findUniqueOrNull(); + if (existingBoat == null) { + throw new ImportRuntimeException(I18n.t("wao.import.contact.failure.wrongBoat", String.valueOf(boat.getImmatriculation()))); + } else { + // copy new values in found entity and save changes + existingBoat.setBoatGroup(boat.getBoatGroup()); + boatDao.update(existingBoat); + } + + } + } catch (ImportRuntimeException e) { + throw new ImportErrorException(e); + } + + updateReferentialMeta(Boat.class.getName()); + + commit(); + + } + + public List<Boat> getBoatsFromImmatriculations(String joinedImmatriculations) { + + Iterable<String> splitImmatriculations = BOAT_IMMATRICULATIONS_SPLITTER.split(joinedImmatriculations); + + Set<Integer> immatriculations = new HashSet<>(); + for (String splitImmatriculation : splitImmatriculations) { + if (StringUtils.isNotBlank(splitImmatriculation)) { + immatriculations.add(Integer.parseInt(splitImmatriculation)); + } + } + + List<Boat> boats = getBoatDao().forImmatriculationIn(immatriculations).findAll(); + + return boats; + + } + +} Copied: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialState.java (from rev 1713, trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialState.java) =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialState.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialState.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,41 @@ +package fr.ifremer.wao.services.service.administration; + +import java.util.Date; + +/** + * Répresente l'état d'une référential à un instant donné. (Date de dernière + * mise à jour par exemple). + */ +public class ReferentialState { + + protected String referentialName; + + protected long size; + + protected Date lastUpdate; + + public String getReferentialName() { + return referentialName; + } + + public void setReferentialName(String referentialName) { + this.referentialName = referentialName; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public Date getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(Date lastUpdate) { + this.lastUpdate = lastUpdate; + } + +} Copied: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UpdateWaoUserCommand.java (from rev 1714, trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java) =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UpdateWaoUserCommand.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UpdateWaoUserCommand.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,224 @@ +package fr.ifremer.wao.services.service.administration; + +import com.google.common.collect.ImmutableMap; +import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.UserProfile; +import fr.ifremer.wao.entity.UserProfileImpl; +import fr.ifremer.wao.entity.UserRole; +import fr.ifremer.wao.entity.WaoUser; +import org.apache.commons.lang3.StringUtils; + +public class UpdateWaoUserCommand { + + protected ObsProgram obsProgram; + + protected WaoUser waoUser; + + protected String clearPassword; + + protected String clearPasswordConfirmation; + + protected UpdateWaoUserCommandPasswordStrategy passwordStrategy; + + protected ImmutableMap<String, Company> allCompanies; + + /** + * Si l'utilisateur est professionnel, on doit savoir à quelle + * liste de navires il est restreint, Cette information est saisie + * en mettant à la suite les immatriculations des navires. + */ + protected String canReadBoats; + + public String getCanReadBoats() { + return canReadBoats; + } + + public void setCanReadBoats(String canReadBoats) { + this.canReadBoats = canReadBoats; + } + + public String getCompanyId() { + String companyId = null; + if (waoUser.getCompany() != null) { + companyId = waoUser.getCompany().getTopiaId(); + } + return companyId; + } + + public void setCompanyId(String companyId) { + if (StringUtils.isBlank(companyId)) { + waoUser.setCompany(null); + } else { + Company company = allCompanies.get(companyId); + waoUser.setCompany(company); + } + } + + public ImmutableMap<String, Company> getAllCompanies() { + return allCompanies; + } + + public void setAllCompanies(ImmutableMap<String, Company> allCompanies) { + this.allCompanies = allCompanies; + } + + protected UserProfile getUserProfile(UserRole userRole, boolean readOnly) { + if (waoUser.isUserProfileNotEmpty()) { + for (UserProfile userProfile : waoUser.getUserProfile(obsProgram)) { + if (userRole.equals(userProfile.getUserRole()) && readOnly == userProfile.isReadOnly()) { + return userProfile; + } + } + } + return null; + } + + protected void updateUserProfile(UserRole userRole, boolean readOnly, boolean userMustHaveProfile) { + UserProfile userProfile = getUserProfile(userRole, readOnly); + if (userMustHaveProfile) { + if (userProfile == null) { + // on l'ajoute + userProfile = new UserProfileImpl(); + userProfile.setUserRole(userRole); + userProfile.setCanWrite(!readOnly); + userProfile.setObsProgram(obsProgram); + waoUser.addUserProfile(userProfile); + } else { + // il l'a déjà + } + } else { + if (userProfile == null) { + // il ne l'a pas + } else { + // on le retire + waoUser.removeUserProfile(userProfile); + } + } + } + + protected boolean hasProfile(UserRole userRole, boolean readOnly) { + boolean hasProfile = getUserProfile(userRole, readOnly) != null; + return hasProfile; + } + + public boolean isAdmin() { + return hasProfile(UserRole.ADMIN, false); + } + + public void setAdmin(boolean admin) { + updateUserProfile(UserRole.ADMIN, false, admin); + } + + public boolean isCoordinator() { + return hasProfile(UserRole.COORDINATOR, false); + } + + public void setCoordinator(boolean coordinator) { + updateUserProfile(UserRole.COORDINATOR, false, coordinator); + } + + public boolean isObserver() { + return hasProfile(UserRole.OBSERVER, false); + } + + public void setObserver(boolean observer) { + updateUserProfile(UserRole.OBSERVER, false, observer); + } + + public boolean isGuest() { + return hasProfile(UserRole.GUEST, false); + } + + public void setGuest(boolean guest) { + updateUserProfile(UserRole.GUEST, false, guest); + } + + public boolean isProfessional() { + return hasProfile(UserRole.PROFESSIONAL, false); + } + + public void setProfessional(boolean professional) { + updateUserProfile(UserRole.PROFESSIONAL, false, professional); + } + + public boolean isAdminReadOnly() { + return hasProfile(UserRole.ADMIN, true); + } + + public void setAdminReadOnly(boolean adminReadOnly) { + updateUserProfile(UserRole.ADMIN, true, adminReadOnly); + } + + public boolean isCoordinatorReadOnly() { + return hasProfile(UserRole.COORDINATOR, true); + } + + public void setCoordinatorReadOnly(boolean coordinatorReadOnly) { + updateUserProfile(UserRole.COORDINATOR, true, coordinatorReadOnly); + } + + public boolean isObserverReadOnly() { + return hasProfile(UserRole.OBSERVER, true); + } + + public void setObserverReadOnly(boolean observerReadOnly) { + updateUserProfile(UserRole.OBSERVER, true, observerReadOnly); + } + + public boolean isGuestReadOnly() { + return hasProfile(UserRole.GUEST, true); + } + + public void setGuestReadOnly(boolean guestReadOnly) { + updateUserProfile(UserRole.GUEST, true, guestReadOnly); + } + + public boolean isProfessionalReadOnly() { + return hasProfile(UserRole.PROFESSIONAL, true); + } + + public void setProfessionalReadOnly(boolean professionalReadOnly) { + updateUserProfile(UserRole.ADMIN, true, professionalReadOnly); + } + + public UpdateWaoUserCommandPasswordStrategy getPasswordStrategy() { + return passwordStrategy; + } + + public void setPasswordStrategy(UpdateWaoUserCommandPasswordStrategy passwordStrategy) { + this.passwordStrategy = passwordStrategy; + } + + public String getClearPassword() { + return clearPassword; + } + + public void setClearPassword(String clearPassword) { + this.clearPassword = clearPassword; + } + + public String getClearPasswordConfirmation() { + return clearPasswordConfirmation; + } + + public void setClearPasswordConfirmation(String clearPasswordConfirmation) { + this.clearPasswordConfirmation = clearPasswordConfirmation; + } + + public WaoUser getWaoUser() { + return waoUser; + } + + public void setWaoUser(WaoUser waoUser) { + this.waoUser = waoUser; + } + + public ObsProgram getObsProgram() { + return obsProgram; + } + + public void setObsProgram(ObsProgram obsProgram) { + this.obsProgram = obsProgram; + } +} Copied: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UpdateWaoUserCommandPasswordStrategy.java (from rev 1713, trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommandPasswordStrategy.java) =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UpdateWaoUserCommandPasswordStrategy.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UpdateWaoUserCommandPasswordStrategy.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,30 @@ +package fr.ifremer.wao.services.service.administration; + +import org.nuiton.i18n.I18n; + +public enum UpdateWaoUserCommandPasswordStrategy { + + KEEP_SAME_PASSWORD(I18n.n("UpdateWaoUserCommandPasswordStrategy.KEEP_SAME_PASSWORD")), + + GENERATE_NEW_PASSWORD(I18n.n("UpdateWaoUserCommandPasswordStrategy.GENERATE_NEW_PASSWORD")), + + DEFINE_PASSWORD(I18n.n("UpdateWaoUserCommandPasswordStrategy.DEFINE_PASSWORD")); + + protected String i18nKey; + + UpdateWaoUserCommandPasswordStrategy(String i18nKey) { + this.i18nKey = i18nKey; + } + + public String getI18nKey() { + return i18nKey; + } + + public boolean isDefinePassword() { + return this == DEFINE_PASSWORD; + } + + public boolean isGeneratePassword() { + return this == GENERATE_NEW_PASSWORD; + } +} Copied: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java (from rev 1714, trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java) =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,197 @@ +package fr.ifremer.wao.services.service.administration; + +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; +import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.entity.Boats; +import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.UserProfile; +import fr.ifremer.wao.entity.UserRole; +import fr.ifremer.wao.entity.WaoUser; +import fr.ifremer.wao.entity.WaoUserImpl; +import fr.ifremer.wao.entity.WaoUserTopiaDao; +import fr.ifremer.wao.services.service.IllegalDeletionException; +import fr.ifremer.wao.services.service.WaoServiceSupport; +import fr.ifremer.wao.services.service.mail.UserCredentialsEmail; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; +import org.nuiton.util.StringUtil; + +import java.util.List; +import java.util.Map; + +public class WaoUsersService extends WaoServiceSupport { + + public List<WaoUser> getWaoUsers(Optional<String> optionalCompanyId) { + + WaoUserTopiaDao dao = getWaoUserDao(); + + TopiaQueryBuilderAddCriteriaOrRunQueryStep<WaoUser> query = dao.newQueryBuilder(); + + if (optionalCompanyId.isPresent()) { + query.addTopiaIdEquals(WaoUser.PROPERTY_COMPANY, optionalCompanyId.get()); + } + + query.setOrderByArguments(WaoUser.PROPERTY_ACTIVE + " desc", WaoUser.PROPERTY_LOGIN); + + List<WaoUser> waoUsers = query.findAll(); + + return waoUsers; + + } + + public WaoUser getWaoUser(String waoUserId) { + + WaoUserTopiaDao dao = getWaoUserDao(); + + WaoUser waouser = dao.findByTopiaId(waoUserId); + + return waouser; + + } + + public WaoUser newWaoUser() { + + WaoUserImpl newWaoUser = new WaoUserImpl(); + + newWaoUser.setActive(true); + + return newWaoUser; + + } + + public UpdateWaoUserCommand newUpdateWaoUserCommand(ObsProgram obsProgram, Optional<String> optionalUserId) { + + UpdateWaoUserCommand updateWaoUserCommand = new UpdateWaoUserCommand(); + + updateWaoUserCommand.setObsProgram(obsProgram); + + ImmutableMap<String, Company> allCompanies = Maps.uniqueIndex( + getCompaniesService().getCompanies(), + TopiaEntities.getTopiaIdFunction()); + + updateWaoUserCommand.setAllCompanies(allCompanies); + + if (optionalUserId.isPresent()) { + + WaoUser waoUser = getWaoUser(optionalUserId.get()); + + updateWaoUserCommand.setWaoUser(waoUser); + + updateWaoUserCommand.setPasswordStrategy(UpdateWaoUserCommandPasswordStrategy.KEEP_SAME_PASSWORD); + + if (waoUser.isCanReadBoatsNotEmpty()) { + + String canReadBoats = StringUtils.join( + Iterables.transform(waoUser.getCanReadBoats(), Boats.getImmatriculation()), + ' ' + ); + + updateWaoUserCommand.setCanReadBoats(canReadBoats); + + } + + } else { + + updateWaoUserCommand.setWaoUser(newWaoUser()); + + updateWaoUserCommand.setPasswordStrategy(UpdateWaoUserCommandPasswordStrategy.GENERATE_NEW_PASSWORD); + + } + + return updateWaoUserCommand; + + } + + public void save(UpdateWaoUserCommand updateWaoUserCommand) { + + ObsProgram obsProgram = updateWaoUserCommand.getObsProgram(); + WaoUser waoUser = updateWaoUserCommand.getWaoUser(); + + waoUser.clearCanReadBoats(); + if (waoUser.hasUserRole(UserRole.PROFESSIONAL, obsProgram)) { + List<Boat> boatsFromImmatriculations = getReferentialService().getBoatsFromImmatriculations(updateWaoUserCommand.getCanReadBoats()); + waoUser.setCanReadBoats(boatsFromImmatriculations); + } + + String newPassword; + switch (updateWaoUserCommand.getPasswordStrategy()) { + case GENERATE_NEW_PASSWORD: + newPassword = newRandomPassword(); + break; + case DEFINE_PASSWORD: + newPassword = updateWaoUserCommand.getClearPassword(); + break; + default: + newPassword = null; + } + + if (newPassword != null) { + String hashedNewPassword = StringUtil.encodeMD5(newPassword); + waoUser.setPassword(hashedNewPassword); + } + + if (updateWaoUserCommand.getPasswordStrategy().isGeneratePassword()) { + UserCredentialsEmail userCredentialsEmail = + new UserCredentialsEmail(getLocale()); + userCredentialsEmail.addTo(waoUser); + userCredentialsEmail.setWaoUser(waoUser); + userCredentialsEmail.setNewPassword(newPassword); + getEmailService().send(userCredentialsEmail); + } + + if (waoUser.isUserProfileNotEmpty()) { + for (UserProfile userProfile : waoUser.getUserProfile()) { + if (StringUtils.isBlank(userProfile.getToken())) { + userProfile.setToken(newUserProfileToken()); + } + } + } + + WaoUserTopiaDao dao = getWaoUserDao(); + if (waoUser.isPersisted()) { + dao.update(waoUser); + } else { + dao.create(waoUser); + } + commit(); + + } + + protected String newRandomPassword() { + + return RandomStringUtils.random(8, true, true); + + } + + protected String newUserProfileToken() { + + return serviceContext.newUuid(); + + } + + public void deleteWaoUser(String waoUserId) throws IllegalDeletionException { + + WaoUserTopiaDao dao = getWaoUserDao(); + + WaoUser waoUser = dao.findByTopiaId(waoUserId); + + Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> allUsages = dao.findAllUsages(waoUser); + + if (allUsages.isEmpty()) { + dao.delete(waoUser); + } else { + throw new IllegalDeletionException(allUsages.keySet()); + } + + commit(); + + } + +} Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/EmailService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/EmailService.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/EmailService.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,113 @@ +package fr.ifremer.wao.services.service.mail; + +import com.github.mustachejava.DefaultMustacheFactory; +import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheFactory; +import com.google.common.base.Charsets; +import fr.ifremer.wao.WaoApplicationConfig; +import fr.ifremer.wao.WaoTechnicalException; +import fr.ifremer.wao.services.service.WaoServiceSupport; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.mail.Email; +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.SimpleEmail; + +import java.io.StringWriter; +import java.util.Locale; + +public class EmailService extends WaoServiceSupport { + + private static final Log log = LogFactory.getLog(EmailService.class); + + public void send(WaoMail mail) { + + if (getApplicationConfig().isDevMode()) { + + if (log.isInfoEnabled()) { + log.info("an email should have been sent if not in devMode: tos = " + + mail.getTos() + ". subject = '" + mail.getSubject() + "'. body = \n" + getBody(mail)); + } + + if (log.isWarnEnabled()) { + if ( ! mail.isRecipientProvided()) { + log.warn("email has no recipient, would not have been sent " + mail); + } + } + + } else { + + doSend(mail); + + } + + } + + protected void doSend(WaoMail mail) { + + WaoApplicationConfig applicationConfig = getApplicationConfig(); + + String body = getBody(mail); + + if (mail.isRecipientProvided()) { + + Email newEmail = new SimpleEmail(); + + newEmail.setHostName(applicationConfig.getSmtpHost()); + + newEmail.setSmtpPort(applicationConfig.getSmtpPort()); + + newEmail.setCharset(Charsets.UTF_8.name()); + + newEmail.setSubject(mail.getSubject()); + + try { + + newEmail.setFrom(applicationConfig.getSmtpFrom()); + + for (String to : mail.getTos()) { + newEmail.addTo(to); + } + + for (String bcc : mail.getBccs()) { + newEmail.addBcc(bcc); + } + + newEmail.setMsg(body); + + newEmail.send(); + + } catch (EmailException e) { + throw new WaoTechnicalException(e); + } + + } else { + + if (log.isErrorEnabled()) { + log.error("email has no recipient, won't be sent " + mail); + } + + } + + } + + /** On utilise le modèle Mustache */ + protected String getBody(WaoMail mail) { + + Locale locale = getLocale(); + + MustacheFactory mustacheFactory = new DefaultMustacheFactory(); + + String templateName = "email/" + mail.getClass().getSimpleName() + "_" + locale.toLanguageTag() + ".mustache"; + + Mustache mustache = mustacheFactory.compile(templateName); + + StringWriter stringWriter = new StringWriter(); + + mustache.execute(stringWriter, mail); + + return stringWriter.toString(); + + } + +} \ No newline at end of file Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/UserCredentialsEmail.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/UserCredentialsEmail.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/UserCredentialsEmail.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,39 @@ +package fr.ifremer.wao.services.service.mail; + +import fr.ifremer.wao.entity.WaoUser; +import org.nuiton.i18n.I18n; + +import java.util.Locale; + +public class UserCredentialsEmail extends WaoMail { + + protected WaoUser waoUser; + + protected String newPassword; + + public UserCredentialsEmail(Locale locale) { + super(locale); + } + + @Override + public String getSubject() { + return I18n.l(locale, "fr.ifremer.wao.services.service.mail.UserCredentialsEmail.subject"); + } + + public void setWaoUser(WaoUser waoUser) { + this.waoUser = waoUser; + } + + public WaoUser getWaoUser() { + return waoUser; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + public String getNewPassword() { + return newPassword; + } + +} Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/WaoMail.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/WaoMail.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/mail/WaoMail.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,69 @@ +package fr.ifremer.wao.services.service.mail; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Sets; +import fr.ifremer.wao.entity.WaoUser; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; + +import java.util.Locale; +import java.util.Set; + +public abstract class WaoMail { + + protected Locale locale; + + protected Set<String> tos; + + protected Set<String> bccs; + + public WaoMail(Locale locale) { + this.locale = locale; + } + + public Set<String> getTos() { + if (tos == null) { + tos = Sets.newHashSet(); + } + return tos; + } + + public void addTo(String email) { + getTos().add(email); + } + + public void addTo(WaoUser waoUser) { + Preconditions.checkArgument(waoUser.isActive()); + addTo(waoUser.getLogin()); + } + + public abstract String getSubject(); + + public Set<String> getBccs() { + if (bccs == null) { + bccs = Sets.newHashSet(); + } + return bccs; + } + + public void addBcc(String email) { + getBccs().add(email); + } + + public void addBcc(WaoUser waoUser) { + Preconditions.checkArgument(waoUser.isActive()); + addBcc(waoUser.getLogin()); + } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this); + } + + public boolean isRecipientProvided() { + boolean isRecipientProvided = CollectionUtils.isNotEmpty(getBccs()) + || CollectionUtils.isNotEmpty(getTos()); + return isRecipientProvided; + } + +} Added: trunk/wao-services/src/main/resources/email/UserCredentialsEmail_en_GB.mustache =================================================================== --- trunk/wao-services/src/main/resources/email/UserCredentialsEmail_en_GB.mustache (rev 0) +++ trunk/wao-services/src/main/resources/email/UserCredentialsEmail_en_GB.mustache 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,14 @@ +Hi {{waoUser.fullName}}, + +Your credentials have been updated. + +Your login: {{waoUser.login}} + +Your password: {{newPassword}} + +You can change your password online. + +Regards. + +-- +The WAO team. Added: trunk/wao-services/src/main/resources/email/UserCredentialsEmail_fr-FR.mustache =================================================================== --- trunk/wao-services/src/main/resources/email/UserCredentialsEmail_fr-FR.mustache (rev 0) +++ trunk/wao-services/src/main/resources/email/UserCredentialsEmail_fr-FR.mustache 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,14 @@ +Bonjour {{waoUser.firstName}}, + +Vos identifiants de connexion ont changés. + +Votre identifiant : {{waoUser.login}} + +Votre mot de passe : {{newPassword}} + +Vous pouvez modifier ce mot de passe depuis le logiciel. + +Cordialement. + +-- +L'équipe WAO. Modified: trunk/wao-services/src/main/resources/i18n/wao-services_en_GB.properties =================================================================== --- trunk/wao-services/src/main/resources/i18n/wao-services_en_GB.properties 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/resources/i18n/wao-services_en_GB.properties 2014-03-06 13:50:31 UTC (rev 1715) @@ -8,6 +8,7 @@ csv.import.error.unableToSetValue=Unable to set value '%s' (entity '%s', line %s, column '%s') csv.import.error.unrecognizedHeaders=Fields %s are not recognized. Accepted fields are %s. csv.import.logComment=Edited through import +fr.ifremer.wao.services.service.mail.UserCredentialsEmail.subject=Your Wao credentials wao.business.boat.validation.immatriculation.wrongFormat=The boat registry number must be composed of 6 digits wao.business.contact.validation.commentAdminNecessaryForDataReliability=You must precise in admin comment why data reliability is '%s' wao.business.contact.validation.commentMissingForState=You must give a comment for state '%s' Modified: trunk/wao-services/src/main/resources/i18n/wao-services_fr_FR.properties =================================================================== --- trunk/wao-services/src/main/resources/i18n/wao-services_fr_FR.properties 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/main/resources/i18n/wao-services_fr_FR.properties 2014-03-06 13:50:31 UTC (rev 1715) @@ -8,6 +8,7 @@ csv.import.error.unableToSetValue=Impossible d'enregistrer la valeur '%s' (entité '%s', ligne %s, column '%s') csv.import.error.unrecognizedHeaders=Les champs %s ne sont pas reconnus. Les champs possibles sont %s. csv.import.logComment=Modification depuis import +fr.ifremer.wao.services.service.mail.UserCredentialsEmail.subject=Informations de connexion Wao wao.business.boat.validation.immatriculation.wrongFormat=L'immatriculation du navire doit être formée de 6 chiffres wao.business.contact.validation.commentAdminNecessaryForDataReliability=Il faut préciser dans le commentaire administrateur pourquoi la donnée est '%s' wao.business.contact.validation.commentMissingForState=Il faut préciser un commentaire pour l'état '%s' Modified: trunk/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoServiceContext.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoServiceContext.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoServiceContext.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -5,6 +5,7 @@ import org.apache.commons.logging.LogFactory; import java.util.Date; +import java.util.Locale; import java.util.Random; public class FakeWaoServiceContext extends DefaultWaoServiceContext { @@ -33,4 +34,10 @@ public void setDate(Date date) { this.date = date; } + + @Override + public Locale getLocale() { + return Locale.FRANCE; + } + } Modified: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -2,6 +2,7 @@ import fr.ifremer.wao.entity.Boat; import fr.ifremer.wao.services.AbstractWaoServiceTest; +import fr.ifremer.wao.services.service.administration.ReferentialService; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; Added: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/WaoUsersServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/WaoUsersServiceTest.java (rev 0) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/WaoUsersServiceTest.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,32 @@ +package fr.ifremer.wao.services.service.administration; + +import fr.ifremer.wao.services.AbstractWaoServiceTest; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Before; +import org.junit.Test; + +public class WaoUsersServiceTest extends AbstractWaoServiceTest { + + private static final Log log = LogFactory.getLog(WaoUsersServiceTest.class); + + protected WaoUsersService service; + + @Before + public void setUp() { + + service = newService(WaoUsersService.class); + + } + + @Test + public void testNewPassword() { + + if (log.isDebugEnabled()) { + log.debug(service.newRandomPassword()); + log.debug(service.newRandomPassword()); + log.debug(service.newRandomPassword()); + } + + } +} Added: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/mail/EmailServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/mail/EmailServiceTest.java (rev 0) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/mail/EmailServiceTest.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -0,0 +1,36 @@ +package fr.ifremer.wao.services.service.mail; + +import fr.ifremer.wao.entity.WaoUserImpl; +import fr.ifremer.wao.services.AbstractWaoServiceTest; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Locale; + +public class EmailServiceTest extends AbstractWaoServiceTest { + + protected EmailService service; + + @Before + public void setUp() { + + service = newService(EmailService.class); + + } + + @Test + public void testGetBody() { + + UserCredentialsEmail mail = new UserCredentialsEmail(Locale.FRANCE); + mail.setWaoUser(new WaoUserImpl()); + mail.setNewPassword("taiste"); + + String body = service.getBody(mail); + + Assert.assertTrue(body.contains("taiste")); + Assert.assertTrue(body.contains("Bonjour")); + + } + +} Deleted: trunk/wao-web/src/main/java/fr/ifremer/wao/web/AuthenticatedWaoUser.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/AuthenticatedWaoUser.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/AuthenticatedWaoUser.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,41 +0,0 @@ -package fr.ifremer.wao.web; - -import fr.ifremer.wao.entity.WaoUser; -import org.apache.shiro.SecurityUtils; -import org.apache.shiro.subject.Subject; - -public class AuthenticatedWaoUser { - - protected WaoUser waoUser; - - protected transient WaoPermissions permissions; - - public AuthenticatedWaoUser(WaoUser waoUser) { - this.waoUser = waoUser; - } - - protected WaoPermissions getPermissions() { - if (permissions == null) { - permissions = new WaoPermissions(); - } - return permissions; - } - - protected boolean isPermitted(String permission) { - return getCurrentUser().isPermitted(permission); - } - - protected Subject getCurrentUser() { - Subject currentUser = SecurityUtils.getSubject(); - return currentUser; - } - - public WaoUser getWaoUser() { - return waoUser; - } - - public void logout() { - getCurrentUser().logout(); - } - -} Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoApplicationContext.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoApplicationContext.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoApplicationContext.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -51,7 +51,7 @@ } - public WaoServiceContext newServiceContext(WaoTopiaPersistenceContext persistenceContext) { + public WaoServiceContext newServiceContext(WaoTopiaPersistenceContext persistenceContext, Locale locale) { DefaultWaoServiceContext newServiceContext = new DefaultWaoServiceContext(); @@ -67,6 +67,8 @@ newServiceContext.setWebApplicationContext(webApplicationContext); + newServiceContext.setLocale(locale); + return newServiceContext; } @@ -121,7 +123,7 @@ WaoTopiaPersistenceContext persistenceContext = newPersistenceContext(); - WaoServiceContext serviceContext = newServiceContext(persistenceContext); + WaoServiceContext serviceContext = newServiceContext(persistenceContext, Locale.FRANCE); InitWaoService initWaoService = serviceContext.newService(InitWaoService.class); Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoInterceptor.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoInterceptor.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoInterceptor.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -13,6 +13,7 @@ import org.nuiton.util.beans.BeanUtil; import java.beans.PropertyDescriptor; +import java.util.Locale; import java.util.Set; public class WaoInterceptor implements Interceptor { @@ -37,17 +38,19 @@ if (action instanceof WaoActionSupport) { - WaoActionSupport encAhiAction = (WaoActionSupport) action; + WaoActionSupport waoAction = (WaoActionSupport) action; - WaoServiceContext serviceContext = newServiceContext(invocation); + Locale locale = waoAction.getLocale(); + WaoServiceContext serviceContext = newServiceContext(invocation, locale); + WaoSession waoSession = getWaoSession(invocation); if (CollectionUtils.isNotEmpty(waoSession.getMessages())) { for (String message : waoSession.getMessages()) { - encAhiAction.addActionMessage(message); + waoAction.addActionMessage(message); } @@ -59,7 +62,7 @@ for (String message : waoSession.getErrorMessages()) { - encAhiAction.addActionError(message); + waoAction.addActionError(message); } @@ -155,14 +158,14 @@ } - protected WaoServiceContext newServiceContext(ActionInvocation invocation) { + protected WaoServiceContext newServiceContext(ActionInvocation invocation, Locale locale) { WaoApplicationContext waoApplicationContext = getWaoApplicationContext(invocation); WaoTopiaPersistenceContext persistenceContext = waoApplicationContext.newPersistenceContext(); WaoServiceContext serviceContext = - waoApplicationContext.newServiceContext(persistenceContext); + waoApplicationContext.newServiceContext(persistenceContext, locale); return serviceContext; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoJspActionSupport.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoJspActionSupport.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoJspActionSupport.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,6 +1,7 @@ package fr.ifremer.wao.web; import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.services.AuthenticatedWaoUser; public class WaoJspActionSupport extends WaoActionSupport { @@ -12,8 +13,12 @@ return applicationConfig.getInstanceDisclaimer(); } + public AuthenticatedWaoUser getAuthenticatedWaoUser() { + return getSession().getAuthenticatedWaoUser(); + } + public ObsProgram getObsProgram() { - return ObsProgram.OBSMER; + return getAuthenticatedWaoUser().getObsProgram(); } public boolean isObsMer() { Deleted: trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoPermissions.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoPermissions.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoPermissions.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,52 +0,0 @@ -package fr.ifremer.wao.web; - -import com.google.common.collect.Iterables; -import fr.ifremer.wao.WaoTopiaPersistenceContext; -import fr.ifremer.wao.entity.WaoUser; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.persistence.TopiaEntities; -import org.nuiton.topia.persistence.TopiaEntity; - -import java.util.HashSet; -import java.util.Set; - -/** - * Représente tout le système de permissions de l'extranet. - */ -public class WaoPermissions { - - private static final Log log = LogFactory.getLog(WaoPermissions.class); - - protected <E extends TopiaEntity> String getTopiaIds(Iterable<E> topiaEntities) { - Iterable<String> topiaIds = Iterables.transform(topiaEntities, TopiaEntities.getTopiaIdFunction()); - return join(topiaIds); - } - - protected String join(Iterable<String> topiaIds) { - return StringUtils.join(topiaIds, ','); - } - - /** - * Permet d'obtenir toutes les permissions accordée à l'utilisateur donné. - */ - public Set<String> getPermissions(WaoTopiaPersistenceContext topiaPersistenceContext, WaoUser waoUser) { - - Set<String> permissions = new HashSet<>(); - - if (waoUser.isActive()) { - - - - } - - if (log.isDebugEnabled()) { - log.debug("permissions for " + waoUser + " are " + permissions); - } - - return permissions; - - } - -} Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoRealm.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoRealm.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoRealm.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -7,6 +7,7 @@ import fr.ifremer.wao.WaoTopiaPersistenceContext; import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.entity.WaoUserTopiaDao; +import fr.ifremer.wao.services.WaoPermissions; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.shiro.authc.AuthenticationException; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoSession.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoSession.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoSession.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,6 +1,12 @@ package fr.ifremer.wao.web; import com.google.common.collect.Lists; +import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.UserProfileImpl; +import fr.ifremer.wao.entity.UserRole; +import fr.ifremer.wao.entity.WaoUser; +import fr.ifremer.wao.entity.WaoUserImpl; +import fr.ifremer.wao.services.AuthenticatedWaoUser; import java.io.Serializable; import java.util.Collection; @@ -43,6 +49,13 @@ } public AuthenticatedWaoUser getAuthenticatedWaoUser() { + if (authenticatedWaoUser == null) { + WaoUser waoUser = new WaoUserImpl(); + UserProfileImpl userProfile = new UserProfileImpl(); + userProfile.setObsProgram(ObsProgram.OBSMER); + userProfile.setUserRole(UserRole.ADMIN); + authenticatedWaoUser = new AuthenticatedWaoUser(waoUser, userProfile); + } return authenticatedWaoUser; } Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/AbstractImportReferentialAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/AbstractImportReferentialAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/AbstractImportReferentialAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -3,7 +3,7 @@ import com.google.common.collect.ImmutableSet; import fr.ifremer.wao.WaoTechnicalException; import fr.ifremer.wao.services.service.ImportErrorException; -import fr.ifremer.wao.services.service.ReferentialService; +import fr.ifremer.wao.services.service.administration.ReferentialService; import fr.ifremer.wao.web.WaoJspActionSupport; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; @@ -92,10 +92,7 @@ log.warn("content type " + csvFileContentType + " is not CSV compatible"); } - // TODO brendan 28/02/14 i18n - session.addErrorMessages( - "il faut fournir un fichier de type CSV (type détecté : " - + csvFileContentType + ")"); + session.addErrorMessages(t("wao.ui.import.csvTypeRequired", csvFileContentType)); result = ERROR; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/CompaniesAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/CompaniesAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/CompaniesAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -2,7 +2,7 @@ import com.opensymphony.xwork2.Preparable; import fr.ifremer.wao.entity.Company; -import fr.ifremer.wao.services.service.CompaniesService; +import fr.ifremer.wao.services.service.administration.CompaniesService; import fr.ifremer.wao.web.WaoJspActionSupport; import java.util.List; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteCompanyAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteCompanyAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteCompanyAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,6 +1,6 @@ package fr.ifremer.wao.web.action.administration; -import fr.ifremer.wao.services.service.CompaniesService; +import fr.ifremer.wao.services.service.administration.CompaniesService; import fr.ifremer.wao.services.service.IllegalDeletionException; import fr.ifremer.wao.web.WaoJspActionSupport; import org.apache.struts2.convention.annotation.Result; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteWaoUserAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteWaoUserAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteWaoUserAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,7 +1,7 @@ package fr.ifremer.wao.web.action.administration; import fr.ifremer.wao.services.service.IllegalDeletionException; -import fr.ifremer.wao.services.service.WaoUsersService; +import fr.ifremer.wao.services.service.administration.WaoUsersService; import fr.ifremer.wao.web.WaoJspActionSupport; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditCompanyAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditCompanyAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditCompanyAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -2,7 +2,7 @@ import com.opensymphony.xwork2.Preparable; import fr.ifremer.wao.entity.Company; -import fr.ifremer.wao.services.service.CompaniesService; +import fr.ifremer.wao.services.service.administration.CompaniesService; import fr.ifremer.wao.web.WaoJspActionSupport; import org.apache.commons.lang3.StringUtils; import org.apache.struts2.convention.annotation.Result; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -4,13 +4,14 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import com.opensymphony.xwork2.Preparable; -import fr.ifremer.wao.services.service.UpdateWaoUserCommand; -import fr.ifremer.wao.services.service.UpdateWaoUserCommandPasswordStrategy; -import fr.ifremer.wao.services.service.WaoUsersService; +import fr.ifremer.wao.services.service.administration.UpdateWaoUserCommand; +import fr.ifremer.wao.services.service.administration.UpdateWaoUserCommandPasswordStrategy; +import fr.ifremer.wao.services.service.administration.WaoUsersService; import fr.ifremer.wao.web.WaoJspActionSupport; import org.apache.commons.lang3.StringUtils; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; +import org.nuiton.util.StringUtil; @Results({ @Result(name="success", type="redirectAction", params = { "actionName", "wao-users", "companyId", "%{companyId}" }) @@ -58,11 +59,14 @@ if ( ! updateWaoUserCommand.getClearPassword().equals(updateWaoUserCommand.getClearPasswordConfirmation())) { addFieldError("updateWaoUserCommand.clearPasswordConfirmation", t("wao.ui.form.updateWaoUserCommand.passwordMismatch")); } + } else if (updateWaoUserCommand.getPasswordStrategy().isGeneratePassword()) { + if ( ! StringUtil.isEmail(updateWaoUserCommand.getWaoUser().getLogin())) { + addFieldError("updateWaoUserCommand.waoUser.login", t("wao.ui.form.updateWaoUserCommand.loginMustBeEmail")); + } } if (updateWaoUserCommand.getCompanyId() == null) { addFieldError("updateWaoUserCommand.companyId", t("wao.ui.form.updateWaoUserCommand.requiredCompany")); - } else { } } Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/ReferentialManagementAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/ReferentialManagementAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/ReferentialManagementAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,12 +1,13 @@ package fr.ifremer.wao.web.action.administration; -import fr.ifremer.wao.services.service.ReferentialService; -import fr.ifremer.wao.services.service.ReferentialState; +import com.opensymphony.xwork2.Preparable; +import fr.ifremer.wao.services.service.administration.ReferentialService; +import fr.ifremer.wao.services.service.administration.ReferentialState; import fr.ifremer.wao.web.WaoJspActionSupport; import java.util.List; -public class ReferentialManagementAction extends WaoJspActionSupport { +public class ReferentialManagementAction extends WaoJspActionSupport implements Preparable { protected ReferentialService referentialService; @@ -17,12 +18,10 @@ } @Override - public String execute() { + public void prepare() { referentialStates = referentialService.getReferentialStates(getObsProgram()); - return SUCCESS; - } public List<ReferentialState> getReferentialStates() { Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/WaoUsersAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/WaoUsersAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/WaoUsersAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -4,7 +4,7 @@ import com.google.common.base.Strings; import com.opensymphony.xwork2.Preparable; import fr.ifremer.wao.entity.WaoUser; -import fr.ifremer.wao.services.service.WaoUsersService; +import fr.ifremer.wao.services.service.administration.WaoUsersService; import fr.ifremer.wao.web.WaoJspActionSupport; import java.util.List; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/DeleteNewsAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/DeleteNewsAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/DeleteNewsAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,6 +1,6 @@ package fr.ifremer.wao.web.action.obsmer; -import fr.ifremer.wao.services.service.NewsService; +import fr.ifremer.wao.services.service.administration.NewsService; import fr.ifremer.wao.web.WaoJspActionSupport; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditNewsAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditNewsAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditNewsAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -2,7 +2,7 @@ import com.opensymphony.xwork2.Preparable; import fr.ifremer.wao.entity.News; -import fr.ifremer.wao.services.service.NewsService; +import fr.ifremer.wao.services.service.administration.NewsService; import fr.ifremer.wao.web.WaoJspActionSupport; import org.apache.commons.lang3.StringUtils; import org.apache.struts2.convention.annotation.Result; @@ -34,7 +34,7 @@ @Override public void prepare() { if (StringUtils.isEmpty(newsId)) { - news = service.newNews(); + news = service.newNews(getAuthenticatedWaoUser()); } else { news = service.getNews(newsId); } @@ -45,8 +45,7 @@ service.save(news); - // TODO brendan 03/03/14 i18n - addActionMessage("Actualité enregistrée"); + addActionMessage(t("wao.ui.action.createNews.success")); return SUCCESS; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/NewsAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/NewsAction.java 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/NewsAction.java 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,10 +1,7 @@ package fr.ifremer.wao.web.action.obsmer; import fr.ifremer.wao.entity.News; -import fr.ifremer.wao.entity.ObsProgram; -import fr.ifremer.wao.entity.UserProfileImpl; -import fr.ifremer.wao.entity.UserRole; -import fr.ifremer.wao.services.service.NewsService; +import fr.ifremer.wao.services.service.administration.NewsService; import fr.ifremer.wao.web.WaoJspActionSupport; import java.util.List; @@ -22,12 +19,10 @@ @Override public String execute() { - UserProfileImpl userProfile = new UserProfileImpl(); - userProfile.setObsProgram(ObsProgram.OBSMER); - userProfile.setUserRole(UserRole.ADMIN); - recentNews = service.getRecentNews(userProfile, 15); + recentNews = service.getRecentNews(getAuthenticatedWaoUser(), 15); return SUCCESS; + } public List<News> getRecentNews() { Modified: trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties =================================================================== --- trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-06 13:50:31 UTC (rev 1715) @@ -25,6 +25,8 @@ wao.ui.action.contactAdmin=Contact an admin wao.ui.action.create=Create wao.ui.action.createCompany=Create a company +wao.ui.action.createNews=Create news +wao.ui.action.createNews.success=News created wao.ui.action.createWaoUser=Create a user wao.ui.action.delete=Delete wao.ui.action.deleteCompany=Delete company @@ -235,6 +237,7 @@ wao.ui.form.updateWaoUserCommand.coordinatorReadOnly=Coordinator (read-only) wao.ui.form.updateWaoUserCommand.guest=Guest wao.ui.form.updateWaoUserCommand.guestReadOnly=Guest (read-only) +wao.ui.form.updateWaoUserCommand.loginMustBeEmail=The login must be a valid email address wao.ui.form.updateWaoUserCommand.missingPassword=The password is missing wao.ui.form.updateWaoUserCommand.observer=Observer wao.ui.form.updateWaoUserCommand.observerReadOnly=Observer (read-only) @@ -248,6 +251,7 @@ wao.ui.import.boatGroupsLabel=of the boat groups wao.ui.import.boatsLabel=of boats wao.ui.import.contactStateMotivesLabel=of the contact state motives +wao.ui.import.csvTypeRequired=You must provide a CSV-compatible file (detected format is %s) wao.ui.import.description=File %s %s \: wao.ui.import.disclaimer=You must upload CSV files using ";" as seperator and UTF-8 as character encoding wao.ui.import.fishingZoneLabel=of fishing zones Modified: trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties =================================================================== --- trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-06 13:50:31 UTC (rev 1715) @@ -1,6 +1,6 @@ -fr.ifremer.wao.services.service.ReferentialState.lastUpdate=Date de dernière mise à jour -fr.ifremer.wao.services.service.ReferentialState.referentialName=Référentiel -fr.ifremer.wao.services.service.ReferentialState.size=Nombre de lignes en base +fr.ifremer.wao.services.service.administration.ReferentialState.lastUpdate=Date de dernière mise à jour +fr.ifremer.wao.services.service.administration.ReferentialState.referentialName=Référentiel +fr.ifremer.wao.services.service.administration.ReferentialState.size=Nombre de lignes en base wao.import.boatGroups.prompt=Import des flotilles wao.import.boatGroups.success=Import des flotilles réalisé avec succès wao.import.boats.prompt=Import des navires @@ -25,6 +25,8 @@ wao.ui.action.contactAdmin=Contacter un responsable ObsMer wao.ui.action.create=Créer wao.ui.action.createCompany=Créer une société +wao.ui.action.createNews=Créer une actualité +wao.ui.action.createNews.success=Actualité enregistrée avec succès wao.ui.action.createWaoUser=Créer un utilisateur wao.ui.action.delete=Supprimer wao.ui.action.deleteCompany=Supprimer la société @@ -235,6 +237,7 @@ wao.ui.form.updateWaoUserCommand.coordinatorReadOnly=Coordinateur (lecture seule) wao.ui.form.updateWaoUserCommand.guest=Invité wao.ui.form.updateWaoUserCommand.guestReadOnly=Invité (lecture seule) +wao.ui.form.updateWaoUserCommand.loginMustBeEmail=Il faut utiliser un email valide comme identifiant wao.ui.form.updateWaoUserCommand.missingPassword=Il faut renseigner un mot de passe wao.ui.form.updateWaoUserCommand.observer=Observateur wao.ui.form.updateWaoUserCommand.observerReadOnly=Observateur (lecture seule) @@ -248,6 +251,7 @@ wao.ui.import.boatGroupsLabel=des strates des navires wao.ui.import.boatsLabel=des navires wao.ui.import.contactStateMotivesLabel=des motifs de refus +wao.ui.import.csvTypeRequired=Il faut fournir un fichier de type CSV (type détecté \: %s) wao.ui.import.description=Fichier %s %s \: wao.ui.import.disclaimer=Veuillez utiliser des fichiers CSV utilisant « ; » comme séparateur et UTF-8 comme encodage de caractères. wao.ui.import.fishingZoneLabel=des zones de pêches Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp 2014-03-06 13:50:31 UTC (rev 1715) @@ -9,13 +9,13 @@ <s:hidden name="companyId" value="%{companyId}" /> - <s:textfield name="company.name" label="%{getText('wao.ui.field.Company.name')}" requiredLabel="true" cssClass="input-xxlarge" /> - <s:textfield name="company.address1" label="%{getText('wao.ui.field.Company.address1')}" cssClass="input-xxlarge" /> - <s:textfield name="company.address2" label="%{getText('wao.ui.field.Company.address2')}" cssClass="input-xxlarge" /> - <s:textfield name="company.postalCode" label="%{getText('wao.ui.field.Company.postalCode')}" cssClass="input-xxlarge" /> - <s:textfield name="company.city" label="%{getText('wao.ui.field.Company.city')}" cssClass="input-xxlarge" /> + <s:textfield name="company.name" label="%{getText('wao.ui.field.Company.name')}" requiredLabel="true" cssClass="input-xlarge" /> + <s:textfield name="company.address1" label="%{getText('wao.ui.field.Company.address1')}" cssClass="input-xlarge" /> + <s:textfield name="company.address2" label="%{getText('wao.ui.field.Company.address2')}" cssClass="input-xlarge" /> + <s:textfield name="company.postalCode" label="%{getText('wao.ui.field.Company.postalCode')}" cssClass="input-small" /> + <s:textfield name="company.city" label="%{getText('wao.ui.field.Company.city')}" cssClass="input-xlarge" /> <s:textfield name="company.phoneNumber" label="%{getText('wao.ui.field.Company.phoneNumber')}" size="14" /> - <s:textfield type="email" name="company.email" label="%{getText('wao.ui.field.Company.email')}" cssClass="input-xxlarge" /> + <s:textfield type="email" name="company.email" label="%{getText('wao.ui.field.Company.email')}" cssClass="input-xlarge" /> <s:checkbox name="company.active" label="%{getText('wao.ui.field.Company.active')}" /> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp 2014-03-06 13:50:31 UTC (rev 1715) @@ -49,13 +49,14 @@ <legend><s:text name="wao.ui.form.WaoUser.identity" /></legend> - <s:textfield name="updateWaoUserCommand.waoUser.firstName" label="%{getText('wao.ui.field.WaoUser.firstName')}" /> - <s:textfield name="updateWaoUserCommand.waoUser.lastName" label="%{getText('wao.ui.field.WaoUser.lastName')}" /> + <s:textfield name="updateWaoUserCommand.waoUser.firstName" label="%{getText('wao.ui.field.WaoUser.firstName')}" requiredLabel="true" /> + <s:textfield name="updateWaoUserCommand.waoUser.lastName" label="%{getText('wao.ui.field.WaoUser.lastName')}" requiredLabel="true" /> <s:select name="updateWaoUserCommand.companyId" label="%{getText('wao.ui.entity.Company')}" list="updateWaoUserCommand.allCompanies" listValue="%{value.name}" - cssClass="input-xxlarge"/> + requiredLabel="true" + cssClass="input-xxlarge" /> <s:checkbox name="updateWaoUserCommand.waoUser.active" label="%{getText('wao.ui.field.WaoUser.active')}" /> </fieldset> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp 2014-03-06 13:50:31 UTC (rev 1715) @@ -9,8 +9,7 @@ <s:url action="edit-news!input" id="createNewsUrl" /> <s:a href="%{createNewsUrl}"> - <%-- TODO i18n --%> - <i class="icon-plus"></i> Ajouter une actualité + <i class="icon-plus"></i> <s:text name="wao.ui.action.createNews" /> </s:a> <s:iterator value="recentNews"> Modified: trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-03-05 14:29:43 UTC (rev 1714) +++ trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-03-06 13:50:31 UTC (rev 1715) @@ -100,7 +100,13 @@ </s:a> </li> <li> - <a href="#"><i class="icon-user"></i> <s:text name="wao.ui.page.UserProfileForm.title" /></a> + + <s:url namespace="/administration" action="edit-wao-user!input" id="editWaoUserUrl"> + <s:param name="waoUserId" value="waoUserId" /> + </s:url> + <s:a href="%{editWaoUserUrl}"> + <i class="icon-user"></i> <s:text name="wao.ui.page.UserProfileForm.title" /> + </s:a> </li> <li> <a href="#"><i class="icon-off"></i> <s:text name="wao.ui.action.logout" /></a>
participants (1)
-
bleny@users.forge.codelutin.com