Sammoa-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
September 2012
- 4 participants
- 111 discussions
r591 - trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence
by fdesbois@users.forge.codelutin.com 25 Sep '12
by fdesbois@users.forge.codelutin.com 25 Sep '12
25 Sep '12
Author: fdesbois
Date: 2012-09-25 11:46:19 +0200 (Tue, 25 Sep 2012)
New Revision: 591
Url: http://forge.codelutin.com/repositories/revision/sammoa/591
Log:
fixes #1525 : remove observation number in map label
Modified:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-09-24 11:25:21 UTC (rev 590)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-09-25 09:46:19 UTC (rev 591)
@@ -58,7 +58,7 @@
public static String toLabel(Observation observation) {
Species species = observation.getSpecies();
- return (species != null ? species.getCode() : "") + " (S" + observation.getObservationNumber() + ")";
+ return species != null ? species.getCode() : "";
}
public static GeoPoint toGeoPoint(Observation observation,
1
0
r590 - trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence
by fdesbois@users.forge.codelutin.com 24 Sep '12
by fdesbois@users.forge.codelutin.com 24 Sep '12
24 Sep '12
Author: fdesbois
Date: 2012-09-24 13:25:21 +0200 (Mon, 24 Sep 2012)
New Revision: 590
Url: http://forge.codelutin.com/repositories/revision/sammoa/590
Log:
fixes #1516 : add empty allowed for validation
Modified:
trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Observation-onBoard-warning-validation.xml
trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Observation-validation-error-validation.xml
Modified: trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Observation-onBoard-warning-validation.xml
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Observation-onBoard-warning-validation.xml 2012-09-24 11:19:23 UTC (rev 589)
+++ trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Observation-onBoard-warning-validation.xml 2012-09-24 11:25:21 UTC (rev 590)
@@ -91,7 +91,7 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ behaviour in { null, "SW", "MI", "BR", "LO", "FE", "FA", "SB", "OT" } ]]>
+ <![CDATA[ behaviour in { null, "", "SW", "MI", "BR", "LO", "FE", "FA", "SB", "OT" } ]]>
</param>
<message>sammoa.validator.observation.behaviour.unkownValue</message>
</field-validator>
Modified: trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Observation-validation-error-validation.xml
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Observation-validation-error-validation.xml 2012-09-24 11:19:23 UTC (rev 589)
+++ trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Observation-validation-error-validation.xml 2012-09-24 11:25:21 UTC (rev 590)
@@ -91,7 +91,7 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ behaviour in { null, "SW", "MI", "BR", "LO", "FE", "FA", "SB", "OT" } ]]>
+ <![CDATA[ behaviour in { null, "", "SW", "MI", "BR", "LO", "FE", "FA", "SB", "OT" } ]]>
</param>
<message>sammoa.validator.observation.behaviour.unkownValue</message>
</field-validator>
1
0
r589 - trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util
by fdesbois@users.forge.codelutin.com 24 Sep '12
by fdesbois@users.forge.codelutin.com 24 Sep '12
24 Sep '12
Author: fdesbois
Date: 2012-09-24 13:19:23 +0200 (Mon, 24 Sep 2012)
New Revision: 589
Url: http://forge.codelutin.com/repositories/revision/sammoa/589
Log:
fixes #1515 : problem with selection of transect
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java 2012-09-21 17:22:36 UTC (rev 588)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java 2012-09-24 11:19:23 UTC (rev 589)
@@ -63,18 +63,25 @@
int lastIndex = e.getLastIndex();
Integer newSelectedRow = null;
- if (listSelectionModel.isSelectionEmpty()) {
+ // Use the last selected row
+ for (int i = firstIndex; i <= lastIndex; i++) {
+ if (listSelectionModel.isSelectedIndex(i)) {
+ newSelectedRow = table.convertRowIndexToModel(i);
+ }
+ }
- // no selection
- } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
-
- // use first index
- newSelectedRow = table.convertRowIndexToModel(firstIndex);
- } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
-
- // use last index
- newSelectedRow = table.convertRowIndexToModel(lastIndex);
- }
+// if (listSelectionModel.isSelectionEmpty()) {
+//
+// // no selection
+// } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+//
+// // use first index
+// newSelectedRow = table.convertRowIndexToModel(firstIndex);
+// } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
+//
+// // use last index
+// newSelectedRow = table.convertRowIndexToModel(lastIndex);
+// }
List<T> elements = selectionModelAdapter.getElements();
T element = null;
1
0
r588 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps
by fdesbois@users.forge.codelutin.com 21 Sep '12
by fdesbois@users.forge.codelutin.com 21 Sep '12
21 Sep '12
Author: fdesbois
Date: 2012-09-21 19:22:36 +0200 (Fri, 21 Sep 2012)
New Revision: 588
Url: http://forge.codelutin.com/repositories/revision/sammoa/588
Log:
Add license header
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GPSNRSerialDevice.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GPSNRSerialDevice.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GPSNRSerialDevice.java 2012-09-21 17:18:29 UTC (rev 587)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GPSNRSerialDevice.java 2012-09-21 17:22:36 UTC (rev 588)
@@ -1,5 +1,29 @@
package fr.ulr.sammoa.application.device.gps;
+/*
+ * #%L
+ * SAMMOA :: Application
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2012 UMS 3462, Code Lutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
import com.google.common.base.Preconditions;
import gnu.io.NRSerialPort;
import gnu.io.NativeResourceException;
1
0
r587 - in trunk: . sammoa-application sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea sammoa-ui-swing/src/main/assembly sammoa-ui-swing/src/main/assembly/x64 sammoa-ui-swing/src/main/assembly/x86
by fdesbois@users.forge.codelutin.com 21 Sep '12
by fdesbois@users.forge.codelutin.com 21 Sep '12
21 Sep '12
Author: fdesbois
Date: 2012-09-21 19:18:29 +0200 (Fri, 21 Sep 2012)
New Revision: 587
Url: http://forge.codelutin.com/repositories/revision/sammoa/587
Log:
fixes #1457 :
- use nrjavaserial (rxtx recent fork) instead of rxtx java library
- create GPSNRSerialDevice impl for Gpsylon to use nrjavaserial
- remove no more used (encapsulated in nrjavaserial) native libraries
- improve SafeGPSNmeaDataProcessor to check if processor is opened on all loops (during reading thread)
- improve begin state after open (only if we receive data, the state becomes READY)
Added:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GPSNRSerialDevice.java
Removed:
trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/SafeGPSSerialDevice.java
trunk/sammoa-ui-swing/src/main/assembly/sammoa64.bat
trunk/sammoa-ui-swing/src/main/assembly/sammoa64.sh
trunk/sammoa-ui-swing/src/main/assembly/x64/librxtxSerial.so
trunk/sammoa-ui-swing/src/main/assembly/x64/rxtxSerial.dll
trunk/sammoa-ui-swing/src/main/assembly/x86/librxtxSerial.so
trunk/sammoa-ui-swing/src/main/assembly/x86/rxtxSerial.dll
Modified:
trunk/pom.xml
trunk/sammoa-application/pom.xml
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java
trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/SafeGPSNmeaDataProcessor.java
trunk/sammoa-ui-swing/src/main/assembly/bin.xml
trunk/sammoa-ui-swing/src/main/assembly/sammoa.bat
trunk/sammoa-ui-swing/src/main/assembly/sammoa.sh
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-09-21 13:00:10 UTC (rev 586)
+++ trunk/pom.xml 2012-09-21 17:18:29 UTC (rev 587)
@@ -399,13 +399,26 @@
<groupId>org.dinopolis.gpstool</groupId>
<artifactId>gpsinput</artifactId>
<version>0.5.3</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.rxtx</groupId>
+ <artifactId>rxtx</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
+ <!--<dependency>-->
+ <!--<groupId>org.rxtx</groupId>-->
+ <!--<artifactId>rxtx</artifactId>-->
+ <!--<version>2.1.7</version>-->
+ <!--</dependency>-->
+
<dependency>
- <groupId>org.rxtx</groupId>
- <artifactId>rxtx</artifactId>
- <version>2.1.7</version>
+ <groupId>com.neuronrobotics</groupId>
+ <artifactId>nrjavaserial</artifactId>
+ <version>3.7.5.1</version>
</dependency>
+
</dependencies>
</dependencyManagement>
Modified: trunk/sammoa-application/pom.xml
===================================================================
--- trunk/sammoa-application/pom.xml 2012-09-21 13:00:10 UTC (rev 586)
+++ trunk/sammoa-application/pom.xml 2012-09-21 17:18:29 UTC (rev 587)
@@ -38,8 +38,8 @@
</dependency>
<dependency>
- <groupId>org.rxtx</groupId>
- <artifactId>rxtx</artifactId>
+ <groupId>com.neuronrobotics</groupId>
+ <artifactId>nrjavaserial</artifactId>
</dependency>
<!-- util dependencies -->
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GPSNRSerialDevice.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GPSNRSerialDevice.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GPSNRSerialDevice.java 2012-09-21 17:18:29 UTC (rev 587)
@@ -0,0 +1,124 @@
+package fr.ulr.sammoa.application.device.gps;
+
+import com.google.common.base.Preconditions;
+import gnu.io.NRSerialPort;
+import gnu.io.NativeResourceException;
+import org.dinopolis.gpstool.gpsinput.GPSDevice;
+import org.dinopolis.gpstool.gpsinput.GPSException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Hashtable;
+
+/**
+ * Created: 21/09/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class GPSNRSerialDevice implements GPSDevice {
+
+ /** Logger. */
+ private static final Logger logger = LoggerFactory.getLogger(GPSNRSerialDevice.class);
+
+ public final static String PORT_NAME_KEY = "port_name";
+ public final static String PORT_SPEED_KEY = "port_speed";
+
+ protected final static String DEFAULT_PORT_NAME_LINUX = "/dev/ttyS1";
+ protected final static String DEFAULT_PORT_NAME_WIN = "COM1";
+ protected final static int DEFAULT_PORT_SPEED = 4800;
+
+ protected String serialPortName;
+
+ protected NRSerialPort serialPort;
+
+ @Override
+ public void init(Hashtable environment) throws GPSException {
+
+ try {
+
+ if (environment.containsKey(PORT_NAME_KEY)) {
+ serialPortName = (String) environment.get(PORT_NAME_KEY);
+
+ } else if (System.getProperty("os.name").toLowerCase().startsWith("windows")) {
+ serialPortName = DEFAULT_PORT_NAME_WIN;
+
+ } else {
+ serialPortName = DEFAULT_PORT_NAME_LINUX;
+ }
+
+ final int serialPortSpeed;
+ if (environment.containsKey(PORT_SPEED_KEY)) {
+ serialPortSpeed = ((Integer) environment.get(PORT_SPEED_KEY)).intValue();
+
+ } else {
+ serialPortSpeed = DEFAULT_PORT_SPEED;
+ }
+
+ serialPort = new NRSerialPort(serialPortName, serialPortSpeed);
+
+ } catch (Exception ex) {
+ throw new GPSException("Invalid environment set for serial " +
+ "connection : " + ex.getMessage(), ex);
+ }
+ }
+
+ @Override
+ public void open() throws GPSException {
+ Preconditions.checkState(serialPort != null,
+ "Please use init() method to prepare serialDevice");
+
+ try {
+ boolean response = serialPort.connect();
+ if (!response) {
+ throw new GPSException("Unable to connect to the SerialPort "
+ + serialPortName);
+ }
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Serial port {} is opened", serialPortName);
+ }
+
+ } catch (NativeResourceException ex) {
+ throw new GPSException("Native exception on open SerialPort "
+ + serialPortName + " : " + ex.getMessage(), ex);
+
+ } catch (Exception ex) {
+ throw new GPSException("Unexpected exception on open SerialPort "
+ + serialPortName + " : " + ex.getMessage(), ex);
+ }
+ }
+
+ @Override
+ public void close() throws GPSException {
+ try {
+ if (serialPort != null) {
+ serialPort.disconnect();
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Serial port {} is closed", serialPortName);
+ }
+ }
+
+ } catch (NativeResourceException ex) {
+ throw new GPSException("Native exception on close SerialPort "
+ + serialPortName + " : " + ex.getMessage(), ex);
+
+ } catch (Exception ex) {
+ throw new GPSException("Unexpected exception on close SerialPort "
+ + serialPortName + " : " + ex.getMessage(), ex);
+ }
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException {
+ return serialPort != null ? serialPort.getInputStream() : null;
+ }
+
+ @Override
+ public OutputStream getOutputStream() throws IOException {
+ return serialPort != null ? serialPort.getOutputStream() : null;
+ }
+}
Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GPSNRSerialDevice.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-09-21 13:00:10 UTC (rev 586)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-09-21 17:18:29 UTC (rev 587)
@@ -35,7 +35,6 @@
import org.dinopolis.gpstool.gpsinput.GPSDevice;
import org.dinopolis.gpstool.gpsinput.GPSException;
import org.dinopolis.gpstool.gpsinput.GPSPosition;
-import org.dinopolis.gpstool.gpsinput.GPSSerialDevice;
import org.dinopolis.gpstool.gpsinput.nmea.SafeGPSNmeaDataProcessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -80,7 +79,7 @@
@Override
public void open() throws DeviceTechnicalException {
- if (getState() == DeviceState.READY) {
+ if (opened) {
if (logger.isWarnEnabled()) {
logger.warn("GPS already opened");
}
@@ -93,11 +92,11 @@
gpsDataProcessor = new SafeGPSNmeaDataProcessor();
- gpsDevice = new GPSSerialDevice();
+ gpsDevice = new GPSNRSerialDevice();
Hashtable<String, Object> options = new Hashtable<String, Object>();
- options.put(GPSSerialDevice.PORT_NAME_KEY, getConfig().getDevice());
- options.put(GPSSerialDevice.PORT_SPEED_KEY, getConfig().getSpeed());
+ options.put(GPSNRSerialDevice.PORT_NAME_KEY, getConfig().getDevice());
+ options.put(GPSNRSerialDevice.PORT_SPEED_KEY, getConfig().getSpeed());
if (logger.isDebugEnabled()) {
logger.debug("GPS options: " + options);
@@ -111,13 +110,9 @@
logAvailablePorts("beforeOpen");
- gpsDataProcessor.open();
-
gpsDataProcessor.addGPSDataChangeListener(gpsDataProcessorListener);
- logger.info("Connected to GPS device");
-
- setState(DeviceState.READY, null);
+ gpsDataProcessor.open();
opened = true;
logAvailablePorts("openedSuccessful");
@@ -135,7 +130,7 @@
stop();
- if (gpsDataProcessor != null && getState() != DeviceState.UNAVAILABLE) {
+ if (opened) {
logger.info("Closing GPS device...");
try {
@@ -317,10 +312,16 @@
String property = evt.getPropertyName();
- if (logger.isTraceEnabled()) {
- logger.trace("Gps data received {} {}", property, evt.getNewValue());
+ if (logger.isDebugEnabled()) {
+ logger.debug("Gps data received {} {}", property, evt.getNewValue());
}
+ if (state == DeviceState.UNAVAILABLE) {
+ logger.info("Connected to GPS device");
+
+ setState(DeviceState.READY, null);
+ }
+
if (GPSDataProcessor.LOCATION.equals(property)) {
lastPositionDate = getDate();
lastPosition = (GPSPosition) evt.getNewValue();
Deleted: trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/SafeGPSSerialDevice.java
===================================================================
--- trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/SafeGPSSerialDevice.java 2012-09-21 13:00:10 UTC (rev 586)
+++ trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/SafeGPSSerialDevice.java 2012-09-21 17:18:29 UTC (rev 587)
@@ -1,60 +0,0 @@
-package org.dinopolis.gpstool.gpsinput;
-/*
- * #%L
- * SAMMOA :: Application
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 UMS 3462, Code Lutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU 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 General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * #L%
- */
-
-import com.google.common.base.Throwables;
-
-import java.io.IOException;
-
-/**
- * There is an issue with closing on {@link gnu.io.SerialPort}. See
- * <a href="https://forums.oracle.com/forums/thread.jspa?threadID=1292323">
- * https://forums.oracle.com/forums/thread.jspa?threadID=1292323
- * </a>
- *
- * Proper close. Need to use also {@link org.dinopolis.gpstool.gpsinput.nmea.SafeGPSNmeaDataProcessor}
- * which is listener on the serial device
- *
- * Created: 06/08/12
- *
- * @author fdesbois <florian.desbois(a)codelutin.com>
- */
-public class SafeGPSSerialDevice extends GPSSerialDevice {
-
- @Override
- public void close() throws GPSException {
- if (serial_port_ != null) {
-
- serial_port_.removeEventListener();
- try {
- serial_port_.getOutputStream().flush();
- serial_port_.getOutputStream().close();
- serial_port_.getInputStream().close();
- } catch (IOException e) {
- throw Throwables.propagate(e);
- }
- serial_port_.close();
- }
- }
-}
Modified: trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/SafeGPSNmeaDataProcessor.java
===================================================================
--- trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/SafeGPSNmeaDataProcessor.java 2012-09-21 13:00:10 UTC (rev 586)
+++ trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/SafeGPSNmeaDataProcessor.java 2012-09-21 17:18:29 UTC (rev 587)
@@ -24,6 +24,8 @@
*/
import org.dinopolis.gpstool.gpsinput.GPSException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.OutputStream;
@@ -36,6 +38,12 @@
*/
public class SafeGPSNmeaDataProcessor extends GPSNmeaDataProcessor {
+ /** Logger. */
+ private static final Logger logger = LoggerFactory.getLogger(SafeGPSNmeaDataProcessor.class);
+
+ protected volatile boolean open_;
+
+ // Override to avoid using daemon for read_thread
@Override
public void open() throws GPSException {
@@ -50,9 +58,7 @@
// start this runnable as thread:
read_thread_ = new Thread(this, "GPSNmeaDataProcessor");
- // >> START fix
- // Remove daemon line from superclass implementation
-
+ // >> START fix : remove daemon line from superclass implementation
// read_thread_.setDaemon(true); // so thread is finished after exit of application
// << END fix
@@ -68,28 +74,219 @@
}
}
+ // Override to clean read_thread on close
@Override
public void close() throws GPSException {
-// for (Object rawDataListener : raw_data_listener_) {
-// removeGPSRawDataListener((GPSRawDataListener) rawDataListener);
-// }
+
+ if (gps_device_ == null) {
+ throw new GPSException("no GPSDevice set!");
+ }
+
+ open_ = false;
if (read_thread_ != null) {
- read_thread_.interrupt();
+ try {
+ read_thread_.join();
+ } catch (InterruptedException ex) {
+ throw new GPSException("Error on thread join", ex);
+ }
read_thread_ = null;
}
- super.close();
+ gps_device_.close();
}
+ // Override to allow stop loop with open flag
@Override
+ protected void readMessages()
+ {
+ if (logger.isDebugEnabled()) {
+ logger.debug("start reading from GPSDevice...");
+ }
+
+ char[] buffer;
+ int count;
+ int data;
+ NMEA0183Sentence message;
+ try
+ {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("inputstream: " + in_stream_);
+ }
+
+ if (!readGarbage()) // try to (re)sync with nmea stream
+ return;
+
+ int loopcount = 0;
+ // >> START fix : add open_ flag to stop loop on close
+ while (open_)
+ // << END fix
+ {
+ loopcount++;
+ count = 0;
+ buffer = new char[MAX_NMEA_MESSAGE_LENGTH];
+
+ // >> START fix : add open_ flag to stop loop on close
+ while (open_ && (data = getNextByte()) != (char) 13) // read data until CR
+ // << END fix
+ {
+
+ if (count >= MAX_NMEA_MESSAGE_LENGTH - 1)
+ {
+ System.err.println("ERROR: max. message length exceeded! (" + count + "):" + new String(buffer));
+ if (!readGarbage()) // try to (re)sync with nmea stream
+ return;
+ loopcount++;
+ count = 0;
+ buffer = new char[MAX_NMEA_MESSAGE_LENGTH];
+ } else
+ {
+ if (data != (char) 10) // ignore LF
+ {
+ buffer[count] = (char) data; // add data to the buffer
+ count++;
+ }
+ }
+ } // end of while (read until end of line)
+
+ if (buffer[0] != '$') // no valid nmea sentence
+ {
+ if (!readGarbage()) // try to (re)sync with nmea stream
+ return;
+ } else
+ { // valid sentence, no garbage
+ try
+ {
+ message = new NMEA0183Sentence(buffer, 0, count);
+
+ buffer[count] = 13; // add CR from NMEA message
+ buffer[count + 1] = 10; // add LF from NMEA message
+ fireRawDataReceived(buffer, 0, count + 2);
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("message: '" + message + "'");
+ logger.debug("sentenceId: '" + message.getSentenceId() + "'");
+ }
+
+ if (!message.isValid() && ignore_invalid_checksum_ && print_ignore_warning_)
+ {
+ logger.error("ERORR: invalid checksum in NMEA message: " + message);
+ logger.error("checksum of sentence: " + message.getChecksum() + ", calculated checksum: " + message.getCalculatedChecksum());
+ logger.warn("WARNING: As you chose to ingore invalid messages, this message is only printed once!");
+ print_ignore_warning_ = false;
+ }
+
+ if (ignore_invalid_checksum_ || message.isValid() || message.getSentenceId().equals("RFTXT"))
+ {
+ try
+ {
+ processNmeaSentence(message);
+ }
+ catch (Exception e)
+ {
+ logger.error("ERROR: Exception thrown on processing of NMEA sentences:");
+ logger.error(message.toString());
+ e.printStackTrace();
+ }
+ } else
+ {
+ logger.error("ERORR: invalid checksum in NMEA message: " + message);
+ logger.error("checksum of sentence: " + message.getChecksum() + ", calculated checksum: " + message.getCalculatedChecksum());
+ }
+ }
+ catch (Exception e)
+ {
+ logger.error("ERROR: Exception thrown on creation or processing of NMEA sentences:");
+ logger.error(new String(buffer));
+ e.printStackTrace();
+ }
+ }
+
+ if (delay_time_ > 0)
+ {
+ try
+ {
+ Thread.sleep(delay_time_);
+ }
+ catch (InterruptedException ie)
+ {
+ }
+ }
+ }
+ }
+ catch (IOException ioe)
+ {
+ if (open_) // otherwise, this is the reason for the exception!
+ ioe.printStackTrace();
+ }
+ }
+
+ // Copy from superclass (private access)
+ protected int getNextByte() throws IOException
+ {
+ int data = -1;
+ // rxtx 2.1.7 on windows has the problem (?) that even if the stream is not ended
+ // it returns -1 here (happens in between nmea sentences)
+ // so we just wait a little and then retry to read
+
+ // >> START fix : add open_ flag to stop loop on close
+ while (open_ && (data = in_stream_.read()) < 0)
+ // << END fix
+ {
+
+ try
+ {
+ Thread.sleep(50);
+ } catch (InterruptedException ignore)
+ {
+ }
+ }
+ return data;
+ }
+
+ // Override to add open_ flag in loops
+ @Override
+ protected boolean readGarbage()
+ {
+ int data;
+ try
+ {
+ // >> START fix : add open_ flag to stop loops on close
+ while (open_)
+ {
+ // read until CR/LF>
+ while (open_ && (data = getNextByte()) != (char) 13) // read data until CR
+ {
+ }
+ // << END fix
+
+ data = getNextByte(); // char after CR
+ if (data == (char) 10) // linefeed
+ {
+ return true;
+ }
+ if (logger.isDebugEnabled())
+ logger.debug("reading garbage...");
+ }
+ }
+ catch (IOException ioe)
+ {
+ System.err.println("GPS Nmea Reading: IOException on beginning of reading, try once more: " + ioe.getMessage());
+ return false;
+ }
+ return false;
+ }
+
+ // Override to fix parse issue with empty String
+ @Override
protected void processGSA(NMEA0183Sentence sentence) {
-// if (logger_nmea_.isDebugEnabled())
-// logger_nmea_.debug("GSA detected: " + sentence);
+ if (logger.isDebugEnabled()) {
+ logger.debug("GSA detected: " + sentence);
+ }
List data_fields = sentence.getDataFields();
Integer[] satellites_ids = new Integer[12];
String pdop = (String) data_fields.get(14);
String hdop = (String) data_fields.get(15);
String vdop = (String) data_fields.get(16);
-// int valid_fix = Integer.parseInt((String) data_fields.get(1));
for (int i = 0; i < 12; i++) {
String id = (String) data_fields.get(i + 2);
@@ -98,9 +295,7 @@
}
}
- // >> START fix
- // Resolve NumberFormatException on new Float with empty String
-
+ // >> START fix : resolve NumberFormatException on new Float with empty String
changeGPSData(PDOP, pdop.isEmpty() ? 0 : new Float(pdop));
changeGPSData(HDOP, hdop.isEmpty() ? 0 : new Float(hdop));
Modified: trunk/sammoa-ui-swing/src/main/assembly/bin.xml
===================================================================
(Binary files differ)
Modified: trunk/sammoa-ui-swing/src/main/assembly/sammoa.bat
===================================================================
--- trunk/sammoa-ui-swing/src/main/assembly/sammoa.bat 2012-09-21 13:00:10 UTC (rev 586)
+++ trunk/sammoa-ui-swing/src/main/assembly/sammoa.bat 2012-09-21 17:18:29 UTC (rev 587)
@@ -1,2 +1,2 @@
-java -Xmx1024M -Djava.library.path=x86 -jar ${project.build.finalName}.${project.packaging} %1 %2 %3 %4 %5 %6 %7 %8 %9
+java -Xmx1024M -jar ${project.build.finalName}.${project.packaging} %1 %2 %3 %4 %5 %6 %7 %8 %9
Modified: trunk/sammoa-ui-swing/src/main/assembly/sammoa.sh
===================================================================
--- trunk/sammoa-ui-swing/src/main/assembly/sammoa.sh 2012-09-21 13:00:10 UTC (rev 586)
+++ trunk/sammoa-ui-swing/src/main/assembly/sammoa.sh 2012-09-21 17:18:29 UTC (rev 587)
@@ -1,6 +1,5 @@
#!/bin/bash
MEMORY="-Xmx1024M"
-JRIARGS="-Djava.library.path=x86"
-java $MEMORY $JRIARGS -jar ${project.build.finalName}.${project.packaging} $*
+java $MEMORY -jar ${project.build.finalName}.${project.packaging} $*
Deleted: trunk/sammoa-ui-swing/src/main/assembly/sammoa64.bat
===================================================================
--- trunk/sammoa-ui-swing/src/main/assembly/sammoa64.bat 2012-09-21 13:00:10 UTC (rev 586)
+++ trunk/sammoa-ui-swing/src/main/assembly/sammoa64.bat 2012-09-21 17:18:29 UTC (rev 587)
@@ -1,2 +0,0 @@
-
-java -Xmx1024M -Djava.library.path=x64 -jar ${project.build.finalName}.${project.packaging} %1 %2 %3 %4 %5 %6 %7 %8 %9
Deleted: trunk/sammoa-ui-swing/src/main/assembly/sammoa64.sh
===================================================================
--- trunk/sammoa-ui-swing/src/main/assembly/sammoa64.sh 2012-09-21 13:00:10 UTC (rev 586)
+++ trunk/sammoa-ui-swing/src/main/assembly/sammoa64.sh 2012-09-21 17:18:29 UTC (rev 587)
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-MEMORY="-Xmx1024M"
-JRIARGS="-Djava.library.path=x64"
-
-java $MEMORY $JRIARGS -jar ${project.build.finalName}.${project.packaging} $*
Deleted: trunk/sammoa-ui-swing/src/main/assembly/x64/librxtxSerial.so
===================================================================
(Binary files differ)
Deleted: trunk/sammoa-ui-swing/src/main/assembly/x64/rxtxSerial.dll
===================================================================
(Binary files differ)
Deleted: trunk/sammoa-ui-swing/src/main/assembly/x86/librxtxSerial.so
===================================================================
(Binary files differ)
Deleted: trunk/sammoa-ui-swing/src/main/assembly/x86/rxtxSerial.dll
===================================================================
(Binary files differ)
1
0
r586 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-application/src/test/java/fr/ulr/sammoa/application sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action src/site/rst
by fdesbois@users.forge.codelutin.com 21 Sep '12
by fdesbois@users.forge.codelutin.com 21 Sep '12
21 Sep '12
Author: fdesbois
Date: 2012-09-21 15:00:10 +0200 (Fri, 21 Sep 2012)
New Revision: 586
Url: http://forge.codelutin.com/repositories/revision/sammoa/586
Log:
fixes #1511 : improve crossingNumber behavior, do not use nbTimes any longer except for init case (from import)
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java
trunk/src/site/rst/model.rst
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-09-20 12:45:28 UTC (rev 585)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-09-21 13:00:10 UTC (rev 586)
@@ -309,13 +309,13 @@
}
}
- public void deleteTansectFlight(Flight flight,
- TransectFlight transectFlight) {
+ public void deleteTransectFlight(Flight flight,
+ TransectFlight transectFlight) {
TopiaContext tx = beginTransaction();
try {
- deleteTansectFlight(tx, flight, transectFlight);
+ deleteTransectFlight(tx, flight, transectFlight);
tx.commitTransaction();
@@ -326,9 +326,9 @@
}
}
- protected void deleteTansectFlight(TopiaContext tx,
- Flight flight,
- TransectFlight transectFlight)
+ protected void deleteTransectFlight(TopiaContext tx,
+ Flight flight,
+ TransectFlight transectFlight)
throws TopiaException {
SammoaDAOHelper.getObserverPositionDAO(tx).deleteAll(
@@ -868,13 +868,12 @@
TransectFlightDAO transectFlightDAO =
SammoaDAOHelper.getTransectFlightDAO(transaction);
- TransectFlight result =
- transectFlightDAO.create(TransectFlight.PROPERTY_TRANSECT,
- transect);
+ int crossingNumber =
+ transectFlightDAO.getMaxCrossingNumberByTransect(transect) + 1;
- int crossingNumber = transect.getNbTimes() + 1;
+ TransectFlight result = transectFlightDAO.create();
+ result.setTransect(transect);
result.setCrossingNumber(crossingNumber);
- transect.setNbTimes(crossingNumber);
// Update transect for nbTimes
TransectDAO transectDAO = SammoaDAOHelper.getTransectDAO(transaction);
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java 2012-09-20 12:45:28 UTC (rev 585)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java 2012-09-21 13:00:10 UTC (rev 586)
@@ -58,7 +58,7 @@
if (transectFlight.isDeleted()) {
// Use FlightService for delete
- context.getService(FlightService.class).deleteTansectFlight(tx, flight, transectFlight);
+ context.getService(FlightService.class).deleteTransectFlight(tx, flight, transectFlight);
result = null;
Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java 2012-09-20 12:45:28 UTC (rev 585)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java 2012-09-21 13:00:10 UTC (rev 586)
@@ -24,6 +24,7 @@
*/
package fr.ulr.sammoa.application;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Flight;
@@ -46,6 +47,9 @@
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
+import java.util.List;
+import java.util.Map;
+
/**
* Created: 08/06/12
*
@@ -133,9 +137,10 @@
FlightService service = context.getService(FlightService.class);
Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
-
- // Create the strate
Strate strate = createStrate(campaign, 1, StrateType.COAST);
+ Transect transect1 = createTransect("C1", strate);
+ Transect transect2 = createTransect("C2", strate);
+ Transect transect3 = createTransect("C3", strate);
Flight flight = service.createFlight(campaign, service.getNextFlightNumber());
@@ -144,10 +149,6 @@
flight.addObserver(createObserver(String.valueOf(i), campaign));
}
- Transect transect1 = createTransect("C1", strate);
- Transect transect2 = createTransect("C2", strate);
- Transect transect3 = createTransect("C3", strate);
-
// Add transect1 and transect2
Iterable<Transect> transects = Lists.newArrayList(transect1, transect2);
@@ -156,8 +157,10 @@
Assert.assertEquals(2, flight.getTransectFlight().size());
TransectFlight transectFlight1 = flight.getTransectFlight().get(0);
Assert.assertEquals(transect1, transectFlight1.getTransect());
+ Assert.assertEquals(1, transectFlight1.getCrossingNumber());
TransectFlight transectFlight2 = flight.getTransectFlight().get(1);
Assert.assertEquals(transect2, transectFlight2.getTransect());
+ Assert.assertEquals(1, transectFlight2.getCrossingNumber());
// Add an other transectFlight for transect2 and transect3
transects = Lists.newArrayList(transect2, transect3);
@@ -167,10 +170,154 @@
Assert.assertEquals(4, flight.getTransectFlight().size());
TransectFlight transectFlight3 = flight.getTransectFlight().get(2);
Assert.assertEquals(transect3, transectFlight3.getTransect());
+ Assert.assertEquals(1, transectFlight3.getCrossingNumber());
TransectFlight transectFlightAtIndex2 = flight.getTransectFlight().get(1);
Assert.assertNotSame(transectFlight2, transectFlightAtIndex2);
+ Assert.assertEquals(transect2, transectFlightAtIndex2.getTransect());
+ Assert.assertEquals(2, transectFlightAtIndex2.getCrossingNumber());
}
+ @Test
+ public void testDeleteTransectFlight() throws Exception {
+
+ SammoaContext context = new SammoaContext(config, database.getPersistence());
+
+ FlightService service = context.getService(FlightService.class);
+
+ Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
+ Strate strate = createStrate(campaign, 1, StrateType.COAST);
+ Transect transect = createTransect("C1", strate);
+
+ Flight flight = service.createFlight(campaign, service.getNextFlightNumber());
+
+ List<TransectFlight> transectFlights =
+ service.addTransects(flight, 0, ImmutableList.of(transect));
+
+ TransectFlight transectFlight = transectFlights.get(0);
+ Assert.assertEquals(1, transectFlight.getCrossingNumber());
+
+ service.deleteTransectFlight(flight, transectFlight);
+
+ transectFlights =
+ service.addTransects(flight, 0, ImmutableList.of(transect));
+ transectFlight = transectFlights.get(0);
+ Assert.assertEquals(1, transectFlight.getCrossingNumber());
+ }
+
+ @Test
+ public void testCrossingNumber() throws Exception {
+
+ SammoaContext context = new SammoaContext(config, database.getPersistence());
+
+ FlightService service = context.getService(FlightService.class);
+
+ Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
+
+ Strate strate = createStrate(campaign, 1, StrateType.COAST);
+ Transect transect = createTransect("C1/01", strate);
+
+ Flight flight1 = service.createFlight(campaign, service.getNextFlightNumber());
+ Flight flight2 = service.createFlight(campaign, service.getNextFlightNumber());
+ Flight flight3 = service.createFlight(campaign, service.getNextFlightNumber());
+
+ int index = 0;
+ // 1st crossing on flight 1
+ {
+ service.addTransects(flight1, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight1.getTransectFlight().get(index);
+ Assert.assertEquals(1, transectFlight.getCrossingNumber());
+ }
+ // 2nd crossing on flight 1
+ {
+ service.addTransects(flight1, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight1.getTransectFlight().get(index);
+ Assert.assertEquals(2, transectFlight.getCrossingNumber());
+ }
+ // 3rd crossing on flight 2
+ {
+ service.addTransects(flight2, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight2.getTransectFlight().get(index);
+ Assert.assertEquals(3, transectFlight.getCrossingNumber());
+ }
+ // 6th crossing on flight 3
+ // manual set because an other system does the 4th and 5th crossings
+ {
+ service.addTransects(flight3, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight3.getTransectFlight().get(index);
+ Assert.assertEquals(4, transectFlight.getCrossingNumber());
+ transectFlight.setCrossingNumber(6);
+ }
+ // 7th crossing on flight 3
+ {
+ service.addTransects(flight3, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight3.getTransectFlight().get(index);
+ Assert.assertEquals(7, transectFlight.getCrossingNumber());
+ }
+ // We delete the flight3, the next crossing become the 4th
+ {
+ service.deleteFlight(campaign.getTopiaId(), flight3.getTopiaId());
+ }
+ // 4th crossing on flight 2
+ {
+ service.addTransects(flight2, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight2.getTransectFlight().get(index);
+ Assert.assertEquals(4, transectFlight.getCrossingNumber());
+ }
+ // We update the transect nbTimes (usually done by import)
+ {
+ transect.setNbTimes(5);
+ }
+ // 6th crossing on flight 2
+ {
+ service.addTransects(flight2, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight2.getTransectFlight().get(index);
+ Assert.assertEquals(6, transectFlight.getCrossingNumber());
+ }
+ // Mark 2nd crossing as deleted
+ {
+ TransectFlight transectFlight = flight1.getTransectFlight().get(index);
+ Assert.assertEquals(2, transectFlight.getCrossingNumber());
+ transectFlight.setDeleted(true);
+ }
+ // 5th crossing on flight 1 (manual change)
+ {
+ service.addTransects(flight1, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight1.getTransectFlight().get(index);
+ Assert.assertEquals(7, transectFlight.getCrossingNumber());
+ transectFlight.setCrossingNumber(5);
+ }
+ // Change the 6th crossingNumber to 2nd (2nd is marked deleted)
+ {
+ TransectFlight transectFlight = flight2.getTransectFlight().get(index);
+ Assert.assertEquals(6, transectFlight.getCrossingNumber());
+ transectFlight.setCrossingNumber(2);
+ }
+ // Check that 6 transectFlight are attached to the transect
+ // but one is deleted
+ {
+ TopiaContext tx = database.beginTransaction();
+ Map<Transect, Long> map = SammoaDAOHelper.getTransectFlightDAO(tx).
+ countAllByTransect();
+ Assert.assertEquals(new Long(6), map.get(transect));
+ }
+ // 6th crossing on flight 1 marked as 1st one (strange but not forbidden)
+ {
+ service.addTransects(flight1, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight1.getTransectFlight().get(index);
+ Assert.assertEquals(6, transectFlight.getCrossingNumber());
+ transectFlight.setCrossingNumber(1);
+ }
+ // 7th crossing on flight 2
+ // There is 6 transectFlight not deleted, 2 as 1st crossing and no 6th crossing
+ // No check is done, but here we assume that there is 6 valid crossing
+ // So the next one is the 7th
+ {
+ service.addTransects(flight2, index, ImmutableList.of(transect));
+ TransectFlight transectFlight = flight2.getTransectFlight().get(index);
+ Assert.assertEquals(7, transectFlight.getCrossingNumber());
+ }
+ }
+
protected Observer createObserver(String initials, Campaign campaign) throws TopiaException {
TopiaContext transaction = database.beginTransaction();
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java 2012-09-20 12:45:28 UTC (rev 585)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java 2012-09-21 13:00:10 UTC (rev 586)
@@ -76,6 +76,34 @@
}
}
+ public int getMaxCrossingNumberByTransect(Transect transect) {
+
+ String ql = "SELECT max(crossingNumber), count(*), transect.nbTimes " +
+ "FROM TransectFlightImpl " +
+ "WHERE transect = :transect " +
+ "AND deleted = :deleted " +
+ "GROUP BY transect";
+ try {
+ Object[] queryResults = (Object[]) getContext().findUnique(
+ ql, "transect", transect, "deleted", false);
+
+ int result;
+ if (queryResults == null) {
+ // By default we use the transect nbTimes set by import
+ result = transect.getNbTimes();
+
+ } else {
+ int maxCrossingNumber = (Integer) queryResults[0];
+ int nbTransectFlights = ((Long) queryResults[1]).intValue();
+ int transectNbTimes = (Integer) queryResults[2];
+ result = Math.max(Math.max(maxCrossingNumber, nbTransectFlights), transectNbTimes);
+ }
+ return result;
+ } catch (TopiaException e) {
+ throw new TopiaRuntimeException(e);
+ }
+ }
+
public void reAttachIndexInFlight(Iterable<TransectFlight> transectFlights) throws TopiaException {
StringBuilder builder = new StringBuilder();
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java 2012-09-20 12:45:28 UTC (rev 585)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java 2012-09-21 13:00:10 UTC (rev 586)
@@ -140,14 +140,6 @@
public void setCrossingNumber(int crossingNumber) {
int oldValue = getCrossingNumber();
getSource().setCrossingNumber(crossingNumber);
-
- // We need to update the manual nbTimes from transect to ensure next crossingNumber value
- // only if the nbTimes is inferior to the new value manually set
- int nbTimes = getTransect().getSource().getNbTimes();
- if (crossingNumber > nbTimes) {
- getTransect().getSource().setNbTimes(crossingNumber);
- }
-
firePropertyChange(PROPERTY_CROSSING_NUMBER, oldValue, crossingNumber);
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java 2012-09-20 12:45:28 UTC (rev 585)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java 2012-09-21 13:00:10 UTC (rev 586)
@@ -80,7 +80,7 @@
FlightService service =
getSammoaUIContext().getService(FlightService.class);
- service.deleteTansectFlight(getModel().getFlight(), transectFlight.getSource());
+ service.deleteTransectFlight(getModel().getFlight(), transectFlight.getSource());
if (logger.isDebugEnabled()) {
logger.debug("Delete transect {} ",
Modified: trunk/src/site/rst/model.rst
===================================================================
--- trunk/src/site/rst/model.rst 2012-09-20 12:45:28 UTC (rev 585)
+++ trunk/src/site/rst/model.rst 2012-09-21 13:00:10 UTC (rev 586)
@@ -737,18 +737,14 @@
+----------------------+----------------------------------+--------------------+----------------+
| nbTimes | Nombre de fois sur lequel a été | int | |
| | effectué le transect. Ce nombre | | |
-| | est incrémenté en fonction du | | |
-| | numéro de passage | | |
-| | (*crossingNumber*) d'un nouveau | | |
-| | TransectFlight_. Le numéro de | | |
-| | passage est modifié manuellement | | |
-| | par l'utilisateur. Le nombre de | | |
-| | TransectFlight_ rattaché à ce | | |
-| | transect depuis la base peut | | |
-| | être différent, car d'anciens | | |
-| | vols ayant un lien avec ce | | |
-| | transect ont pu être supprimés | | |
-| | de la base. | | |
+| | est importé et n'est utilisé | | |
+| | comme base pour le prochain | | |
+| | *crossingNumber* des | | |
+| | TransectFlight_ que si il est | | |
+| | supérieur à la plus grande | | |
+| | valeur existante de | | |
+| | *crossingNumber* pour ce | | |
+| | transect. | | |
+----------------------+----------------------------------+--------------------+----------------+
| graphicIndex | Index de l'objet graphique | Integer | |
| | depuis le fichier SHP importé. | | |
1
0
Author: fdesbois
Date: 2012-09-20 14:45:28 +0200 (Thu, 20 Sep 2012)
New Revision: 585
Url: http://forge.codelutin.com/repositories/revision/sammoa/585
Log:
fixes #1455 : end model doc
Modified:
trunk/src/site/rst/model.rst
Modified: trunk/src/site/rst/model.rst
===================================================================
--- trunk/src/site/rst/model.rst 2012-09-18 17:04:54 UTC (rev 584)
+++ trunk/src/site/rst/model.rst 2012-09-20 12:45:28 UTC (rev 585)
@@ -310,7 +310,8 @@
*<<entity>>*
Observateur participant à une campagne et positionné sur le plan de vol à une
-position dans l'avion.
+position dans l'avion. Voir `importer les observateurs
+<import-export.html#bservateurs-csv>`_ .
+----------------------+----------------------------------+--------------------+----------------+
| Nom | Description | Type | Contraintes |
@@ -450,6 +451,107 @@
coordonnées géographiques. A chaque changement de conditions d'observations, un
nouveau parcours est créé.
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| beginTime | Temps auquel a été commencé | Date | required |
+| | le parcours | (seconds) | |
++----------------------+----------------------------------+--------------------+----------------+
+| effortNumber | Numéro d'effort (pour un LEG | Integer | |
+| | uniquement) incrémenté par | | |
+| | rapport au vol | | |
++----------------------+----------------------------------+--------------------+----------------+
+| distance | ?? | double | |
++----------------------+----------------------------------+--------------------+----------------+
+| seaState | Code pour l'état de la mer | int | min = 0 |
+| | selon l'échelle de Beaufort | | max = 5 |
++----------------------+----------------------------------+--------------------+----------------+
+| swell | Houle (0 pas de houle < 2 houle | int | min = 0 |
+| | gênante) | | max = 2 |
++----------------------+----------------------------------+--------------------+----------------+
+| turbidity | Turbidité/transparence de l'eau | int | values = [0,1, |
+| | (0 eau claire < 2 eau turbide, | | 2,9] |
+| | 9 turbidité inconnue) | | |
++----------------------+----------------------------------+--------------------+----------------+
+| cloudCover | Couverture nuaugeuse défini par | int | min = 0 |
+| | le système des octats (0 pour | | max = 8 |
+| | dégagé < 8 pour complètement | | |
+| | couvert) | | |
++----------------------+----------------------------------+--------------------+----------------+
+| skyGlint | Réflexion des nuages | int | min = 0 |
++----------------------+----------------------------------+--------------------+----------------+
+| glareFrom | Début de la zone d'éblouissement | Integer | min = 0 |
+| | en degré (le nez de l'avion 0°) | | max = 360 |
++----------------------+----------------------------------+--------------------+----------------+
+| glareTo | Fin de la zone d'éblouissement | Integer | min = 0 |
+| | en degré (le nez de l'avion 0°) | | max = 360 |
++----------------------+----------------------------------+--------------------+----------------+
+| glareUnder | Eblouissement sous l'avion | boolean | |
++----------------------+----------------------------------+--------------------+----------------+
+| glareSeverity | Intensité d'éblouissement (0 | int | min = 0 |
+| | aucun éblouissement < 3 | | max = 3 |
+| | éblouissement fort) | | |
++----------------------+----------------------------------+--------------------+----------------+
+| subjectiveConditions | Détectabilité. Estimation des | String | regex = |
+| | observateurs en fonction des | | "$[EGMP]{2}^" |
+| | autres paramètres si les | | |
+| | conditions sont bonnes ou non. | | |
+| | Il s'agit de deux lettres, une | | |
+| | pour le côté gauche et une pour | | |
+| | le côté droit. | | |
+| | (E excellentes, G bonnes, M | | |
+| | moyennes et P pauvres). | | |
++----------------------+----------------------------------+--------------------+----------------+
+| unexpectedRight | Commentaire sur les observations | String | |
+| | à droite. Généralement utilisé | | |
+| | pour compter le nombre d'exocet | | |
+| | ou de méduse. | | |
++----------------------+----------------------------------+--------------------+----------------+
+| unexpectedLeft | Commentaire sur les observations | String | |
+| | à gauche. Généralement utilisé | | |
+| | pour compter le nombre d'exocet | | |
+| | ou de méduse. | | |
++----------------------+----------------------------------+--------------------+----------------+
+| comment | Commentaires sur le parcours | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| valid | Indique si le parcours a été | boolean | |
+| | validé ou non | | |
++----------------------+----------------------------------+--------------------+----------------+
+| deleted | Indique si le parcours a été | boolean | |
+| | marque comme supprimé ou non | | |
++----------------------+----------------------------------+--------------------+----------------+
+| flight | Vol auquel est rattaché ce | Flight_ | required |
+| | parcours | | |
++----------------------+----------------------------------+--------------------+----------------+
+| routeType | Type de parcours | RouteType_ | required |
++----------------------+----------------------------------+--------------------+----------------+
+| transectFlight | Transect référence sur lequel | TransectFlight_ | |
+| | est effectué l'effort d' | | |
+| | observation pour un parcours de | | |
+| | type LEG | | |
++----------------------+----------------------------------+--------------------+----------------+
+| circleBackCause | Observation source pour un | Observation_ | |
+| | parcours de type CIRCLE_BACK | | |
++----------------------+----------------------------------+--------------------+----------------+
+| observerPosition | Ensemble des positions des | Collection of | |
+| | observateurs sur ce parcours. | ObserverPosition_ | |
+| | Le premier LEG sur un transect | | |
+| | débutera avec le prévisionnel | | |
+| | des positions d'observateur | | |
+| | depuis un TransectFlight_ | | |
+| | Il peut y avoir une position | | |
+| | sans observateur. Le nombre de | | |
+| | position est conditionné par le | | |
+| | type de plate-forme de l'avion. | | |
++----------------------+----------------------------------+--------------------+----------------+
+
+Autres règles de validation :
+
+- Il ne peut y avoir deux parcours à la suite avec le même type pour la même heure
+- Il ne peut y avoir deux parcours à la suite avec le même type et les même conditions d'observations
+ (seaState, swell, turbidity, cloudCover, skyGlint, glareFrom, glareTo, glareUnder,
+ glareSeverity, subjectiveConditions, observerPosition)
+
RouteType
---------
@@ -493,22 +595,86 @@
*<<entity>>*
-Secteur géographique sur lequel l'effort est effectué.
+Secteur géographique sur lequel l'effort est effectué. Voir `importer les strates
+<import-export.html#fichier-de-strate-dbf>`_ .
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| sectorNumber | Numéro de secteur | int | naturalId |
++----------------------+----------------------------------+--------------------+----------------+
+| campaign | Campagne rattachée à ce secteur | Campaign_ | naturalId |
++----------------------+----------------------------------+--------------------+----------------+
+| name | Nom du secteur | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| localCreation | Indique si la création de | boolean | |
+| | l'entité a été faites depuis | | |
+| | l'interface de l'application | | |
+| | (différent d'un import) | | |
++----------------------+----------------------------------+--------------------+----------------+
+
Species
-------
*<<entity>>*
-Espèce observée.
+Espèce observée. Voir `importer les espèces
+<import-export.html#especes-csv>`_ .
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| code | Code de l'espèce | String | naturalId |
++----------------------+----------------------------------+--------------------+----------------+
+| region | Région rattachée à cette espèce | Region_ | naturalId |
++----------------------+----------------------------------+--------------------+----------------+
+| commonName | Nom commun de l'espèce | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| latinName | Nom scientifique de l'espèce | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| groupName | Nom du group auquel appartient | String | |
+| | cette espèce | | |
++----------------------+----------------------------------+--------------------+----------------+
+| family | Famille de l'espèce | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| type | Type d'espèce | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| localCreation | Indique si la création de | boolean | |
+| | l'entité a été faites depuis | | |
+| | l'interface de l'application | | |
+| | (différent d'un import) | | |
++----------------------+----------------------------------+--------------------+----------------+
+
Strate
------
*<<entity>>*
-Strate géographique sur laquelle l'effort est effectué.
+Strate géographique sur laquelle l'effort est effectué. Voir `importer les strates
+<import-export.html#fichier-de-strate-dbf>`_ .
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| sector | Secteur rattachée à cette strate | Sector_ | naturalId |
++----------------------+----------------------------------+--------------------+----------------+
+| strateType | Type de strate | StrateType_ | naturalId |
++----------------------+----------------------------------+--------------------+----------------+
+| code | Code de la strate. | String | |
+| | Utilisation du numéro de secteur | | |
+| | et du code du type de strate. | | |
+| | Ex: sectorNumber = 1, | | |
+| | strateTypeCode = 'C' => | | |
+| | code = "C1" | | |
++----------------------+----------------------------------+--------------------+----------------+
+| name | Nom usuel de la strate | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| localCreation | Indique si la création de | boolean | |
+| | l'entité a été faites depuis | | |
+| | l'interface de l'application | | |
+| | (différent d'un import) | | |
++----------------------+----------------------------------+--------------------+----------------+
+
StrateType
----------
@@ -516,13 +682,89 @@
Type de strate possible (côtière, pente, néritique, océanique).
++----------------------+----------------------------------+
+| Valeur | Description |
++======================+==================================+
+| COAST | Côtière. code = 'C' |
++----------------------+----------------------------------+
+| NERITIC | Néritique. code = 'N' |
++----------------------+----------------------------------+
+| SLOPE | Pente. code = 'P' |
++----------------------+----------------------------------+
+| OCEANIC | Océanique. code = 'O' |
++----------------------+----------------------------------+
+
Transect
--------
*<<entity>>*
Segment géographique sur lequel doit être effectué l'effort d'observation.
+Voir `importer les transects
+<import-export.html#fichier-de-transect-dbf>`_ .
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| name | Nom du transect. | String | naturalId |
+| | Utilisation du code de la strate | | |
+| | et d'un numéro incrémenté sur | | |
+| | deux chiffres. | | | |
+| | strate. Ex: strateCode = "C1" | | |
+| | => name = "C1/01" ou "C1/24" | | |
++----------------------+----------------------------------+--------------------+----------------+
+| strate | Strate sur laquelle se situe ce | Strate_ | naturalId |
+| | transect | | |
++----------------------+----------------------------------+--------------------+----------------+
+| length | Longueur du transect en mètres | Double | |
++----------------------+----------------------------------+--------------------+----------------+
+| startX | Coordonnée géographique X du | Double | |
+| | début du transect | | |
++----------------------+----------------------------------+--------------------+----------------+
+| startY | Coordonnée géographique Y du | Double | |
+| | début du transect | | |
++----------------------+----------------------------------+--------------------+----------------+
+| endX | Coordonnée géographique X de | Double | |
+| | fin du transect | | |
++----------------------+----------------------------------+--------------------+----------------+
+| endY | Coordonnée géographique Y de | Double | |
+| | fin de transect | | |
++----------------------+----------------------------------+--------------------+----------------+
+| localCreation | Indique si la création de | boolean | |
+| | l'entité a été faites depuis | | |
+| | l'interface de l'application | | |
+| | (différent d'un import) | | |
++----------------------+----------------------------------+--------------------+----------------+
+| nbTimes | Nombre de fois sur lequel a été | int | |
+| | effectué le transect. Ce nombre | | |
+| | est incrémenté en fonction du | | |
+| | numéro de passage | | |
+| | (*crossingNumber*) d'un nouveau | | |
+| | TransectFlight_. Le numéro de | | |
+| | passage est modifié manuellement | | |
+| | par l'utilisateur. Le nombre de | | |
+| | TransectFlight_ rattaché à ce | | |
+| | transect depuis la base peut | | |
+| | être différent, car d'anciens | | |
+| | vols ayant un lien avec ce | | |
+| | transect ont pu être supprimés | | |
+| | de la base. | | |
++----------------------+----------------------------------+--------------------+----------------+
+| graphicIndex | Index de l'objet graphique | Integer | |
+| | depuis le fichier SHP importé. | | |
+| | Il permet de faire correspondre | | |
+| | les méta-données avec sa | | |
+| | représentation graphique. Il | | |
+| | s'agit en fait de l'index de la | | |
+| | ligne de transect dans le | | |
+| | fichier DBF importé. | | |
+| | Cette propriété peut être vide | | |
+| | si aucune correspondance | | |
+| | graphique n'est disponible dans | | |
+| | le cas d'un nouveau transect | | |
+| | créé depuis l'application. | | |
++----------------------+----------------------------------+--------------------+----------------+
+
TransectFlight
--------------
@@ -531,4 +773,34 @@
Segment géographique prévu (et potentiellement réalisé) pour un vol donné.
Chaque parcours de type LEG représentant un effort d'observation est
obligatoirement associé à un transect du plan de vol. L'ensemble de ces
-segments représente un plan de vol avec une numérotation représentant l'ordre.
\ No newline at end of file
+segments représente un plan de vol avec une numérotation représentant l'ordre.
+
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| transect | Numéro d'observation incrémenté | Transect_ | required |
+| | par rapport au vol | | |
++----------------------+----------------------------------+--------------------+----------------+
+| crossingNumber | Numéro de passage sur le | int | |
+| | transect. Incrémentée depuis | | |
+| | le nombre de fois sur le | | |
+| | transect (*nbTimes*) où modifié | | |
+| | manuellement. Dans ce cas, le | | |
+| | nombre de fois du transect est | | |
+| | mis à jour pour le prochain | | |
+| | incrément | | |
++----------------------+----------------------------------+--------------------+----------------+
+| valid | Indique si le transect a été | boolean | |
+| | validé ou non | | |
++----------------------+----------------------------------+--------------------+----------------+
+| deleted | Indique si le transect a été | boolean | |
+| | marqué comme supprimé ou non | | |
++----------------------+----------------------------------+--------------------+----------------+
+| observerPosition | Ensemble des positions des | Collection of | |
+| | observateurs prévues pour ce | ObserverPosition_ | |
+| | transect. | | |
+| | Il peut y avoir une position | | |
+| | sans observateur. Le nombre de | | |
+| | position est conditionné par le | | |
+| | type de plate-forme de l'avion. | | |
++----------------------+----------------------------------+--------------------+----------------+
\ No newline at end of file
1
0
r584 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-persistence/src/main/xmi src/site src/site/resources src/site/rst
by fdesbois@users.forge.codelutin.com 18 Sep '12
by fdesbois@users.forge.codelutin.com 18 Sep '12
18 Sep '12
Author: fdesbois
Date: 2012-09-18 19:04:54 +0200 (Tue, 18 Sep 2012)
New Revision: 584
Url: http://forge.codelutin.com/repositories/revision/sammoa/584
Log:
refs #1455 : clean model doc + issue with captureDelay on new geoPoint during validation
Added:
trunk/src/site/resources/model.png
trunk/src/site/rst/model.rst
Removed:
trunk/src/site/rst/sammoa-model.rst
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-persistence/src/main/xmi/sammoa.zargo
trunk/src/site/rst/import-export.rst
trunk/src/site/rst/index.rst
trunk/src/site/site.xml
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-09-12 16:24:04 UTC (rev 583)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-09-18 17:04:54 UTC (rev 584)
@@ -496,7 +496,7 @@
result.setSpeed(location.getSpeed());
result.setAltitude(location.getAltitude());
- int captureDelay =
+ int captureDelay = location.getCaptureDelay() +
Seconds.secondsBetween(locationTime, newTime).getSeconds();
result.setCaptureDelay(captureDelay);
Modified: trunk/sammoa-persistence/src/main/xmi/sammoa.zargo
===================================================================
--- trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-09-12 16:24:04 UTC (rev 583)
+++ trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-09-18 17:04:54 UTC (rev 584)
@@ -1,101 +1,83 @@
-PK]Z%Asammoa.argo�TK��0�ﯰr��l�B��.�bϕO���8��zƱ�8}����JQ5��y�̔\7��@T�*{�Uw��Bծ��rK�G�ζJ����,#e��(Ot�#T���weq�'���)c�(��+
+PKc�2Asammoa.argo�TK��0�ﯰr��l�B��.�bϕO���8��zƱ�8}����JQ5��y�̔\7��@T�*{�Uw��Bծ��rK�G�ζJ����,#e��(Ot�#T���weq�'���)c�(��+
X�}c��^N�q�������)��V�7J
_���\(�9��@�PJ�= ����j�V�����N���%�C�H�N��I����L<�'9�h���R���Vh��I�Ijì�`O���A4��^�I��*p�����G[N�i�P�=
�V�Ch��(`�5��18��!F��NݹU�'��nP5eq&��/�����<��-�����휈3F��@ o4�|T���jIm�&o�g&���v�e���*�����LJ��OO+FM݆4F
�2j�-J�☆��y��E�uT�Ge�y��g��}䞽~nh:�B�ӝ�7�_���3
-V��M�w��d����o�zm�j�4�s�%�Ts�m�����}I�gi�q{�qi�����Xҳ��^[7L��2���ճ-��wc�UY%�]<�q��d�h�����G<1�hx����7PK��DH�PK]Z%Asammoa_Diagrammedeclasses.pgml�]m��6���_�*{B� &����s�c����m��R�k�����[���w�;��H��lR�D��nR�D���F���t����q6�.��h���p�
-��(O����rw��=����^�������}�<=�>�����σg�.ƫ�3~E��8\�ӧU�h�p1\<Dk~Q��x:|X/���j:�m�Z�G��"�XO/~����l�\^o���������sB�y��\/&s���q���<��A��W϶�z��������w��5/��i{������X�)�~�=��9��S��#��O��N���Y�j2�-���pF�oO�_������p1�����B�����j��ޯW��u:�/�p��[���!��l�"�y͢ūg�q�����g>���P�a������p�{�����O����*���{鏛��h5�?�B�\����W�8��?}�/w��?����uw�| �_V|�(��2���i�3On0�~;�U��J8���Sm�H8A�j�v��=�#6}?��d�̢��w��p6�z������h6V������3���z��N���f9]�s.��_�-��%�/����B�.ˋ�Q��ܬ����Z�?�/J�,J/��?��O�����U��L/�ཽ�^"/(mImU���%K�&�&)���w���fn�x��~�NU]k�ٚ����?�
-�Y��Uh^��+��_f�����շ�<�?����}�4_��T�u�L�����L�Z���֔��\.�-�*z|.V�����������*����.J�a��/�UXs=�kR�]��`�h�vyNV�n���0�����AT)F�q ����.�{�V_8��њJwK��b��ip��o8�q��Kg��
-x��]��
-����J'��Y�8��
-x�%x{��Y��,
-gW�0��E�p8/E�� ���g �����c��O�R����މ������O_����q�'��|>���g����Q�&�t����R��~��(؞�1��Q�+;�cԀ�V���� ��*2��g��P�{�s�9ۘ�N3cB�~����bBSQ�ppz;��~LI1����#m�� }^qq�"B�ZD���dI"�!�$<���� ���6="������#B�D��R�5���X��nDh�av��z]�0j@H[�$ؚ��s�!�AH�՟G����x��A:�n�_)���giq!y�{ZJ�Ec���N���n�~,Ȯ�e�u��,g�u�}!B]̍s�d�h��|���_�po}�X����6���c��7���ï-��A�2�o���%W�CeUa��!�$$\,9\��e��j#�ԑw��rǗB��[�į"Y��Գ�vW�Yhv��]D)���$�M�`���tzNj����`����n��
-��>�
-��_b`�A�V�V���V��v(�g�lT��:��3���OH�Śf��t�'p����]�k��&�\����Oo��^�B�Amb��P�P~���M)ФhU�tw�Z�n.��2
-�FD��f�0-=� ֈU���a�����:C[DuiV!�����2�Q%|�\F�i"3��{ě�!�h��W�|��C<�Zϻ���i����pa���1Z�8�2a+��C��6��o�G�P�G�!��������=r�z�h���������ȟ��?�#�o����L>�;���K��?���i�d����;�b�0�,�x�g��_8n(�?�g���x��o����sQ�U w
-��8o����<Z�Z���蓆���.W2���
-�ӆb~|�/��E^1_��@0�����P�oo�������,��`�d�O��<F_�U��W1S��9;J6���<
-�� G�ĺ�4�J:?�Є�N~a�$�_��C R'��R"�E���3-M�4��9��FG���%
-]��
-�W�])4���LB����k�KQl�Xd��+2��[��
-����p<�1��%��M���w������3\Al��s��=���sщ�E�g�W������6����d+����U-:]Z��1YѰ14�r� (1���M�r�蜵�Ĉ������>\�ω��.��8�=�f����ą��g�]%�˰SC��]��)�7���m,y֣-�=G������m�x��-�=|&�4�
-���Y��Բ��_�o�sփ-�}~~�F�rV���Y�X�����j�h˜�h��d8���~J7*<���:g=�!�%ZE�,���o�=���@cL/<b��g=��_���UD��p�pˬLm
-��p����Y)�Yt�2Wo���L�����5�UϬ��,/C�k�q��lܶ��]�<x��8{��9Η�E!�
-1��!|*��9��������K�j
-�����çR�u�4n��P����a�I�c���E�>
-�ʤ�s�/Uݝ��
-���ڜj!|A>U ���l���h�b��'
-��=����k�R$_���<"j;�9Q2���#B骖Q����� �C`+��|�����z�o���m/����˻�
-��T��kP�
-��P�P�~����w7���T�kX����X�Xz����M��6�����~sy��0���P���"�j�X{�X�3�����a}��7��0�EϬlj�,�$S۪k61�B�����V}��"4�H�"]?�� U���J�ғ�����ܲ��RuY��Ǒ�����
-J�f�`wR�4���Y��̩�$,a�4n��$#긻�T�)Z7��9c�;��c\h�����%�O��=�+�*�&mRB��9c�O�Ϩ�'�ʓ����������mzvS�6�%�[�K9U�^T/��"M�%ӊ��<|/��yakϣ�ԫ��a
-���4g���g:W�Kܫ)?��G1���^���� �JymF��9f5� �`�,�C#�rj<���%�z��V��������'n^��O1p��#�[(��k8�xc̾^~�^�O��
-H��d+
-pS�\�mg3 ب�Pg���hKh�������k\�w��P��n��x��o
-���K������41�A_|5�{�%����?�C/>�#�=�"���"�e>N��@-uT|eN��B`���h��W�C�(Ǽ�<�L��z�5�?�_��^DŇRcJY�����"z�"��Rf*�ԣ.�N&�b��%_| e��M�0Lg�G�h=�������"[N��@e�z���`�5�Mg\u�o&7Jj�B�<l�~��<��DMUN��\
-�;B
-˕(��AS#�v��ٟj����A��\�|�h#k��ɚE4�h�KD;,^2��n�pS�<��c��|�g���偣�=��:�n��6���$�ٷF��q5� �Ms��Q�ވ]W�k�;�������i���(w�'�S������N��DK}�5��)w�]��F��]l�c��vQwڂ44-���c�M��Kwvvm�t[=*m��c��n�d�I�ǚ,�G�l���Xҿ)9���"~3����pB�?1���N�!�j� �1�1�?1���N�)�h��ݨ�t;�g[t�a��>,iߔ�}�w��{o�A�(��>L�yd:.A�7����>�'��~���ä�������AQ�:dv�>풜}�b�������H��Ǹ"OY�i�F����*"�o��}|;��ꘖo�An��C.B>I,*p�,�%i��J�����O�\�G�Y�+\�I1�|�y-��zCi,�gdZޑ��1��G\���U����6%3���nq��dF�Q.�le���T����l�P^X�)/Ǵ��c���]m�jD����F�}h2�%�l�����h4M�*�}��l�e�^��\�99�|k=Ojg���i����ۻ���h��&���x��/��mn��ơ�&�����7�C�m�����!{��N��b�����ȟ��?�#�qk����L>�;��Ge��?���i�D�z��@T�&�e/p�L89� ������j���n�A:-�E�y�݆B.�Λ��r>�V�"=��:���"�\�
-��co
-�~Ō|�����kF=���]\�?�;>F�T�Û�u>Y��}
-WQb������
-�5�η��Tj����(1.��Y��o�Z��W���.��f]2A"Wf�S�.���fg�BN��KAִ�V�`߱��9�6/��JA�n^r�{���m����iS�5� �\�h�*��&&�
-X61��t3��&����i���6ffn��Ƽ��������9�S�H����G31�{��{J�갅yS��<����maޜ���1�-L8�C�'��m�܇��}��
-L8��
-L�x���yy����^31��v�������>�1W:N��1W;{�����[0po39k`��R���������H��aG���H!,�H�Y��d�Z��
-�t#G*��t��AQ��V��ꤻ�Ֆ�nEm}�1�
-�+b�BZ�G��R�l�����R�S+]��1_J��L˗:}�N>� S�ֿۚE"�F�0�h��Mg�hԔ)miB��R /�S�<JTt����}�|��mq��i\��g��#-"���r��b�Mu����Rs뷟�������A����e�
-�� ��)$ۣG\�ݭ�p{T��eh��u�����,~w���V�w�R�}�w�����KD�ߥ�E�I7I���?���ޭƬ�>���ݎ�ݲR�s�U�������s��v�<����>�W�<��<��4br����;��/���2=p:�Ҳ��F���fF�=��Y���ka��H�-��r��4r��'71�s?\��z�
-轍 J<鸑Y���`+����[�^�b/~
-4Fz���6'9O��Ci�9ӎ�5.��� ��0�P\w�e)�����0{#Ԩm`#"����T��[��0�\O��"�G���4p[���"J~�����L3j�i��b��=�e����,:*Ĉ*.$�AVKL���#Jf�,ͦ�G�?ӌJL3Y{�D���4K
-�;���;�hT���4��"�ii�@F�A�fTc�՞Gw�����x�˧�bոf�P�Ew�~�_�(��(S �(���P�b�}����nܵ�}T��)I����H�R�6�Hإ���=�R��e@����e�<U���#��x}�H=����q2���k�Q4j_*^z�U�I���7����^EY�>���y����2t��9�>�Z��>��QWq�ȃ�>��냮�M��fE���G�j_��(�7���=�~��I�B��[��`�߸��C �R��QB��*j�ĵW0�ζ4�J�U���o�ԗb����#��#u䕂����$X�99�FH}kR��U{
-(�"V�S ��9����B���j2j��=b����0|-F��t�IkO�H�����㣪�Rd
-Tv�¶����.�j�m���J�e����,C�HӲ<i)_�֟H�x�9��}q�Ճ{�&��b�]���QQ���MwKdž� ��q��>�F���"�5/���Y8�W�EŘ����D�5b����.����jTO_���֓�[�&�'�\����6�zYm�a��9ZX��g�t���g(b��}�Ϯ�
-����og��yہ�`�Tx�Vz�0H�Y�$b���)X�id/��OA�5]N�7����o�v��5>��`m�&E�� 'җsC ��;X�z:q��p�s��1&�0�Lq�z��h%
-��:���HJ6g�L�G�J$k_��:b�}�#ke��:k1s��A%�*��oSo��ɫP���}���y�ۧ���M�M���T6�i56ߵ�u5FuQ�z��LP� C3cY �Q�< �IIe��TƬ�E9eؑ8e4{C�I�q ��l����#i�Hy�)�.�M���U�k�2�"�e c��YFg��UUT�7)B�tRY2dk:=�lR"�L�ٴ��2>d������;RYL(猪QIe���`��l]�U�̤L��g�Y~�t>]�p �8%��н�TV�d�X�ރ�e �n ��,�.��XtR��@�:߬���?wl>(�x$T��7>��
-�{%���VZ�8��j��/�LO�,i�i:�V5����da�t��f�����7�#�#Y�͇#�+�/F��t*҆Pi�i�IE��$m̀�F��TM�FvSq|���6XAd3���b���˴
-V^r���6�*���
-0�>����U�i�@�6m�C��6��#���������L}P�r��ˑ�b��kx��è�^y*sT���0G@�i��N�i:�6��=%Zw�-b���T�3x����hP^�z)Jyo���' [ԃ7��w�CQ9�۷Eqo��ᷜ��q�-ќ�y�h`�,�^.[�;4���Ь��
-;�R"M�i�^�V���T�W�C�{J4��a;��TE��Շf���.ۡ�h�u{;�� �4�N��w��,Я;-��+�V����%
-�����NQ��(16��pN���B ^�^�B�����\��.Ҙ��cM�^��I�Q����|X1/��kD�^�����<:�]2z��67yM��kDJ^s3bTN�hG88w�<�3�]�)�>FJiT}UZ�]��!��XK]��7���𦈖��̽�&��=�2�ԙ�I,!Z�Z��TI\�k6
-`d q�H�k��6u���u�����$v�����d���j5mM]��˦5�آ<H�Ѳ��O�
-��ܕ�D��-�w�$�皋P1ǞhIk�Ʀ�=�Rv��a�Z�c��њ�Aw�A7���A�R�VU1'ŘI���g�1�Ř�z[��K�-��p\p�pjjka�R�T�
-�b�u8~ӛ�@s1gJ6̩��L5�0��2���E[��R����jƔ�M����ظ��ٽ���c"1(��ף���X:��"�&s|8deP�⊥�+V�Bʅ�ä����B<��8�P��܉����M���a1]�A���E��/<��P�I���k����ML���/��˃J���5_n{��űga���g�:�~�O�xy��B�� �8�Q@be{��e;Ŝވ1���Wك*����k������[z����#���)i?�i��kJ`>^m'��T�}��h���s�g�n��Z�m'ye������1������`�������e�-\��A�TtL�~>���6�������_���z�p ������NxN�|{5�<q��Ȧ�R�k�T7��}d�b1qE�=13s��%<�����DKf)ڠ͗���a<
-���C�@�s�2�.e!F�x3��=ed<1oF�V��2�rky!��$�М2�rky�Py�HyG�~
-G�pYȤ��[���dU"P�:��<J��� �d��U����{L����Bn-��l͔nB�+˭�J���*�m�2*�B_����'�����c&�-]8��в�z[y�,j9���ѼB5Z���{_���OQuR�z_��dW��:-AZ����*G�k�
-z��NK����o��/��n�ݭ���C�E"�E9a���"�d�;.��o��E*�E[�$�Rl�E*Of��\ 2[����qA�\���lE�&������z_%I7I1�����hֺRuM��m3���.��<�헺`m/ua~Xq�J跰�E�#q��X��\�v�5�tz�&B$�4�?i�< �W�gd��������$
-�=A=v��ª���!�Q,~��OƁc�l�~����Q������
-�Z��%ٝ`��p�;�d>|;#�ݾ�@bg���`2n��E�f�9C���3�������Y<�B�F`����F�2c_��Q4j�$����]GtG���.eI5��
-Gs�A
-4�F��TehԞM`hCCQڞV�BW�GwDv
-��[
-C��j����IS�]Ӛ��(�A���Ψ=��Ѥs�-2W`-�������}�гuͰ�b�M��v����ch�4���&R� ��1�� >g�*���{�q<y���#T;:l�4�{�o�Vc{�����緗�Agi�U�}�
-��$�Xt'8bq�C��F *����C���*}HA����9�����`��R�.5���2�&���b���.
-XKִ����k-�<�_:����@�/�v$����H`�m#r�@�i{(�*��c����X c�t�!c,�|9r�ּ��mLoH'��:\�L\�A$�r�� �T��la�f'O�d`2A�m楛nk��w��f���i��ٗ�l3_g5�an�f涾˼M�_�:*!Ī��B�Ξ���}��m�m�o۸l|���n.��7e������4`�|�#�a���5�����n"mC������҃iJ~�����H4��M�6�w[ؔ���i�Ù��lJ_c-�an�tmSz��[����'}��"q��k�{�[�߶������Ξ4ϰ$�y���(����)��ì֊-��/|�Ź�ٕǤ���1_����ȡ�pcrO�(�7��� �c����g]C�$rOK�0Ȓs�Y��I#�k)]��y5||�(���i+����d]RP��Z��,�4Đ*�-AF5)mz��d:��t�
-���_�w!�_(J�u���W��C�����2��o�c��2j��,]S�1Ӳ<=�@��)�'�݊^�� �p��\|.����IK���.��n�9)��B���b�Ǖ�%���R��-(� 1�D#�L g�㛉V���fb@A[m&�ID���z�q]��h5].��C�҅��CR
-TN��i��^@<;˫��ݫ����_��J�'�uA�ZҦ}'m���Z�y���@�ހ[�
-�<Hn�mX���6F�k�"y������ɭ�|"+��T�p�>4lN�6|S����s"�֤U�ڶԃ= m�,jc��������Mmˍ�ݬ�c�r�B�6�#�QC�T
-m���#w��u��m
-����mj-��_C�*c� "�ۢK�,| Tl�ɨIJئZ`{������T
-l�*��<��]���z,����V��t�e�Y5�F��u�\��u���<Hh�j��=f�� T��6�B�:��!�^3�M�ж�����t}�yG��њ���!'%���=�*��?+@NK 78z��������{%��&̻L'����9�*y�U�����QV�U��*w�`k�����Q����hjj\���d2s2Մ��<@Q�
-O;\U��Ţ�2���#��~I�* 0y�����:�#8Ee(�gT��:s��8s�����9Pn�Uf`%xM'���gs��r2�uj�z=�8��|:�S(�d�漴js�9�͉�6'��BmN��6'�؊}����yY
-�}���m�
-�[�9��ۜo���u���m�
-�ۮ��7����HO�y�f+�X����1ٱ�U*U�<�U
-k���il�$
-18�J��VF�Uz�L��Viy �V)��
-�[�JYǭ��@/f EC���ۥ�7`�.eM�K�9m
-�lg�\��oi�wU�f�f���Ҭ�DŽց�<����{�ā$Z��hH=7$8�A6��1egg���)��p���@ʙ�������-�����&M=rj
-ni�����df�&���b�����"\�(��3ђ,v�p4����܊�Q����T���r�c�̡�
-���oz��^��T��P��<�5E+Y�����'JǼ9\�໎
--��)���t��1V�t1J���/vJW�
-�Ԯ;�N���y��G��>��L2��
-�dY���p�Z�����j��|����p1���M��wq��`9�2��u8���Q���e���%����.r=\�+ԩ~e-Ƌ�p��F��w����� �:K��
-u|?��7J���L�!?����*�~��rZ��v��Y^�:��ׁ���{�}���Pk���I�/�W���k8�v�E��2s�C����H���Z�߶˗��+j��#qL0H�*����k��e�zI㛤f��2���u=��Z���!�Ԋ-O�N7���6��W���ű�M���u�������Y������I&�E�6I�,&��:UXr��z�Ž�2z�.%�Bg��QPnK�ߞ���m���ȑ6r��
-)��?��:.�r[|#XM���_EE��Vt+~�EIO���[u�RYޭa9?�6FTs�YPM�Z��i�V*�$�A������t�՟[s+�{j�"X*��*oO��hP���j�?�uo�&�n������s���*ڬk��[����eL��8��y��[�Dʴt"�z-m�2R��o��JK�4.A�T4�JK됾���i��k�(����m�P�Vk�lԶ���vqm�6�m�4��9H�5ش�,�b����(�8@:�a��FH����2z�J�I�!����v7HEN��@�n��N��@�>*��zT��vT��o=;��}P
-��$�6=�b�ơ�rq`�B��E��>,B�E�%�be{ږT�Hx,۲(�5�湒�u�#h��p�e+�Y�y�۷-[�)�&��m�V6
-��c�!n߶l}�@��۶-�0Ƕ�H�m�V��A�ƃA�J-´lWj�}��$�ct2 Q`�,<\X��<�ٛS���L[��B�_-[C��&�e[��h���Z��}g��6��d��-X�v�*��MX�F�֮��}��݆���m#�6݈5W�#�11�������<�6QF����&Cdf�1H�O;�A�k����5G�ŬI�Ԑ4�s8s��
-Tj,�<�훣h�b��hK���3� �o�v���E�m���o���
-7}�c_�N������8{���PK�[�+ѡPK`Z%A&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PK`Z%Asammoa_Diagrammedeclasses2.pgml��o�8��_���t'�)6�������i�v�nݤi�N�ʍ�����$�@RJ[��6U1�����>�'&�on��tE��gC
+V��M�w��d����o�zm�j�4�s�%�Ts�m�����}I�gi�q{�qi�����Xҳ��^[7L��2���ճ-��wc�UY%�]<�q��d�h�����G<1�hx����7PK��DH�PKc�2Asammoa_Diagrammedeclasses.pgml�]ے�F�}�Wp�0��j�n��-i��^�ʒBj���Ą�M�g�D//�5�?���c[I�n
+`� pl��
+@U�YY�'�^����i�k8_L�����{�g�h8��_�����%{����^��퇛�?��=��
+�������ދ����r��_��b.���2yZ4_���h�/��N��y��r��/'�_��j�\��������L����������^�����g���0���/��y?x����w��3�?��_l���a����ŋ���k^����ys��d�mo�?��d��w���O����s��O���q�������2�����s��I��k���9���v!_�_.���2L��k�c:�/�p�_\���!��t�"�<������y=HH�o�k>���x����-�������$�~�<�|�/��O�K?�����e6���+�L_��_pP�?}�/Gw��o�������7_���˒�#V�W<=mv���z�of�_����<p�
+��@�Wm�^ٸ{�xĦ�G�l���4o��,������D�_>Fӡ�U����1pp���V��d4���tθد��aޟ-�{�}|�JU//�G�,us���S�Z�?�k%H���Z�g�W��N�H{]�o���
+�ۛ�%�Bi*�Q�<�����%K�&�&),�N�z��
+ϗ��ө��/����C�&_�����F-4�a�&r���t�c�/�v����1���+i���j�)�ש6��LM
+�u�����l�5�3|���tI��������mka|��0����R�SK�$�N+�2Y�5�1ߺ�R�b=�nga]ޅ�ej[b8{?�>s���E�b����P�w1��p6^~��F+�](E� �ň���|�_���b���XZ�x8V�����@������q�qܭ�%�s ��7-���V���Ѡ?�����8��Q4
+��R�Y �[=K��=>L���|2[����X���r_q~x������l��A;[��p^q������!Hub� J��������8L>�N����w��X�� ��AD�����y���eqtsɱ4�/��ua#�0eJ"��"b�0wO,ԏL��$����y�lMl`^ Hy%��h�8���2�)�
+�!�J@J+���ڸ[�V����%�����F�I%��<��/ВJ�|j���ВJ;̦K*�TRRI1� �ᛓTn�Jk �X��¨9%M'9Hv:I,���H)-�T-X����R��F]���:�1���t�I�)A~
+͒n�t�1u�Z�j��F�h���f=�q�& Ը��p=�C��:��ht�5����ͩ�h2U�%Fs7[=m$�/�9��AK�N�0{�;�՜)m��ז߫ {�
+��@)f�+3����:��,K�2j��
+���H����Ma��E��,t��DE����nDM:���b7��jrj��&o���e:]�F\{j�p��Qm7Z!��v����9a�N�lh����m�
+uC
+>Ac��qt�4��L�I�H
+�Zg���7�p����Caj�&_����Oo�ޔB�ʠ61�:�E�?����h\���g����7wW�e���FĨ��0�L ��F�Š۰��Aa��1s;�����E��T�鶑�iP� �e�Js���D���w����!�h5�7�l�_O<�Zϻ���i���v�m��1�/9�2q,����8������~�����W���C������m��oѥU?I�����?�-�G>�06-����3����O�6���~��s'��}[�Ֆz�
+�0-�X��a�P8l(�?����3_�����7��#@l0�9j(�Ἓ
+�f�h)[�#�������a���� �r�*`N���%��*���E��߁�Be�����/o�W�G~��h�
+`~�Gr
+�w��<E_�e�vc!S���J6���|
+�� G�Ļ�,�j��# =��I}�Lf�Up�>�&��e@"ˊef�H!T�s�Ս1$U����vL�b�/
+�j��J�*�W�Q�H~���"�M~S�`���J&�P������x������f�5 �T
+-|W;��iq�s����9��y��si@��=+ˬx�P�Z��P:��]s�/z~L�K,n(�'hZtJ������Ҩ��6Y��L*60��M�r�锭�� �������1�[�c3^�����f��q�����J��a'�dv��s4��o�r\���[����0\%+�ܤnc��n��ز� k}�T����:���U�i��ش�[�1���:�Vs{�Y!�ƾm�b߶�&O�[w0(D�س�C[�&��פ���t���56m��/�2��GM/�hRc��p��)�T��-&5vk���>�"⅛K,��ʬҳ|N�e��EhV��C���.POF5�\�]�\_�X����w�pm~n¸zŵ���8�D�=5Zi6tW����=���jkL�]m}�a]�X��� �c+1�b�L�z�V����nG"���#Ҹ�s�jVZ��D��Ť�@���k�U�8���Rm}��7h��uD��J��k�ĝ��F�?[&�Γi����
+k"�d{M=��u��j⺾:12ԣ[#��Z��*&�R1=l�����P���s00r��՟��t���Sàh4
+jS?�j��O�?�����h�
+kS/�k�Oo��r�q1ئ���"��W7�a'פj�C�yBm'�~1ֆ2��:��7~5����ޕ]m���ғ+��4*�K��w�{�����ЍS�xU�5ee8��=�o&^��va�.z�ĝ4��!��ڮ�j��8��K1]��`�Hv��v�`Zl��w�RL�@��=�au��������<�t�;��1n�ɰÀn��G
+��Z@WNU<Mڤ�._�֟LWڵKi�/�r;h�7�N:�뻭�Z[��l�w��yQ#��F��S&����z�\_��֞G{9`��xb]`�k]q�D��H`�'�
+b���'0�Z\W�b2䵩����ǶKk/d:!'ŐC.���"��[:K_��ߟ�{?�P�[Z�|�-����_��
+�7��;�E�����d�7�U_�V��n��w��Ev�tj 6(�����ګǿq�2��&LV˒;_���7Q:�%������$qԭ�x/j$t�K����K���x'jdt������y��l��ѱ��A�v�y�2j�C\��v������(35��0�0�~
+���"(ޔ���:�u����SY/ސ2Sרu�p4��˴?�5��Rfj eLô��z0�VÛ諩-�EBTd�� Q��;L��¸��2���ˎ�!�&k�R�4u5�01�+V���T����N��q� �������ɴ��έh`�4��vPjd���R4��UX�x�JD;(�Q<�x:�xz�F=��QSg�;��b�5���Z<���ƹ�J���3l>��
+>z5�8w�'�Q�¹��N��X���-��9w�-�nm]0�XW��g]Tʝ����&�<D���%�M��Kw�yݖ���u����n7Pk���N㢒S�<ݨ����T�g�*@�G\죲�쾏b�qT�>*��ح��6R7YN��)&m��|����
+�܆�I;)&H�爐�m�vR��x�E�'�l�Ēè����O7�Q�'��0m����L[1�М���O�'��v�?1i��j}�d0��?1����uI�O�uq�}��̋���4��Cޤ���>Ŵ����hm;��7��>��Q�V��An��A.@>J<*���V��anl��a.`>yz�s����o��#ol��!�Eޮy��E�L+^R7Ev�K�ٰ
+�~1ަ�H���RUTiᔋa_�)��ƛ�Z�a_�l��!=�<��x�j�WSW��A�S��dC���[,��$�����'��j>�Zf�����<�`��O�4o�h�vn���#�`S��q��I�n}��}4
+7��Ioz�ys?��v.^O\���7u�g�ח��G�ܷ�����آ�?���v��#{�f= T�?.�mΝ���Il��/D#��`4Z��x��B�9� ��ϫ�r���nnA�:)b�y�QC!l��lx5�EKِ~��=k�����d9��y�{n��;�?�_q#_��@𢲇�Q�p��+�#��c4M0?�)y��;�T`����2J�X�-A� _��ls9���\����8�B��Ѽ��k����8�]���۽y�L�ȥ��ԽK�&��Yl���b�R�5��1<�z�
+?G�����M)���K�y�_���ڿ����V�<�_���_��Ŵ�]L�5��|m�� ���4_�`U3s7��c�9�`�9�`��/�)J��cf�=�/�{J�h��yW�܃� ��a�!��1�<L{�1��Wpv@�]̻���e�s0��w�`��;������0��z�������E�e���s���(�.z�N�9 'oOK�8����5�P'�)�������H�'?G9� @�D�f-�qk%RP��nѩN\���8��ʤ�����l��vT&u/�8{%FT�CQ���,�%��l�d6��l�Ý�E�V�b��b��V.��C�K���W���,�0׆�э�!�y:AC�VLi�i{�/����`*�G����G{�S>|�z��m��� Ұi��i�CZD���O�(�b�M��w:d��P�y����ݯ��UH�tA^ }��Uq3;��i8�]H�L�? vز�kf���R��A�YÑ`�p�a~GK�g뺓�Ԉg��}f�]�S��R����s��MR0��$T�Z�dM��/ �ڝ�g��+���y����9��;(�y����.X�9@���O5��lC}s
+�S���v���ür�a^�s����X��0�
+r=L�B�f���V�x����-w1��G��zZ��Ǵ�
+�*�z�r'��|�m� �z�eVx����)��6�����4}N���dLָ۪�r�T3�����݈mIj�F�Ԯ�>�Md���&����,Xj {�����2���w4���X����&>�x�(��gt57����-]MԦ�`����9���x���j�g���v����&[o�HW#��j���pKW����F�����M]=M�I-i1{����V{�%Q}������˧�b*�k�ZF�������,G�L, k-F�ï��M-}��X�H$~�����ex
+��������gG���:)y:r^T~����n"��O����X��kOh�� {{�I�������mj�4~`*uz�V�I��7����foEY�>����Nފ
+���&!~�����s~���ԭ�j�A��w��
+����M�Ղ�D�#4�h�<�=UK�J�؎�&�+�7�&��do�&_���!6�V���AҭTJ�L���*�c�y����d��5�J�tk��<p����''��D
+Oa��:K���*�n�N��6�@�����eY&�Dutz�i�nr TK��0��y���i@�����]�)V�bk���̇��单�����q�����b����4��Q[�P-�Z"�SR�l_�S�����H�uX�:��T���z���I� �pdy�l�T��>����<ܞ��EӰ?����iAeED�Bx�U�R^�����VD��w��C.�y:Zr�Ġ��D���T�T2�R���d��b�d�Ϳ��`�g�yf0}��,8�T�I���83(�J�~���7
+�C��ݙA\ o[Й]:���Yz������
+%����A\��ir0��OA
+7U���R��o�u��5>U�AMC��(�I��'������c���P������~���Z�j�8�SQ���CQ� ���Y@F��a�E���#f�gT���:���9��T�����t��ou\�_�S`p��f�#r�L����K��Wv�I`�lMw62�Ex��j�/g���U0���yiz=�yl�K>:$1�Z��GyiГxi${E�V��lX>�%�0�4>r ��#������nR�8���i$Ng��[Q���IpFbD��P��6���L��N�Lۅ��߅�LSm6Il3��)3mcd�����Z��������j =;��5-�I����IkIR��d��
Q*�����[�h2_,�[���Q ���~�C]���+��K@隷e��ź?��cK ��:�k��S2���_��-����[�_������^���d-k2��+���PuwQ3;�y8e��L��dcTڊ��;�<��T±��T7��p+"a��b~�n�&5Wڑ�!��|0�Gf�*P?���������
+ң)��*��.9�m�~���O/��U���~X�O�
+������o3��Y�����!�����ϳ�{��k(��7��4��a�x��'P�S�ގ����rG����gqn��Îplv:�
+g���X-�^g��n�5S���aq�����霷��w��5�����O3����Y9���Ea�����
+¦{�9f�����YV��T�)gc<����p�^I����+��<����
+~hzO��B-�C�KM�K�>����gx��Ы4�懢���UH��%��o�zU`_�V`����{A�'j���߷������xҵsj� �TX��η̞�{
+ =�?0md ��]����5Gĉi]��8�������S�%�e���
+8yz�V�a�e쪜��=u��p�q�H�Oa�1R���j�����l�Y���C6<+E��P����7$��rO��U����Mu
+����ϦJ��N�i�s�oX�~�͵��k�\�k��o�m�[b`6_'5�F�}Su�|`�I'=l��{)}�Z�[��T�럺q�8�\B���a��r*&�c��M��xv��T"1O��a�0Z�-C9�t���R�۲*�s�����ie�I1恡���\:e�9��'��
+Z�������m8�ӏ5�q���+�1'H��J-}�ꮰۺ��['()���ʮ���ȉWˮ4�5��r(
+�{*UWً�)=%.`�� �����M8Am ��A]냄s���T�/�ä�!�7��S����(��n�DI��l�� �r2�Oq���y.�OL̥1_b��{>�6F�L
+G�|I���xyP�r���r��+^.�=���^'<���c~z������n�%x�8�������R�b��p�V���,�ae��HI�4M[�v�[�z�&S�˪lH�+�g#�E�I�L@Y[�-GK�eہ7W��S�\�z�~o0����;a���?�fa/JZK&__���E�A��m�����y5Y�������]~'<' ��eѼ�����?���K�{��j��n��߫��_�2ޒ'���'��Ǜ��RxN��)�ͤ��ھ��p��y>&����T�Jf�gY����7���VY�,�(��a��Њ'h���I��IR�;NccDXȂ�(^ՠ�H�̫Z��6��1���h�ctߠ��T�u��#��[����s8���BZuF���!QK`���F�Q��: �d��}��F��a:]_㝘Tbv�&[�ɛ�ט��vl�Cv}���ʨ�]-�[���1��;̤���ж�+:�]��r����Y���T�vh�wm^Ka��UQ�%�w�^�POV�����m����Z
+v���С����Q�i2�VA�i ��rAmoO�8�`�f_$k�}��}DZ@���Y��,A�o� ʨ5��+�!�h�Rk4���iz˱4���pk��k.[w��O�����2��X���3R鬵���ڡ磤��DUzSI�7;��uM���4k�6﨣�y��o��νy�K����TB�{w�Y1�w�C��{����!ǚ�����d(�q���P�䑹Ż�<�=c�b� 8$��%y�0�e�߰?��a���/�s�c��������@�xpL��1�:�l�I?Y����nW�G 1<X�1�ָ#;b��#�'B�x��g����y�3��fơ����b�G-M*�*���@�y0�w�,�&Y�A�0��M6�h�gc���y6
+a��H,�h�Z��ϖ�ܒ<�ƧC��Z�����a�N�L�^���=��9��o0���l�~�����c3�v���]��+��6�h
+q��xB�m����p�`n�z��@y���
+�D�:4#�Mz��?����A�h�Us���P7�X�u��]j�S�Y� �)�
+�s�>� X�y���I�
+O˚G8�KKGMf1�*M�I�MzSq�yg��%k�goi@���k)d�/�o��qF�3O:}�3��3��Z6� w�
+䘟y*�)��s��kz.�1m����1h�xU���z�>��'�GL<.
+�F�>6H�Dr.p1�'�K`�0�����`2Ae�Y��)�$y��&8;���i�������:ژ��s���̽K��:#
+V�3t/�y���.��{�.�w�\��;�� ���(�'*3���,���S��c���1��7%��P�H[�1sG��,Zt���㤪���M����V#���B�DzO���g��3��?����ZG�0w��sw]]��<.
+��q��^�!��q���ߵ�
+��*%y�%���5.y1�@�aQ.��Z3�{��1�;i���A0�c0�H"ݐ�I���}���z�&�I��OIq��l�Ա
+Y��7��#�ȩ<���Ƹ�����|�)���`����/"QL�.����$�Ő*�-AF5)mz��d:��t�6��`�w!`(Fi����CvZ���2n�l2�Z+��`hj��P�Z�Z`_���io[0�.� �p�u�,|f�s0�N%��"��!!���6�'���i�]��p6��8)A�Yv�lo�A�Κ6n�Xi����{{�֨R#>��Fk���@O˺6�w̃БO��i*��n49�>���HbO:�9����!E5G���4�����ij�]V=��i�,f������dw�$a��e�kI���_j�cj��J����/�c�P�7p�v�o�y��c���*���\;>�\�S�Ų*�`�4iHms������L8ٵbߜ���Q��ˏ;:U>ɏ#w&���o���f�Džq���Y�(�$ᅴT����9"͏)?��G���Cu��ȏ
+�����8q��!Q�8o���W:��Ѳやj2j��Felj��a:]v|��8���ɦZSY��.7�n���mv|ce(�Z��̨�q]/�!�f�K�)�^��Dˏ�0��f�*�lj������q���5��g�v�+�O�<�S��h��i���M��r��� '%��h7�r~|6�&�~ �&� �6s8�9rn㕋d�+G4
+��gإ�7��@ܒ֮:���1��ᐞz��<x������R(.['GF�D�hd`՝���,�SUx���Sea����852�|������,��b28J�*��d�c���;�A�������ѣ������\e������������c9���^o�>�s<�Sh����r�s^�������`m}N�f�Ӣ�{�����*ݽ�I;����}N�r����8�9i�sV��u)�t/�� |��e��V�>&LV�J���G�J펂���QP�O��QP�[�e�w�*�bm�J�rk�WZ~�{��u^i��{���^i�YD/dV�WA��K�߀k��5�/%��'�9
+�s��AN�4'�*^o�f�#��G
+���D|�x���(��Yu�~�h`����
+��|�4����=�/�{J�Vpvi1�>�:��S6~������:����Y'@��:8w��%�Ν����:�G�C+��`~殩K���*w)Ᏽ�S������j��q;���j������KW����l���.�x�������E��]�
+�ٓ��3�_��v��q&�E�����2��\{Rs����bbG�Ӷ!k4���E��{��۱�8�N��Sm�:p���?��|X����ׅ�PW�kh҅�/�0PG��� �t���Q�n@SUPM�Z���i�N���Wӱm0��tP�` ]zju�/D�2��n��z&��>t�>�]b`�@��Kk[CP��5�k��Q�h�IL5�&�Ğ�r��@2�+c=���s�2R���?|wWX��
+K�6�����.I=;�o?�r-#mc��BT�p녨��O�R����uc˓BT��6Җ�!��ƫu���P}S_��C�@��ra+���,�W���*�Bj�+s�4�t�����(��s�c�8��l�v�!�[��Nlq�[��*��8/��wy-k�3�0hz&xؔ�"0�q%n�r��KNe߱|K��)�%�f��oI��+��-�X����-�����Ă�����-I����[�η��߹o [�[�J�}K������-���>��-��q=@4ߐwTKP�,g/�uY*� x��08���(�Q�������?O�SNY���2S�,R�4z���T�&�g[b������dM��ρE����R�<��{���=X��;wa�9���V�<������}X���vbQӝXs+����ݯx9�L������G4bp� (p0���P;���y6����������r�Q��}����!i�g��]]C�@w�j��;wG����kF����V���h�O���t:5�9�%��.7��������w�PK4�u��*ƚPKd�2A&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PKd�2Asammoa_Diagrammedeclasses2.pgml��o�8��_���t'�)6�������i�v�nݤi�N�ʍ�����$�@RJ[��6U1�����>�'&�on��tE��gC
Y�3'��3o(�8�3e��h���_�O��7|������$���Md��\��؉�9KZ#o`G^��J�5�m/������w��Y�p�"���?����q`��ɲ�{���=]�H�Mt�T�Z�n�6:�3E9P�yGJ��=�Cy�֔B�$��Nc �;#�u�E�b��x�{Jzk{��Ą�*Vv%U�w%�Ю����6�����8�C�b�:f4�!����>�*��9�l��q���X���ʳ�^Fԅ������̬�h�p�A
��K���X~���˒U�q`;���Qr�p�W6������,��g^@sc1�F�f(�7ӳ[8S���ڟ�ˡ>NK.��]����iIɮ:��������%�ް|�Q�è�a��a�:��V�����ÒĻZU�3�h$���gv�;C9 ��p�Ro3����i�?������K��������p�߶r`Y~��iK .�1�Q�oć���b�J���k����0NUC�0Z�U��n嬴S�<ȽW1 �!Y��D�2��z�+,����Ʋ��ud���f��Zi5Z�T[����*`��J}v�ʃ3xD���pԐ��D*&b#S�����Rs���y�૭�$]�����l���r��.�eS�q8����/��ܾ���2K�Ϻ�8ڦ�c�d��KnXҀ��^���h����٬
R�
@@ -103,65 +85,76 @@
8
��R���E�H�(tX )q���Ed�b賀��S�3��aHi�lޔj#���h*�� Bz�)��jo�O��)\�RF�J�Jz�x�OT=�,u>�&㔁J�jQ��5}0��@�@U���({R�I����(�,U��n�'e�=EL�Y�>0���b��Я*6�,��������}ZS\OS�h�ŔG��QGA�jWE��S�RK�RY�ȳ�4�,!M��LSj��>���2M��gWυ�>C�B� ������V�#�m�6z�9H�O��:_˪��H�O��5�Y���NL�XJ-�M��1Q���-kV�j[l��̝��Z�t�5/�t">�W�!xg;>�CJ��DېN�6�qvϞ<���.˒�'����I�dP��I��q��������9�����Z�oG6ko���1��vx�.8�|���"r�y1�c�K@`�_�Q��>(�3�������_�f�Õw8�ATM!μ�W�|$_"[Vmp�9���=�)�g��wޮM���G�
�o.��Ѩ���d���&��S>h�Ӌ�Ƚ���0WG�G]0}p�p�yܶd����,�M�+�B��4��]}М���X��m���
-�&=���i��6����s���Fm#M�F۰��Nۤ��Ʀ`n��s|��~gm�=���i��6���������V�V�6�Զ�wm���ңI��w�6y�`��?PKɟ���FAPK`Z%Asammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|��
+�&=���i��6����s���Fm#M�F۰��Nۤ��Ʀ`n��s|��~gm�=���i��6���������V�V�6�Զ�wm���ңI��w�6y�`��?PKɟ���FAPKd�2Asammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|��
���,���\�l�v�
-l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPK`Z%Asammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���>
+l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPKd�2Asammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���>
�z& Q}�0�
-�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PK`Z%A
-sammoa.xmi�]ݖ�8r�ߧ���cϜl�EJ�${�s���q��n��@$��"5���*���\fr�g��$O�բB�����ݒ�X(|U(������Uq:���Ey�6��왾�xS��O�7W��������Q>ϜF����|�zዟ������Ϧ
-��C3Α����J䐏��i��bK��s��+��B��h6����^њ�����>��W���l�f<�^�"Bm����AD����O��6�;���#/T(�
-�d���m���:ӛu˟�_5����wJ����O����Jt�^���i/��������|����L^Q��%;S��d���>y��'�k&�0�oaWI���oȻ~�>.�Fm���~��Ӓ�)?Mߋ�}��$]_�[�α�!�:W�+�*WWF���%��2p�6�-����6�M2ZkW�П/�FI�w�C����+Nx7Ǧc;f�*�'�!��|��(��[��/�wt��$�d��]�}��+)��5v�l���FCF�=�=�����mλM|��H���Ǻ8T�ˡ
-C�z��~�ҟ�8xL:����6_>�v�u���|"
-��{j�0\�`��}߱�}~�!�Z��L��p��-���N�x��NA�2��,��[�Q�a�ݔu�#�a�����3GS���b�9
-��)�������Ό2ưU��IΉ�밣�q�H����-�W��w`%��;r�0�3�#��B%�)����?bOy�F/ߎ_?�F/�o�_�m�!�N1I����{��x"�^������>��������<"�g�ҙ�iL�$BG��� U?����>.Gd�X��b���)��8PptM���JhR�!�1��V,'$�ae�F=8�&Yp+���X�^q1��*�K��_�� ��@�������
-`D9z!&�1�қ̯�^s��b> �l���8��l���B�MA�GxJ�����������-!�ͷ8�KY�]L����&�3�5N3��*7��Mq
-�)�����0 sVhC�r���Х2��+\�'
-\�~����G�2��S��D,h�'37NE�X��<�J.�/DD}�������_�Æ��U��q�r������7M2+<��yL�f䓻P���B;�O!Cb:��?'�n�
-1�g�Q-�5�ly�v���:MKkwP�`6t�F��1��bR]������Z�ϋ1"��a�uQ^c��~k�y�P����w��v�{'Y��$�P��=�E���(����nMz�����,����:st��.]��A#v�F���s��#:�d�t�ɮ�����Zۭ�=�^��w2��Β�' �#C��X�>��֛6\��@�f��o
-e�`��u�|���8���l�y����D��D��r���.��L�fL�n۲�01��������/���_eh]`�N��jvJ���y�ai2�5D����� �8g��Q8��g��+������c]��p���>o�=�}�s�� ��C�-���x�:&�AɃ;ӟ'�!k�Q��x��������.�M��)���͔%[� 6 ې{�`_c��3'�۳��ҵf��t�����F@_6�9��G��P���^��Y��[?W��<��AK�e^j�5s,�������ȡF(B������h������܆L��Z�vȒ�|���-l#B����#�� ll��C6��ތM��j���u7f�Ȧ8�����u���c �u���H��x�������RЪ������\b[<b�MQ��w�zb�
-l�o�kr��b�ɵ�7�[��o���t��aF�l��� };~]
-"�KY��:yS�.��^�\���Hڿ+�L��>��o��KA(way���C|H�^�G��p�/��#N�~��s� ���I��i.>��^��'y��~gV�g���Ů�?� �'[��{9���K>a��84�x����{��%����2�1GAD��s��I�t:Ѧ��ײ��z�EJ�+���,��-$G�����Xߘ�H��V�!ۣ�s�V�\ճ���x��l�m<d.Ahc}�l��fR���lͶr���^յ�m|dm�uʭ��#� ��J7״�U�������KQ������{��*bӟ%Q��Zq�\PH�8�Lo]z]��D�J�oSJ[��w���m����b̝��[�"뵲�b��u��/�)r~�wK��㭍��0v�*��v��"}b5��,�"��
-��"�a��^�uE��zd��� �
-3R����7M�c
-����1�8b����a9�f�F77�0�vu���)v�J����<��#�;��ĈK��O˩�-�˥�a�&�+Y{3�zx3q��U�Ã�)�'���;���)�����6;QW�_�'��I��%9�S���m<h���6n33T�^��)�n�{�3h3Sj�8E*�x�`���1vN!��j��Wg���-�^��K@_!5,�����ya����A����)��"�����8J@Xں� �뮇�ܬ]�k����$��\L
-a��x�F�8��=�6VM42WF�9�U<�O�XwU�ΥKbA,��b������x�S̓��%B�O-#��8PV�.|):x��
-�j������[��t��d~������0n-��r��xV%M�~��&��HzAl��Prް��jk�"&uK�!����x�kXL̬8}b!��b.7��! ��~2"��
-/��9p�� G���!�g5�B4���4��0��P��|�˒ф�����O�ʔI?��2�+�"B�6�aDf��S���[5�#^tw��R�Az>EObwx�Z]��avZ��n��N��^}�p��_��7T��ai1�&E�7�~��*�!�sը] ����S�G*P+!��mv���dz ���r|-�H�8��D0�uyhPي�����ғ�3�!�3v��~GvJ��ò�JV�1Xg�Tn�� �:�N�=��6Ԓg��b��
-�����P�1W�)`� �f�Zr ����sn�{����K��`]��pN��3MB
-dޓQ
-�-�݃/��S.���_ր��=3�ɷ!�5�^� w�C�^{m~�X=�����n� ����9t����7)��(�˟�ZkɅ�ݜ�j|�$z�s�E��hy��aF(��M��-�G�9��\��#�h"5�]V@xj���D��J��3M�ܢ0%�Ǔx"�J�����"��?�(��-.��z
-7�Y
-r��j�7N���~ÚXՠ��jV�n"���Hns��2F�2-�j�8}�0L/pTcc`��H��VR�q��B�R�x����vw��f£��Hx2�M?����e�:(���8}��p���RN�#�������{S'�-�)������1����p�$n�
-B���2� dYj� ��p� ĝj}fb���P�O�If%A�XBI�Kn�i8�N��1��0Sq!�4ӡ�H�p��S���k��R[m�v��5
-L4�t����Hp��@�<0
-2*{ ���LR�Jr��n'!�;�V`*�!���{��ʃ���x� 4��m
-S��kc��vZ�9)Y��˰����J�,�y��g���RW0%�k�g�������u�ͫ~FU���,���B�Ce���n(��Ak��W�A
-A��z�#
-t�4�t�H���`�:�h0��;��� �Q��(`0#����P��f�����gJ���fߛ��R,-�T�8}̼��Hp�H�Ms��R�,y��>��t��q�#/
-�y��@��Ť��2�e:��FL�mc�s+�Ӓ��4 � ӡ�8 nr7�ߜ���ڕ+f�@�>�$�t��S@\9p L�>�p@���D����5��e���i;�#0@���$����f:���p뿕��A�i%�ђ�;�"�t��1 ~m�r#�RxD�'��.� �an6fz]���2T��4��d5�h�,�q�јDhaGpY���DJa���ł�d��naH��>E5!�eY3]v�Ir��;4�>8��X�+���)H��S5^C�=���X�a�2;fo/37W�� ��#�w+�S����6H/������0`@��C�֏��ѐuJ��<�{���`(x*L�f:��ƛ�r\�~n&L��e:�$��q������a�� �gl15�$�"j���]B�F����^�4���S,���gs��!�L���ĝ��qg������l-57w�?����A�����{���p�pH��O�B1��0f��T
-c�"�3�fG�(��;L�����*�`jAE�� �m�C�3���
-7��rҼ��<-&�C�@���t�wQ"a�4��%��!,�)7T�����<,����9�Ug��`iQF�0�`d:T�m����Z�0=����V�յ����>頮�Y�u�lbd"n:a_�厥W^!'�1���5t1}ό�����!�5&抃ܝ�@z �s�k�H��6tsE8��؇�́Cd���t�L��x���\�Z�͙C����C��9鷒�\�R���c�����^G:[v��s̑{�,��O��
-=��,�HM�E� �0��U&`�}Zs�!�͟��my���uSg˝��rf�䎌̡�#��B��� �<C��M'A $��t��"�Hz\�s���d�G���L��FRU A������O��9ӡ��gq�eZ��h��R��z��c�`P'0�|�-lG��8a:�dxZLy;q���]���X��da�v�x�?�9P(N�'�tH�B�:�x�w�������ȧ$��"A��y�k܀� � Df�n�$|���u rU���rÀ��>�^�`,lFn}����s�]L�q���E�C���5A���[I��=�{-�\�unt��E�ɳ�IQ_?0��jA!�B�A�C�C��En�
-��GK^����^��w��CnhA�w���(�ׂ"��ȂL�z��ł�t���M��
-dxj�
-��(����f�p"kn�Rl�~��gpȱ��
-���A��L�:C��7�y�l���ck��Uز�@ ��Q�m�63�$�.*�<(I��Ak+iF� w،|(�[�t�mK7uJ)�ڶn�-��/�&�
-ƣ<[���'N���t����v�~v8B
-�Ĕ�g1�$ ����P�T�D��P���b���Z2ӡ��'�]K��.��L�ʓfL�n۲�)S�"ZWKI
-X�t�%Ͻ�l�F�I(m!��b6 ��
-�L����2�MI����{XEJ2���<��Am�L�����{��%�p@��%O�6��͙�D&��8���dyZL5q��G�C�q@"y.�l3���gl1'�%�#Ι��)!���'u�Q�^��5�);*M�h�p�I��Ÿ ��7A�C��q�`m[%H%Ȱs\r`�cK/��j@@I┻�VV���r�(����ey��.~=��Ҡ5�WΡ���Yu�V.TJ�#W�@�r3���Pɭί�[L1 �@�C��_��o���r��,���t��QP�u���8��3����U�n�p[K�jvM[*b:��,|���NJ��&��u�,;K�о �3���W��jjˢB�2u��N:L�qσ�؛F�R-�H��p&$���8Э p7yɼ��Hq��}^ a�7�p�zA�5-�g
-��j�B5�L@*�"W��7�)�.L D�g:䦠[���YLAl �"v�C�Q@8>���?c��a2�#�S��4�&��l��a��q��i N�d:�;���B�䬐��v�]��Uh�.u��9��g�π2l-
-��4�t�fY��ʉ�ؒ��P�י>��m�u3|�s�C��9&��Q[���i��sc��ƶ�){ml6�N���
-�sc;H��8�[Nh���������u������ q��s; q���~���
-��*���є�?�8��&˦�q�qO��ט��A���Rz ͗\T����k�5GaK�~H�:D����0���,�O�g�����ݱj������r��9עTm�<�ذ����f��-�G�9�Ȍ�x�ňƧ�@���Ϣ�Ԅ[tY�i�-~��'��M�,i$��Y83���������L���DŢ�<z���#r�2����`����m��������@ ��b�Њ�Yh3�;*�V�R'8��v�0
-S��
-��P �*�H9�#E|h��H9�=�8��z���*���W���ôv���_���LJ�>o�mW��u,u�s�3�nWcj�,�1�-�Z�������&.�������n�5͢��魦:��m�&6�2A�$��w��z]08��Jn����9}��C/kB2�{k+q��L��ε]�&d����s��d�ϙ�O�χ�D���7��Fn햧B#�%p?��|�[��ؐ��c"��:��O����Ɣ�߬�oJ�����X�C�i����z����n媑,ӊ8�V����J��Qsm�誐="ɡd
-?��t�#V��U'�7@&욳/$C��Y@��,9$� �ؘ�͒cĠ"��J2I��[mrm���{�a��I[��r�͞�ji�e«�����&��L�+a��i�ikڒϓ���O��)P�>�p=0�d7d��М�L0q�`&���QL�q���@i_������0;�D����t�l&�l����%����;` «8�G�n�O������ջ)��%.L�[w���6�yu�Uk�L��'��u��k1m���U\ �����k-,�fft��l��2�`����K��TK�s��n!WA��F���*b57YV�13k(��+⛲+��xdz�"��ؖ��ݞiS�fL�n�b�u
-J�!��L"�����U
-�0�B�b3�_b3Ϥ�{e��b�@�z��$��@����v�����l�vOg9NTM/���8}����������As���x��S�hǁ�ӥ
-�ov��ĭn1J��9��YP)Jq�e����Kp�����8�s���d��t�G�@�����7����wԠ��h��8����^��'I��
-�()0��u(@PuN��F١�Yn0�
-.
-��O��)��,-�ޓƌJ/����n-��.�di1�d$�z2��łc�_;��Rsk�:�!�͑3��Z�01��a�io~� A Ӎ�^��0��L�SrJ��$�ϲ��Z�N�t�Y�x���G�k�9�S�X�@(L��p|(��+��-F�=�@��Ť:� �"�dZ���ىL�Z�iӫ1��;;��a��ih ��b���� ӡ�ՉO�V�v��&Q����4�k���̦mM��j� ���DD���~s���͊���^L`��T��,ə8�:��r����!uv|h�%��xg8T���U84{4��]��%�o~�iKj�,�Br�y+�dd�ųlQ�-I��Y������?r����"�f��r.o�Qz�D�ȟn��[k�v��@�p�_���v�a C�NC&7�xt��@�̅��d�V�=l�3�u+}&��P��L���ߐ �olt�d����E�?�l����\��[����a�7gj�>��Iɝ�:8E7:��f)��p��+k��9�w���&�H�7��n�X�1�`�本��x�S̱����.�Ȍ8�b�AKf��u-,.�p�]�.��vd=��q�zX����05�zml6�N�Eilm�S��l�8��w���#<Ǟ�=�K�t���U-��I�&�!� �a�C������#p�`l/n�&g)�O�zZa�r.�0�(?a�g� �V�3�r�0�f[�5Jt�B�f[�&�Z��\\�0oRz�9�����X�3WE��`��p�9/pE�=n�'L�tʳpN�c��/k}�qj�A@�~�_c"�r�d���[���Z��cJ��&̈X3j��C�����M��H� Q���Zk�uB���[5>癱�ע$n��_XI���j�孼�'��6ƪiR�l�c�V��>���C��o�Ap&U���C'�g:�$�!���q�����r�=��#���|�V���C˭�e·�V�l6�Фew�j"=���6�Q�P�U�lu�l<��gtQ��� ��ƍN't���Y#o�Evs�D�����#���D�H{����Ή�nP�Z:q�ڥ��� ��۹��D>�5��2�ED�u�k�J�x���x��fMP҅
-��Э�"���� �d���8ޣ�ێ��4�6f
-��w�E�ͭ7����>j��Ό"��Or�f;!���=?����z|�Ȁ0Zn��ПQ�90GT?;��b�[�y��&V,��ɼ @���hA�̐cw�y���6_�����K�y��Bn��)D���5cW��2w����Q��G��8X��_t ��(��{����H��q���o~"��M���;>�F/7�=���7�������Q��ad�w���IG�������d�Z�����h����Rk~�(��6�چ��匟b�g���]���T�OnX(B�_�����"��ywT���kk1��>=��p[n���-����n�r��뿽{CQ����W�PK/��"p�PK]Z%A��DH�sammoa.argoPK]Z%A�[�+ѡ�sammoa_Diagrammedeclasses.pgmlPK`Z%AǒV9�&�-sammoa_Diagrammedecasdutilisation.pgmlPK`Z%Aɟ���FA�.sammoa_Diagrammedeclasses2.pgmlPK`Z%AP����K 6sammoa.todoPK`Z%A8��7y�&7sammoa_profile.profilePK`Z%A/��"p�
-�7sammoa.xmiPK�)Z
\ No newline at end of file
+�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PKd�2A
+sammoa.xmi�]ݖ�8r�ߧ���cϜl�ER�({�s���q�L6Ws TsM����*���\f�*��I�$%�E ���G��%d�P��P(T}��穧<�0r_���\m4�+ط��'��o��������_߽Q>O�F����|��ы����L'
+��GS͐����J쒏1��h��9V��LQME��h�/��2��+ZS՞������50�q�JQ�����O���P@[�~��gA���pPb��G���x��)��]�d���m���:ӛu˟�_5z���wJ���
+�ß�(�/(�ͫ�z�����К/Ԗ�O仦������B���';S��d���>y��'�k&M1�_`cOI���oȻ~�>.�Fm���~��Ӓ�)?����}��$]_�[�ε�!�:W�+�*WW�&V�mS}��m�uڦ��Wf��|�\�̶�|�7J���N�\q���\ǵ�W�?9ȋ0��cę/�b�<}�����Q"k��j���_IY�푇��7\5S��a���w��n�p�m�_�G�m�>�ÑB>�.m)�34���8��c�9z�G������ۯ��@�i`��SSE��C����=��u��k1:2�N���ܷ���;����;͕i�Pdc���2C����0�
+�����34�J.FA��P ь���
+���(�`���PrN�X�e�珔���OЂ|��?�+��ߑ�Fɜ�>�(A) L����9��g^������I�R�6�;���4 ����]�.�y�o#r�e�����wo�<�vЧ_4�G$��<:s#2���D�K���%� ��~P���lI�[L4ߣ;!R0_���YH�_��C@'�D�ۍ�XY��B.�I���c�)6�W<Lzy��n���~$HE:<�`�z{���Q�~��~��!�M�Wr�Y@H�}�����<�����B�MA�OxJ��9e1���?~��_Br�oqҗ���X1���Lng5�k�f�MUnȟ��SDY�'"#a�І���Ke,�W�O���:� ���O��@7Nfn����?�
+�\*_��>.��#�;�D
+�G
+卧|!���< |k�Y`YdV���tYa���
+-�C�2��3"��\!�7J�e���-/�ё�P��i�Z���maþ)7���y����lL'^�B^����+������[��.EHj�}��k��w�EH�-bq�
+��������`$}��ҹ��X�����b�|dc�^%��X�����#KT}�5,D%�k���u��d�f�t���Q�&l��25��t�Yf$0�R�W�k��j8���;\�s���:Kn�����<:�R��?|v��Q��6�m�|�hx(k��T����h��p����-�g#u�#����JA�K��/g`�n���Z� �=6̖�0ab��������_�����к���"�����5���Ҩ,d�'j�<�
+� q����8t�T=2���Fu�ql�.�6�#�㍸��z�<��;vɸ%v�l>�\�� ���̒ې�L��Za<�J������M�� ���͔%[��pn�!�f���t��Kn��z[ך��>�>�!}ټ�i�C d�fzy�od�Ko�\��f��Z�x-�Rۭ�cy��`��@�e�G�0D1�'M�����dz��D����k�䚬K�,߮�j���"�\�
+="������a��Xޛ�I\�^�u6��ƌ���ׁ�����~,����T�7o����vts_
+Z�ݴ~|����A��#����kk'�'f����������&W)-��\�-q�Q���Z�+�Kg~f���z{�з�ץ �})��n'o*�%~�K�K�.I{w��I��������A)�.,���~(���5yd�F��r�<��EQ`�G��[~��
+���{�Uh�����wf5�����\���3��}��<��#�q��Ǜ��'l��&�OV7�����DrW�Y�5f(��2y�6=�N'� [=�Z�2V��H s�z���E~���h�1�}�a1�1q+����!b��<d{�sN��j��z�Z�T��m��̅ hcml��-��,����9v���߭�60W⠍���{�N��qo���Zi��6���:>R�R��=u)�x;��b1{�XEl�$��2@+��
+ '��K�\���
+�mJi�����;�-vSv[���^`�Ud�VV[lt�N��e:EΏ�#��;�ژ_�c�ߡjW�]�O��ۘeU�7��A�W�7�`��+ⳮ�7Ә��Q$�aF�}��� xL��嚻<fG�=�?,��,����F�N��S�8�NV�����'7��cs�"��q��i9���3��dz%ko��Uo&Z=�*z��<���r�pG#��1�c��`So��~�z��aq������X�c:Eh�*���V�a��k�3CE�����"�V�<�3�Fz�S�"�' f^��c���~V����X8m�n��o^��
+�a�ĵ�D��'7*���N�7_@�@��Q��f�&���6�Y��3�252� �Ix ����%��|q�<�6VM42WF�9�U<�O�XwU�ΥKbA,��b������x�S̓��%B�O-#��8PV�.|):x��
+�j������[��rC��}d}�9wI�a�Z�儇�J�t=��&��HzAl��Prް��jk�"&uK�!����x�kXL̬8}b!��b.7��! ��~2"��
+/��9p�� G��x��!�g5�B4���4��0��P��{˒ф�����O�ʔ\?��2�+�"B�6�QLf^�S���[5�#^tw��R�Az>EObwx�Z�pp���j���n�4٫�nѣ�!w�Ɔ*�2,-&ݤ(}�&ӏ�^�9Dt���?b�Z�{��Hj�`@"�[��I����t��b�_:R(N 3Lz]T�b�q�7`�����N��<ǚ{�d?�#;%� �A�s�*r�,�3Z*���O\�`����E�j�3��U��`{CZN(И+�
+�oH�T-9hb��U���ڽfm��&�h�at�8'ِ�&!2�ɨF؊������)n���_ր�
+|k�ط�o#�������uz����bu?�G7X�
+ �br��C���������|,r}{�%�Vts�Ϫ��%Ϲ�j��9Ɔ��>6�j���|#spi���̢��T[tYᩁ�{��v(�4s�O��W+������|v�<����c��5��g)ȕJ����8�V������m�S�[N:s#��Uj�
+p�p��������0�� P����ϻ"��ZI�lj|�
+=J��5>�>�QX|��� �6s#��̶�оw��6�aj���2��1Oå�J9��}�FB
+^�O�xnH��g����_��'qT
+��� H ��vɑ@�7 A-�@ܩ�c&6Zm�x{�dV�%�0�40���F3��D�C
+3'�L3�w:]��ݦ36lUo1��Q`��s�=��@��Ř��Q��P�i��f�JT���t;�p��� �S1x.�o�gطi�V/�ƫ�-�h���n[M��#�d +/��
+�+��^��
+F�BH]��L�q �]��J������7��Uq��`����5������A�^�5a�%�40 � �"
+��6s�9E�Y`߹�-)��F�63"9�.�m[��}�ll���H ��bJՉ���k�^����4wh �͒���An�L�jW9�ΚHq��Tv��A&�L@"ܨ������J��u3�T��Pc����o�t�
+H���I Nld:��) ����q8 ��b����L�[�2��洝=q ��bڊ��l3Nat���� |� 䴒�h�]�pf:��?��]��^)<"υ�rm��� 73�.�m\�U��iV3�j:�0�m�q��Dhc�pY���DJa���ł�d�4�0${q����鲬�.Mf�ܧ<�.M�e)�v˽�4�!�uy
+��kH��v͎���!�cc��2s�qUQ�
+��=�|�r<Պ�a��n���H�. ��YZ�14a�`���0��Q�� �w��g*���AA����A�i�@� n��"���gA�f��A�Y�C�1@���x�X��y�SCM�@(���P��%!DP���qKKj�V�*;Ţ<��^qgR�,&�L�>�;�t�,�%�mk�����!�ܽ������3�6�e�{[�C:�"��!($�1#p�R39�_�)6;B�D9>ڑ(`��G��V�S*J$N xl3j�IT\(n������$��i1�B4G�C�� �E���- ga�M����2�����aA��p�ω�8�K�2
+� � ӡ�n�%��d�К��I.�d\�n�N�ʅi�;ȴ5�]���M�L�M'l�˱ܱ��+D�F?�q�e
+]����aH}[���:'抋���@z �s���H��6t3�8�؇�́C�����0��������k-�X���3�V��ćx s�o%Ϲ�j��9�&75�S��t����#3���,F0>=�+�$�h"5�]V�xj��zW����iI���(7:&��9�&�M�-wFg˙�;22��+��G䦦�d4�-&7����.ӡ��#�r�s&�=��Gw� 0�� �-��,~��ϙ5v?��,�:�F���0�b��`�e�K/�:��p�kna;B�ص �a� ��b�ۉ���2���B,�'�߰Nj��ÝBq��<a��@"�Y���ɹ�A�����|J�:.��[��@��
+x2`�@d��V^A§/�="W�X��f����<�`a3r�[D��h����b*\��.2�W�YV�Г<gltu�\�nt��C!�ɷ�IQ_?0��jA!�B�A�C�C��En�
+��GK^����^��w�CnhA�w����(�ׂ"��ȂL�z��ł�t���ML
+dx�.90�Q���AA���D����q�0~?���Y �ւ*d��J3���d��U/�ۃ`�5a��m��!%�uy@P��AIR����)��a+�,n�ө�l�2(��j�A���l+�_H=J��Gy�SO�>����PY�!��,��p�|(�)��b�I�C)ӡ������
+��).�,%%��d�Ce�ON���
+�]ˡ�džٲvʔ����R���?�k�s�%���a�A[Ȱ��
+q�`"ӡƦ��Lp�G�$���V��L-�8�8}P�'ӡ�@ �;��s�����i�ӡ
+�ps��� n1�I�g��<-��8}P�#ӡ�8 �<�{�|��3�����L��������N���k�ew[����&4u=8�$��b��� ӡ�f��L0����d�9*90˱�@@5 �$q�f{++�js9�J�T���<q��\V������s��-q�BV&�ʅ�Ji~c�JVn�C5Uܱ*�u���?c�) A T�t���K��
+ TN�����8}���4
+J���:���=�zf�RV�*2�:niI^M�jc[ELǓև��1��I �ܤ���eg��w!�}�C5���V����T(t�0Z���!�<���I�( ��b��HgB2��fq���K�]�p@�����J����i�}P@��U�'�Yd:
+P�������Hq��pa!<�p 7ݚ5( ��b
+bK�3j���\�Ș�[p��P���Z?�w��d
+��s��Mq�`� ӡ��n#�M�
+Y��i�mfV����S�4{p�7��?Ȱ� 4�� ӡ�emN*'�{`K�6C�n<w� 0�q���S�y.�o�g�`�o1Dm��˧Q��iF;�l춰�T;:[E�ύ� ���n 8�5�o��4ڨۥ�QF��s$x�M�F���8��#?�K�����u�P�+GS�{�8��5Y�ߚ�!�đ��~���\J/�����}���`
+�f($,"cɁ�i�C�(w�;��|�E������\����;V��Qt����~��<�Z����g������V�e�����?�f1���1��$�h"5�]V�xZ����@��ɞ%�$�2a�s�V�>8x��Ps7��X��G�R<xD�k��@���r�@�l�^��`p�В�1]�8ZLZq� m�CՁ`�C���lu��h�m�mi6[Ap*ѓC)Gr��M�)'��ǒW=�WEx��{|�����K�;��p�����V��]�Rg��=s�v5����2s-���z���Mn�@J��)
+)����4�r�k�Mu<�Z�Ml�1d��I0��8��`p�܊�%�s�Г�^քd.��V�0!����k��M�r-��j�"��Ο3�/�����EQ`�����-O�F&K�~@��*
+�>�x�!O�GDR|u�(�0�=� ݿY�
+m���~5��O�f=M&!��n�>g��y��F�L+�Z1;D�"(�V[D͵-��B��$��5��b�a�X�6W�����kξ�e�g ��@���9`��l�#��dU��Ib|F��j�ksl���k#��Z)�lv]�˄W���g��V���3��`� l�ն,GӖ|wǎ�>�RL�@q������ݐpCs�3����4
+,�cD1�3��;q�}�:�_������Bj�c�l&�l����%����;` «8���n�O������ս)��%.L�[w���6�yu�>F��4A�:����LA5�<lW�⯮2��A�����*(�8��<��zx���%�� �ܥE�[H�U#��鄤��X�M�UE���������87�^��70V7Llv-�����0[63��_�� �`f=|D=�j�� j�)���y&=�-�+z���~'��<"ڦ�r�f��N�e9]��8Q5������S�f^�/��2\�ͱ�>≻O�O�*��ٵw���2��(-B:䄓�gA�(� �R���//�=�s�"t��=�N���VСq��
+\
+h�LZ�߹P�R��z�q 7��.N����QR(`Z��P���G�e�f���(�X(`�C<��'`Ȳ��{O3(�.��d,�@��Ŕ�� ��d:T����Kͭ��@h:C�v�j���ܦ����YLX��L7bz]���2-N�u(��4?��N�����(��6�O\���rL-�.��P�8���PPAW��-F�}�@��Ť:� �"�dZ���9�L��ӫ12�;́��A��ih ��b���� ӡ�ՉO�V�v��&Q{��4�k���̦m��ڶ�-����ӯ?7+��l'3�='�g���fq9���Y�3q�u��r����!uv|h%��xg8T���U84{4��U��%�o~�iKj�,�Br�y+�dd�ϧ٢�[�"���;.o�a&�`��NN��� \�r ���;6�`�?��ٷ�����L��y�����T��Ln������������f{�
+g��V�L�ա�ٙb�)�!A T���T�$F'��,�FY-O�h7�<����o��5|�M��;E
+p�nt��R2���@W�P;s��NG�Q;��h���`���B;7�dE��ī�b�]��`tAGf� K�zX2�w��kaq�8���"�pIm�#�᥎��Ú�����ma��vtve{k� W��j��g��)g��˟���m�[_��b��8�jA�NB6ɍ�N
+������d��m����lr���$���-�23��|a>�0oO�0�(��1n�TC�Dwl�h��m�����Ņ �&������y��8sU�y
+�H
+'̹��W����&�q��I�<�F?�q�e�/1N�yR���F��9|y�Q2������}�@V-��1%b}fĬ���!ms�`�&JO$Ą(���O�o���:!Vts����X��kQ7Z�/��Fw�e5��V���-cղ�g�۱�]��a�P�pӡ��7� 8�*�҂���3N��{Tง�w�dq���Rw�!�d�V>L+�G���C˭�e·�V�l6�h�;fKM�GS5�a;*��ꛍ���Y:�.*?�0��ٸ��n�ܷ9k䭰h�nc���Ӓ��adt>��i�q��{�1���
+j��K'�S��>�u`;����ȇ�F�S渘����u�R����/�ܬ J��a����@$_z?�l���{4b���#���F���.�9�����8���Gm���(�$Gk�"ы����� ������冬
+�)�sD��s;!Ɓ�h���tb��ʌ�dJ�����s�-0����˞�=C� z�?ς0V���<D
+�}`_�y����q��G��y���#�h_�E�<&����ce�C%��|��O���$~�ɀ������|?�Q�P
+OM�bp��vV|�Νtd�ɩ(��O��y�ߏv�x-���w�B�m�m�.�X�� �F���Ԣ�}���b��
+�(��5RWX��=����0qm-�q�§�o�vnk��3r[n���-�v.�����7t�'Ȟ||���PK�
+4"��PKc�2A��DH�sammoa.argoPKc�2A4�u��*ƚ�sammoa_Diagrammedeclasses.pgmlPKd�2AǒV9�&t-sammoa_Diagrammedecasdutilisation.pgmlPKd�2Aɟ���FA�.sammoa_Diagrammedeclasses2.pgmlPKd�2AP����K�5sammoa.todoPKd�2A8��7y��6sammoa_profile.profilePKd�2A�
+4"��
+�7sammoa.xmiPK��Y
\ No newline at end of file
Added: trunk/src/site/resources/model.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/site/resources/model.png
___________________________________________________________________
Added: svn:mime-type
+ image/png
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/src/site/rst/import-export.rst
===================================================================
--- trunk/src/site/rst/import-export.rst 2012-09-12 16:24:04 UTC (rev 583)
+++ trunk/src/site/rst/import-export.rst 2012-09-18 17:04:54 UTC (rev 584)
@@ -719,22 +719,20 @@
Les propriétés suffixés d'un ^ correspondent à des clés étrangères en base.
- Region : code
-- Species : code, region^ (*)
-- Campaign : code, region^
-- Observer : initials, campaign^ (**)
-- Sector : sectorNumber, campaign^
-- Strate : strateType, sector^
-- Transect : name, strate^
+- Species [1]_ : code, region [2]_
+- Campaign : code, region [2]_
+- Observer [3]_ : initials, campaign [2]_
+- Sector : sectorNumber, campaign [2]_
+- Strate : strateType, sector [2]_
+- Transect : name, strate [2]_
-- Flight : systemId, flightNumber, campaign^
+- Flight : systemId, flightNumber, campaign [2]_
- GeoPoints
- ObserverPosition
- TransectFlight
- Observation
- Route
-
-
-
-* Pas d'espèce commune entre deux régions ou sinon une copie sera effectuée
-** Pas d'observateur commun entre deux campagnes ou sinon une copie sera effectuée
\ No newline at end of file
+.. [1] Pas d'espèce commune entre deux régions ou sinon une copie sera effectuée
+.. [2] Propriété correspondant à une clé étrangère en base
+.. [3] Pas d'observateur commun entre deux campagnes ou sinon une copie sera effectuée
\ No newline at end of file
Modified: trunk/src/site/rst/index.rst
===================================================================
--- trunk/src/site/rst/index.rst 2012-09-12 16:24:04 UTC (rev 583)
+++ trunk/src/site/rst/index.rst 2012-09-18 17:04:54 UTC (rev 584)
@@ -82,10 +82,10 @@
4. De retour sur l'édition d'une campagne on peut choisir les fichiers pour :
- `Importer les strates
- <import-export.html##fichier-de-strate-dbf>`_
+ <import-export.html#fichier-de-strate-dbf>`_
- `Importer les transects
- <import-export.html##fichier-de-transect-dbf>`_
+ <import-export.html#fichier-de-transect-dbf>`_
- `Importer les observateurs
<import-export.html#observateurs-csv>`_
Added: trunk/src/site/rst/model.rst
===================================================================
--- trunk/src/site/rst/model.rst (rev 0)
+++ trunk/src/site/rst/model.rst 2012-09-18 17:04:54 UTC (rev 584)
@@ -0,0 +1,534 @@
+.. -
+.. * #%L
+.. * SAMMOA
+.. * $Id$
+.. * $HeadURL$
+.. * %%
+.. * Copyright (C) 2012 UMS 3462, Code Lutin
+.. * %%
+.. * This program is free software: you can redistribute it and/or modify
+.. * it under the terms of the GNU 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 General Public
+.. * License along with this program. If not, see
+.. * <http://www.gnu.org/licenses/gpl-3.0.html>.
+.. * #L%
+.. -
+
+=================
+Modèle de données
+=================
+
+Le modèle représente tout ce qui sera saisi en vol et par la suite extrait pour
+la validation et les exports.
+
+Description
+===========
+
+Il comporte trois sous-ensembles :
+
+- Le réferentiel (en bleu ciel)
+
+- Le vol (en jaune)
+
+- Les conditions et paramètres d'observations (en vert)
+
+.. image:: model.png
+
+Avant la création des vols, les référentiels doivent être renseignés. Ici on
+part d'une région (Region_) auquelle sont liées les espèces (Species_) propre à
+cette région. Ensuite on y associe une campagne (Campaign_), puis les observateurs
+(Observer_) liés à cette campagne, et les secteurs (Sector_) géographiques liés à
+cette campagne. Pour finir, on associe les strates (Strate_) géographiques liés au
+secteur et les transects (Transect_) liés à chacune de ces strates.
+
+Au début de chaque vol (Flight_), les transects prévus (TransectFlight_) sont
+associés avec pour chacun d'eux, les positions des observateurs (ObserverPosition_).
+Des transects peuvent être ajoutés afin d'effectuer de nouvelles observations
+non prévues au départ.
+
+Le parcours (Route_) reste l'élément central et permettra de segmenter le vol
+(Flight_). Chaque parcours contient les conditions d'observation associées ou
+non au transect prévu (TransectFlight_) en fonction du type de parcours
+(RouteType_).
+
+Les positions des observateurs (ObserverPosition_) peuvent également changées en
+cours de vol et seront donc également associées au parcours.
+
+Une observation (Observation_) n'est liée qu'à la position de l'observateur
+(Position_) et garde également en référence le vol (Flight_) auquel elle est
+associée. Pour retrouver les observations d'un parcours, on utilisera le temps
+(*observationTime*), c'est à dire, qu'un parcours contiendra toutes les
+observations jusqu'au temps du prochain parcours
+(*route.beginTime <= observation.observationTime < nextRoute.beginTime*). Cette
+modélisation a été faites pour simplifier les modifications de temps lors
+de la validation. Ainsi, la suppression d'une route ou son changement de temps
+ne provoquera aucune manipulation des observations vu qu'aucun lien physique
+fort n'existe dans le modèle.
+
+Le temps est aussi la donnée clé pour la liaison avec le GPS et les enregistrements
+audio. Ainsi le temps au moment de l'observation (*observationTime*) est
+synchronisé avec un point du GPS (GeoPoint_). Pour permettre de garder le
+tracé géographique de l'avion, une liste de points GPS sera enregistré pour
+chacun des parcours (Route_). Le lien n'apparaît pas car, une nouvelle fois la
+liaison se fera sur le temps. D'un parcours à l'autre, il n'y aura aucune coupure,
+le temps de début d'un parcours (*beginTime*) déterminera la fin du précédent, on
+connaîtra ainsi l'ensemble des points GPS associés à chaque parcours.
+L'enregistrement audio de chacun des transects sera quant à lui synchronisé sur le
+temps de début (*beginTime*) du premier parcours (LEG) du transect. Il sera toujours
+possible grâce au temps de l'observation de caler la lecture audio pour une
+observation donnée.
+
+Dictionnaire de données
+=======================
+
+Campaign
+--------
+
+*<<entity>>*
+
+Campagne d'observations sur une région donnée. La campagne est formée d'une
+période, de secteurs avec ses strates et transects et des observateurs.
+
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| code | Code de la campagne | String | naturalId |
++----------------------+----------------------------------+--------------------+----------------+
+| region | Région sur laquelle est | Region_ | naturalId |
+| | effectuée la campagne | | |
++----------------------+----------------------------------+--------------------+----------------+
+| name | Nom de la campagne | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| beginDate | Date de début de la campagne | Date | required |
+| | | (day) | |
++----------------------+----------------------------------+--------------------+----------------+
+| endDate | Date de fin de la campagne | Date | required |
+| | | (day) | |
++----------------------+----------------------------------+--------------------+----------------+
+| localCreation | Indique si la création de | boolean | |
+| | l'entité a été faites depuis | | |
+| | l'interface de l'application | | |
+| | (différent d'un import) | | |
++----------------------+----------------------------------+--------------------+----------------+
+
+Flight
+------
+
+*<<entity>>*
+
+Vol associé à une campagne. Il contient son plan de vol et plusieurs
+informations sur le vol, comme les observateurs embarqués, son numéro et la
+référence de l'avion.
+
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| flightNumber | Numéro du vol par rapport au | String | naturalId |
+| | système sur lequel il a été | | |
+| | effectué. Ce numéro est | | |
+| | incrémenté sur chaque système | | |
+| | indépendamment. Il peut être | | |
+| | saisie manuellement mais | | |
+| | aucun retour sur un numéro | | |
+| | antérieur n'est possible pour | | |
+| | éviter les conflits sur d'autres | | |
+| | bases permettant de centraliser | | |
+| | les données. | | |
++----------------------+----------------------------------+--------------------+----------------+
+| systemId | Identifiant du système sur | String | naturalId |
+| | lequel le vol est effectué | | |
++----------------------+----------------------------------+--------------------+----------------+
+| campaign | Campagne sur laquelle est | Campaign_ | naturalId |
+| | effectuée le vol | | |
++----------------------+----------------------------------+--------------------+----------------+
+| immatriculation | Immatriculation de l'avion | String | |
+| | utilisé pour le vol | | |
++----------------------+----------------------------------+--------------------+----------------+
+| beginDate | Date de début du vol. Un vol | Date | |
+| | sans date de début n'a pas | (seconds) | |
+| | encore démarré | | |
++----------------------+----------------------------------+--------------------+----------------+
+| endDate | Date de fin du vol. Un vol sans | Date | |
+| | date de fin est en cours de | (seconds) | |
+| | saisie et ne peut pas être | | |
+| | validé | | |
++----------------------+----------------------------------+--------------------+----------------+
+| comment | Commentaires sur le vol | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| platformType | Type de plate-forme en fonction | PlatformType_ | required |
+| | du type d'avion | | |
++----------------------+----------------------------------+--------------------+----------------+
+| transectFlight | Plan de vol. Liste des transects | List of | **composite** |
+| | prévus et effectués sur ce vol. | TransectFlight_ | *<<indexed>>* |
+| | Ils seront effectués si ils sont | | |
+| | liés à une Route_ | | |
++----------------------+----------------------------------+--------------------+----------------+
+| observer | Ensemble des observateurs montés | Collection of | |
+| | à bord de l'avion | Observer_ | |
++----------------------+----------------------------------+--------------------+----------------+
+
+GeoPoint
+--------
+
+*<<entity>>*
+
+Il s'agit d'un point géographique avec ses coordonnées latitude, longitude et
+le temps auquel il a été enregistré.
+
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| recordTime | Temps auquel a été enregistré | Date | |
+| | ce point géographique | (seconds) | |
++----------------------+----------------------------------+--------------------+----------------+
+| longitude | Longitude géographique | double | |
++----------------------+----------------------------------+--------------------+----------------+
+| latitude | Latitude géographique | double | |
++----------------------+----------------------------------+--------------------+----------------+
+| altitude | Altitude (feet) lors de la | double | |
+| | capture | | |
++----------------------+----------------------------------+--------------------+----------------+
+| speed | Vitesse (km/h) lors de la | double | |
+| | capture | | |
++----------------------+----------------------------------+--------------------+----------------+
+| captureDelay | Temps passé en secondes depuis | int | |
+| | la capture réelle. Par exemple | | |
+| | depuis un GPS, il s'agit du | | |
+| | temps entre la capture GPS et | | |
+| | l'enregistrement du point | | |
++----------------------+----------------------------------+--------------------+----------------+
+| flight | Vol sur lequel est enregistré | Flight_ | required |
+| | le point géographique | | |
++----------------------+----------------------------------+--------------------+----------------+
+
+Observation
+-----------
+
+*<<entity>>*
+
+Données d'une observation effectuée pour une position d'observateur à un temps
+donné.
+
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| observationNumber | Numéro d'observation incrémenté | int | |
+| | par rapport au vol | | |
++----------------------+----------------------------------+--------------------+----------------+
+| observationTime | Temps auquel a été faites | Date | required |
+| | l'observation | (seconds) | |
++----------------------+----------------------------------+--------------------+----------------+
+| podSize | Nombre d'individus de l'espèce | int | min = 1 |
+| | observée | | |
++----------------------+----------------------------------+--------------------+----------------+
+| age | Tranche d'âge des individus | String | values = ["", |
+| | observées | | "J","I","A", |
+| | | | "M"] |
++----------------------+----------------------------------+--------------------+----------------+
+| cue | Code qualifiant ce qui a | String | values = ["", |
+| | réellement permit de détecter | | "U","A","2", |
+| | les animaux | | "3","4","5", |
+| | | | "6","7","8", |
+| | | | "9"] |
++----------------------+----------------------------------+--------------------+----------------+
+| behaviour | Code se rapportant au | String | values = ["", |
+| | comportement qui a dominé durant | | "SW","MI", |
+| | l'observation | | "BR","LO", |
+| | | | "FE","FA", |
+| | | | "SB","OT"] |
++----------------------+----------------------------------+--------------------+----------------+
+| swimDir | Direction de nage suivie par les | int | min = 0 |
+| | animaux. Il s'agit de l'angle de | | max = 360 |
+| | gisement, 360 étant la direction | | |
+| | suivie par l'avion | | |
++----------------------+----------------------------------+--------------------+----------------+
+| calves | Nombre de jeunes estimé en | int | min = 0 |
+| | fonction de la taille des | | |
+| | adultes et du comportement | | |
++----------------------+----------------------------------+--------------------+----------------+
+| photo | Indique si des photos ont été | boolean | |
+| | prises ou non | | |
++----------------------+----------------------------------+--------------------+----------------+
+| comment | Commentaires sur l'observation | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| valid | Indique si l'observation a été | boolean | |
+| | validée ou non | | |
++----------------------+----------------------------------+--------------------+----------------+
+| deleted | Indique si l'observation a été | boolean | |
+| | marquée comme supprimée ou non | | |
++----------------------+----------------------------------+--------------------+----------------+
+| flight | Vol pendant lequel a été faites | Flight_ | required |
+| | cette observation | | |
++----------------------+----------------------------------+--------------------+----------------+
+| species | Espèce observée | Species_ | required |
++----------------------+----------------------------------+--------------------+----------------+
+| observationStatus | Status de l'observation utilisé | ObservationStatus_ | required |
+| | lors d'un CIRCLE_BACK, sinon | | |
+| | la valeur est NEW par défaut | | |
++----------------------+----------------------------------+--------------------+----------------+
+| position | Position de l'observateur depuis | Position_ | required |
+| | laquelle a été faites | | |
+| | l'observation | | |
++----------------------+----------------------------------+--------------------+----------------+
+
+ObservationStatus
+-----------------
+
+*<<enumeration>>*
+
+Status d'une observation, principalement utilisé pour différencier lors de
+CIRCLE_BACK les recapture d'observations.
+
++----------------------+----------------------------------+
+| Valeur | Description |
++======================+==================================+
+| NEW | Nouvelle observation |
++----------------------+----------------------------------+
+| CIRCLE_BACK | Observation faisant l'objet d'un |
+| | CIRCLE_BACK |
++----------------------+----------------------------------+
+| NO_RECAPTURE | Observation faisant l'objet d'un |
+| | CIRCLE_BACK mais sans aucune |
+| | recapture |
++----------------------+----------------------------------+
+| RECAPTURE | Nouvelle observation qui est une |
+| | recapture de celle ayant causée |
+| | le CIRCLE_BACK |
++----------------------+----------------------------------+
+
+Observer
+--------
+
+*<<entity>>*
+
+Observateur participant à une campagne et positionné sur le plan de vol à une
+position dans l'avion.
+
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| initials | Initiales de l'observateur. La | String | required |
+| | valeur est unique par campagne. | | |
++----------------------+----------------------------------+--------------------+----------------+
+| firstName | Prénom de l'observateur | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| lastName | Nom de famille de l'observateur | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| organization | Nom de la société de l' | String | |
+| | observateur | | |
++----------------------+----------------------------------+--------------------+----------------+
+| email | Adresse email de l'observateur | String | |
+| | | | |
++----------------------+----------------------------------+--------------------+----------------+
+| localCreation | Indique si la création de | boolean | |
+| | l'entité a été faites depuis | | |
+| | l'interface de l'application | | |
+| | (différent d'un import) | | |
++----------------------+----------------------------------+--------------------+----------------+
+| pilot | Indique si cette observateur est | boolean | |
+| | en fait un pilote d'avion. Un | | |
+| | pilote ne peut pas être | | |
+| | positionné comme un observateur | | |
+| | (gauche, droite, centre...) | | |
++----------------------+----------------------------------+--------------------+----------------+
+| campaign | Campagne à laquelle est | Campaign_ | required |
+| | rattachée l'observateur | | |
++----------------------+----------------------------------+--------------------+----------------+
+
+ObserverPosition
+----------------
+
+*<<entity>>*
+
+Position pour un observateur. Cette position est d'abord définit dans le plan
+de vol prévisionnel puis modifiée si nécessaire sur le parcours lors de
+changements de conditions d'observations. D'un point de vue technique on
+manipulera deux entités différentes, une pour le plan de vol et une pour
+chaque parcours.
+
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| observer | Observateur | Observer_ | required |
++----------------------+----------------------------------+--------------------+----------------+
+| position | Position dans l'avion | Position_ | required |
++----------------------+----------------------------------+--------------------+----------------+
+
+PlatformType
+------------
+
+*<<enumeration>>*
+
+Type de plate-forme pour l'avion qui influence les positions (Position_)
+possibles des observateurs dans l'avion. (Pour le moment seule la plate-forme
+SIMPLE est gérée dans l'application).
+
++----------------------+----------------------------------+
+| Valeur | Description |
++======================+==================================+
+| SIMPLE | Plate-forme simple (4 |
+| | observateurs) |
++----------------------+----------------------------------+
+| DOUBLE | Plate-forme double (6 |
+| | observateurs) |
++----------------------+----------------------------------+
+
+Position
+--------
+
+*<<enumeration>>*
+
+Position possible pour un observateur.
+
++----------------------+----------------------------------+
+| Valeur | Description |
++======================+==================================+
+| NAVIGATOR | Navigateur (position centrale) |
+| | label = 'C' |
++----------------------+----------------------------------+
+| FRONT_LEFT | Avant gauche (position gauche |
+| | sur une plate-forme simple) |
+| | label = 'L' |
++----------------------+----------------------------------+
+| FRONT_RIGHT | Avant droit (position droite |
+| | sur une plate-forme simple) |
+| | label = 'R' |
++----------------------+----------------------------------+
+| BACK_LEFT | Arrière gauche (pour |
+| | une plate-forme double) |
++----------------------+----------------------------------+
+| BACK_RIGHT | Arrière droit (pour |
+| | une plate-forme double) |
++----------------------+----------------------------------+
+| CO_NAVIGATOR | Assistant navigateur |
++----------------------+----------------------------------+
+
+Region
+------
+
+*<<entity>>*
+
+Région sur laquelle est effectuée une campagne.
+
++----------------------+----------------------------------+--------------------+----------------+
+| Nom | Description | Type | Contraintes |
++======================+==================================+====================+================+
+| code | Code de la région | String | naturalId |
++----------------------+----------------------------------+--------------------+----------------+
+| name | Nom de la région | String | |
++----------------------+----------------------------------+--------------------+----------------+
+| latMin | Latitude minimum de la zone | double | |
+| | géographique de la région | | |
++----------------------+----------------------------------+--------------------+----------------+
+| latMax | Latitude maximum de la zone | double | |
+| | géographique de la région | | |
++----------------------+----------------------------------+--------------------+----------------+
+| longMin | Longitude minimum de la zone | double | |
+| | géographique de la région | | |
++----------------------+----------------------------------+--------------------+----------------+
+| longMax | Longitude maximum de la zone | double | |
+| | géographique de la région | | |
++----------------------+----------------------------------+--------------------+----------------+
+
+Route
+-----
+
+*<<entity>>*
+
+Segment du vol représentant un parcours. Il contient les conditions
+d'observations (y compris les positions d'observateurs) et permet de
+différencier les types de parcours (TRANSIT, LEG, CIRCLE_BACK). Il est
+enregistré à un temps donné pour permettre de retrouver ses observations et ses
+coordonnées géographiques. A chaque changement de conditions d'observations, un
+nouveau parcours est créé.
+
+RouteType
+---------
+
+*<<enumeration>>*
+
+Type de parcours possible.
+
++----------------------+----------------------------------+
+| Valeur | Description |
++======================+==================================+
+| TRANSIT | Parcours avant et après l' |
+| | arrivée sur un transect |
++----------------------+----------------------------------+
+| LEG | A chaque changement de |
+| | conditions d'observations, un |
+| | nouveau LEG est créé pour |
+| | marquer l'effort d'observation. |
+| | Le LEG est le seul parcours |
+| | qui est lié au transect |
++----------------------+----------------------------------+
+| CIRCLE_BACK | Parcours ayant pour objectif de |
+| | faire demi-tour sur une |
+| | observation afin de vérifier les |
+| | données ou de mieux observer l' |
+| | animal. L'observation est |
+| | enregistrée (*circleBackCause*) |
+| | et de nouvelles observations |
+| | peuvent être enregistrées |
+| | pendant ce CIRCLE_BACK (CB). Le |
+| | statut de l'observation initiale |
+| | peut changer en fonction des |
+| | observations effectuées pendant |
+| | le CIRCLE_BACK |
+| | (ObservationStatus_). Sinon le |
+| | statut sera par défaut "NEW" |
+| | pour chacune des observations. |
++----------------------+----------------------------------+
+
+Sector
+------
+
+*<<entity>>*
+
+Secteur géographique sur lequel l'effort est effectué.
+
+Species
+-------
+
+*<<entity>>*
+
+Espèce observée.
+
+Strate
+------
+
+*<<entity>>*
+
+Strate géographique sur laquelle l'effort est effectué.
+
+StrateType
+----------
+
+*<<enumeration>>*
+
+Type de strate possible (côtière, pente, néritique, océanique).
+
+Transect
+--------
+
+*<<entity>>*
+
+Segment géographique sur lequel doit être effectué l'effort d'observation.
+
+TransectFlight
+--------------
+
+*<<entity>>*
+
+Segment géographique prévu (et potentiellement réalisé) pour un vol donné.
+Chaque parcours de type LEG représentant un effort d'observation est
+obligatoirement associé à un transect du plan de vol. L'ensemble de ces
+segments représente un plan de vol avec une numérotation représentant l'ordre.
\ No newline at end of file
Property changes on: trunk/src/site/rst/model.rst
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Deleted: trunk/src/site/rst/sammoa-model.rst
===================================================================
--- trunk/src/site/rst/sammoa-model.rst 2012-09-12 16:24:04 UTC (rev 583)
+++ trunk/src/site/rst/sammoa-model.rst 2012-09-18 17:04:54 UTC (rev 584)
@@ -1,48 +0,0 @@
-.. -
-.. * #%L
-.. * SAMMOA
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * Copyright (C) 2012 UMS 3462, Code Lutin
-.. * %%
-.. * This program is free software: you can redistribute it and/or modify
-.. * it under the terms of the GNU 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 General Public
-.. * License along with this program. If not, see
-.. * <http://www.gnu.org/licenses/gpl-3.0.html>.
-.. * #L%
-.. -
-
-=================
-Modèle de données
-=================
-
-TODO-fdesbois-2012-07-10 : update and add image (this page is not yet in menu)
-
-Le modèle représente tout ce qui sera saisi en vol et par la suite extrait pour la validation et les exports.
-Il comporte trois sous-ensembles :
-- Le réferentiel : observateurs et strates (en bleu ciel)
-- Le vol décomposé en plusieurs parcours (en jaune)
-- Les conditions et paramètres d'observations sur un transect pour chacun des parcours LEG et CIRCLE_BACK (en vert)
-
-Au début de chaque vol, les transects et les positions des observateurs (ObserverPosition) sont renseignés. Des transects peuvent être ajoutés afin d'effectuer de nouvelles observations non prévues au départ. Le parcours (Route) reste l'élément central et permettra de retrouver le vol (Flight) et le transect (Transect) lors des observations.
-
-Tout le trajet de l'avion est enregistré grâce à ces parcours (Route), chacun d'eux peut être de trois types différents (RouteType) :
-- TRANSIT : avant et après l'arrivée sur un transect,
-- LEG : à chaque changement de conditions d'observations (ObservationCondition), un nouveau LEG (donc un nouveau parcours) est créé et permet la saisie des observations (Observation)
-- CIRCLE_BACK : l'observation initiale est enregistré (circleBackCause) et de nouvelles observations peuvent être enregistrées pendant ce CIRCLE_BACK (CB). Le statut de l'observation initiale peut changer en fonction des observations effectuées pendant le CIRCLE_BACK (ObservationStatus). Sinon le statut sera par défaut "NEW" pour chacune des observations.
-
-Les positions des observateurs peuvent également changées en cours de vol et seront donc également associées au parcours.
-
-Le temps est la donnée clé pour la liaison avec le GPS et les enregistrements audio. Ainsi le temps au moment de l'observation (observationTime) est synchronisé avec un point du GPS (GeoPoint). Pour permettre de garder le tracé géographique de l'avion, une liste de points GPS sera enregistré pour chacun des parcours. Le lien n'apparaît pas car, une nouvelle fois la liaison se fera sur le temps. D'un parcours à l'autre, il n'y aura aucune coupure, le temps de début d'un parcours déterminera la fin du précédent, on connaîtra ainsi l'ensemble des points GPS associés à chaque parcours. L'enregistrement audio (et plus précisémment le nom du fichier) de chacun des LEG sera quand à lui synchronisé sur le temps de début (beginTime) du parcours. Il sera toujours possible grâce au temps de l'observation de caler la lecture audio pour une observation précise.
-
-
Modified: trunk/src/site/site.xml
===================================================================
--- trunk/src/site/site.xml 2012-09-12 16:24:04 UTC (rev 583)
+++ trunk/src/site/site.xml 2012-09-18 17:04:54 UTC (rev 584)
@@ -100,6 +100,7 @@
</menu>
<menu name="Développeur">
+ <item name="Modèle de données" href="model.html"/>
<item name="GPS" href="gps.html"/>
<item name="Import/Export" href="import-export.html"/>
</menu>
1
0
r583 - in trunk: . sammoa-application sammoa-persistence sammoa-ui-swing
by maven-release@users.forge.codelutin.com 12 Sep '12
by maven-release@users.forge.codelutin.com 12 Sep '12
12 Sep '12
Author: maven-release
Date: 2012-09-12 18:24:04 +0200 (Wed, 12 Sep 2012)
New Revision: 583
Url: http://forge.codelutin.com/repositories/revision/sammoa/583
Log:
[maven-release-plugin] prepare for next development iteration
Modified:
trunk/pom.xml
trunk/sammoa-application/pom.xml
trunk/sammoa-persistence/pom.xml
trunk/sammoa-ui-swing/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-09-12 16:23:57 UTC (rev 582)
+++ trunk/pom.xml 2012-09-12 16:24:04 UTC (rev 583)
@@ -15,7 +15,7 @@
<groupId>fr.ulr</groupId>
<artifactId>sammoa</artifactId>
- <version>1.0-rc2</version>
+ <version>1.0-rc3-SNAPSHOT</version>
<modules>
<module>sammoa-persistence</module>
@@ -81,12 +81,12 @@
<!-- ************************************************************* -->
<scm>
- <url>http://svn.forge.codelutin.com/svn/sammoa/tags/sammoa-1.0-rc2</url>
+ <url>http://svn.forge.codelutin.com/svn/sammoa/trunk</url>
<connection>
- scm:svn:http://svn.forge.codelutin.com/svn/sammoa/tags/sammoa-1.0-rc2
+ scm:svn:http://svn.forge.codelutin.com/svn/sammoa/trunk
</connection>
<developerConnection>
- scm:svn:http://svn.forge.codelutin.com/svn/sammoa/tags/sammoa-1.0-rc2
+ scm:svn:http://svn.forge.codelutin.com/svn/sammoa/trunk
</developerConnection>
</scm>
Modified: trunk/sammoa-application/pom.xml
===================================================================
--- trunk/sammoa-application/pom.xml 2012-09-12 16:23:57 UTC (rev 582)
+++ trunk/sammoa-application/pom.xml 2012-09-12 16:24:04 UTC (rev 583)
@@ -9,7 +9,7 @@
<parent>
<groupId>fr.ulr</groupId>
<artifactId>sammoa</artifactId>
- <version>1.0-rc2</version>
+ <version>1.0-rc3-SNAPSHOT</version>
</parent>
<artifactId>sammoa-application</artifactId>
Modified: trunk/sammoa-persistence/pom.xml
===================================================================
--- trunk/sammoa-persistence/pom.xml 2012-09-12 16:23:57 UTC (rev 582)
+++ trunk/sammoa-persistence/pom.xml 2012-09-12 16:24:04 UTC (rev 583)
@@ -9,7 +9,7 @@
<parent>
<groupId>fr.ulr</groupId>
<artifactId>sammoa</artifactId>
- <version>1.0-rc2</version>
+ <version>1.0-rc3-SNAPSHOT</version>
</parent>
<artifactId>sammoa-persistence</artifactId>
Modified: trunk/sammoa-ui-swing/pom.xml
===================================================================
--- trunk/sammoa-ui-swing/pom.xml 2012-09-12 16:23:57 UTC (rev 582)
+++ trunk/sammoa-ui-swing/pom.xml 2012-09-12 16:24:04 UTC (rev 583)
@@ -9,7 +9,7 @@
<parent>
<groupId>fr.ulr</groupId>
<artifactId>sammoa</artifactId>
- <version>1.0-rc2</version>
+ <version>1.0-rc3-SNAPSHOT</version>
</parent>
<artifactId>sammoa-ui-swing</artifactId>
1
0
Author: maven-release
Date: 2012-09-12 18:23:57 +0200 (Wed, 12 Sep 2012)
New Revision: 582
Url: http://forge.codelutin.com/repositories/revision/sammoa/582
Log:
[maven-release-plugin] copy for tag sammoa-1.0-rc2
Added:
tags/sammoa-1.0-rc2/
1
0