Wao-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
March 2014
- 3 participants
- 90 discussions
12 Mar '14
Author: bleny
Date: 2014-03-12 14:39:15 +0100 (Wed, 12 Mar 2014)
New Revision: 1718
Url: http://forge.codelutin.com/projects/wao/repository/revisions/1718
Log:
refs #4483 in edit-sample-row form add observation effort and program
Added:
trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java
trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/ReferentialServiceTest.java
trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/MonthConverter.java
trunk/wao-web/src/main/resources/fr/
trunk/wao-web/src/main/resources/fr/ifremer/
trunk/wao-web/src/main/resources/fr/ifremer/wao/
trunk/wao-web/src/main/resources/fr/ifremer/wao/entity/
trunk/wao-web/src/main/resources/fr/ifremer/wao/entity/SampleRow-conversion.properties
Removed:
trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java
Modified:
trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java
trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleMonthImpl.java
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java
trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java
trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-sample-row-input.jsp
Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java
===================================================================
--- trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java 2014-03-11 13:44:08 UTC (rev 1717)
+++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -3,6 +3,7 @@
import fr.ifremer.wao.entity.ObsProgram;
import java.text.DateFormat;
+import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;
@@ -38,7 +39,13 @@
return dateFormat.format(date);
}
+ public static Date parseMonth(String monthYear) throws ParseException {
+ DateFormat dateFormat = new SimpleDateFormat(MONTH_PATTERN);
+ return dateFormat.parse(monthYear);
+ }
+
public static Pattern getSampleRowCodePattern(ObsProgram obsProgram) {
return Pattern.compile("^(\\d{4})_" + obsProgram.getShortCode() + "(\\d{4})$");
}
+
}
Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleMonthImpl.java
===================================================================
--- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleMonthImpl.java 2014-03-11 13:44:08 UTC (rev 1717)
+++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleMonthImpl.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -24,6 +24,7 @@
package fr.ifremer.wao.entity;
+import com.google.common.base.Objects;
import fr.ifremer.wao.WaoUtils;
import java.util.Date;
@@ -43,4 +44,9 @@
return periodDatesContains;
}
+ @Override
+ public String toString() {
+ String toString = Objects.toStringHelper(this).add(PROPERTY_PERIOD_DATE, WaoUtils.formatMonth(periodDate)).toString();
+ return toString;
+ }
}
Added: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java
===================================================================
--- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java (rev 0)
+++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -0,0 +1,18 @@
+package fr.ifremer.wao.entity;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableMap;
+
+public class SampleRowTopiaDao extends AbstractSampleRowTopiaDao<SampleRow> {
+
+ public Optional<String> findMaxSampleRowCode(String sampleRowCodePrefix) {
+ String hql = "select max(sr.code) "
+ + newFromClause("sr")
+ + " where sr.code like :sampleRowCodePattern";
+ ImmutableMap<String, String> hqlParameters =
+ ImmutableMap.of("sampleRowCodePattern", sampleRowCodePrefix + "%");
+ Optional<String> optionalMaxSampleRowCode = tryFindUnique(hql, (ImmutableMap) hqlParameters);
+ return optionalMaxSampleRowCode;
+ }
+
+}
Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java
===================================================================
--- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java 2014-03-11 13:44:08 UTC (rev 1717)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -15,6 +15,8 @@
import fr.ifremer.wao.entity.ObsProgram;
import fr.ifremer.wao.entity.ProfessionImpl;
import fr.ifremer.wao.entity.SampleMonth;
+import fr.ifremer.wao.entity.SampleMonthImpl;
+import fr.ifremer.wao.entity.SampleMonthTopiaDao;
import fr.ifremer.wao.entity.SampleRow;
import fr.ifremer.wao.entity.SampleRowImpl;
import fr.ifremer.wao.entity.SampleRowLog;
@@ -28,11 +30,14 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.topia.persistence.TopiaEntities;
+import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
public class ObsMerSamplingPlanService extends WaoServiceSupport {
@@ -163,8 +168,6 @@
public void preValidate(AuthenticatedWaoUser authenticatedWaoUser, UpdateSampleRowCommand updateSampleRowCommand) {
- // TODO brendan 10/03/14 mettre à jour les codes DCF5
-
String elligibleBoatImmatriculations = updateSampleRowCommand.getElligibleBoatImmatriculations();
List<Boat> elligibleBoats = getReferentialService().getBoatsFromImmatriculations(elligibleBoatImmatriculations);
@@ -202,6 +205,51 @@
sampleRow.cleardCF5Code();
sampleRow.addAlldCF5Code(getReferentialService().getDcf5Codes(dcf5Codes));
+ SampleMonthTopiaDao sampleMonthDao = getSampleMonthDao();
+
+ Set<SampleMonth> sampleMonthsToRemove = new HashSet<>(sampleRow.getSampleMonth());
+ Map<String, Integer> expectedObservationsByMonths = updateSampleRowCommand.getExpectedObservationsByMonths();
+ for (Map.Entry<String, Integer> entry : expectedObservationsByMonths.entrySet()) {
+ Date month;
+ try {
+ month = updateSampleRowCommand.monthFormat.parse(entry.getKey());
+ } catch (ParseException e) {
+ throw new IllegalArgumentException(expectedObservationsByMonths.toString(), e);
+ }
+ SampleMonth sampleMonth = sampleRow.getSampleMonth(month);
+ Integer expectedObservations = entry.getValue();
+ if (expectedObservations == null) {
+ if (sampleMonth != null) {
+ // rien à faire, il va être supprimé
+ }
+ } else {
+ if (sampleMonth == null) {
+ sampleMonth = new SampleMonthImpl();
+ sampleMonth.setPeriodDate(month);
+ sampleRow.addSampleMonth(sampleMonth);
+ sampleMonthDao.create(sampleMonth);
+ if (log.isTraceEnabled()) {
+ log.trace("created sample month " + sampleMonth);
+ }
+ } else {
+ sampleMonthsToRemove.remove(sampleMonth);
+ if (log.isTraceEnabled()) {
+ log.trace("will keep " + sampleMonth);
+ }
+ }
+ sampleMonth.setExpectedTidesValue(expectedObservations);
+ sampleMonthDao.update(sampleMonth);
+ }
+ }
+
+ for (SampleMonth sampleMonth : sampleMonthsToRemove) {
+ if (log.isTraceEnabled()) {
+ log.trace("will remove " + sampleMonth);
+ }
+ sampleRow.removeSampleMonth(sampleMonth);
+ sampleMonthDao.delete(sampleMonth);
+ }
+
}
public void save(UpdateSampleRowCommand updateSampleRowCommand) {
Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java
===================================================================
--- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java 2014-03-11 13:44:08 UTC (rev 1717)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -6,16 +6,25 @@
import com.google.common.collect.Sets;
import fr.ifremer.wao.entity.Company;
import fr.ifremer.wao.entity.FishingZone;
+import fr.ifremer.wao.entity.SampleMonth;
import fr.ifremer.wao.entity.SampleRow;
import fr.ifremer.wao.entity.SampleRowLog;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.nuiton.topia.persistence.TopiaEntities;
+import org.nuiton.util.PeriodDates;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.Set;
public class UpdateSampleRowCommand {
+ protected DateFormat monthFormat = new SimpleDateFormat("YYYYMM");
+
protected boolean creation;
protected SampleRow sampleRow;
@@ -30,6 +39,32 @@
protected String dcf5Codes;
+ /**
+ * La clé est un mois au format YYYY-MM
+ */
+ protected Map<String, Integer> expectedObservationsByMonths;
+
+ public Map<String, Integer> getExpectedObservationsByMonths() {
+ if (expectedObservationsByMonths == null) {
+ expectedObservationsByMonths = new LinkedHashMap<>();
+ Date periodBegin = sampleRow.getPeriodBegin();
+ Date periodEnd = sampleRow.getPeriodEnd();
+ for (Date month : new PeriodDates(periodBegin, periodEnd).getMonths()) {
+ SampleMonth sampleMonth = sampleRow.getSampleMonth(month);
+ Integer expectedObservations = null;
+ if (sampleMonth != null) {
+ expectedObservations = sampleMonth.getExpectedTidesValue();
+ }
+ expectedObservationsByMonths.put(monthFormat.format(month), expectedObservations);
+ }
+ }
+ return expectedObservationsByMonths;
+ }
+
+ public void setExpectedObservationsByMonths(Map<String, Integer> expectedObservationsByMonths) {
+ this.expectedObservationsByMonths = expectedObservationsByMonths;
+ }
+
public String getCompanyId() {
String companyId = null;
if (sampleRow.getCompany() != null) {
Modified: 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/ReferentialService.java 2014-03-11 13:44:08 UTC (rev 1717)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -27,7 +27,6 @@
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import fr.ifremer.wao.WaoTechnicalException;
import fr.ifremer.wao.entity.Boat;
@@ -1027,7 +1026,7 @@
if (StringUtils.isNotBlank(joinedDcf5Codes)) {
- String[] splitCodes = joinedDcf5Codes.split("\\s?");
+ Iterable<String> splitCodes = Splitter.onPattern("\\s+").split(joinedDcf5Codes);
for (String code : splitCodes) {
@@ -1039,11 +1038,9 @@
targetSpeciesDCF = getTargetSpeciesDCFDao().forCodeEquals(codeParts[1]).findUnique();
}
- ImmutableMap<String, Object> properties =
- ImmutableMap.of(
- DCF5Code.PROPERTY_FISHING_GEAR_DCF, (Object) fishingGearDCF,
- DCF5Code.PROPERTY_TARGET_SPECIES_DCF, targetSpeciesDCF
- );
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(DCF5Code.PROPERTY_FISHING_GEAR_DCF, fishingGearDCF);
+ properties.put(DCF5Code.PROPERTY_TARGET_SPECIES_DCF, targetSpeciesDCF);
Optional<DCF5Code> optionalDcf5Code = dao.forProperties(properties).tryFindUnique();
Deleted: 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-11 13:44:08 UTC (rev 1717)
+++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -1,154 +0,0 @@
-package fr.ifremer.wao.services.service;
-
-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;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.InputStream;
-import java.util.Collection;
-import java.util.Date;
-
-public class ReferentialServiceTest extends AbstractWaoServiceTest {
-
- private static final Log log = LogFactory.getLog(ReferentialServiceTest.class);
-
- protected ReferentialService service;
-
- @Before
- public void setUp() {
- getServiceContext().setDate(new Date(1393607049651l));
- service = newService(ReferentialService.class);
- }
-
- @Test
- public void testImportFishingZones() {
- InputStream input = null;
- try {
- input = getClass().getResourceAsStream("/import/zonesPeche.csv");
- service.importFishingZones(input);
- } catch (ImportErrorException e) {
- if (log.isDebugEnabled()) {
- log.debug("unexpected exception raised", e);
- }
- Assert.fail("exception should not be raised");
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
-
- @Test
- public void testImportTerrestrialLocations() {
- InputStream input = null;
- try {
- input = getClass().getResourceAsStream("/terrestrialLocations.csv");
- service.importTerrestrialLocations(input);
- } catch (ImportErrorException e) {
- if (log.isDebugEnabled()) {
- log.debug("unexpected exception raised", e);
- }
- Assert.fail("exception should not be raised");
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
-
- @Test
- public void testImportContactStateMotives() {
- testImportTerrestrialLocations();
- InputStream input = null;
- try {
- input = getClass().getResourceAsStream("/motifs.csv");
- service.importContactStateMotives(input);
- } catch (ImportErrorException e) {
- if (log.isDebugEnabled()) {
- log.debug("unexpected exception raised", e);
- }
- Assert.fail("exception should not be raised");
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
-
- @Test
- public void testImportTerrestrialDivisions() {
- testImportTerrestrialLocations();
- InputStream input = null;
- try {
- input = getClass().getResourceAsStream("/import/purifiedTerrestrialDivisions.csv");
- service.importTerrestrialDivisions(input);
- } catch (ImportErrorException e) {
- if (log.isDebugEnabled()) {
- log.debug("unexpected exception raised", e);
- }
- Assert.fail("exception should not be raised");
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
-
- @Test
- public void testImportObsDebCodes() {
- testImportTerrestrialLocations();
- InputStream input = null;
- try {
- input = getClass().getResourceAsStream("/obsDebCodes.csv");
- service.importObsDebCodes(input);
- } catch (ImportErrorException e) {
- if (log.isDebugEnabled()) {
- log.debug("unexpected exception raised", e);
- }
- Assert.fail("exception should not be raised");
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
-
- @Test
- public void testImportBoats() {
- testImportTerrestrialLocations();
- InputStream input = null;
- try {
- input = getClass().getResourceAsStream("/import/navires.csv");
- service.importBoats(input);
- } catch (ImportErrorException e) {
- if (log.isDebugEnabled()) {
- log.debug("unexpected exception raised", e);
- }
- Assert.fail("exception should not be raised");
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
-
- @Test
- public void testImportBoatGroups() {
- testImportBoats();
- InputStream input = null;
- try {
- input = getClass().getResourceAsStream("/import/strates.csv");
- service.importBoatGroups(input);
- } catch (ImportErrorException e) {
- if (log.isDebugEnabled()) {
- log.debug("unexpected exception raised", e);
- }
- Assert.fail("exception should not be raised");
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
-
- @Test
- public void testGetBoatsByImmatriculations() {
- testImportBoats();
- Collection<Boat> boats = service.getBoatsFromImmatriculations("174258, 284595 978419");
- Assert.assertEquals(3, boats.size());
- boats = service.getBoatsFromImmatriculations(" ");
- Assert.assertTrue(boats.isEmpty());
- }
-}
Copied: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/ReferentialServiceTest.java (from rev 1716, trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java)
===================================================================
--- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/ReferentialServiceTest.java (rev 0)
+++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/ReferentialServiceTest.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -0,0 +1,170 @@
+package fr.ifremer.wao.services.service.administration;
+
+import fr.ifremer.wao.entity.Boat;
+import fr.ifremer.wao.entity.DCF5Code;
+import fr.ifremer.wao.services.AbstractWaoServiceTest;
+import fr.ifremer.wao.services.service.ImportErrorException;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Date;
+
+public class ReferentialServiceTest extends AbstractWaoServiceTest {
+
+ private static final Log log = LogFactory.getLog(ReferentialServiceTest.class);
+
+ protected ReferentialService service;
+
+ @Before
+ public void setUp() {
+ getServiceContext().setDate(new Date(1393607049651l));
+ service = newService(ReferentialService.class);
+ }
+
+ @Test
+ public void testImportFishingZones() {
+ InputStream input = null;
+ try {
+ input = getClass().getResourceAsStream("/import/zonesPeche.csv");
+ service.importFishingZones(input);
+ } catch (ImportErrorException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("unexpected exception raised", e);
+ }
+ Assert.fail("exception should not be raised");
+ } finally {
+ IOUtils.closeQuietly(input);
+ }
+ }
+
+ @Test
+ public void testImportTerrestrialLocations() {
+ InputStream input = null;
+ try {
+ input = getClass().getResourceAsStream("/terrestrialLocations.csv");
+ service.importTerrestrialLocations(input);
+ } catch (ImportErrorException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("unexpected exception raised", e);
+ }
+ Assert.fail("exception should not be raised");
+ } finally {
+ IOUtils.closeQuietly(input);
+ }
+ }
+
+ @Test
+ public void testImportContactStateMotives() {
+ testImportTerrestrialLocations();
+ InputStream input = null;
+ try {
+ input = getClass().getResourceAsStream("/motifs.csv");
+ service.importContactStateMotives(input);
+ } catch (ImportErrorException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("unexpected exception raised", e);
+ }
+ Assert.fail("exception should not be raised");
+ } finally {
+ IOUtils.closeQuietly(input);
+ }
+ }
+
+ @Test
+ public void testImportTerrestrialDivisions() {
+ testImportTerrestrialLocations();
+ InputStream input = null;
+ try {
+ input = getClass().getResourceAsStream("/import/purifiedTerrestrialDivisions.csv");
+ service.importTerrestrialDivisions(input);
+ } catch (ImportErrorException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("unexpected exception raised", e);
+ }
+ Assert.fail("exception should not be raised");
+ } finally {
+ IOUtils.closeQuietly(input);
+ }
+ }
+
+ @Test
+ public void testImportObsDebCodes() {
+ testImportTerrestrialLocations();
+ InputStream input = null;
+ try {
+ input = getClass().getResourceAsStream("/obsDebCodes.csv");
+ service.importObsDebCodes(input);
+ } catch (ImportErrorException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("unexpected exception raised", e);
+ }
+ Assert.fail("exception should not be raised");
+ } finally {
+ IOUtils.closeQuietly(input);
+ }
+ }
+
+ @Test
+ public void testImportBoats() {
+ testImportTerrestrialLocations();
+ InputStream input = null;
+ try {
+ input = getClass().getResourceAsStream("/import/navires.csv");
+ service.importBoats(input);
+ } catch (ImportErrorException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("unexpected exception raised", e);
+ }
+ Assert.fail("exception should not be raised");
+ } finally {
+ IOUtils.closeQuietly(input);
+ }
+ }
+
+ @Test
+ public void testImportBoatGroups() {
+ testImportBoats();
+ InputStream input = null;
+ try {
+ input = getClass().getResourceAsStream("/import/strates.csv");
+ service.importBoatGroups(input);
+ } catch (ImportErrorException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("unexpected exception raised", e);
+ }
+ Assert.fail("exception should not be raised");
+ } finally {
+ IOUtils.closeQuietly(input);
+ }
+ }
+
+ @Test
+ public void testGetBoatsByImmatriculations() {
+ testImportBoats();
+ Collection<Boat> boats = service.getBoatsFromImmatriculations("174258, 284595 978419");
+ Assert.assertEquals(3, boats.size());
+ boats = service.getBoatsFromImmatriculations(" ");
+ Assert.assertTrue(boats.isEmpty());
+ }
+
+ @Test
+ public void testGetDcf5Codes() {
+
+ service.initialDCF5CodesImport();
+
+ Collection<DCF5Code> dcf5Codes = service.getDcf5Codes("OTT_DWS OTB_DEF OTB OTT_DEF");
+
+ Assert.assertEquals(4, dcf5Codes.size());
+
+ for (DCF5Code dcf5Code : dcf5Codes) {
+ Assert.assertTrue(dcf5Code.isPersisted());
+ }
+
+ }
+}
Added: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/MonthConverter.java
===================================================================
--- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/MonthConverter.java (rev 0)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/MonthConverter.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -0,0 +1,71 @@
+package fr.ifremer.wao.web.action;
+
+import com.opensymphony.xwork2.conversion.TypeConversionException;
+import fr.ifremer.wao.WaoUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.struts2.util.StrutsTypeConverter;
+
+import java.text.ParseException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Map;
+
+public class MonthConverter extends StrutsTypeConverter {
+
+ @Override
+ public Date convertFromString(Map map, String[] strings, Class aClass) {
+
+ if (strings.length == 1) {
+
+ String string = strings[0];
+
+ Date parsedValue;
+
+ if (StringUtils.isEmpty(string)) {
+
+ parsedValue = null;
+
+ } else {
+
+ try {
+ parsedValue = WaoUtils.parseMonth(string);
+ } catch (ParseException e) {
+ throw new TypeConversionException("strings=" + Arrays.toString(strings));
+ }
+
+ }
+
+ return parsedValue;
+
+ } else {
+ throw new TypeConversionException("strings=" + Arrays.toString(strings));
+ }
+
+ }
+
+ @Override
+ public String convertToString(Map map, Object o) {
+
+ String str;
+
+ if (o == null) {
+
+ str = StringUtils.EMPTY;
+
+ } else {
+
+ if (o instanceof Date) {
+
+ Date date = (Date) o;
+
+ str = WaoUtils.formatMonth(date);
+
+ } else {
+ throw new UnsupportedOperationException("cannot convert to month " + o);
+ }
+ }
+
+ return str;
+
+ }
+}
Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java
===================================================================
--- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java 2014-03-11 13:44:08 UTC (rev 1717)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java 2014-03-12 13:39:15 UTC (rev 1718)
@@ -15,6 +15,8 @@
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
+import java.util.Map;
+
@Results({
@Result(name="success", type="redirectAction", params = { "actionName", "sampling-plan" })
})
@@ -110,4 +112,12 @@
return updateSampleRowCommand;
}
+ public Map<String, Integer> getExpectedObservationsByMonths() {
+ return getUpdateSampleRowCommand().getExpectedObservationsByMonths();
+ }
+
+ public void setExpectedObservationsByMonths(Map<String, Integer> expectedObservationsByMonths) {
+ getUpdateSampleRowCommand().setExpectedObservationsByMonths(expectedObservationsByMonths);
+ }
+
}
\ No newline at end of file
Added: trunk/wao-web/src/main/resources/fr/ifremer/wao/entity/SampleRow-conversion.properties
===================================================================
--- trunk/wao-web/src/main/resources/fr/ifremer/wao/entity/SampleRow-conversion.properties (rev 0)
+++ trunk/wao-web/src/main/resources/fr/ifremer/wao/entity/SampleRow-conversion.properties 2014-03-12 13:39:15 UTC (rev 1718)
@@ -0,0 +1,2 @@
+periodBegin=fr.ifremer.wao.web.action.MonthConverter
+periodEnd=fr.ifremer.wao.web.action.MonthConverter
Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-sample-row-input.jsp
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-sample-row-input.jsp 2014-03-11 13:44:08 UTC (rev 1717)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-sample-row-input.jsp 2014-03-12 13:39:15 UTC (rev 1718)
@@ -66,6 +66,16 @@
<legend><s:text name="wao.ui.form.SampleRow.program" /></legend>
+ <s:textfield name="updateSampleRowCommand.sampleRow.programName" label="%{getText('wao.ui.field.SampleRow.programName')}" />
+ <s:textfield name="updateSampleRowCommand.sampleRow.periodBegin" label="%{getText('wao.ui.field.SampleRow.periodBegin')}" cssClass="input-small" />
+ <s:textfield name="updateSampleRowCommand.sampleRow.periodEnd" label="%{getText('wao.ui.field.SampleRow.periodEnd')}" cssClass="input-small" />
+
+ <s:iterator value="expectedObservationsByMonths" var="month">
+
+ <s:textfield type="number" name="expectedObservationsByMonths['%{#month.key}']" label="%{#month.key}" cssClass="input-small" />
+
+ </s:iterator>
+
</fieldset>
<fieldset>
1
0
11 Mar '14
Author: bleny
Date: 2014-03-11 14:44:08 +0100 (Tue, 11 Mar 2014)
New Revision: 1717
Url: http://forge.codelutin.com/projects/wao/repository/revisions/1717
Log:
refs #4483 introduce edit-sample-row form
Added:
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java
trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java
trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-sample-row-input.jsp
Modified:
trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/Boats.java
trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/DCF5CodeImpl.java
trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SamplingStrategy.java
trunk/wao-persistence/src/main/xmi/wao-model.zargo
trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java
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/ReferentialService.java
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java
trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoInterceptor.java
trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/CompaniesAction.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/css/wao.css
Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/Boats.java
===================================================================
--- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/Boats.java 2014-03-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/Boats.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -1,6 +1,8 @@
package fr.ifremer.wao.entity;
import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import org.apache.commons.lang3.StringUtils;
public class Boats {
@@ -8,6 +10,12 @@
return new GetImmatriculation();
}
+ public static String toImmatriculations(Iterable<Boat> boats) {
+ return StringUtils.join(
+ Iterables.transform(boats, getImmatriculation()),
+ ' ');
+ }
+
protected static class GetImmatriculation implements Function<Boat, Integer> {
@Override
Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/DCF5CodeImpl.java
===================================================================
--- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/DCF5CodeImpl.java 2014-03-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/DCF5CodeImpl.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -20,6 +20,8 @@
*/
package fr.ifremer.wao.entity;
+import com.google.common.base.Objects;
+
public class DCF5CodeImpl extends DCF5CodeAbstract {
@Override
@@ -51,11 +53,18 @@
}
@Override
- public String toString() {
+ public String getCode() {
String toString = getFishingGearCode();
if (getTargetSpeciesDCF() != null) {
toString += "_" + getTargetSpeciesCode();
}
return toString;
}
+
+ @Override
+ public String toString() {
+ String toString = Objects.toStringHelper(this).add("code", getCode()).toString();
+ return toString;
+ }
+
}
Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SamplingStrategy.java
===================================================================
--- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SamplingStrategy.java 2014-03-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SamplingStrategy.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -49,4 +49,8 @@
// return WaoUtils.t(i18nKey);
throw new UnsupportedOperationException();
}
+
+ public boolean isSpecificStock() {
+ return SPECIFIC_STOCK == this;
+ }
}
Modified: trunk/wao-persistence/src/main/xmi/wao-model.zargo
===================================================================
(Binary files differ)
Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java
===================================================================
--- trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java 2014-03-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -166,4 +166,8 @@
}
return authorizedToEditOrDeleteNews;
}
+
+ public boolean isAuthorizedToCreateSampleRow() {
+ return userProfile.isAdmin();
+ }
}
Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java
===================================================================
--- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java (rev 0)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -0,0 +1,235 @@
+package fr.ifremer.wao.services.service;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+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.DCF5Code;
+import fr.ifremer.wao.entity.ElligibleBoat;
+import fr.ifremer.wao.entity.ElligibleBoatImpl;
+import fr.ifremer.wao.entity.ElligibleBoatTopiaDao;
+import fr.ifremer.wao.entity.FishingZone;
+import fr.ifremer.wao.entity.ObsProgram;
+import fr.ifremer.wao.entity.ProfessionImpl;
+import fr.ifremer.wao.entity.SampleMonth;
+import fr.ifremer.wao.entity.SampleRow;
+import fr.ifremer.wao.entity.SampleRowImpl;
+import fr.ifremer.wao.entity.SampleRowLog;
+import fr.ifremer.wao.entity.SampleRowLogImpl;
+import fr.ifremer.wao.entity.SampleRowTopiaDao;
+import fr.ifremer.wao.entity.SamplingStrategy;
+import fr.ifremer.wao.services.AuthenticatedWaoUser;
+import org.apache.commons.lang3.BooleanUtils;
+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 java.util.ArrayList;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ObsMerSamplingPlanService extends WaoServiceSupport {
+
+ private static final Log log = LogFactory.getLog(ObsMerSamplingPlanService.class);
+
+ public UpdateSampleRowCommand newUpdateSampleRowCommand(AuthenticatedWaoUser authenticatedWaoUser, Optional<String> optionalSampleRowId) {
+
+ Preconditions.checkState(authenticatedWaoUser.isAuthorizedToCreateSampleRow());
+
+ UpdateSampleRowCommand updateSampleRowCommand =
+ new UpdateSampleRowCommand();
+
+ if (optionalSampleRowId.isPresent()) {
+
+ String sampleRowId = optionalSampleRowId.get();
+
+ SampleRow sampleRow = getSampleRowDao().findByTopiaId(sampleRowId);
+
+ updateSampleRowCommand.setSampleRow(sampleRow);
+
+ updateSampleRowCommand.setCreation(false);
+
+ SampleRowLogImpl newSampleRowLog = new SampleRowLogImpl();
+ newSampleRowLog.setAuthor(authenticatedWaoUser.getWaoUser());
+ newSampleRowLog.setFromAdmin(authenticatedWaoUser.isAdmin());
+ updateSampleRowCommand.setSampleRowLog(newSampleRowLog);
+ sampleRow.addSampleRowLog(newSampleRowLog);
+
+ Set<Boat> elligibleBoats = new HashSet<>();
+ for (ElligibleBoat elligibleBoat : sampleRow.getElligibleBoat()) {
+ boolean boatIsElligibleForUser =
+ authenticatedWaoUser.isAdmin() && elligibleBoat.isGlobalActive() ||
+ authenticatedWaoUser.isCoordinator() && BooleanUtils.isTrue(elligibleBoat.getCompanyActive());
+ if (boatIsElligibleForUser) {
+ elligibleBoats.add(elligibleBoat.getBoat());
+ }
+ }
+ String elligibleBoatImmatriculations = Boats.toImmatriculations(elligibleBoats);
+ updateSampleRowCommand.setElligibleBoatImmatriculations(elligibleBoatImmatriculations);
+
+ Set<String> dcf5Codes = new HashSet<>();
+ for (DCF5Code dcf5Code : sampleRow.getdCF5Code()) {
+ dcf5Codes.add(dcf5Code.getCode());
+ }
+ updateSampleRowCommand.setDcf5Codes(StringUtils.join(dcf5Codes, ' '));
+
+ } else {
+
+ SampleRow newSampleRow = new SampleRowImpl();
+
+ newSampleRow.setObsProgram(ObsProgram.OBSMER);
+ newSampleRow.setProfession(new ProfessionImpl());
+ newSampleRow.setFishingZone(new ArrayList<FishingZone>());
+ newSampleRow.setSampleMonth(new ArrayList<SampleMonth>());
+ newSampleRow.setSamplingStrategy(SamplingStrategy.SIMULTANEOUS_ALL_SPECIES);
+
+ String newSampleRowCode = getNewSampleRowCode(ObsProgram.OBSMER);
+ newSampleRow.setCode(newSampleRowCode);
+
+ updateSampleRowCommand.setSampleRow(newSampleRow);
+
+ updateSampleRowCommand.setCreation(true);
+
+ }
+
+ ImmutableMap<String, FishingZone> allFishingZones =
+ Maps.uniqueIndex(
+ getReferentialService().getAllFishingZones(),
+ TopiaEntities.getTopiaIdFunction()
+ );
+ updateSampleRowCommand.setAllFishingZones(allFishingZones);
+
+ ImmutableMap<String, Company> allCompanies =
+ Maps.uniqueIndex(
+ getCompaniesService().getAllCompanies(),
+ TopiaEntities.getTopiaIdFunction()
+ );
+ updateSampleRowCommand.setAllCompanies(allCompanies);
+
+ return updateSampleRowCommand;
+
+ }
+
+ /**
+ * On va rechercher en base pour générer un code qui n'existe pas déjà.
+ */
+ protected String getNewSampleRowCode(ObsProgram obsProgram) {
+
+ // On pré-définit un code pour la nouvelle ligne.
+ // au moment de la création d'une nouvelle ligne, on a aucune info donc
+ // on suppose que c'est pour l'année en cours
+
+ Calendar begin = new GregorianCalendar();
+ begin.setTime(getNow());
+ int year = begin.get(Calendar.YEAR);
+
+ String newSampleRowCodePrefix = year + "_" + obsProgram.getShortCode();
+
+ SampleRowTopiaDao dao = getSampleRowDao();
+
+ Optional<String> optionalMaxSampleRowCode = dao.findMaxSampleRowCode(newSampleRowCodePrefix);
+ int maxSampleRowCodeSequence;
+ if (optionalMaxSampleRowCode.isPresent()) {
+ String maxSampleRowCode = optionalMaxSampleRowCode.get();
+ if (log.isDebugEnabled()) {
+ log.debug("max code found : " + maxSampleRowCode);
+ }
+ String sequenceStr = StringUtils.removeStart(maxSampleRowCode, newSampleRowCodePrefix);
+ maxSampleRowCodeSequence = Integer.parseInt(sequenceStr);
+ } else {
+ maxSampleRowCodeSequence = 0;
+ }
+
+ maxSampleRowCodeSequence += 1;
+
+ String newSampleRowCodeSuffix = StringUtils.leftPad(String.valueOf(maxSampleRowCodeSequence), 4, "0");
+
+ String newSampleRowCode = newSampleRowCodePrefix + newSampleRowCodeSuffix;
+
+ if (log.isInfoEnabled()) {
+ log.info("new sample row code for " + obsProgram + " is " + newSampleRowCode);
+ }
+
+ return newSampleRowCode;
+
+ }
+
+ public void preValidate(AuthenticatedWaoUser authenticatedWaoUser, UpdateSampleRowCommand updateSampleRowCommand) {
+
+ // TODO brendan 10/03/14 mettre à jour les codes DCF5
+
+ String elligibleBoatImmatriculations = updateSampleRowCommand.getElligibleBoatImmatriculations();
+
+ List<Boat> elligibleBoats = getReferentialService().getBoatsFromImmatriculations(elligibleBoatImmatriculations);
+
+ SampleRow sampleRow = updateSampleRowCommand.getSampleRow();
+
+ for (Boat boat : elligibleBoats) {
+ ElligibleBoat elligibleBoat = sampleRow.getElligibleBoatByBoat(boat);
+ if (elligibleBoat == null) {
+ elligibleBoat = new ElligibleBoatImpl();
+ elligibleBoat.setSampleRow(sampleRow);
+ elligibleBoat.setBoat(boat);
+ }
+ if (authenticatedWaoUser.isAdmin()) {
+ elligibleBoat.setGlobalActive(true);
+ } else if (authenticatedWaoUser.isCoordinator()) {
+ elligibleBoat.setCompanyActive(true);
+ }
+ }
+
+ for (ElligibleBoat elligibleBoat : sampleRow.getElligibleBoat()) {
+ Boat boat = elligibleBoat.getBoat();
+ boolean isNoLongerActive = ! elligibleBoats.contains(boat);
+ if (isNoLongerActive) {
+ if (authenticatedWaoUser.isAdmin()) {
+ elligibleBoat.setGlobalActive(false);
+ } else if (authenticatedWaoUser.isCoordinator()) {
+ elligibleBoat.setCompanyActive(null);
+ }
+ }
+ }
+
+ String dcf5Codes = updateSampleRowCommand.getDcf5Codes();
+
+ sampleRow.cleardCF5Code();
+ sampleRow.addAlldCF5Code(getReferentialService().getDcf5Codes(dcf5Codes));
+
+ }
+
+ public void save(UpdateSampleRowCommand updateSampleRowCommand) {
+
+ SampleRow sampleRow = updateSampleRowCommand.getSampleRow();
+
+ if ( ! updateSampleRowCommand.isCreation()) {
+ SampleRowLog sampleRowLog = updateSampleRowCommand.getSampleRowLog();
+ getSampleRowLogDao().create(sampleRowLog);
+ }
+
+ ElligibleBoatTopiaDao elligibleBoatDao = getElligibleBoatDao();
+ for (ElligibleBoat elligibleBoat : sampleRow.getElligibleBoat()) {
+ if (elligibleBoat.isPersisted()) {
+ elligibleBoatDao.update(elligibleBoat);
+ } else {
+ elligibleBoatDao.create(elligibleBoat);
+ }
+ }
+
+ SampleRowTopiaDao dao = getSampleRowDao();
+ if (sampleRow.isPersisted()) {
+ dao.update(sampleRow);
+ } else {
+ dao.create(sampleRow);
+ }
+ commit();
+
+ }
+
+}
Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java
===================================================================
--- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java (rev 0)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -0,0 +1,140 @@
+package fr.ifremer.wao.services.service;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import fr.ifremer.wao.entity.Company;
+import fr.ifremer.wao.entity.FishingZone;
+import fr.ifremer.wao.entity.SampleRow;
+import fr.ifremer.wao.entity.SampleRowLog;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.nuiton.topia.persistence.TopiaEntities;
+
+import java.util.Set;
+
+public class UpdateSampleRowCommand {
+
+ protected boolean creation;
+
+ protected SampleRow sampleRow;
+
+ protected SampleRowLog sampleRowLog;
+
+ protected ImmutableMap<String, FishingZone> allFishingZones;
+
+ protected ImmutableMap<String, Company> allCompanies;
+
+ protected String elligibleBoatImmatriculations;
+
+ protected String dcf5Codes;
+
+ public String getCompanyId() {
+ String companyId = null;
+ if (sampleRow.getCompany() != null) {
+ companyId = sampleRow.getCompany().getTopiaId();
+ }
+ return companyId;
+ }
+
+ public void setCompanyId(String companyId) {
+ Company company = null;
+ if (StringUtils.isNotBlank(companyId)) {
+ company = allCompanies.get(companyId);
+ }
+ sampleRow.setCompany(company);
+ }
+
+ // TODO brendan 10/03/14 supprimer les sample months si effort = ""
+
+ public void setCode(String code) {
+ Preconditions.checkState(isCreation(), "cannot change code for sample row " + sampleRow);
+ sampleRow.setCode(code);
+ }
+
+ public String getCode() {
+ return sampleRow.getCode();
+ }
+
+ public boolean isCreation() {
+ return creation;
+ }
+
+ public void setCreation(boolean creation) {
+ this.creation = creation;
+ }
+
+ public void setSampleRow(SampleRow sampleRow) {
+ this.sampleRow = sampleRow;
+ }
+
+ public SampleRow getSampleRow() {
+ return sampleRow;
+ }
+
+ public void setSampleRowLog(SampleRowLog sampleRowLog) {
+ this.sampleRowLog = sampleRowLog;
+ }
+
+ public SampleRowLog getSampleRowLog() {
+ return sampleRowLog;
+ }
+
+ public Set<String> getFishingZoneIds() {
+ Set<String> fishingZoneIds;
+ if (sampleRow.getFishingZone() == null) {
+ fishingZoneIds = null;
+ } else {
+ fishingZoneIds = Sets.newHashSet(
+ Iterables.transform(
+ sampleRow.getFishingZone(),
+ TopiaEntities.getTopiaIdFunction()
+ )
+ );
+ }
+ return fishingZoneIds;
+ }
+
+ public void setFishingZoneIds(Set<String> fishingZoneIds) {
+ sampleRow.clearFishingZone();
+ if (CollectionUtils.isNotEmpty(fishingZoneIds)) {
+ for (String fishingZoneId : fishingZoneIds) {
+ FishingZone fishingZone = allFishingZones.get(fishingZoneId);
+ sampleRow.addFishingZone(fishingZone);
+ }
+ }
+ }
+
+ public ImmutableMap<String, FishingZone> getAllFishingZones() {
+ return allFishingZones;
+ }
+
+ public void setAllFishingZones(ImmutableMap<String, FishingZone> allFishingZones) {
+ this.allFishingZones = allFishingZones;
+ }
+
+ public ImmutableMap<String, Company> getAllCompanies() {
+ return allCompanies;
+ }
+
+ public void setAllCompanies(ImmutableMap<String, Company> allCompanies) {
+ this.allCompanies = allCompanies;
+ }
+
+ public String getElligibleBoatImmatriculations() {
+ return elligibleBoatImmatriculations;
+ }
+
+ public void setElligibleBoatImmatriculations(String elligibleBoatImmatriculations) {
+ this.elligibleBoatImmatriculations = elligibleBoatImmatriculations;
+ }
+
+ public String getDcf5Codes() {
+ return dcf5Codes;
+ }
+
+ public void setDcf5Codes(String dcf5Codes) {
+ this.dcf5Codes = dcf5Codes;
+ }
+}
Modified: 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/CompaniesService.java 2014-03-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/CompaniesService.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -12,7 +12,7 @@
public class CompaniesService extends WaoServiceSupport {
- public List<Company> getCompanies() {
+ public List<Company> getAllCompanies() {
CompanyTopiaDao dao = getPersistenceContext().getCompanyDao();
Modified: 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/ReferentialService.java 2014-03-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -24,8 +24,10 @@
package fr.ifremer.wao.services.service.administration;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import fr.ifremer.wao.WaoTechnicalException;
import fr.ifremer.wao.entity.Boat;
@@ -36,6 +38,7 @@
import fr.ifremer.wao.entity.ContactStateMotif;
import fr.ifremer.wao.entity.ContactStateMotifTopiaDao;
import fr.ifremer.wao.entity.DCF5Code;
+import fr.ifremer.wao.entity.DCF5CodeTopiaDao;
import fr.ifremer.wao.entity.FishingGearDCF;
import fr.ifremer.wao.entity.FishingGearDCFTopiaDao;
import fr.ifremer.wao.entity.FishingZone;
@@ -92,6 +95,7 @@
import java.io.InputStream;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -216,6 +220,17 @@
}
+
+ public List<FishingZone> getAllFishingZones() {
+
+ FishingZoneTopiaDao dao = getPersistenceContext().getFishingZoneDao();
+
+ List<FishingZone> fishingZones = dao.newQueryBuilder().setOrderByArguments(FishingZone.PROPERTY_LATITUDE + " desc").findAll();
+
+ return fishingZones;
+
+ }
+
/**
* Import des lieux terrestres (ports et criées).
*/
@@ -999,4 +1014,52 @@
}
+ /**
+ * Étant donné une suite de codes DCF séparés par des caractères blancs, on retourne
+ * les instances de {@link fr.ifremer.wao.entity.DCF5Code} correspondantes en ajoutant
+ * les manquantes au référentiel au besoin.
+ */
+ public Collection<DCF5Code> getDcf5Codes(String joinedDcf5Codes) {
+
+ Collection<DCF5Code> dcf5Codes = new HashSet<>();
+
+ DCF5CodeTopiaDao dao = getDCF5CodeDao();
+
+ if (StringUtils.isNotBlank(joinedDcf5Codes)) {
+
+ String[] splitCodes = joinedDcf5Codes.split("\\s?");
+
+ for (String code : splitCodes) {
+
+ String[] codeParts = code.split("_");
+
+ FishingGearDCF fishingGearDCF = getFishingGearDCFDao().forCodeEquals(codeParts[0]).findUnique();
+ TargetSpeciesDCF targetSpeciesDCF = null;
+ if (codeParts.length == 2) {
+ targetSpeciesDCF = getTargetSpeciesDCFDao().forCodeEquals(codeParts[1]).findUnique();
+ }
+
+ ImmutableMap<String, Object> properties =
+ ImmutableMap.of(
+ DCF5Code.PROPERTY_FISHING_GEAR_DCF, (Object) fishingGearDCF,
+ DCF5Code.PROPERTY_TARGET_SPECIES_DCF, targetSpeciesDCF
+ );
+
+ Optional<DCF5Code> optionalDcf5Code = dao.forProperties(properties).tryFindUnique();
+
+ DCF5Code dcf5Code;
+ if (optionalDcf5Code.isPresent()) {
+ dcf5Code = optionalDcf5Code.get();
+ } else {
+ dcf5Code = dao.create(properties);
+ }
+
+ dcf5Codes.add(dcf5Code);
+
+ }
+ }
+
+ return dcf5Codes;
+ }
+
}
Modified: 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/administration/WaoUsersService.java 2014-03-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -2,7 +2,6 @@
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;
@@ -73,7 +72,7 @@
updateWaoUserCommand.setObsProgram(obsProgram);
ImmutableMap<String, Company> allCompanies = Maps.uniqueIndex(
- getCompaniesService().getCompanies(),
+ getCompaniesService().getAllCompanies(),
TopiaEntities.getTopiaIdFunction());
updateWaoUserCommand.setAllCompanies(allCompanies);
@@ -88,10 +87,7 @@
if (waoUser.isCanReadBoatsNotEmpty()) {
- String canReadBoats = StringUtils.join(
- Iterables.transform(waoUser.getCanReadBoats(), Boats.getImmatriculation()),
- ' '
- );
+ String canReadBoats = Boats.toImmatriculations(waoUser.getCanReadBoats());
updateWaoUserCommand.setCanReadBoats(canReadBoats);
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-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoInterceptor.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -56,7 +56,7 @@
// login à l'arrache
WaoUser admin = serviceContext.getPersistenceContext().getWaoUserDao().forLoginEquals("admin").findUnique();
UserProfile userProfile = new UserProfileImpl();
- userProfile.setUserRole(UserRole.COORDINATOR);
+ userProfile.setUserRole(UserRole.ADMIN);
userProfile.setObsProgram(ObsProgram.OBSMER);
userProfile.setCanWrite(true);
AuthenticatedWaoUser authenticatedWaoUser = new AuthenticatedWaoUser(admin, userProfile);
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-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/CompaniesAction.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -20,7 +20,7 @@
@Override
public void prepare() {
- companies = service.getCompanies();
+ companies = service.getAllCompanies();
}
Added: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java
===================================================================
--- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java (rev 0)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java 2014-03-11 13:44:08 UTC (rev 1717)
@@ -0,0 +1,113 @@
+package fr.ifremer.wao.web.action.obsmer;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Strings;
+import com.opensymphony.xwork2.Preparable;
+import fr.ifremer.wao.WaoUtils;
+import fr.ifremer.wao.entity.SampleRow;
+import fr.ifremer.wao.services.service.ObsMerSamplingPlanService;
+import fr.ifremer.wao.services.service.UpdateSampleRowCommand;
+import fr.ifremer.wao.web.WaoJspActionSupport;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts2.convention.annotation.Result;
+import org.apache.struts2.convention.annotation.Results;
+
+@Results({
+ @Result(name="success", type="redirectAction", params = { "actionName", "sampling-plan" })
+})
+public class EditSampleRowAction extends WaoJspActionSupport implements Preparable {
+
+ private static final Log log = LogFactory.getLog(EditSampleRowAction.class);
+
+ protected ObsMerSamplingPlanService service;
+
+ protected Optional<String> optionalSampleRowId = Optional.absent();
+
+ protected UpdateSampleRowCommand updateSampleRowCommand;
+
+ public void setService(ObsMerSamplingPlanService service) {
+ this.service = service;
+ }
+
+ public String getSampleRowId() {
+ return optionalSampleRowId.orNull();
+ }
+
+ public void setSampleRowId(String sampleRowId) {
+ this.optionalSampleRowId = Optional.fromNullable(Strings.emptyToNull(sampleRowId));
+ }
+
+ @Override
+ public void prepare() {
+
+ updateSampleRowCommand = service.newUpdateSampleRowCommand(getAuthenticatedWaoUser(), optionalSampleRowId);
+
+ }
+
+ @Override
+ public void validate() {
+
+ service.preValidate(getAuthenticatedWaoUser(), updateSampleRowCommand);
+
+ SampleRow sampleRow = updateSampleRowCommand.getSampleRow();
+
+ if (updateSampleRowCommand.isCreation()) {
+ if ( ! WaoUtils.getSampleRowCodePattern(sampleRow.getObsProgram()).matcher(sampleRow.getCode()).matches()) {
+ addFieldError("updateSampleRowCommand.code", t("wao.import.sampleRow.failure.wrongSampleRowCodeFormat", sampleRow.getCode()));
+ }
+ } else {
+ if (StringUtils.isBlank(updateSampleRowCommand.getSampleRowLog().getComment())) {
+ addFieldError("updateSampleRowCommand.sampleRowLog.comment", t("wao.ui.form.SampleRow.error.missingLogComment"));
+ }
+ }
+
+ if (StringUtils.isBlank(sampleRow.getProgramName())) {
+ addFieldError("updateSampleRowCommand.sampleRow.programName", t("wao.ui.form.SampleRow.error.missingProgramName"));
+ }
+
+ if (sampleRow.getPeriodBegin() == null) {
+ addFieldError("updateSampleRowCommand.sampleRow.periodBegin", t("wao.ui.form.SampleRow.error.missingPeriodBegin"));
+ }
+
+ if (sampleRow.getPeriodEnd() == null) {
+ addFieldError("updateSampleRowCommand.sampleRow.periodEnd", t("wao.ui.form.SampleRow.error.missingPeriodEnd"));
+ }
+
+ if (CollectionUtils.isEmpty(sampleRow.getdCF5Code())) {
+ addFieldError("updateSampleRowCommand.dcf5Codes", t("wao.ui.form.SampleRow.error.missingDcf5Codes"));
+ }
+
+ if (CollectionUtils.isEmpty(sampleRow.getFishingZone())) {
+ addFieldError("updateSampleRowCommand.fishingZones", t("wao.ui.form.SampleRow.error.missingFishingZones"));
+ }
+
+ if (sampleRow.getSamplingStrategy().isSpecificStock() && StringUtils.isEmpty(sampleRow.getProfession().getSpecies())) {
+ addFieldError("updateSampleRowCommand.sampleRow.samplingStrategy", t("wao.ui.form.SampleRow.error.missingProfessionSpecies"));
+ }
+
+ // FIXME brendan 06/03/14 check code uniqueness
+
+ }
+
+ @Override
+ public String execute() {
+
+ service.save(updateSampleRowCommand);
+
+ session.addMessage(t("wao.ui.form.updateSampleRowCommand.success", updateSampleRowCommand.getSampleRow().getCode()));
+
+ return SUCCESS;
+
+ }
+
+ public UpdateSampleRowCommand getUpdateSampleRowCommand() {
+ if (updateSampleRowCommand == null) {
+ prepare();
+ }
+ return updateSampleRowCommand;
+ }
+
+}
\ No newline at end of file
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-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-11 13:44:08 UTC (rev 1717)
@@ -11,6 +11,7 @@
wao.import.fishingZones.success=Import fishing zones successful
wao.import.obsDebCodes.prompt=Import ObsDeb codes
wao.import.obsDebCodes.success=Import ObsDeb codes successful
+wao.import.sampleRow.failure.wrongSampleRowCodeFormat=
wao.import.terrestrialDivisions.prompt=Import ObsDeb terrestrial divisions
wao.import.terrestrialDivisions.success=Import ObsDeb terrestrial divisions successful
wao.import.terrestrialLocations.prompt=Import terrestrial locations
@@ -151,6 +152,7 @@
wao.ui.field.FishingZone.facadeName=Facade
wao.ui.field.FishingZone.sectorName=Sector
wao.ui.field.SampleRow.appliedCoverageRate=Applied coverage rate
+wao.ui.field.SampleRow.averageTideTime=
wao.ui.field.SampleRow.boat=Boat
wao.ui.field.SampleRow.code=Line code
wao.ui.field.SampleRow.comment=Comment
@@ -158,10 +160,14 @@
wao.ui.field.SampleRow.dCF5Code=DCF5 Codes
wao.ui.field.SampleRow.day=Day
wao.ui.field.SampleRow.dcf5Code=DCF5 code
+wao.ui.field.SampleRow.dcf5Codes=
+wao.ui.field.SampleRow.elligibleBoat=
wao.ui.field.SampleRow.expectedDate=Date
wao.ui.field.SampleRow.fishingZones=Fishing zone(s)
+wao.ui.field.SampleRow.fishingZonesInfos=
wao.ui.field.SampleRow.libelle=Labels
wao.ui.field.SampleRow.meshSize=Mesh size
+wao.ui.field.SampleRow.nbObservants=
wao.ui.field.SampleRow.observationType=Observation type
wao.ui.field.SampleRow.observationUnit=Observation unit
wao.ui.field.SampleRow.observers=Observers
@@ -197,10 +203,17 @@
wao.ui.filters.refresh=Refresh filters
wao.ui.forgotPassword=Forgot password ?
wao.ui.form.SampleRow.boatsDescription=This field contains registration numbers of the ships that areeligible for this ligne. You can use any separator to separate numbers (space, dot, line-return, comma)
+wao.ui.form.SampleRow.error.missingDcf5Codes=
+wao.ui.form.SampleRow.error.missingFishingZones=
wao.ui.form.SampleRow.error.missingLogComment=You must add a comment to explain why you modified the line
+wao.ui.form.SampleRow.error.missingPeriodBegin=
+wao.ui.form.SampleRow.error.missingPeriodEnd=
+wao.ui.form.SampleRow.error.missingProfessionSpecies=
+wao.ui.form.SampleRow.error.missingProgramName=
wao.ui.form.SampleRow.missingBeginDate=Begin date missing to generate line code
wao.ui.form.SampleRow.others=Others data of the sample row
wao.ui.form.SampleRow.program=Associated program and observation effort by months
+wao.ui.form.SampleRow.warn.hasSampleMonthRealTideTime=
wao.ui.form.WaoUser.credentials=Credentials
wao.ui.form.WaoUser.identity=Identity
wao.ui.form.WaoUser.preferences=Preferences
@@ -230,6 +243,7 @@
wao.ui.form.repeatPassword=Repeat password
wao.ui.form.roles=Roles
wao.ui.form.sortByTideBegin=Sort by observation begin date
+wao.ui.form.updateSampleRowCommand.success=
wao.ui.form.updateWaoUserCommand.admin=Administrator
wao.ui.form.updateWaoUserCommand.adminReadOnly=Administrator (read-only)
wao.ui.form.updateWaoUserCommand.canReadBoats=Only able to read boats
@@ -395,6 +409,8 @@
wao.ui.synthesis.observationHours.description=Number of observations according to the time of the day (based on the observation begin date)
wao.ui.synthesis.observationHours.title=Observation hours
wao.ui.unavailableOperation=Unavailable operation
+wao.ui.unit.days=
+wao.ui.unit.observers=
wao.ui.userList=Users list
wao.ui.userMustAcceptCgu=You must accept the terms of use
wao.ui.validLogin=Valid identifier
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-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-11 13:44:08 UTC (rev 1717)
@@ -11,6 +11,7 @@
wao.import.fishingZones.success=Import des zones de pêches réalisé avec succès
wao.import.obsDebCodes.prompt=Import des codes ObsDeb
wao.import.obsDebCodes.success=Import des codes ObsDeb réalisé avec succès
+wao.import.sampleRow.failure.wrongSampleRowCodeFormat=
wao.import.terrestrialDivisions.prompt=Import des unités d'observation
wao.import.terrestrialDivisions.success=Import des unités d'observation réalisé avec succès
wao.import.terrestrialLocations.prompt=Import des lieux terrestres
@@ -151,6 +152,7 @@
wao.ui.field.FishingZone.facadeName=Façade
wao.ui.field.FishingZone.sectorName=Zone
wao.ui.field.SampleRow.appliedCoverageRate=Taux de couverture appliqué
+wao.ui.field.SampleRow.averageTideTime=
wao.ui.field.SampleRow.boat=Navire
wao.ui.field.SampleRow.code=Code ligne
wao.ui.field.SampleRow.comment=Commentaire
@@ -158,10 +160,14 @@
wao.ui.field.SampleRow.dCF5Code=Codes
wao.ui.field.SampleRow.day=Jour
wao.ui.field.SampleRow.dcf5Code=Code DCF Niv. 5
+wao.ui.field.SampleRow.dcf5Codes=
+wao.ui.field.SampleRow.elligibleBoat=
wao.ui.field.SampleRow.expectedDate=Date
wao.ui.field.SampleRow.fishingZones=Zone(s) de pêche
+wao.ui.field.SampleRow.fishingZonesInfos=
wao.ui.field.SampleRow.libelle=Libellé
wao.ui.field.SampleRow.meshSize=Maillage
+wao.ui.field.SampleRow.nbObservants=
wao.ui.field.SampleRow.observationType=Type d'observation
wao.ui.field.SampleRow.observationUnit=Unité d'observation
wao.ui.field.SampleRow.observers=Observateurs
@@ -197,10 +203,17 @@
wao.ui.filters.refresh=Rafraîchir les champs du filtre
wao.ui.forgotPassword=Mot de passe oublié ?
wao.ui.form.SampleRow.boatsDescription=Ce champs correspond aux immatriculations des navires qui sont éligibles pour cette ligne. Vous pouvez utiliser n'importe quel séparateur pour séparer les immatriculations (virgule, point, espace ou saut de ligne)
+wao.ui.form.SampleRow.error.missingDcf5Codes=
+wao.ui.form.SampleRow.error.missingFishingZones=
wao.ui.form.SampleRow.error.missingLogComment=Vous devez préciser la raison de vos modifications
+wao.ui.form.SampleRow.error.missingPeriodBegin=
+wao.ui.form.SampleRow.error.missingPeriodEnd=
+wao.ui.form.SampleRow.error.missingProfessionSpecies=
+wao.ui.form.SampleRow.error.missingProgramName=
wao.ui.form.SampleRow.missingBeginDate=Date de début manquante pour générer le code de la ligne \!
wao.ui.form.SampleRow.others=Autres données de la ligne d'échantillonnage
wao.ui.form.SampleRow.program=Programme de rattachement et effort d'observation par mois
+wao.ui.form.SampleRow.warn.hasSampleMonthRealTideTime=
wao.ui.form.WaoUser.credentials=Informations d'authentification
wao.ui.form.WaoUser.identity=Identité
wao.ui.form.WaoUser.preferences=Préférences
@@ -230,6 +243,7 @@
wao.ui.form.repeatPassword=Répéter le mot de passe
wao.ui.form.roles=Rôles
wao.ui.form.sortByTideBegin=Trier par date de début d'observation (du plus récent au plus ancien)
+wao.ui.form.updateSampleRowCommand.success=
wao.ui.form.updateWaoUserCommand.admin=Administrateur
wao.ui.form.updateWaoUserCommand.adminReadOnly=Administrateur (lecture seule)
wao.ui.form.updateWaoUserCommand.canReadBoats=Limiter à la consultation des navires
@@ -395,6 +409,8 @@
wao.ui.synthesis.observationHours.description=Nombre d'observations effectuée selon l'heure d'arrivée
wao.ui.synthesis.observationHours.title=Distribution des périodes d'observation
wao.ui.unavailableOperation=Opération non-disponible
+wao.ui.unit.days=
+wao.ui.unit.observers=
wao.ui.userList=Liste des utilisateurs
wao.ui.userMustAcceptCgu=Vous devez accepter les conditions d'utilisation pour utiliser Wao
wao.ui.validLogin=Identifiant valide
Copied: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-sample-row-input.jsp (from rev 1716, trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-news-input.jsp)
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-sample-row-input.jsp (rev 0)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-sample-row-input.jsp 2014-03-11 13:44:08 UTC (rev 1717)
@@ -0,0 +1,124 @@
+<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
+<%@taglib uri="/struts-tags" prefix="s" %>
+
+<html>
+ <head>
+ <title>
+ <s:if test="updateSampleRowCommand.creation">
+ <s:text name="wao.ui.sampleRow.creation" />
+ </s:if>
+ <s:else>
+ <s:property value="t('wao.ui.sampleRow.edition', updateSampleRowCommand.sampleRow.code)" />
+ </s:else>
+ </title>
+ </head>
+
+
+ <h1>
+ <s:if test="updateSampleRowCommand.creation">
+ <s:text name="wao.ui.sampleRow.creation" />
+ </s:if>
+ <s:else>
+ <s:property value="t('wao.ui.sampleRow.edition', updateSampleRowCommand.sampleRow.code)" />
+ </s:else>
+ </h1>
+
+ <s:if test="updateSampleRowCommand.sampleRow.hasSampleMonthRealTideTime()">
+ <div class="alert">
+ <s:text name="wao.ui.form.SampleRow.warn.hasSampleMonthRealTideTime" />
+ </div>
+ </s:if>
+
+ <s:form>
+
+ <s:hidden name="sampleRowId" value="%{sampleRowId}" />
+
+ <fieldset>
+
+ <legend><s:text name="wao.ui.field.SampleRow.profession" /></legend>
+
+ <s:textfield name="updateSampleRowCommand.sampleRow.profession.libelle" label="%{getText('wao.ui.field.SampleRow.libelle')}" />
+ <s:textfield name="updateSampleRowCommand.sampleRow.profession.size" label="%{getText('wao.ui.field.SampleRow.size')}" inputAppend="m" cssClass="input-small" />
+ <s:textfield name="updateSampleRowCommand.sampleRow.profession.meshSize" label="%{getText('wao.ui.field.SampleRow.meshSize')}" inputAppend="mm" cssClass="input-small" />
+ <s:textfield name="updateSampleRowCommand.sampleRow.profession.species" label="%{getText('wao.ui.field.SampleRow.species')}" />
+ <s:textfield name="updateSampleRowCommand.sampleRow.profession.other" label="%{getText('wao.ui.field.SampleRow.other')}" />
+ <s:textfield name="updateSampleRowCommand.dcf5Codes" label="%{getText('wao.ui.field.SampleRow.dcf5Codes')}" cssClass="input-xxlarge" />
+
+ </fieldset>
+
+ <fieldset>
+
+ <legend><s:text name="wao.ui.field.SampleRow.fishingZones" /></legend>
+
+ <s:select name="updateSampleRowCommand.fishingZoneIds"
+ label="%{getText('wao.ui.field.SampleRow.fishingZones')}"
+ list="updateSampleRowCommand.allFishingZones"
+ listValue="%{value.code}"
+ multiple="true"
+ cssClass="input-xxlarge"
+ />
+
+ <s:textfield name="updateSampleRowCommand.sampleRow.fishingZonesInfos" label="%{getText('wao.ui.field.SampleRow.fishingZonesInfos')}" cssClass="input-xxlarge" />
+
+ </fieldset>
+
+ <fieldset>
+
+ <legend><s:text name="wao.ui.form.SampleRow.program" /></legend>
+
+ </fieldset>
+
+ <fieldset>
+
+ <legend><s:text name="wao.ui.form.SampleRow.others" /></legend>
+
+ <s:if test="updateSampleRowCommand.creation">
+ <s:textfield name="updateSampleRowCommand.code" label="%{getText('wao.ui.field.SampleRow.code')}" cssClass="input-small"/>
+ </s:if>
+
+ <s:select name="updateSampleRowCommand.companyId"
+ label="%{getText('wao.ui.field.SampleRow.company')}"
+ list="updateSampleRowCommand.allCompanies"
+ listValue="%{value.name}"
+ cssClass="input-xxlarge"
+ />
+
+ <s:textfield type="number" name="updateSampleRowCommand.sampleRow.nbObservants" label="%{getText('wao.ui.field.SampleRow.nbObservants')}" inputAppend="%{getText('wao.ui.unit.observers')}" cssClass="input-small"/>
+ <s:textfield type="number" name="updateSampleRowCommand.sampleRow.averageTideTime" label="%{getText('wao.ui.field.SampleRow.averageTideTime')}" inputAppend="%{getText('wao.ui.unit.days')}" cssClass="input-small"/>
+ <s:textfield type="number" name="updateSampleRowCommand.sampleRow.appliedCoverageRate" label="%{getText('wao.ui.field.SampleRow.appliedCoverageRate')}" inputAppend="%" cssClass="input-small"/>
+
+ <s:textarea name="updateSampleRowCommand.elligibleBoatImmatriculations" label="%{getText('wao.ui.field.SampleRow.elligibleBoat')}" />
+
+ <s:textarea name="updateSampleRowCommand.sampleRow.comment" label="%{getText('wao.ui.field.SampleRow.comment')}" />
+
+ </fieldset>
+
+ <s:if test=" ! updateSampleRowCommand.creation">
+
+ <fieldset>
+
+ <legend><s:text name="wao.ui.form.editComment" /></legend>
+
+ <s:text name="wao.ui.form.editionAuthor" /> <s:property value="updateSampleRowCommand.sampleRowLog.author.fullName" />
+
+ <s:textarea name="updateSampleRowCommand.sampleRowLog.comment" label="%{getText('wao.ui.form.editComment')}" requiredLabel="true" />
+
+ </fieldset>
+
+ </s:if>
+
+ <div class="form-actions">
+ <s:url namespace="/obsmer" action="sampling-plan" id="samplingPlanUrl" />
+ <s:a href="%{samplingPlanUrl}" cssClass="btn">
+ <i class="icon-chevron-left"></i> <s:text name="wao.ui.action.cancel" />
+ </s:a>
+
+ <s:submit type="button" cssClass="btn">
+ <i class="icon-hdd"></i> <s:text name="wao.ui.action.save" />
+ </s:submit>
+ </div>
+
+ </s:form>
+
+</html>
+
Modified: trunk/wao-web/src/main/webapp/css/wao.css
===================================================================
--- trunk/wao-web/src/main/webapp/css/wao.css 2014-03-06 16:50:28 UTC (rev 1716)
+++ trunk/wao-web/src/main/webapp/css/wao.css 2014-03-11 13:44:08 UTC (rev 1717)
@@ -33,7 +33,7 @@
textarea {
width: 100%;
- min-height: 300px;
+ min-height: 150px;
}
.form-actions button[type="submit"] {
1
0
r1716 - in trunk: wao-services/src/main/java/fr/ifremer/wao/services wao-web/src/main/java/fr/ifremer/wao/web wao-web/src/main/java/fr/ifremer/wao/web/action/administration wao-web/src/main/resources/i18n wao-web/src/main/webapp/WEB-INF/content/administration wao-web/src/main/webapp/WEB-INF/content/obsmer wao-web/src/main/webapp/WEB-INF/decorators
by bleny@users.forge.codelutin.com 06 Mar '14
by bleny@users.forge.codelutin.com 06 Mar '14
06 Mar '14
Author: bleny
Date: 2014-03-06 17:50:28 +0100 (Thu, 06 Mar 2014)
New Revision: 1716
Url: http://forge.codelutin.com/projects/wao/repository/revisions/1716
Log:
refs #4560 refs #4553 add security for news and administration
Modified:
trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java
trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoInterceptor.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/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/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-wao-user.jsp
trunk/wao-web/src/main/webapp/WEB-INF/content/administration/referential-management.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/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java
===================================================================
--- trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java 2014-03-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java 2014-03-06 16:50:28 UTC (rev 1716)
@@ -1,6 +1,8 @@
package fr.ifremer.wao.services;
+import com.google.common.base.Preconditions;
import fr.ifremer.wao.entity.Company;
+import fr.ifremer.wao.entity.News;
import fr.ifremer.wao.entity.ObsProgram;
import fr.ifremer.wao.entity.UserProfile;
import fr.ifremer.wao.entity.UserRole;
@@ -97,4 +99,71 @@
return waoUser.getCompany();
}
+ public boolean isAuthorizedToChangeUserRights() {
+ boolean authorizedToChangeUserRights = isAuthorizedToSetAdmin()
+ || isAuthorizedToSetCoordinator()
+ || isAuthorizedToSetObserver()
+ || isAuthorizedToSetGuest()
+ || isAuthorizedToSetProfessional();
+ return authorizedToChangeUserRights;
+ }
+
+ public boolean isAuthorizedToActiveUser() {
+ return userProfile.isAdmin();
+ }
+
+ public boolean isAuthorizedToChangeUserCompany() {
+ return userProfile.isAdmin();
+ }
+
+ public boolean isAuthorizedToSetAdmin() {
+ return userProfile.isAdmin();
+ }
+
+ public boolean isAuthorizedToSetCoordinator() {
+ return userProfile.isAdmin();
+ }
+
+ public boolean isAuthorizedToSetObserver() {
+ boolean authorizedToSetObserver = userProfile.isAdmin()
+ || userProfile.isCoordinator();
+ return authorizedToSetObserver;
+ }
+
+ public boolean isAuthorizedToSetGuest() {
+ return userProfile.isAdmin();
+ }
+
+ public boolean isAuthorizedToSetProfessional() {
+ return userProfile.isAdmin();
+ }
+
+ public boolean isAuthorizedToUpdateReferential() {
+ return userProfile.isAdmin();
+ }
+
+ public boolean isAuthorizedToViewCompanies() {
+ return userProfile.isAdmin();
+ }
+
+ public boolean isAuthorizedToViewCompanyUsers() {
+ return userProfile.isAdmin() || userProfile.isCoordinator();
+ }
+
+ public boolean isAuthorizedToCreateNews() {
+ return userProfile.isAdmin() || userProfile.isCoordinator();
+ }
+
+ public boolean isAuthorizedToEditOrDeleteNews(News news) {
+ Preconditions.checkArgument(news.getObsProgram() == null || news.getObsProgram().equals(userProfile.getObsProgram()));
+ boolean authorizedToEditOrDeleteNews;
+ if (userProfile.isAdmin()) {
+ authorizedToEditOrDeleteNews = true;
+ } else if (userProfile.isCoordinator()) {
+ authorizedToEditOrDeleteNews = waoUser.getCompany().equals(news.getCompany());
+ } else {
+ authorizedToEditOrDeleteNews = false;
+ }
+ return authorizedToEditOrDeleteNews;
+ }
}
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-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoInterceptor.java 2014-03-06 16:50:28 UTC (rev 1716)
@@ -5,6 +5,12 @@
import com.opensymphony.xwork2.interceptor.Interceptor;
import fr.ifremer.wao.WaoApplicationConfig;
import fr.ifremer.wao.WaoTopiaPersistenceContext;
+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 fr.ifremer.wao.services.AuthenticatedWaoUser;
import fr.ifremer.wao.services.WaoService;
import fr.ifremer.wao.services.WaoServiceContext;
import org.apache.commons.collections.CollectionUtils;
@@ -46,6 +52,17 @@
WaoSession waoSession = getWaoSession(invocation);
+ if (waoSession.getAuthenticatedWaoUser() == null) {
+ // login à l'arrache
+ WaoUser admin = serviceContext.getPersistenceContext().getWaoUserDao().forLoginEquals("admin").findUnique();
+ UserProfile userProfile = new UserProfileImpl();
+ userProfile.setUserRole(UserRole.COORDINATOR);
+ userProfile.setObsProgram(ObsProgram.OBSMER);
+ userProfile.setCanWrite(true);
+ AuthenticatedWaoUser authenticatedWaoUser = new AuthenticatedWaoUser(admin, userProfile);
+ waoSession.setAuthenticatedWaoUser(authenticatedWaoUser);
+ }
+
if (CollectionUtils.isNotEmpty(waoSession.getMessages())) {
for (String message : waoSession.getMessages()) {
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-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoSession.java 2014-03-06 16:50:28 UTC (rev 1716)
@@ -1,11 +1,6 @@
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;
@@ -49,13 +44,6 @@
}
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/EditWaoUserAction.java
===================================================================
--- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java 2014-03-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java 2014-03-06 16:50:28 UTC (rev 1716)
@@ -69,6 +69,8 @@
addFieldError("updateWaoUserCommand.companyId", t("wao.ui.form.updateWaoUserCommand.requiredCompany"));
}
+ // FIXME brendan 06/03/14 check login uniqueness
+
}
@Override
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-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/ReferentialManagementAction.java 2014-03-06 16:50:28 UTC (rev 1716)
@@ -1,5 +1,6 @@
package fr.ifremer.wao.web.action.administration;
+import com.google.common.base.Preconditions;
import com.opensymphony.xwork2.Preparable;
import fr.ifremer.wao.services.service.administration.ReferentialService;
import fr.ifremer.wao.services.service.administration.ReferentialState;
@@ -20,6 +21,8 @@
@Override
public void prepare() {
+ Preconditions.checkState(getAuthenticatedWaoUser().isAuthorizedToUpdateReferential());
+
referentialStates = referentialService.getReferentialStates(getObsProgram());
}
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-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/WaoUsersAction.java 2014-03-06 16:50:28 UTC (rev 1716)
@@ -1,6 +1,7 @@
package fr.ifremer.wao.web.action.administration;
import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.opensymphony.xwork2.Preparable;
import fr.ifremer.wao.entity.WaoUser;
@@ -28,6 +29,12 @@
@Override
public void prepare() {
+ Preconditions.checkState(getAuthenticatedWaoUser().isAuthorizedToViewCompanyUsers());
+
+ if (getAuthenticatedWaoUser().isCoordinator()) {
+ optionalCompanyId = Optional.of(getAuthenticatedWaoUser().getCompany().getTopiaId());
+ }
+
waoUsers = service.getWaoUsers(optionalCompanyId);
}
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-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-06 16:50:28 UTC (rev 1716)
@@ -333,6 +333,7 @@
wao.ui.page.UserProfileForm.title=Profile management
wao.ui.page.companies.title=Companies
wao.ui.page.waoUsers.title=Users
+wao.ui.page.waoUsers.titleForCompany=Users for company %s
wao.ui.publishedByProgram=Pusblished by program
wao.ui.publishedByYourCompany=Published by company
wao.ui.sampleRow.creation=Creation of a sample row
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-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-06 16:50:28 UTC (rev 1716)
@@ -333,6 +333,7 @@
wao.ui.page.UserProfileForm.title=Gestion du profil
wao.ui.page.companies.title=Sociétés
wao.ui.page.waoUsers.title=Utilisateurs
+wao.ui.page.waoUsers.titleForCompany=Utilisateurs de la société %s
wao.ui.publishedByProgram=Publiée par le programme
wao.ui.publishedByYourCompany=Publiée par la société
wao.ui.sampleRow.creation=Création d'une ligne du plan d'échantillonnage
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-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp 2014-03-06 16:50:28 UTC (rev 1716)
@@ -51,21 +51,30 @@
<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}"
- requiredLabel="true"
- cssClass="input-xxlarge" />
- <s:checkbox name="updateWaoUserCommand.waoUser.active" label="%{getText('wao.ui.field.WaoUser.active')}" />
+ <s:if test="authenticatedWaoUser.authorizedToChangeUserCompany">
+ <s:select name="updateWaoUserCommand.companyId"
+ label="%{getText('wao.ui.entity.Company')}"
+ list="updateWaoUserCommand.allCompanies"
+ listValue="%{value.name}"
+ requiredLabel="true"
+ cssClass="input-xxlarge" />
+ </s:if>
+
+ <s:if test="authenticatedWaoUser.authorizedToActiveUser">
+ <s:checkbox name="updateWaoUserCommand.waoUser.active" label="%{getText('wao.ui.field.WaoUser.active')}" />
+ </s:if>
+
</fieldset>
<fieldset>
<legend><s:text name="wao.ui.form.WaoUser.credentials" /></legend>
- <s:textfield name="updateWaoUserCommand.waoUser.login" label="%{getText('wao.ui.field.WaoUser.login')}" requiredLabel="true" cssClass="input-xlarge" />
+ <s:textfield name="updateWaoUserCommand.waoUser.login"
+ label="%{getText('wao.ui.field.WaoUser.login')}"
+ requiredLabel="true"
+ cssClass="input-xlarge" />
<s:radio name="updateWaoUserCommand.passwordStrategy"
label="%{getText('wao.ui.form.updateWaoUserCommand.passwordStrategy')}"
@@ -80,27 +89,38 @@
</fieldset>
- <fieldset>
+ <s:if test="authenticatedWaoUser.authorizedToChangeUserRights">
+ <fieldset>
- <legend><s:text name="wao.ui.form.WaoUser.rights" /></legend>
+ <legend><s:text name="wao.ui.form.WaoUser.rights" /></legend>
- <s:checkbox name="updateWaoUserCommand.admin" label="%{getText('wao.ui.form.updateWaoUserCommand.admin')}" />
- <s:checkbox name="updateWaoUserCommand.adminReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.adminReadOnly')}" />
- <s:checkbox name="updateWaoUserCommand.coordinator" label="%{getText('wao.ui.form.updateWaoUserCommand.coordinator')}" />
- <s:checkbox name="updateWaoUserCommand.coordinatorReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.coordinatorReadOnly')}" />
- <s:checkbox name="updateWaoUserCommand.observer" label="%{getText('wao.ui.form.updateWaoUserCommand.observer')}" />
- <s:checkbox name="updateWaoUserCommand.observerReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.observerReadOnly')}" />
- <s:checkbox name="updateWaoUserCommand.guest" label="%{getText('wao.ui.form.updateWaoUserCommand.guest')}" />
- <s:checkbox name="updateWaoUserCommand.guestReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.guestReadOnly')}" />
- <s:checkbox name="updateWaoUserCommand.professional" label="%{getText('wao.ui.form.updateWaoUserCommand.professional')}" />
- <s:checkbox name="updateWaoUserCommand.professionalReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.professionalReadOnly')}" />
+ <s:if test="authenticatedWaoUser.authorizedToSetAdmin">
+ <s:checkbox name="updateWaoUserCommand.admin" label="%{getText('wao.ui.form.updateWaoUserCommand.admin')}" />
+ <s:checkbox name="updateWaoUserCommand.adminReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.adminReadOnly')}" />
+ </s:if>
+ <s:if test="authenticatedWaoUser.authorizedToSetCoordinator">
+ <s:checkbox name="updateWaoUserCommand.coordinator" label="%{getText('wao.ui.form.updateWaoUserCommand.coordinator')}" />
+ <s:checkbox name="updateWaoUserCommand.coordinatorReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.coordinatorReadOnly')}" />
+ </s:if>
+ <s:if test="authenticatedWaoUser.authorizedToSetObserver">
+ <s:checkbox name="updateWaoUserCommand.observer" label="%{getText('wao.ui.form.updateWaoUserCommand.observer')}" />
+ <s:checkbox name="updateWaoUserCommand.observerReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.observerReadOnly')}" />
+ </s:if>
+ <s:if test="authenticatedWaoUser.authorizedToSetGuest">
+ <s:checkbox name="updateWaoUserCommand.guest" label="%{getText('wao.ui.form.updateWaoUserCommand.guest')}" />
+ <s:checkbox name="updateWaoUserCommand.guestReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.guestReadOnly')}" />
+ </s:if>
+ <s:if test="authenticatedWaoUser.authorizedToSetProfessional">
+ <s:checkbox name="updateWaoUserCommand.professional" label="%{getText('wao.ui.form.updateWaoUserCommand.professional')}" />
+ <s:checkbox name="updateWaoUserCommand.professionalReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.professionalReadOnly')}" />
+ <div id="defineCanReadBoats">
+ <s:textarea name="updateWaoUserCommand.canReadBoats" label="%{getText('wao.ui.form.updateWaoUserCommand.canReadBoats')}" />
+ </div>
+ </s:if>
- <div id="defineCanReadBoats">
- <s:textarea name="updateWaoUserCommand.canReadBoats" label="%{getText('wao.ui.form.updateWaoUserCommand.canReadBoats')}" />
- </div>
+ </fieldset>
+ </s:if>
- </fieldset>
-
<fieldset>
<legend><s:text name="wao.ui.form.WaoUser.preferences" /></legend>
Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/referential-management.jsp
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/referential-management.jsp 2014-03-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/referential-management.jsp 2014-03-06 16:50:28 UTC (rev 1716)
@@ -130,13 +130,13 @@
<table class="table table-bordered">
<tr>
<th>
- <s:text name="fr.ifremer.wao.services.service.ReferentialState.referentialName" />
+ <s:text name="fr.ifremer.wao.services.service.administration.ReferentialState.referentialName" />
</th>
<th>
- <s:text name="fr.ifremer.wao.services.service.ReferentialState.size" />
+ <s:text name="fr.ifremer.wao.services.service.administration.ReferentialState.size" />
</th>
<th>
- <s:text name="fr.ifremer.wao.services.service.ReferentialState.lastUpdate" />
+ <s:text name="fr.ifremer.wao.services.service.administration.ReferentialState.lastUpdate" />
</th>
</tr>
<s:iterator value="referentialStates">
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-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp 2014-03-06 16:50:28 UTC (rev 1716)
@@ -7,12 +7,14 @@
</head>
- <s:url action="edit-news!input" id="createNewsUrl" />
- <s:a href="%{createNewsUrl}">
- <i class="icon-plus"></i> <s:text name="wao.ui.action.createNews" />
- </s:a>
+ <s:if test="authenticatedWaoUser.authorizedToCreateNews">
+ <s:url action="edit-news!input" id="createNewsUrl" />
+ <s:a href="%{createNewsUrl}">
+ <i class="icon-plus"></i> <s:text name="wao.ui.action.createNews" />
+ </s:a>
+ </s:if>
- <s:iterator value="recentNews">
+ <s:iterator value="recentNews" var="aRecentNews">
<div class="news">
<h1>
@@ -23,27 +25,30 @@
<p>
<s:if test="fromAdmin">
- <s:property value="text('wao.ui.publishedByProgram')" />
+ <s:text name="wao.ui.publishedByProgram" />
</s:if>
<s:else>
- <s:property value="text('wao.ui.publishedByYourCompany')" />
+ <s:text name="wao.ui.publishedByYourCompany" />
</s:else>
+ <s:text name="wao.ui.misc.onDate" />
<s:property value="text('wao.ui.misc.onDate')" />
<s:property value="topiaCreateDate" />
- <s:url action="edit-news!input" id="editNewsUrl">
- <s:param name="newsId" value="topiaId" />
- </s:url>
- <s:a href="%{editNewsUrl}">
- <i class="icon-edit"></i> <s:text name="wao.ui.action.edit" />
- </s:a>
+ <s:if test="authenticatedWaoUser.isAuthorizedToEditOrDeleteNews(#aRecentNews)">
+ <s:url action="edit-news!input" id="editNewsUrl">
+ <s:param name="newsId" value="topiaId" />
+ </s:url>
+ <s:a href="%{editNewsUrl}">
+ <i class="icon-edit"></i> <s:text name="wao.ui.action.edit" />
+ </s:a>
- <s:url action="delete-news" id="deleteNewsUrl">
- <s:param name="newsId" value="topiaId" />
- </s:url>
- <s:a href="%{deleteNewsUrl}">
- <i class="icon-trash"></i> <s:text name="wao.ui.action.delete" />
- </s:a>
+ <s:url action="delete-news" id="deleteNewsUrl">
+ <s:param name="newsId" value="topiaId" />
+ </s:url>
+ <s:a href="%{deleteNewsUrl}">
+ <i class="icon-trash"></i> <s:text name="wao.ui.action.delete" />
+ </s:a>
+ </s:if>
</p>
</div>
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-06 13:50:31 UTC (rev 1715)
+++ trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-03-06 16:50:28 UTC (rev 1716)
@@ -29,7 +29,7 @@
<li class="active">
<s:url namespace="/%{obsProgram.name().toLowerCase()}" action="news" id="newsUrl" />
<s:a href="%{newsUrl}">
- <s:text name="wao.ui.page.Index.title" />
+ <i class="icon-home"></i> <s:text name="wao.ui.page.Index.title" />
</s:a>
</li>
<li>
@@ -64,18 +64,32 @@
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
- <li>
- <s:url namespace="/administration" action="referential-management" id="referentialManagementUrl" />
- <s:a href="%{referentialManagementUrl}">
- <i class="icon-upload"></i> <s:text name="wao.ui.page.ReferentialManagement.title" />
- </s:a>
- </li>
- <li>
- <s:url namespace="/administration" action="companies" id="companiesUrl" />
- <s:a href="%{companiesUrl}">
- <i class="icon-user"></i> <s:text name="wao.ui.page.companies.title" />
- </s:a>
- </li>
+ <s:if test="authenticatedWaoUser.authorizedToUpdateReferential">
+ <li>
+ <s:url namespace="/administration" action="referential-management" id="referentialManagementUrl" />
+ <s:a href="%{referentialManagementUrl}">
+ <i class="icon-upload"></i> <s:text name="wao.ui.page.ReferentialManagement.title" />
+ </s:a>
+ </li>
+ </s:if>
+ <s:if test="authenticatedWaoUser.authorizedToViewCompanies">
+ <li>
+ <s:url namespace="/administration" action="companies" id="companiesUrl" />
+ <s:a href="%{companiesUrl}">
+ <i class="icon-user"></i> <s:text name="wao.ui.page.companies.title" />
+ </s:a>
+ </li>
+ </s:if>
+ <s:if test="authenticatedWaoUser.authorizedToViewCompanyUsers">
+ <li>
+ <s:url namespace="/administration" action="wao-users" id="companyUsersUrl">
+ <s:param name="companyId" value="authenticatedWaoUser.waoUser.company.topiaId" />
+ </s:url>
+ <s:a href="%{companyUsersUrl}">
+ <i class="icon-user"></i> <s:property value="t('wao.ui.page.waoUsers.titleForCompany', authenticatedWaoUser.waoUser.company.name)" />
+ </s:a>
+ </li>
+ </s:if>
</ul>
</li>
<li class="dropdown">
@@ -100,9 +114,8 @@
</s:a>
</li>
<li>
-
<s:url namespace="/administration" action="edit-wao-user!input" id="editWaoUserUrl">
- <s:param name="waoUserId" value="waoUserId" />
+ <s:param name="waoUserId" value="%{authenticatedWaoUser.waoUser.topiaId}" />
</s:url>
<s:a href="%{editWaoUserUrl}">
<i class="icon-user"></i> <s:text name="wao.ui.page.UserProfileForm.title" />
@@ -149,6 +162,11 @@
</a>
</li>
<li>
+ <a href="http://forms.ifremer.fr/sih/wao-demande-dintervention-sur-le-site/" title="Page d'accueil du SIH" target="_blank">
+ Demande d’intervention
+ </a>
+ </li>
+ <li>
<a href="http://www.gnu.org/licenses/agpl.html" title="License AGPL v3" target="_blank">
AGPLv3
</a>
1
0
06 Mar '14
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>
1
0
r1714 - in trunk: wao-services/src/main/java/fr/ifremer/wao/services/service wao-services/src/test/java/fr/ifremer/wao/services/service wao-web/src/main/resources/i18n wao-web/src/main/webapp/WEB-INF/content/administration wao-web/src/main/webapp/WEB-INF/content/obsmer wao-web/src/main/webapp/WEB-INF/decorators wao-web/src/main/webapp/css
by bleny@users.forge.codelutin.com 05 Mar '14
by bleny@users.forge.codelutin.com 05 Mar '14
05 Mar '14
Author: bleny
Date: 2014-03-05 15:29:43 +0100 (Wed, 05 Mar 2014)
New Revision: 1714
Url: http://forge.codelutin.com/projects/wao/repository/revisions/1714
Log:
refs #4560 deal with WaoUser#canReadBoats field in edit-wao-user
Modified:
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.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/WaoUsersService.java
trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.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/companies.jsp
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/administration/wao-users.jsp
trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-news-input.jsp
trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp
trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp
trunk/wao-web/src/main/webapp/css/wao.css
Modified: 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 11:21:54 UTC (rev 1713)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java 2014-03-05 14:29:43 UTC (rev 1714)
@@ -25,6 +25,7 @@
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;
@@ -91,10 +92,13 @@
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.
@@ -103,6 +107,9 @@
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;
@@ -131,6 +138,7 @@
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
@@ -972,4 +980,21 @@
}
+ 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;
+
+ }
+
}
Modified: 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 11:21:54 UTC (rev 1713)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java 2014-03-05 14:29:43 UTC (rev 1714)
@@ -23,6 +23,21 @@
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) {
Modified: 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 11:21:54 UTC (rev 1713)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java 2014-03-05 14:29:43 UTC (rev 1714)
@@ -2,13 +2,18 @@
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;
@@ -71,10 +76,23 @@
if (optionalUserId.isPresent()) {
- updateWaoUserCommand.setWaoUser(getWaoUser(optionalUserId.get()));
+ 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());
@@ -89,8 +107,15 @@
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:
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 11:21:54 UTC (rev 1713)
+++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java 2014-03-05 14:29:43 UTC (rev 1714)
@@ -1,5 +1,6 @@
package fr.ifremer.wao.services.service;
+import fr.ifremer.wao.entity.Boat;
import fr.ifremer.wao.services.AbstractWaoServiceTest;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
@@ -9,6 +10,7 @@
import org.junit.Test;
import java.io.InputStream;
+import java.util.Collection;
import java.util.Date;
public class ReferentialServiceTest extends AbstractWaoServiceTest {
@@ -139,4 +141,13 @@
IOUtils.closeQuietly(input);
}
}
+
+ @Test
+ public void testGetBoatsByImmatriculations() {
+ testImportBoats();
+ Collection<Boat> boats = service.getBoatsFromImmatriculations("174258, 284595 978419");
+ Assert.assertEquals(3, boats.size());
+ boats = service.getBoatsFromImmatriculations(" ");
+ Assert.assertTrue(boats.isEmpty());
+ }
}
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 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-05 14:29:43 UTC (rev 1714)
@@ -230,6 +230,7 @@
wao.ui.form.sortByTideBegin=Sort by observation begin date
wao.ui.form.updateWaoUserCommand.admin=Administrator
wao.ui.form.updateWaoUserCommand.adminReadOnly=Administrator (read-only)
+wao.ui.form.updateWaoUserCommand.canReadBoats=Only able to read boats
wao.ui.form.updateWaoUserCommand.coordinator=Coordinator
wao.ui.form.updateWaoUserCommand.coordinatorReadOnly=Coordinator (read-only)
wao.ui.form.updateWaoUserCommand.guest=Guest
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 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-05 14:29:43 UTC (rev 1714)
@@ -230,6 +230,7 @@
wao.ui.form.sortByTideBegin=Trier par date de début d'observation (du plus récent au plus ancien)
wao.ui.form.updateWaoUserCommand.admin=Administrateur
wao.ui.form.updateWaoUserCommand.adminReadOnly=Administrateur (lecture seule)
+wao.ui.form.updateWaoUserCommand.canReadBoats=Limiter à la consultation des navires
wao.ui.form.updateWaoUserCommand.coordinator=Coordinateur
wao.ui.form.updateWaoUserCommand.coordinatorReadOnly=Coordinateur (lecture seule)
wao.ui.form.updateWaoUserCommand.guest=Invité
Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp 2014-03-05 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp 2014-03-05 14:29:43 UTC (rev 1714)
@@ -17,21 +17,14 @@
<th>
<s:text name="wao.ui.field.Company.active" />
</th>
- <th>
+ <th class="actions">
<s:text name="wao.ui.actions" />
</th>
</tr>
<s:iterator value="companies">
<tr>
- <td>
- <s:if test="active">
- <s:property value="name" />
- </s:if>
- <s:else>
- <del>
- <s:property value="name" />
- </del>
- </s:else>
+ <td<s:if test=" ! active"> class="inactive"</s:if>>
+ <s:property value="name" />
</td>
<td>
<s:if test="active">
@@ -41,7 +34,7 @@
<s:text name="wao.ui.misc.no" />
</s:else>
</td>
- <td>
+ <td class="actions">
<s:url action="edit-company!input" id="editCompanyUrl">
<s:param name="companyId" value="topiaId" />
</s:url>
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 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp 2014-03-05 14:29:43 UTC (rev 1714)
@@ -26,7 +26,7 @@
</s:a>
<s:submit type="button" cssClass="btn">
- <i class="icon-ok"></i> <s:text name="wao.ui.action.save" />
+ <i class="icon-hdd"></i> <s:text name="wao.ui.action.save" />
</s:submit>
</div>
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 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp 2014-03-05 14:29:43 UTC (rev 1714)
@@ -16,9 +16,26 @@
}
}
- $('input[name="updateWaoUserCommand\\.passwordStrategy"]').change(showHideDefinePasswordFunction);
+ var $updateWaoUserCommandProfessionalInput = $('input[name="updateWaoUserCommand.professional"]');
+ var $updateWaoUserCommandProfessionalReadOnlyInput = $('input[name="updateWaoUserCommand.professionalReadOnly"]');
+ var showHideDefineCanReadBoatsFunction = function () {
+ var $defineCanReadBoats = $('#defineCanReadBoats');
+ if ($updateWaoUserCommandProfessionalInput.prop('checked') || $updateWaoUserCommandProfessionalReadOnlyInput.prop('checked')) {
+ $defineCanReadBoats.show();
+ } else {
+ $defineCanReadBoats.hide();
+ }
+ }
+
+ // bindings
+ $('input[name="updateWaoUserCommand.passwordStrategy"]').change(showHideDefinePasswordFunction);
+ $updateWaoUserCommandProfessionalInput.change(showHideDefineCanReadBoatsFunction);
+ $updateWaoUserCommandProfessionalReadOnlyInput.change(showHideDefineCanReadBoatsFunction);
+
+ // init
showHideDefinePasswordFunction();
+ showHideDefineCanReadBoatsFunction();
});
</script>
@@ -37,7 +54,9 @@
<s:select name="updateWaoUserCommand.companyId"
label="%{getText('wao.ui.entity.Company')}"
list="updateWaoUserCommand.allCompanies"
- listValue="%{value.name}" />
+ listValue="%{value.name}"
+ cssClass="input-xxlarge"/>
+ <s:checkbox name="updateWaoUserCommand.waoUser.active" label="%{getText('wao.ui.field.WaoUser.active')}" />
</fieldset>
@@ -64,8 +83,6 @@
<legend><s:text name="wao.ui.form.WaoUser.rights" /></legend>
- <s:checkbox name="updateWaoUserCommand.waoUser.active" label="%{getText('wao.ui.field.WaoUser.active')}" />
-
<s:checkbox name="updateWaoUserCommand.admin" label="%{getText('wao.ui.form.updateWaoUserCommand.admin')}" />
<s:checkbox name="updateWaoUserCommand.adminReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.adminReadOnly')}" />
<s:checkbox name="updateWaoUserCommand.coordinator" label="%{getText('wao.ui.form.updateWaoUserCommand.coordinator')}" />
@@ -77,6 +94,10 @@
<s:checkbox name="updateWaoUserCommand.professional" label="%{getText('wao.ui.form.updateWaoUserCommand.professional')}" />
<s:checkbox name="updateWaoUserCommand.professionalReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.professionalReadOnly')}" />
+ <div id="defineCanReadBoats">
+ <s:textarea name="updateWaoUserCommand.canReadBoats" label="%{getText('wao.ui.form.updateWaoUserCommand.canReadBoats')}" />
+ </div>
+
</fieldset>
<fieldset>
@@ -88,13 +109,15 @@
</fieldset>
<div class="form-actions">
- <s:url action="companies" id="companiesUrl" />
- <s:a href="%{companiesUrl}" cssClass="btn">
+ <s:url action="wao-users" id="waoUsersUrl">
+ <s:param name="companyId" value="updateWaoUserCommand.companyId" />
+ </s:url>
+ <s:a href="%{waoUsersUrl}" cssClass="btn">
<i class="icon-chevron-left"></i> <s:text name="wao.ui.action.cancel" />
</s:a>
<s:submit type="button" cssClass="btn">
- <i class="icon-ok"></i> <s:text name="wao.ui.action.save" />
+ <i class="icon-hdd"></i> <s:text name="wao.ui.action.save" />
</s:submit>
</div>
Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp 2014-03-05 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp 2014-03-05 14:29:43 UTC (rev 1714)
@@ -26,15 +26,8 @@
</tr>
<s:iterator value="waoUsers">
<tr>
- <td>
- <s:if test="active">
- <s:property value="login" />
- </s:if>
- <s:else>
- <del>
- <s:property value="login" />
- </del>
- </s:else>
+ <td<s:if test=" ! active"> class="inactive"</s:if>>
+ <s:property value="login" />
</td>
<td>
<s:property value="fullName" />
Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-news-input.jsp
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-news-input.jsp 2014-03-05 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-news-input.jsp 2014-03-05 14:29:43 UTC (rev 1714)
@@ -11,7 +11,7 @@
<s:textfield name="news.title" label="%{getText('wao.ui.news.title')}" cssClass="input-xxlarge" />
- <s:textarea name="news.content" label="%{getText('wao.ui.news.content')}" cssClass="input-xxlarge" rows="15" />
+ <s:textarea name="news.content" label="%{getText('wao.ui.news.content')}" />
<div class="form-actions">
<s:url action="news" id="newsUrl" />
@@ -20,7 +20,7 @@
</s:a>
<s:submit type="button" cssClass="btn">
- <i class="icon-ok"></i> <s:text name="wao.ui.action.save" />
+ <i class="icon-hdd"></i> <s:text name="wao.ui.action.save" />
</s:submit>
</div>
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 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp 2014-03-05 14:29:43 UTC (rev 1714)
@@ -9,7 +9,7 @@
<s:url action="edit-news!input" id="createNewsUrl" />
<s:a href="%{createNewsUrl}">
- <%-- TODO i18n -->
+ <%-- TODO i18n --%>
<i class="icon-plus"></i> Ajouter une actualité
</s:a>
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 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-03-05 14:29:43 UTC (rev 1714)
@@ -27,31 +27,31 @@
<a class="brand" href="#">Wao <s:property value="getText(obsProgram)" /></a>
<ul class="nav">
<li class="active">
- <s:url action="news" id="newsUrl" />
+ <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="news" id="newsUrl" />
<s:a href="%{newsUrl}">
<s:text name="wao.ui.page.Index.title" />
</s:a>
</li>
<li>
- <s:url action="sampling-plan" id="samplingPlanUrl" />
+ <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="sampling-plan" id="samplingPlanUrl" />
<s:a href="%{samplingPlanUrl}">
<s:text name="wao.ui.page.SamplingPlan.title" />
</s:a>
</li>
<li>
- <s:url action="boats" id="boatsUrl" />
+ <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="boats" id="boatsUrl" />
<s:a href="%{boatsUrl}">
<s:text name="wao.ui.page.Boats.title" />
</s:a>
</li>
<li>
- <s:url action="contacts" id="contactsUrl" />
+ <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="contacts" id="contactsUrl" />
<s:a href="%{contactsUrl}">
<s:text name="wao.ui.page.Contacts.title" />
</s:a>
</li>
<li>
- <s:url action="synthesis" id="synthesisUrl" />
+ <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="synthesis" id="synthesisUrl" />
<s:a href="%{synthesisUrl}">
<s:text name="wao.ui.page.Synthesis.title" />
</s:a>
@@ -111,12 +111,12 @@
</div>
</div>
- <content>
+ <main>
<s:actionerror theme="bootstrap" />
<s:actionmessage theme="bootstrap" />
<s:fielderror theme="bootstrap" />
<decorator:body />
- </content>
+ </main>
<footer class="hidden-print<s:if test="%{instanceDisclaimer != null}"> disclaimer-displayed</s:if>" >
<ul>
Modified: trunk/wao-web/src/main/webapp/css/wao.css
===================================================================
--- trunk/wao-web/src/main/webapp/css/wao.css 2014-03-05 11:21:54 UTC (rev 1713)
+++ trunk/wao-web/src/main/webapp/css/wao.css 2014-03-05 14:29:43 UTC (rev 1714)
@@ -1,3 +1,7 @@
+/**
+ * Le style du layout
+ */
+
footer {
text-align: center;
margin-left: auto;
@@ -11,4 +15,45 @@
footer ul li {
display: inline;
margin-left: 20px;
-}
\ No newline at end of file
+}
+
+main {
+ max-width: 800px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/**
+ * Le style général des formulaires
+ */
+
+.form-actions {
+ margin-top: 75px;
+}
+
+textarea {
+ width: 100%;
+ min-height: 300px;
+}
+
+.form-actions button[type="submit"] {
+ float: right;
+}
+
+legend+.control-group {
+ margin-top: 0px;
+}
+
+/**
+ * Des classes à usage transverse
+ */
+
+/* pour représente qu'une entité (société, utilisateur) est inactive */
+.inactive {
+ text-decoration: line-through;
+}
+
+th.actions, td.actions {
+ white-space: nowrap;
+}
+
1
0
r1713 - in trunk: wao-persistence/src/main/java/fr/ifremer/wao/entity wao-services/src/main/java/fr/ifremer/wao/services/service wao-services/src/main/resources/i18n wao-web/src/main/java/fr/ifremer/wao/web/action/administration wao-web/src/main/resources/i18n wao-web/src/main/webapp/WEB-INF/content/administration
by bleny@users.forge.codelutin.com 05 Mar '14
by bleny@users.forge.codelutin.com 05 Mar '14
05 Mar '14
Author: bleny
Date: 2014-03-05 12:21:54 +0100 (Wed, 05 Mar 2014)
New Revision: 1713
Url: http://forge.codelutin.com/projects/wao/repository/revisions/1713
Log:
refs #4560 start users management
Added:
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/action/administration/DeleteWaoUserAction.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/WaoUsersAction.java
trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp
trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp
Modified:
trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/UserRole.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-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/companies.jsp
Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/UserRole.java
===================================================================
--- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/UserRole.java 2014-03-05 11:21:07 UTC (rev 1712)
+++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/UserRole.java 2014-03-05 11:21:54 UTC (rev 1713)
@@ -77,11 +77,12 @@
/** for a given program, return the roles that can be assigned by someone
* who own the role <code>userRole</code>
+ *
* @param obsProgram available roles depends on the program
* @param userRole role of the user who want to grant rights
* @return roles that the user can affect
*/
- public static UserRole[] getAllowedRoles(ObsProgram obsProgram, UserRole userRole) {
+ public static List<UserRole> getAllowedRoles(ObsProgram obsProgram, UserRole userRole) {
List<UserRole> allowedRoles = new ArrayList<UserRole>();
allowedRoles.add(UserRole.COORDINATOR);
allowedRoles.add(UserRole.OBSERVER);
@@ -94,7 +95,6 @@
allowedRoles.add(UserRole.PROFESSIONAL);
}
}
- UserRole[] result = allowedRoles.toArray(new UserRole[allowedRoles.size()]);
- return result;
+ return allowedRoles;
}
}
Added: 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 (rev 0)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java 2014-03-05 11:21:54 UTC (rev 1713)
@@ -0,0 +1,209 @@
+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;
+
+ 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;
+ }
+}
Added: 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 (rev 0)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommandPasswordStrategy.java 2014-03-05 11:21:54 UTC (rev 1713)
@@ -0,0 +1,30 @@
+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;
+ }
+}
Added: 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 (rev 0)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java 2014-03-05 11:21:54 UTC (rev 1713)
@@ -0,0 +1,143 @@
+package fr.ifremer.wao.services.service;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import fr.ifremer.wao.entity.Company;
+import fr.ifremer.wao.entity.ObsProgram;
+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.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()) {
+
+ updateWaoUserCommand.setWaoUser(getWaoUser(optionalUserId.get()));
+
+ updateWaoUserCommand.setPasswordStrategy(UpdateWaoUserCommandPasswordStrategy.KEEP_SAME_PASSWORD);
+
+ } else {
+
+ updateWaoUserCommand.setWaoUser(newWaoUser());
+
+ updateWaoUserCommand.setPasswordStrategy(UpdateWaoUserCommandPasswordStrategy.GENERATE_NEW_PASSWORD);
+
+ }
+
+ return updateWaoUserCommand;
+
+ }
+
+ public void save(UpdateWaoUserCommand updateWaoUserCommand) {
+
+ WaoUser waoUser = updateWaoUserCommand.getWaoUser();
+
+ 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();
+
+ }
+
+}
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 11:21:07 UTC (rev 1712)
+++ trunk/wao-services/src/main/resources/i18n/wao-services_en_GB.properties 2014-03-05 11:21:54 UTC (rev 1713)
@@ -1,3 +1,6 @@
+UpdateWaoUserCommandPasswordStrategy.DEFINE_PASSWORD=Manually define the password
+UpdateWaoUserCommandPasswordStrategy.GENERATE_NEW_PASSWORD=Generate a new password
+UpdateWaoUserCommandPasswordStrategy.KEEP_SAME_PASSWORD=Keep the same password
csv.import.error.missingMandatoryHeaders=The mandatory fields %s are missing
csv.import.error.unableToParseValue=Unable to parse value '%s' (column '%s', line %s)
csv.import.error.unableToReadField=Unable to read value of column '%s' at line %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 11:21:07 UTC (rev 1712)
+++ trunk/wao-services/src/main/resources/i18n/wao-services_fr_FR.properties 2014-03-05 11:21:54 UTC (rev 1713)
@@ -1,3 +1,6 @@
+UpdateWaoUserCommandPasswordStrategy.DEFINE_PASSWORD=Définir le mot de passe manuellement
+UpdateWaoUserCommandPasswordStrategy.GENERATE_NEW_PASSWORD=Générer un nouveau mot de passe
+UpdateWaoUserCommandPasswordStrategy.KEEP_SAME_PASSWORD=Conserver le mot de passe actuel
csv.import.error.missingMandatoryHeaders=Les champs obligatoires %s sont manquants
csv.import.error.unableToParseValue=Erreur lors de l'interprétation de la valeur '%s' (colonne '%s', ligne %s)
csv.import.error.unableToReadField=Impossible de lire la colonne '%s' à la ligne %s
Copied: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteWaoUserAction.java (from rev 1710, 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 (rev 0)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteWaoUserAction.java 2014-03-05 11:21:54 UTC (rev 1713)
@@ -0,0 +1,49 @@
+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.web.WaoJspActionSupport;
+import org.apache.struts2.convention.annotation.Result;
+import org.apache.struts2.convention.annotation.Results;
+
+@Results({
+ @Result(name="error", type="redirectAction", params = { "actionName", "wao-users" }),
+ @Result(name="success", type="redirectAction", params = { "actionName", "wao-users" })
+})
+public class DeleteWaoUserAction extends WaoJspActionSupport {
+
+ protected WaoUsersService service;
+
+ protected String waoUserId;
+
+ public void setService(WaoUsersService service) {
+ this.service = service;
+ }
+
+ public void setWaoUserId(String waoUserId) {
+ this.waoUserId = waoUserId;
+ }
+
+ @Override
+ public String execute() {
+
+ try {
+
+ service.deleteWaoUser(waoUserId);
+
+ session.addMessage(t("wao.ui.action.deleteWaoUser.success"));
+
+ return SUCCESS;
+
+ } catch (IllegalDeletionException e) {
+
+ // TODO brendan 04/03/14 préciser le problème
+ session.addErrorMessages(t("wao.ui.action.deleteWaoUser.failure"));
+
+ return ERROR;
+
+ }
+
+ }
+
+}
Copied: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java (from rev 1710, 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 (rev 0)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java 2014-03-05 11:21:54 UTC (rev 1713)
@@ -0,0 +1,103 @@
+package fr.ifremer.wao.web.action.administration;
+
+import com.google.common.base.Optional;
+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.web.WaoJspActionSupport;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.struts2.convention.annotation.Result;
+import org.apache.struts2.convention.annotation.Results;
+
+@Results({
+ @Result(name="success", type="redirectAction", params = { "actionName", "wao-users", "companyId", "%{companyId}" })
+})
+public class EditWaoUserAction extends WaoJspActionSupport implements Preparable {
+
+ protected WaoUsersService service;
+
+ protected Optional<String> optionalWaoUserId = Optional.absent();
+
+ protected Optional<String> optionalCompanyId = Optional.absent();
+
+ protected UpdateWaoUserCommand updateWaoUserCommand;
+
+ public void setService(WaoUsersService service) {
+ this.service = service;
+ }
+
+ public void setWaoUserId(String waoUserId) {
+ this.optionalWaoUserId = Optional.fromNullable(Strings.emptyToNull(waoUserId));
+ }
+
+ public void setCompanyId(String companyId) {
+ this.optionalCompanyId = Optional.fromNullable(Strings.emptyToNull(companyId));
+ }
+
+ @Override
+ public void prepare() {
+
+ updateWaoUserCommand = service.newUpdateWaoUserCommand(getObsProgram(), optionalWaoUserId);
+
+ if (optionalCompanyId.isPresent()) {
+ updateWaoUserCommand.setCompanyId(optionalCompanyId.get());
+ }
+
+ }
+
+ @Override
+ public void validate() {
+
+ if (updateWaoUserCommand.getPasswordStrategy().isDefinePassword()) {
+ if (StringUtils.isEmpty(updateWaoUserCommand.getClearPassword())) {
+ addFieldError("updateWaoUserCommand.clearPassword", t("wao.ui.form.updateWaoUserCommand.missingPassword"));
+ }
+ if ( ! updateWaoUserCommand.getClearPassword().equals(updateWaoUserCommand.getClearPasswordConfirmation())) {
+ addFieldError("updateWaoUserCommand.clearPasswordConfirmation", t("wao.ui.form.updateWaoUserCommand.passwordMismatch"));
+ }
+ }
+
+ if (updateWaoUserCommand.getCompanyId() == null) {
+ addFieldError("updateWaoUserCommand.companyId", t("wao.ui.form.updateWaoUserCommand.requiredCompany"));
+ } else {
+ }
+
+ }
+
+ @Override
+ public String execute() {
+
+ service.save(updateWaoUserCommand);
+
+ session.addMessage(t("wao.ui.form.updateWaoUserCommand.success", updateWaoUserCommand.getWaoUser().getLogin()));
+
+ // for redirection
+ setCompanyId(updateWaoUserCommand.getWaoUser().getCompany().getTopiaId());
+
+ return SUCCESS;
+
+ }
+
+ public String getWaoUserId() {
+ return optionalWaoUserId.orNull();
+ }
+
+ public String getCompanyId() {
+ return optionalCompanyId.orNull();
+ }
+
+ public UpdateWaoUserCommand getUpdateWaoUserCommand() {
+ if (updateWaoUserCommand == null) {
+ return service.newUpdateWaoUserCommand(getObsProgram(), optionalWaoUserId);
+ }
+ return updateWaoUserCommand;
+ }
+
+ public ImmutableSet<UpdateWaoUserCommandPasswordStrategy> getUpdateWaoUserCommandPasswordStrategies() {
+ return ImmutableSet.copyOf(UpdateWaoUserCommandPasswordStrategy.values());
+ }
+
+}
Copied: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/WaoUsersAction.java (from rev 1710, 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/WaoUsersAction.java (rev 0)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/WaoUsersAction.java 2014-03-05 11:21:54 UTC (rev 1713)
@@ -0,0 +1,38 @@
+package fr.ifremer.wao.web.action.administration;
+
+import com.google.common.base.Optional;
+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.web.WaoJspActionSupport;
+
+import java.util.List;
+
+public class WaoUsersAction extends WaoJspActionSupport implements Preparable {
+
+ protected WaoUsersService service;
+
+ protected Optional<String> optionalCompanyId = Optional.absent();
+
+ protected List<WaoUser> waoUsers;
+
+ public void setService(WaoUsersService service) {
+ this.service = service;
+ }
+
+ public void setCompanyId(String companyId) {
+ this.optionalCompanyId = Optional.fromNullable(Strings.emptyToNull(companyId));
+ }
+
+ @Override
+ public void prepare() {
+
+ waoUsers = service.getWaoUsers(optionalCompanyId);
+
+ }
+
+ public List<WaoUser> getWaoUsers() {
+ return waoUsers;
+ }
+}
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 11:21:07 UTC (rev 1712)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-05 11:21:54 UTC (rev 1713)
@@ -25,10 +25,12 @@
wao.ui.action.contactAdmin=Contact an admin
wao.ui.action.create=Create
wao.ui.action.createCompany=Create a company
-wao.ui.action.createUser=Create a user
+wao.ui.action.createWaoUser=Create a user
wao.ui.action.delete=Delete
wao.ui.action.deleteCompany=Delete company
wao.ui.action.deleteCompany.confirm=Are you sure you want to delete this company ?
+wao.ui.action.deleteCompany.failure=The company cannot be deleted
+wao.ui.action.deleteCompany.success=Company deleted successfully
wao.ui.action.deleteContact=Delete contact
wao.ui.action.deleteContact.confirm=Are you sure you want to delete this contact ?
wao.ui.action.deleteNews=Delete this news
@@ -37,6 +39,8 @@
wao.ui.action.deleteSampleRow.confirm=Are you sure your want to delete this sample row ?
wao.ui.action.deleteUser=Delete this user
wao.ui.action.deleteUser.confirm=Are your sure you want to delete this user ?
+wao.ui.action.deleteWaoUser.failure=The user cannot be deleted
+wao.ui.action.deleteWaoUser.success=User deleted successfully
wao.ui.action.edit=Edit
wao.ui.action.enlargeView=Enlarge view
wao.ui.action.exportBoats=Export boats with private infos
@@ -54,10 +58,12 @@
wao.ui.action.runImport=Run import
wao.ui.action.runSearch=Run search
wao.ui.action.save=Save
+wao.ui.action.save.success=Modifications saved
wao.ui.action.showDetails=Show details
wao.ui.action.showFilters=Show filters
wao.ui.action.unvalidateContact=Unvalidate contact
wao.ui.action.viewBoatsForRow=View the boats for this sample row
+wao.ui.action.viewCompanyWaoUsers=View users for this company
wao.ui.action.viewIndicatorsHistory=View indicators historic
wao.ui.actions=Actions
wao.ui.boatList=List of %s boats
@@ -106,7 +112,13 @@
wao.ui.field.BoatDistrict.code=District code
wao.ui.field.BoatInfos.dup=Capacity of the ship in specialized staff
wao.ui.field.Company.active=Active
+wao.ui.field.Company.address1=Address
+wao.ui.field.Company.address2=Address (
+wao.ui.field.Company.city=City
+wao.ui.field.Company.email=E-mail
wao.ui.field.Company.name=Name
+wao.ui.field.Company.phoneNumber=Phone number
+wao.ui.field.Company.postalCode=Post code
wao.ui.field.Contact.beginDate=Observation start
wao.ui.field.Contact.comment=Observer comment
wao.ui.field.Contact.commentAdmin=Program comment
@@ -171,8 +183,12 @@
wao.ui.field.User.lastName=Last name
wao.ui.field.User.login=Login
wao.ui.field.UserProfile.userRole=Role
+wao.ui.field.WaoUser.active=Active
wao.ui.field.WaoUser.canReadBoats=Restraint view to boats
-wao.ui.field.WaoUser.login=Identifier
+wao.ui.field.WaoUser.firstName=First name
+wao.ui.field.WaoUser.fullName=Name
+wao.ui.field.WaoUser.lastName=Last name
+wao.ui.field.WaoUser.login=Login
wao.ui.field.WaoUser.mammalsNotifications=Receive notifications about mammals captures
wao.ui.field.WaoUser.password=Password
wao.ui.filters.filters=Search filters
@@ -183,6 +199,10 @@
wao.ui.form.SampleRow.missingBeginDate=Begin date missing to generate line code
wao.ui.form.SampleRow.others=Others data of the sample row
wao.ui.form.SampleRow.program=Associated program and observation effort by months
+wao.ui.form.WaoUser.credentials=Credentials
+wao.ui.form.WaoUser.identity=Identity
+wao.ui.form.WaoUser.preferences=Preferences
+wao.ui.form.WaoUser.rights=Rights
wao.ui.form.addComment=Add a comment
wao.ui.form.addRole=Add this ru00F4le
wao.ui.form.boardingFrom=Boardings since
@@ -208,6 +228,21 @@
wao.ui.form.repeatPassword=Repeat password
wao.ui.form.roles=Roles
wao.ui.form.sortByTideBegin=Sort by observation begin date
+wao.ui.form.updateWaoUserCommand.admin=Administrator
+wao.ui.form.updateWaoUserCommand.adminReadOnly=Administrator (read-only)
+wao.ui.form.updateWaoUserCommand.coordinator=Coordinator
+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.missingPassword=The password is missing
+wao.ui.form.updateWaoUserCommand.observer=Observer
+wao.ui.form.updateWaoUserCommand.observerReadOnly=Observer (read-only)
+wao.ui.form.updateWaoUserCommand.passwordMismatch=Provided passwords don't match
+wao.ui.form.updateWaoUserCommand.passwordStrategy=Password modification
+wao.ui.form.updateWaoUserCommand.professional=Professional
+wao.ui.form.updateWaoUserCommand.professionalReadOnly=Professional (read-only)
+wao.ui.form.updateWaoUserCommand.requiredCompany=The company is required
+wao.ui.form.updateWaoUserCommand.success=Modifications about %s saved
wao.ui.import.boatDistrictLabel=of the coordinates of boat districts
wao.ui.import.boatGroupsLabel=of the boat groups
wao.ui.import.boatsLabel=of boats
@@ -292,6 +327,7 @@
wao.ui.page.Synthesis.title=Synthesis
wao.ui.page.UserProfileForm.title=Profile management
wao.ui.page.companies.title=Companies
+wao.ui.page.waoUsers.title=Users
wao.ui.publishedByProgram=Pusblished by program
wao.ui.publishedByYourCompany=Published by company
wao.ui.sampleRow.creation=Creation of a sample row
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 11:21:07 UTC (rev 1712)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-05 11:21:54 UTC (rev 1713)
@@ -25,10 +25,12 @@
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.createUser=Créer un utilisateur
+wao.ui.action.createWaoUser=Créer un utilisateur
wao.ui.action.delete=Supprimer
wao.ui.action.deleteCompany=Supprimer la société
wao.ui.action.deleteCompany.confirm=Êtes-vous sûr de vouloir supprimer la société ?
+wao.ui.action.deleteCompany.failure=La suppression de la société a échoué
+wao.ui.action.deleteCompany.success=La société a bien été supprimée
wao.ui.action.deleteContact=Supprimer le contact
wao.ui.action.deleteContact.confirm=Êtes-vous sûr de vouloir supprimer définitivement ce contact ?
wao.ui.action.deleteNews=Supprimer la nouvelle
@@ -37,6 +39,8 @@
wao.ui.action.deleteSampleRow.confirm=Êtes-vous sûr de vouloir supprimer la ligne %s du plan ?
wao.ui.action.deleteUser=Supprimer l'utilisateur
wao.ui.action.deleteUser.confirm=Êtes-vous sûr de vouloir supprimer l'utilisateur ?
+wao.ui.action.deleteWaoUser.failure=La suppression de l'utilisateur a échoué
+wao.ui.action.deleteWaoUser.success=L'utilisateur a bien été supprimé
wao.ui.action.edit=Modifier
wao.ui.action.enlargeView=Agrandir la vue
wao.ui.action.exportBoats=Exporter les $s navires avec leurs informations privées
@@ -54,10 +58,12 @@
wao.ui.action.runImport=Lancer l'import
wao.ui.action.runSearch=Lancer la recherche
wao.ui.action.save=Enregistrer
+wao.ui.action.save.success=Les informations ont bien été enregistrées
wao.ui.action.showDetails=Voir les détails
wao.ui.action.showFilters=Afficher les filtres
wao.ui.action.unvalidateContact=Invalider le contact
wao.ui.action.viewBoatsForRow=Voir les navires présentis pour cette ligne
+wao.ui.action.viewCompanyWaoUsers=Voir les utilisateurs associés à cette société
wao.ui.action.viewIndicatorsHistory=Voir l'historique des modifications des indicateurs
wao.ui.actions=Actions
wao.ui.boatList=Liste de %s navires
@@ -106,7 +112,13 @@
wao.ui.field.BoatDistrict.code=Code du quartier maritime
wao.ui.field.BoatInfos.dup=Capacité d'accueil du navire en personnels spécialisés
wao.ui.field.Company.active=Active
+wao.ui.field.Company.address1=Adresse
+wao.ui.field.Company.address2=Complément d'adresse
+wao.ui.field.Company.city=Ville
+wao.ui.field.Company.email=E-mail
wao.ui.field.Company.name=Nom
+wao.ui.field.Company.phoneNumber=N° de téléphone
+wao.ui.field.Company.postalCode=Code postal
wao.ui.field.Contact.beginDate=Début d'observation
wao.ui.field.Contact.comment=Commentaire observateur
wao.ui.field.Contact.commentAdmin=Commentaire programme
@@ -171,7 +183,11 @@
wao.ui.field.User.lastName=Nom
wao.ui.field.User.login=Identifiant
wao.ui.field.UserProfile.userRole=Rôle
+wao.ui.field.WaoUser.active=Actif
wao.ui.field.WaoUser.canReadBoats=Restreindre la vue aux navires
+wao.ui.field.WaoUser.firstName=Prénom
+wao.ui.field.WaoUser.fullName=Nom
+wao.ui.field.WaoUser.lastName=Nom
wao.ui.field.WaoUser.login=Identifiant
wao.ui.field.WaoUser.mammalsNotifications=Recevoir les notifications de captures accidentelles
wao.ui.field.WaoUser.password=Mot de passe
@@ -183,6 +199,10 @@
wao.ui.form.SampleRow.missingBeginDate=Date de début manquante pour générer le code de la ligne \!
wao.ui.form.SampleRow.others=Autres données de la ligne d'échantillonnage
wao.ui.form.SampleRow.program=Programme de rattachement et effort d'observation par mois
+wao.ui.form.WaoUser.credentials=Informations d'authentification
+wao.ui.form.WaoUser.identity=Identité
+wao.ui.form.WaoUser.preferences=Préférences
+wao.ui.form.WaoUser.rights=Droits
wao.ui.form.addComment=Ajouter un commentaire
wao.ui.form.addRole=Ajouter ce rôle
wao.ui.form.boardingFrom=Sollicitations du navire depuis le
@@ -208,6 +228,21 @@
wao.ui.form.repeatPassword=Répéter le mot de passe
wao.ui.form.roles=Rôles
wao.ui.form.sortByTideBegin=Trier par date de début d'observation (du plus récent au plus ancien)
+wao.ui.form.updateWaoUserCommand.admin=Administrateur
+wao.ui.form.updateWaoUserCommand.adminReadOnly=Administrateur (lecture seule)
+wao.ui.form.updateWaoUserCommand.coordinator=Coordinateur
+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.missingPassword=Il faut renseigner un mot de passe
+wao.ui.form.updateWaoUserCommand.observer=Observateur
+wao.ui.form.updateWaoUserCommand.observerReadOnly=Observateur (lecture seule)
+wao.ui.form.updateWaoUserCommand.passwordMismatch=La confirmation du mot de passe ne correspond pas au mot de passe indiqué
+wao.ui.form.updateWaoUserCommand.passwordStrategy=Changement du mot de passe
+wao.ui.form.updateWaoUserCommand.professional=Professionel
+wao.ui.form.updateWaoUserCommand.professionalReadOnly=Professionel (lecture seule)
+wao.ui.form.updateWaoUserCommand.requiredCompany=Il faut associer l'utilisateur à une société
+wao.ui.form.updateWaoUserCommand.success=Les modifications concernant l'utilisateur %s ont bien été enregistrées
wao.ui.import.boatDistrictLabel=des coordonnées des quartiers des navires
wao.ui.import.boatGroupsLabel=des strates des navires
wao.ui.import.boatsLabel=des navires
@@ -292,6 +327,7 @@
wao.ui.page.Synthesis.title=Synthèse
wao.ui.page.UserProfileForm.title=Gestion du profil
wao.ui.page.companies.title=Sociétés
+wao.ui.page.waoUsers.title=Utilisateurs
wao.ui.publishedByProgram=Publiée par le programme
wao.ui.publishedByYourCompany=Publiée par la société
wao.ui.sampleRow.creation=Création d'une ligne du plan d'échantillonnage
Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp 2014-03-05 11:21:07 UTC (rev 1712)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp 2014-03-05 11:21:54 UTC (rev 1713)
@@ -55,6 +55,13 @@
<s:a href="%{deleteCompanyUrl}">
<i class="icon-trash"></i> <s:text name="wao.ui.action.delete" />
</s:a>
+
+ <s:url action="wao-users" id="waoUsersUrl">
+ <s:param name="companyId" value="topiaId" />
+ </s:url>
+ <s:a href="%{waoUsersUrl}">
+ <i class="icon-list"></i> <s:text name="wao.ui.action.viewCompanyWaoUsers" />
+ </s:a>
</td>
</tr>
</s:iterator>
Copied: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp (from rev 1710, 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 (rev 0)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp 2014-03-05 11:21:54 UTC (rev 1713)
@@ -0,0 +1,103 @@
+<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
+<%@taglib uri="/struts-tags" prefix="s" %>
+
+<html>
+ <head>
+ <script>
+ $(document).ready(function () {
+
+ var showHideDefinePasswordFunction = function () {
+ var $definePassword = $('#definePassword');
+ var $definePasswordInput = $('input[value="DEFINE_PASSWORD"]');
+ if ($definePasswordInput.prop('checked')) {
+ $definePassword.show();
+ } else {
+ $definePassword.hide();
+ }
+ }
+
+ $('input[name="updateWaoUserCommand\\.passwordStrategy"]').change(showHideDefinePasswordFunction);
+
+ showHideDefinePasswordFunction();
+
+ });
+ </script>
+ </head>
+
+ <s:form>
+
+ <s:hidden name="waoUserId" value="%{waoUserId}" />
+
+ <fieldset>
+
+ <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:select name="updateWaoUserCommand.companyId"
+ label="%{getText('wao.ui.entity.Company')}"
+ list="updateWaoUserCommand.allCompanies"
+ listValue="%{value.name}" />
+
+ </fieldset>
+
+ <fieldset>
+
+ <legend><s:text name="wao.ui.form.WaoUser.credentials" /></legend>
+
+ <s:textfield name="updateWaoUserCommand.waoUser.login" label="%{getText('wao.ui.field.WaoUser.login')}" requiredLabel="true" cssClass="input-xlarge" />
+
+ <s:radio name="updateWaoUserCommand.passwordStrategy"
+ label="%{getText('wao.ui.form.updateWaoUserCommand.passwordStrategy')}"
+ listValue="%{getText(top.i18nKey)}"
+ list="updateWaoUserCommandPasswordStrategies"
+ requiredLabel="true" />
+
+ <div id="definePassword">
+ <s:textfield type="password" name="updateWaoUserCommand.clearPassword" label="%{getText('wao.ui.field.WaoUser.password')}" />
+ <s:textfield type="password" name="updateWaoUserCommand.clearPasswordConfirmation" label="%{getText('wao.ui.form.repeatPassword')}" />
+ </div>
+
+ </fieldset>
+
+ <fieldset>
+
+ <legend><s:text name="wao.ui.form.WaoUser.rights" /></legend>
+
+ <s:checkbox name="updateWaoUserCommand.waoUser.active" label="%{getText('wao.ui.field.WaoUser.active')}" />
+
+ <s:checkbox name="updateWaoUserCommand.admin" label="%{getText('wao.ui.form.updateWaoUserCommand.admin')}" />
+ <s:checkbox name="updateWaoUserCommand.adminReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.adminReadOnly')}" />
+ <s:checkbox name="updateWaoUserCommand.coordinator" label="%{getText('wao.ui.form.updateWaoUserCommand.coordinator')}" />
+ <s:checkbox name="updateWaoUserCommand.coordinatorReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.coordinatorReadOnly')}" />
+ <s:checkbox name="updateWaoUserCommand.observer" label="%{getText('wao.ui.form.updateWaoUserCommand.observer')}" />
+ <s:checkbox name="updateWaoUserCommand.observerReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.observerReadOnly')}" />
+ <s:checkbox name="updateWaoUserCommand.guest" label="%{getText('wao.ui.form.updateWaoUserCommand.guest')}" />
+ <s:checkbox name="updateWaoUserCommand.guestReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.guestReadOnly')}" />
+ <s:checkbox name="updateWaoUserCommand.professional" label="%{getText('wao.ui.form.updateWaoUserCommand.professional')}" />
+ <s:checkbox name="updateWaoUserCommand.professionalReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.professionalReadOnly')}" />
+
+ </fieldset>
+
+ <fieldset>
+
+ <legend><s:text name="wao.ui.form.WaoUser.preferences" /></legend>
+
+ <s:checkbox name="updateWaoUserCommand.waoUser.mammalsNotifications" label="%{getText('wao.ui.field.WaoUser.mammalsNotifications')}" />
+
+ </fieldset>
+
+ <div class="form-actions">
+ <s:url action="companies" id="companiesUrl" />
+ <s:a href="%{companiesUrl}" cssClass="btn">
+ <i class="icon-chevron-left"></i> <s:text name="wao.ui.action.cancel" />
+ </s:a>
+
+ <s:submit type="button" cssClass="btn">
+ <i class="icon-ok"></i> <s:text name="wao.ui.action.save" />
+ </s:submit>
+ </div>
+
+ </s:form>
+
+</html>
Copied: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp (from rev 1709, trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp)
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp (rev 0)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp 2014-03-05 11:21:54 UTC (rev 1713)
@@ -0,0 +1,74 @@
+<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
+<%@taglib uri="/struts-tags" prefix="s" %>
+
+<html>
+
+ <head>
+
+ </head>
+
+ <h1><s:text name="wao.ui.page.waoUsers.title" /></h1>
+
+ <table class="table table-bordered">
+ <tr>
+ <th>
+ <s:text name="wao.ui.field.WaoUser.login" />
+ </th>
+ <th>
+ <s:text name="wao.ui.field.WaoUser.fullName" />
+ </th>
+ <th>
+ <s:text name="wao.ui.field.WaoUser.active" />
+ </th>
+ <th>
+ <s:text name="wao.ui.actions" />
+ </th>
+ </tr>
+ <s:iterator value="waoUsers">
+ <tr>
+ <td>
+ <s:if test="active">
+ <s:property value="login" />
+ </s:if>
+ <s:else>
+ <del>
+ <s:property value="login" />
+ </del>
+ </s:else>
+ </td>
+ <td>
+ <s:property value="fullName" />
+ </td>
+ <td>
+ <s:if test="active">
+ <s:text name="wao.ui.misc.yes" />
+ </s:if>
+ <s:else>
+ <s:text name="wao.ui.misc.no" />
+ </s:else>
+ </td>
+ <td>
+ <s:url action="edit-wao-user!input" id="editWaoUserUrl">
+ <s:param name="waoUserId" value="topiaId" />
+ </s:url>
+ <s:a href="%{editWaoUserUrl}">
+ <i class="icon-edit"></i> <s:text name="wao.ui.action.edit" />
+ </s:a>
+
+ <s:url action="delete-wao-user" id="deleteWaoUserUrl">
+ <s:param name="waoUserId" value="topiaId" />
+ </s:url>
+ <s:a href="%{deleteWaoUserUrl}">
+ <i class="icon-trash"></i> <s:text name="wao.ui.action.delete" />
+ </s:a>
+ </td>
+ </tr>
+ </s:iterator>
+ </table>
+
+ <s:url action="edit-wao-user!input" id="createWaoUserUrl" />
+ <s:a href="%{createWaoUserUrl}">
+ <i class="icon-plus"></i> <s:text name="wao.ui.action.createWaoUser" />
+ </s:a>
+
+</html>
1
0
r1712 - trunk/wao-services/src/main/java/fr/ifremer/wao/services/service
by bleny@users.forge.codelutin.com 05 Mar '14
by bleny@users.forge.codelutin.com 05 Mar '14
05 Mar '14
Author: bleny
Date: 2014-03-05 12:21:07 +0100 (Wed, 05 Mar 2014)
New Revision: 1712
Url: http://forge.codelutin.com/projects/wao/repository/revisions/1712
Log:
add delegate methods in ServiceSupport
Modified:
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoServiceSupport.java
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 11:20:21 UTC (rev 1711)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoServiceSupport.java 2014-03-05 11:21:07 UTC (rev 1712)
@@ -2,6 +2,34 @@
import fr.ifremer.wao.WaoApplicationConfig;
import fr.ifremer.wao.WaoTopiaPersistenceContext;
+import fr.ifremer.wao.entity.BoatGroupTopiaDao;
+import fr.ifremer.wao.entity.BoatInfosTopiaDao;
+import fr.ifremer.wao.entity.BoatTopiaDao;
+import fr.ifremer.wao.entity.CompanyTopiaDao;
+import fr.ifremer.wao.entity.ContactStateMotifTopiaDao;
+import fr.ifremer.wao.entity.ContactTopiaDao;
+import fr.ifremer.wao.entity.DCF5CodeTopiaDao;
+import fr.ifremer.wao.entity.ElligibleBoatTopiaDao;
+import fr.ifremer.wao.entity.FishingGearDCFTopiaDao;
+import fr.ifremer.wao.entity.FishingZoneTopiaDao;
+import fr.ifremer.wao.entity.FleetTopiaDao;
+import fr.ifremer.wao.entity.IndicatorLevelTopiaDao;
+import fr.ifremer.wao.entity.IndicatorLogTopiaDao;
+import fr.ifremer.wao.entity.IndicatorTopiaDao;
+import fr.ifremer.wao.entity.NewsTopiaDao;
+import fr.ifremer.wao.entity.ObsDebCodeDetailsTopiaDao;
+import fr.ifremer.wao.entity.ObsDebCodeTopiaDao;
+import fr.ifremer.wao.entity.ProfessionTopiaDao;
+import fr.ifremer.wao.entity.ReferentialMetaTopiaDao;
+import fr.ifremer.wao.entity.SampleMonthTopiaDao;
+import fr.ifremer.wao.entity.SampleRowLogTopiaDao;
+import fr.ifremer.wao.entity.SampleRowTopiaDao;
+import fr.ifremer.wao.entity.ShipOwnerTopiaDao;
+import fr.ifremer.wao.entity.TargetSpeciesDCFTopiaDao;
+import fr.ifremer.wao.entity.TerrestrialDivisionTopiaDao;
+import fr.ifremer.wao.entity.TerrestrialLocationTopiaDao;
+import fr.ifremer.wao.entity.UserProfileTopiaDao;
+import fr.ifremer.wao.entity.WaoUserTopiaDao;
import fr.ifremer.wao.services.WaoService;
import fr.ifremer.wao.services.WaoServiceContext;
import fr.ifremer.wao.services.WaoWebApplicationContext;
@@ -29,11 +57,11 @@
return serviceContext.getPersistenceContext();
}
- public WaoWebApplicationContext getWebApplicationContext() {
+ protected WaoWebApplicationContext getWebApplicationContext() {
return serviceContext.getWebApplicationContext();
}
- public <E extends WaoService> E newService(Class<E> serviceClass) {
+ protected <E extends WaoService> E newService(Class<E> serviceClass) {
return serviceContext.newService(serviceClass);
}
@@ -48,4 +76,120 @@
protected ReferentialService getReferentialService() {
return newService(ReferentialService.class);
}
+
+ protected CompaniesService getCompaniesService() {
+ return newService(CompaniesService.class);
+ }
+
+ protected BoatTopiaDao getBoatDao() {
+ return getPersistenceContext().getBoatDao();
+ }
+
+ protected BoatGroupTopiaDao getBoatGroupDao() {
+ return getPersistenceContext().getBoatGroupDao();
+ }
+
+ protected BoatInfosTopiaDao getBoatInfosDao() {
+ return getPersistenceContext().getBoatInfosDao();
+ }
+
+ protected CompanyTopiaDao getCompanyDao() {
+ return getPersistenceContext().getCompanyDao();
+ }
+
+ protected ContactTopiaDao getContactDao() {
+ return getPersistenceContext().getContactDao();
+ }
+
+ protected ContactStateMotifTopiaDao getContactStateMotifDao() {
+ return getPersistenceContext().getContactStateMotifDao();
+ }
+
+ protected DCF5CodeTopiaDao getDCF5CodeDao() {
+ return getPersistenceContext().getDCF5CodeDao();
+ }
+
+ protected ElligibleBoatTopiaDao getElligibleBoatDao() {
+ return getPersistenceContext().getElligibleBoatDao();
+ }
+
+ protected FishingGearDCFTopiaDao getFishingGearDCFDao() {
+ return getPersistenceContext().getFishingGearDCFDao();
+ }
+
+ protected FishingZoneTopiaDao getFishingZoneDao() {
+ return getPersistenceContext().getFishingZoneDao();
+ }
+
+ protected FleetTopiaDao getFleetDao() {
+ return getPersistenceContext().getFleetDao();
+ }
+
+ protected IndicatorTopiaDao getIndicatorDao() {
+ return getPersistenceContext().getIndicatorDao();
+ }
+
+ protected IndicatorLevelTopiaDao getIndicatorLevelDao() {
+ return getPersistenceContext().getIndicatorLevelDao();
+ }
+
+ protected IndicatorLogTopiaDao getIndicatorLogDao() {
+ return getPersistenceContext().getIndicatorLogDao();
+ }
+
+ protected NewsTopiaDao getNewsDao() {
+ return getPersistenceContext().getNewsDao();
+ }
+
+ protected ObsDebCodeTopiaDao getObsDebCodeDao() {
+ return getPersistenceContext().getObsDebCodeDao();
+ }
+
+ protected ObsDebCodeDetailsTopiaDao getObsDebCodeDetailsDao() {
+ return getPersistenceContext().getObsDebCodeDetailsDao();
+ }
+
+ protected ProfessionTopiaDao getProfessionDao() {
+ return getPersistenceContext().getProfessionDao();
+ }
+
+ protected ReferentialMetaTopiaDao getReferentialMetaDao() {
+ return getPersistenceContext().getReferentialMetaDao();
+ }
+
+ protected SampleMonthTopiaDao getSampleMonthDao() {
+ return getPersistenceContext().getSampleMonthDao();
+ }
+
+ protected SampleRowTopiaDao getSampleRowDao() {
+ return getPersistenceContext().getSampleRowDao();
+ }
+
+ protected SampleRowLogTopiaDao getSampleRowLogDao() {
+ return getPersistenceContext().getSampleRowLogDao();
+ }
+
+ protected ShipOwnerTopiaDao getShipOwnerDao() {
+ return getPersistenceContext().getShipOwnerDao();
+ }
+
+ protected TargetSpeciesDCFTopiaDao getTargetSpeciesDCFDao() {
+ return getPersistenceContext().getTargetSpeciesDCFDao();
+ }
+
+ protected TerrestrialDivisionTopiaDao getTerrestrialDivisionDao() {
+ return getPersistenceContext().getTerrestrialDivisionDao();
+ }
+
+ protected TerrestrialLocationTopiaDao getTerrestrialLocationDao() {
+ return getPersistenceContext().getTerrestrialLocationDao();
+ }
+
+ protected UserProfileTopiaDao getUserProfileDao() {
+ return getPersistenceContext().getUserProfileDao();
+ }
+
+ protected WaoUserTopiaDao getWaoUserDao() {
+ return getPersistenceContext().getWaoUserDao();
+ }
}
1
0
r1711 - trunk/wao-persistence/src/main/java/fr/ifremer/wao
by bleny@users.forge.codelutin.com 05 Mar '14
by bleny@users.forge.codelutin.com 05 Mar '14
05 Mar '14
Author: bleny
Date: 2014-03-05 12:20:21 +0100 (Wed, 05 Mar 2014)
New Revision: 1711
Url: http://forge.codelutin.com/projects/wao/repository/revisions/1711
Log:
fix missing topia configuration directives at runtime
Modified:
trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfig.java
Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfig.java
===================================================================
--- trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfig.java 2014-03-04 09:56:19 UTC (rev 1710)
+++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfig.java 2014-03-05 11:20:21 UTC (rev 1711)
@@ -50,6 +50,8 @@
Map<String, String> jpaParameters = Maps.newHashMap();
Properties hibernateProperties = applicationConfig.getOptionStartsWith("hibernate");
jpaParameters.putAll((Map) hibernateProperties);
+ Properties topiaProperties = applicationConfig.getOptionStartsWith("topia");
+ jpaParameters.putAll((Map) topiaProperties);
return jpaParameters;
}
1
0
r1710 - in trunk: wao-services/src/main/java/fr/ifremer/wao/services/service wao-web/src/main/java/fr/ifremer/wao/web wao-web/src/main/java/fr/ifremer/wao/web/action/administration
by bleny@users.forge.codelutin.com 04 Mar '14
by bleny@users.forge.codelutin.com 04 Mar '14
04 Mar '14
Author: bleny
Date: 2014-03-04 10:56:19 +0100 (Tue, 04 Mar 2014)
New Revision: 1710
Url: http://forge.codelutin.com/projects/wao/repository/revisions/1710
Log:
refs #4560 add missing CRUD operations for companies
Added:
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/IllegalDeletionException.java
trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteCompanyAction.java
Modified:
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompaniesService.java
trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoActionSupport.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/EditCompanyAction.java
Modified: 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-03 17:16:55 UTC (rev 1709)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompaniesService.java 2014-03-04 09:56:19 UTC (rev 1710)
@@ -3,8 +3,10 @@
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 {
@@ -52,4 +54,22 @@
}
+ 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();
+
+ }
+
}
Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/IllegalDeletionException.java
===================================================================
--- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/IllegalDeletionException.java (rev 0)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/IllegalDeletionException.java 2014-03-04 09:56:19 UTC (rev 1710)
@@ -0,0 +1,25 @@
+package fr.ifremer.wao.services.service;
+
+import fr.ifremer.wao.WaoException;
+import org.nuiton.topia.persistence.TopiaEntity;
+
+import java.util.Set;
+
+/**
+ * L'utilisateur a voulu supprimer une entité mais on doit refuser sa demande car
+ * elle est liée à d'autres entités en base.
+ */
+public class IllegalDeletionException extends WaoException {
+
+ /** Les types d'entités qui utilisent l'entité qu'on ne peut pas supprimer. */
+ protected Set<Class<? extends TopiaEntity>> classes;
+
+ public IllegalDeletionException(Set<Class<? extends TopiaEntity>> classes) {
+ this.classes = classes;
+ }
+
+ public Set<Class<? extends TopiaEntity>> getClasses() {
+ return classes;
+ }
+
+}
Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoActionSupport.java
===================================================================
--- trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoActionSupport.java 2014-03-03 17:16:55 UTC (rev 1709)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoActionSupport.java 2014-03-04 09:56:19 UTC (rev 1710)
@@ -1,6 +1,7 @@
package fr.ifremer.wao.web;
import fr.ifremer.wao.WaoApplicationConfig;
+import org.nuiton.i18n.I18n;
import org.nuiton.web.struts2.BaseAction;
public class WaoActionSupport extends BaseAction {
@@ -21,4 +22,8 @@
this.session = session;
}
+ public String t(String key, Object... args) {
+ return I18n.l(getLocale(), key, args);
+ }
+
}
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-03 17:16:55 UTC (rev 1709)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/CompaniesAction.java 2014-03-04 09:56:19 UTC (rev 1710)
@@ -1,12 +1,13 @@
package fr.ifremer.wao.web.action.administration;
+import com.opensymphony.xwork2.Preparable;
import fr.ifremer.wao.entity.Company;
import fr.ifremer.wao.services.service.CompaniesService;
import fr.ifremer.wao.web.WaoJspActionSupport;
import java.util.List;
-public class CompaniesAction extends WaoJspActionSupport {
+public class CompaniesAction extends WaoJspActionSupport implements Preparable {
protected CompaniesService service;
@@ -17,12 +18,10 @@
}
@Override
- public String execute() {
+ public void prepare() {
companies = service.getCompanies();
- return SUCCESS;
-
}
public List<Company> getCompanies() {
Added: 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 (rev 0)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/DeleteCompanyAction.java 2014-03-04 09:56:19 UTC (rev 1710)
@@ -0,0 +1,49 @@
+package fr.ifremer.wao.web.action.administration;
+
+import fr.ifremer.wao.services.service.CompaniesService;
+import fr.ifremer.wao.services.service.IllegalDeletionException;
+import fr.ifremer.wao.web.WaoJspActionSupport;
+import org.apache.struts2.convention.annotation.Result;
+import org.apache.struts2.convention.annotation.Results;
+
+@Results({
+ @Result(name="error", type="redirectAction", params = { "actionName", "companies" }),
+ @Result(name="success", type="redirectAction", params = { "actionName", "companies" })
+})
+public class DeleteCompanyAction extends WaoJspActionSupport {
+
+ protected CompaniesService service;
+
+ protected String companyId;
+
+ public void setCompanyId(String companyId) {
+ this.companyId = companyId;
+ }
+
+ public void setService(CompaniesService service) {
+ this.service = service;
+ }
+
+ @Override
+ public String execute() {
+
+ try {
+
+ service.deleteCompany(companyId);
+
+ session.addMessage(t("wao.ui.action.deleteCompany.success"));
+
+ return SUCCESS;
+
+ } catch (IllegalDeletionException e) {
+
+ // TODO brendan 04/03/14 préciser le problème
+ session.addErrorMessages(t("wao.ui.action.deleteCompany.failure"));
+
+ return ERROR;
+
+ }
+
+ }
+
+}
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-03 17:16:55 UTC (rev 1709)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditCompanyAction.java 2014-03-04 09:56:19 UTC (rev 1710)
@@ -45,7 +45,7 @@
service.save(company);
- addActionMessage("Société enregistrée");
+ session.addMessage(t("wao.ui.action.save.success"));
return SUCCESS;
@@ -58,4 +58,5 @@
public Company getCompany() {
return company;
}
+
}
1
0
r1709 - in trunk: wao-services/src/main/java/fr/ifremer/wao/services/service wao-web/src/main/java/fr/ifremer/wao/web/action/administration wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer wao-web/src/main/resources/i18n wao-web/src/main/webapp/WEB-INF/content/administration wao-web/src/main/webapp/WEB-INF/content/obsmer wao-web/src/main/webapp/WEB-INF/decorators
by bleny@users.forge.codelutin.com 03 Mar '14
by bleny@users.forge.codelutin.com 03 Mar '14
03 Mar '14
Author: bleny
Date: 2014-03-03 18:16:55 +0100 (Mon, 03 Mar 2014)
New Revision: 1709
Url: http://forge.codelutin.com/projects/wao/repository/revisions/1709
Log:
refs #4560 add CRUD operations for companies
Added:
trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompaniesService.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/EditCompanyAction.java
trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp
trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp
Modified:
trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditNewsAction.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/obsmer/news.jsp
trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp
Added: 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 (rev 0)
+++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompaniesService.java 2014-03-03 17:16:55 UTC (rev 1709)
@@ -0,0 +1,55 @@
+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 java.util.List;
+
+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();
+
+ }
+
+}
Added: 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 (rev 0)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/CompaniesAction.java 2014-03-03 17:16:55 UTC (rev 1709)
@@ -0,0 +1,32 @@
+package fr.ifremer.wao.web.action.administration;
+
+import fr.ifremer.wao.entity.Company;
+import fr.ifremer.wao.services.service.CompaniesService;
+import fr.ifremer.wao.web.WaoJspActionSupport;
+
+import java.util.List;
+
+public class CompaniesAction extends WaoJspActionSupport {
+
+ protected CompaniesService service;
+
+ protected List<Company> companies;
+
+ public void setService(CompaniesService service) {
+ this.service = service;
+ }
+
+ @Override
+ public String execute() {
+
+ companies = service.getCompanies();
+
+ return SUCCESS;
+
+ }
+
+ public List<Company> getCompanies() {
+ return companies;
+ }
+
+}
Added: 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 (rev 0)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditCompanyAction.java 2014-03-03 17:16:55 UTC (rev 1709)
@@ -0,0 +1,61 @@
+package fr.ifremer.wao.web.action.administration;
+
+import com.opensymphony.xwork2.Preparable;
+import fr.ifremer.wao.entity.Company;
+import fr.ifremer.wao.services.service.CompaniesService;
+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;
+
+@Results({
+ @Result(name="success", type="redirectAction", params = { "actionName", "companies" })
+})
+public class EditCompanyAction extends WaoJspActionSupport implements Preparable {
+
+ protected CompaniesService service;
+
+ protected String companyId;
+
+ protected Company company;
+
+ public void setCompanyId(String companyId) {
+ this.companyId = companyId;
+ }
+
+ public void setCompany(Company company) {
+ this.company = company;
+ }
+
+ public void setService(CompaniesService service) {
+ this.service = service;
+ }
+
+ @Override
+ public void prepare() {
+ if (StringUtils.isEmpty(companyId)) {
+ company = service.newCompany();
+ } else {
+ company = service.getCompany(companyId);
+ }
+ }
+
+ @Override
+ public String execute() {
+
+ service.save(company);
+
+ addActionMessage("Société enregistrée");
+
+ return SUCCESS;
+
+ }
+
+ public String getCompanyId() {
+ return companyId;
+ }
+
+ public Company getCompany() {
+ return company;
+ }
+}
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-02-28 17:37:02 UTC (rev 1708)
+++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditNewsAction.java 2014-03-03 17:16:55 UTC (rev 1709)
@@ -45,6 +45,7 @@
service.save(news);
+ // TODO brendan 03/03/14 i18n
addActionMessage("Actualité enregistrée");
return SUCCESS;
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-02-28 17:37:02 UTC (rev 1708)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-03 17:16:55 UTC (rev 1709)
@@ -59,6 +59,7 @@
wao.ui.action.unvalidateContact=Unvalidate contact
wao.ui.action.viewBoatsForRow=View the boats for this sample row
wao.ui.action.viewIndicatorsHistory=View indicators historic
+wao.ui.actions=Actions
wao.ui.boatList=List of %s boats
wao.ui.boatinfo.title=Infos about %s
wao.ui.boats.associatedLine=Sample row(s) associated with this boat
@@ -290,6 +291,7 @@
wao.ui.page.SamplingPlan.title=Sampling plan
wao.ui.page.Synthesis.title=Synthesis
wao.ui.page.UserProfileForm.title=Profile management
+wao.ui.page.companies.title=Companies
wao.ui.publishedByProgram=Pusblished by program
wao.ui.publishedByYourCompany=Published by company
wao.ui.sampleRow.creation=Creation of a sample row
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-02-28 17:37:02 UTC (rev 1708)
+++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-03 17:16:55 UTC (rev 1709)
@@ -59,6 +59,7 @@
wao.ui.action.unvalidateContact=Invalider le contact
wao.ui.action.viewBoatsForRow=Voir les navires présentis pour cette ligne
wao.ui.action.viewIndicatorsHistory=Voir l'historique des modifications des indicateurs
+wao.ui.actions=Actions
wao.ui.boatList=Liste de %s navires
wao.ui.boatinfo.title=Informations sur %s
wao.ui.boats.associatedLine=Ligne(s) du plan associée(s) à ce navire
@@ -290,6 +291,7 @@
wao.ui.page.SamplingPlan.title=Plan d'échantillonnage
wao.ui.page.Synthesis.title=Synthèse
wao.ui.page.UserProfileForm.title=Gestion du profil
+wao.ui.page.companies.title=Sociétés
wao.ui.publishedByProgram=Publiée par le programme
wao.ui.publishedByYourCompany=Publiée par la société
wao.ui.sampleRow.creation=Création d'une ligne du plan d'échantillonnage
Added: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp (rev 0)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp 2014-03-03 17:16:55 UTC (rev 1709)
@@ -0,0 +1,68 @@
+<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
+<%@taglib uri="/struts-tags" prefix="s" %>
+
+<html>
+
+ <head>
+
+ </head>
+
+ <h1><s:text name="wao.ui.page.companies.title" /></h1>
+
+ <table class="table table-bordered">
+ <tr>
+ <th>
+ <s:text name="wao.ui.field.Company.name" />
+ </th>
+ <th>
+ <s:text name="wao.ui.field.Company.active" />
+ </th>
+ <th>
+ <s:text name="wao.ui.actions" />
+ </th>
+ </tr>
+ <s:iterator value="companies">
+ <tr>
+ <td>
+ <s:if test="active">
+ <s:property value="name" />
+ </s:if>
+ <s:else>
+ <del>
+ <s:property value="name" />
+ </del>
+ </s:else>
+ </td>
+ <td>
+ <s:if test="active">
+ <s:text name="wao.ui.misc.yes" />
+ </s:if>
+ <s:else>
+ <s:text name="wao.ui.misc.no" />
+ </s:else>
+ </td>
+ <td>
+ <s:url action="edit-company!input" id="editCompanyUrl">
+ <s:param name="companyId" value="topiaId" />
+ </s:url>
+ <s:a href="%{editCompanyUrl}">
+ <i class="icon-edit"></i> <s:text name="wao.ui.action.edit" />
+ </s:a>
+
+ <s:url action="delete-company" id="deleteCompanyUrl">
+ <s:param name="companyId" value="topiaId" />
+ </s:url>
+ <s:a href="%{deleteCompanyUrl}">
+ <i class="icon-trash"></i> <s:text name="wao.ui.action.delete" />
+ </s:a>
+ </td>
+ </tr>
+ </s:iterator>
+ </table>
+
+ <s:url action="edit-company!input" id="createCompanyUrl" />
+ <s:a href="%{createCompanyUrl}">
+ <i class="icon-plus"></i> <s:text name="wao.ui.action.createCompany" />
+ </s:a>
+
+</html>
Added: 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 (rev 0)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp 2014-03-03 17:16:55 UTC (rev 1709)
@@ -0,0 +1,35 @@
+<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
+<%@taglib uri="/struts-tags" prefix="s" %>
+
+<html>
+ <head>
+ </head>
+
+ <s:form>
+
+ <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.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:checkbox name="company.active" label="%{getText('wao.ui.field.Company.active')}" />
+
+ <div class="form-actions">
+ <s:url action="companies" id="companiesUrl" />
+ <s:a href="%{companiesUrl}" cssClass="btn">
+ <i class="icon-chevron-left"></i> <s:text name="wao.ui.action.cancel" />
+ </s:a>
+
+ <s:submit type="button" cssClass="btn">
+ <i class="icon-ok"></i> <s:text name="wao.ui.action.save" />
+ </s:submit>
+ </div>
+
+ </s:form>
+
+</html>
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-02-28 17:37:02 UTC (rev 1708)
+++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp 2014-03-03 17:16:55 UTC (rev 1709)
@@ -8,7 +8,8 @@
</head>
<s:url action="edit-news!input" id="createNewsUrl" />
- <s:a href="%{createNewsUrl}" title="Ajouter une actualité">
+ <s:a href="%{createNewsUrl}">
+ <%-- TODO i18n -->
<i class="icon-plus"></i> Ajouter une actualité
</s:a>
Modified: trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp
===================================================================
--- trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-02-28 17:37:02 UTC (rev 1708)
+++ trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-03-03 17:16:55 UTC (rev 1709)
@@ -70,6 +70,12 @@
<i class="icon-upload"></i> <s:text name="wao.ui.page.ReferentialManagement.title" />
</s:a>
</li>
+ <li>
+ <s:url namespace="/administration" action="companies" id="companiesUrl" />
+ <s:a href="%{companiesUrl}">
+ <i class="icon-user"></i> <s:text name="wao.ui.page.companies.title" />
+ </s:a>
+ </li>
</ul>
</li>
<li class="dropdown">
1
0