Tutti-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
January 2013
- 4 participants
- 143 discussions
r249 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/config resources/i18n
by tchemit@users.forge.codelutin.com 28 Jan '13
by tchemit@users.forge.codelutin.com 28 Jan '13
28 Jan '13
Author: tchemit
Date: 2013-01-28 12:26:25 +0100 (Mon, 28 Jan 2013)
New Revision: 249
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/249
Log:
refs #1893: [TECH] - Mise ?\195?\160 jour automatique de l'outil
Added:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDatabaseUpdaterCallBack.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiJreUpdaterCallBack.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUpdaterCallBack.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/
Modified:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java 2013-01-28 11:22:28 UTC (rev 248)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java 2013-01-28 11:26:25 UTC (rev 249)
@@ -28,13 +28,12 @@
import jaxx.runtime.SwingUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.nuiton.i18n.I18n;
-import org.nuiton.i18n.init.DefaultI18nInitializer;
+import org.nuiton.util.ApplicationUpdater;
import javax.swing.UIManager;
import javax.swing.plaf.BorderUIResource;
import java.awt.Color;
-import java.util.Locale;
+import java.io.File;
/**
* To start Tutti application.
@@ -47,31 +46,27 @@
/** Logger. */
private static final Log log = LogFactory.getLog(RunTutti.class);
+ public static final int UPATE_EXIT_CODE = 88;
+
public static void main(String... args) {
// Create configuration
TuttiConfig config = new TuttiConfig("tutti.properties", args);
// Create application context
- final TuttiUIContext context = TuttiUIContext.newContext(config);
+ TuttiUIContext context = TuttiUIContext.newContext(config);
- // use our special classLoader (which will read some files from resources from a configuration directory)
- Thread.currentThread().setContextClassLoader(context.getResourceLoader());
+ // prepare context (mainly init configs, i18n)
+ context.init();
- // Use shutdownHook to close context on System.exit
- Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
+ // try to update jre
+ updateTuttiJre(context);
- @Override
- public void run() {
- if (log.isInfoEnabled()) {
- log.info("Close context on shutdown");
- }
- context.close();
- }
- }));
+ // try to update application
+ updateTuttiApplication(context);
- // Initialize i18n
- I18n.init(new DefaultI18nInitializer("tutti-ui-swing"), Locale.UK);
+ // try to update database
+ updateTuttiDatabase(context);
// Prepare ui look&feel and load ui properties
try {
@@ -88,6 +83,7 @@
//UIManager.put("BlockingLayerUI.blockingColor", new Color(50, 50, 50));
startTutti(context);
+
}
public static void startTutti(TuttiUIContext context) {
@@ -108,8 +104,79 @@
ui.dispose();
if (exit) {
- System.exit(0);
+ System.exit(1);
}
}
+ public static void updateTuttiJre(TuttiUIContext context) {
+
+ TuttiConfig config = context.getConfig();
+
+ File current = config.getJreDirectory();
+ if (current == null || !current.exists()) {
+
+ // can not update jre
+ if (log.isWarnEnabled()) {
+ log.warn("No jre directory defined, skip jre update.");
+ }
+ } else {
+
+ String url = config.getApplicationUpdateUrl();
+ if (log.isInfoEnabled()) {
+ log.info(String.format("Try to update jre (current jre location: %s), using update url: %s", current, url));
+ }
+ ApplicationUpdater up = new ApplicationUpdater();
+ File dest = config.getNewTmpDirectory("NEW-jre");
+ up.update(url,
+ current,
+ dest,
+ false,
+ new TuttiJreUpdaterCallBack(context));
+ }
+ }
+
+ public static void updateTuttiApplication(TuttiUIContext context) {
+ TuttiConfig config = context.getConfig();
+
+ File current = config.getApplicationDirectory();
+ if (current == null || !current.exists()) {
+
+ // can not update application
+ if (log.isWarnEnabled()) {
+ log.warn("No application directory defined, skip application update.");
+ }
+ } else {
+
+ String url = config.getApplicationUpdateUrl();
+ if (log.isInfoEnabled()) {
+ log.info(String.format("Try to update application (current application location: %s), using update url: %s", current, url));
+ }
+ ApplicationUpdater up = new ApplicationUpdater();
+
+ File dest = config.getNewTmpDirectory("NEW-tutti");
+ up.update(url,
+ current,
+ dest,
+ false,
+ new TuttiApplicationUpdaterCallBack(context));
+ }
+
+ }
+
+ public static void updateTuttiDatabase(TuttiUIContext context) {
+ TuttiConfig config = context.getConfig();
+ String url = config.getDatabaseUpdateUrl();
+ ApplicationUpdater up = new ApplicationUpdater();
+
+ File current = config.getServiceConfig().getAdagioDriverConfig().getDbDirectory();
+ File dest = config.getNewTmpDirectory("NEW-database");
+ if (log.isInfoEnabled()) {
+ log.info(String.format("Try to update database (current database location: %s), using update url: %s", current, url));
+ }
+ up.update(url,
+ current,
+ dest,
+ false,
+ new TuttiDatabaseUpdaterCallBack(context));
+ }
}
\ No newline at end of file
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java 2013-01-28 11:26:25 UTC (rev 249)
@@ -0,0 +1,69 @@
+package fr.ifremer.tutti.ui.swing;
+
+/*
+ * #%L
+ * Tutti :: UI
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 Ifremer
+ * %%
+ * 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 org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationUpdater;
+
+/**
+ * CallBack to update jre.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 1.0
+ */
+public class TuttiApplicationUpdaterCallBack extends TuttiUpdaterCallBack {
+
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(TuttiApplicationUpdaterCallBack.class);
+
+ public static final String APP_KEY = "tutti";
+
+ public TuttiApplicationUpdaterCallBack(TuttiUIContext context) {
+ super(context, APP_KEY);
+ }
+
+ @Override
+ protected void updateDone(ApplicationUpdater.ApplicationInfo applicationInfo,
+ Exception error) {
+
+ if (error != null) {
+
+ //error when update database
+ if (log.isWarnEnabled()) {
+ log.warn("Could not update tutti application", error);
+ }
+ } else {
+
+ // launch a referential synchronize operation
+ if (log.isInfoEnabled()) {
+ log.info(String.format("A tutti application update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", applicationInfo.oldVersion, applicationInfo.newVersion));
+ }
+
+ System.exit(RunTutti.UPATE_EXIT_CODE);
+ }
+ }
+}
Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDatabaseUpdaterCallBack.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDatabaseUpdaterCallBack.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDatabaseUpdaterCallBack.java 2013-01-28 11:26:25 UTC (rev 249)
@@ -0,0 +1,74 @@
+package fr.ifremer.tutti.ui.swing;
+
+/*
+ * #%L
+ * Tutti :: UI
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 Ifremer
+ * %%
+ * 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 org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationUpdater;
+import org.nuiton.util.Version;
+
+/**
+ * CallBack to update tutti.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 1.0
+ */
+public class TuttiDatabaseUpdaterCallBack extends TuttiUpdaterCallBack {
+
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(TuttiDatabaseUpdaterCallBack.class);
+
+ public static final String APP_KEY = "adagiodb";
+
+ public TuttiDatabaseUpdaterCallBack(TuttiUIContext context) {
+ super(context, APP_KEY);
+ }
+
+ @Override
+ protected void updateDone(ApplicationUpdater.ApplicationInfo applicationInfo,
+ Exception error) {
+
+ if (error != null) {
+
+ //error when update database
+ if (log.isWarnEnabled()) {
+ log.warn("Could not update database", error);
+ }
+ } else if (Version.VZERO.toString().equals(applicationInfo.oldVersion)) {
+
+ // first database, just copy it to correct directory
+ if (log.isInfoEnabled()) {
+ log.info("First time database was downloaded at version: " + applicationInfo.newVersion);
+ }
+ } else {
+
+ // launch a referential synchronize operation
+ if (log.isInfoEnabled()) {
+ log.info(String.format("A database update was downloaded (oldVersion: %s, newVersion: %s), will launch a referential synchronize operation ", applicationInfo.oldVersion, applicationInfo.newVersion));
+ }
+ }
+ }
+}
Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDatabaseUpdaterCallBack.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiJreUpdaterCallBack.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiJreUpdaterCallBack.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiJreUpdaterCallBack.java 2013-01-28 11:26:25 UTC (rev 249)
@@ -0,0 +1,71 @@
+package fr.ifremer.tutti.ui.swing;
+
+/*
+ * #%L
+ * Tutti :: UI
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 Ifremer
+ * %%
+ * 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 org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationUpdater;
+
+/**
+ * CallBack to update jre.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 1.0
+ */
+public class TuttiJreUpdaterCallBack extends TuttiUpdaterCallBack {
+
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(TuttiJreUpdaterCallBack.class);
+
+
+
+ public static final String APP_KEY = "jre";
+
+ public TuttiJreUpdaterCallBack(TuttiUIContext context) {
+ super(context, APP_KEY);
+ }
+
+ @Override
+ protected void updateDone(ApplicationUpdater.ApplicationInfo applicationInfo,
+ Exception error) {
+
+ if (error != null) {
+
+ //error when update database
+ if (log.isWarnEnabled()) {
+ log.warn("Could not update database", error);
+ }
+ } else {
+
+ // launch a referential synchronize operation
+ if (log.isInfoEnabled()) {
+ log.info(String.format("A jre update was downloaded (oldVersion: %s, newVersion: %s), will restart applicationto use it", applicationInfo.oldVersion, applicationInfo.newVersion));
+ }
+
+ System.exit(RunTutti.UPATE_EXIT_CODE);
+ }
+ }
+}
Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiJreUpdaterCallBack.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-01-28 11:22:28 UTC (rev 248)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-01-28 11:26:25 UTC (rev 249)
@@ -25,6 +25,7 @@
*/
import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
import com.google.common.collect.Sets;
import fr.ifremer.tutti.persistence.RessourceClassLoader;
import fr.ifremer.tutti.persistence.entities.data.Cruise;
@@ -40,11 +41,15 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdesktop.beans.AbstractBean;
+import org.nuiton.i18n.I18n;
+import org.nuiton.i18n.init.DefaultI18nInitializer;
import org.nuiton.widget.SwingSession;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Closeable;
+import java.io.IOException;
+import java.util.Locale;
import java.util.Set;
/**
@@ -278,6 +283,41 @@
firePropertyChange(PROPERTY_SCREEN, oldValue, screen);
}
+ public void init() {
+
+
+ try {
+ getConfig().getServiceConfig().prepareDirectories();
+ } catch (IOException e) {
+ throw Throwables.propagate(e);
+ }
+
+ // use our special classLoader (which will read some files from resources from a configuration directory)
+ Thread.currentThread().setContextClassLoader(getResourceLoader());
+
+ // Use shutdownHook to close context on System.exit
+ Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ if (log.isInfoEnabled()) {
+ log.info("Close context on shutdown");
+ }
+ close();
+ }
+ }));
+
+ try {
+ getConfig().getServiceConfig().getAdagioDriverConfig().initConfig(getResourceLoader());
+ } catch (IOException e) {
+
+ throw new RuntimeException("Could not init adagio configuration", e);
+ }
+
+ // Initialize i18n
+ I18n.init(new DefaultI18nInitializer("tutti-ui-swing"), Locale.UK);
+ }
+
public void open() {
if (programId == null) {
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUpdaterCallBack.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUpdaterCallBack.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUpdaterCallBack.java 2013-01-28 11:26:25 UTC (rev 249)
@@ -0,0 +1,102 @@
+package fr.ifremer.tutti.ui.swing;
+
+/*
+ * #%L
+ * Tutti :: UI
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 Ifremer
+ * %%
+ * 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.collect.Maps;
+import org.nuiton.util.ApplicationUpdater;
+
+import java.util.Map;
+
+/**
+ * CallBack to update tutti.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 1.0
+ */
+public abstract class TuttiUpdaterCallBack implements ApplicationUpdater.ApplicationUpdaterCallback {
+
+ protected final TuttiUIContext context;
+
+ protected final String app;
+
+ protected ApplicationUpdater.ApplicationInfo applicationInfo;
+
+ protected Exception error;
+
+ public TuttiUpdaterCallBack(TuttiUIContext context, String app) {
+ this.context = context;
+ this.app = app;
+ }
+
+ public boolean isSuccess() {
+ return error == null;
+ }
+
+ public boolean isUpdateDone() {
+ return applicationInfo != null;
+ }
+
+ public ApplicationUpdater.ApplicationInfo getApplicationInfo() {
+ return applicationInfo;
+ }
+
+ public Exception getError() {
+ return error;
+ }
+
+ @Override
+ public final Map<String, ApplicationUpdater.ApplicationInfo> updateToDo(Map<String, ApplicationUpdater.ApplicationInfo> appToUpdate) {
+ ApplicationUpdater.ApplicationInfo applicationInfo = appToUpdate.get(app);
+ if (applicationInfo != null) {
+ appToUpdate = Maps.newHashMap();
+ appToUpdate.put(app, applicationInfo);
+ }
+ return appToUpdate;
+ }
+
+ @Override
+ public final void updateDone(Map<String, ApplicationUpdater.ApplicationInfo> appToUpdate,
+ Map<String, Exception> appUpdateError) {
+
+ ApplicationUpdater.ApplicationInfo applicationInfo = appToUpdate.get(app);
+ Exception exception = appUpdateError.get(app);
+ if (applicationInfo != null) {
+
+ this.error = exception;
+ if (exception == null) {
+ this.applicationInfo = applicationInfo;
+ }
+ updateDone(applicationInfo, exception);
+ }
+ }
+
+ @Override
+ public void aborted(String propertiesURL, Exception eee) {
+ this.error = eee;
+ }
+
+ protected abstract void updateDone(ApplicationUpdater.ApplicationInfo applicationInfo,
+ Exception error);
+}
Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUpdaterCallBack.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java 2013-01-28 11:22:28 UTC (rev 248)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java 2013-01-28 11:26:25 UTC (rev 249)
@@ -24,7 +24,6 @@
* #L%
*/
-import com.google.common.base.Throwables;
import fr.ifremer.tutti.service.TuttiServiceTechnicalException;
import fr.ifremer.tutti.service.config.TuttiServiceConfig;
import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType;
@@ -39,9 +38,16 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.util.ApplicationConfig;
import org.nuiton.util.ApplicationConfigHelper;
+import org.nuiton.util.ApplicationConfigProvider;
import org.nuiton.util.ArgumentsParserException;
import org.nuiton.util.Version;
+import javax.swing.KeyStroke;
+import java.awt.Color;
+import java.io.File;
+import java.net.URL;
+import java.util.Set;
+
/**
* Tutti application config.
*
@@ -67,16 +73,28 @@
*/
protected final TuttiServiceConfig serviceConfig;
+ protected final String[] optionKeyToNotSave;
+
public TuttiConfig(String file, String... args) {
applicationConfig = new ApplicationConfig();
// load all config default options
- ApplicationConfigHelper.loadAllDefaultOption(applicationConfig,
- null,
- null,
- null,
- true);
+ Set<ApplicationConfigProvider> providers =
+ ApplicationConfigHelper.loadAllDefaultOption(applicationConfig,
+ null,
+ null,
+ null,
+ true);
+
+ Set<String> optionToSkip =
+ ApplicationConfigHelper.getTransientOrFinalOptionKey(providers);
+
+ if (log.isInfoEnabled()) {
+ log.info("Option that won't be saved: " + optionToSkip);
+ }
+ optionKeyToNotSave = optionToSkip.toArray(new String[optionToSkip.size()]);
+
applicationConfig.setConfigFileName(file);
try {
@@ -87,16 +105,29 @@
"Could not parse configuration", e);
}
+ //TODO Review this, this is very dirty to do this...
+ File tuttiBasedir = getTuttiBasedir();
+
+ if (tuttiBasedir == null) {
+ tuttiBasedir = new File("");
+ }
+ if (!tuttiBasedir.isAbsolute()) {
+ tuttiBasedir = new File(tuttiBasedir.getAbsolutePath());
+ }
+ if (tuttiBasedir.getName().equals("..")) {
+ tuttiBasedir = tuttiBasedir.getParentFile().getParentFile();
+ }
+ if (tuttiBasedir.getName().equals(".")) {
+ tuttiBasedir = tuttiBasedir.getParentFile();
+ }
+ if (log.isInfoEnabled()) {
+ log.info("Application basedir: " + tuttiBasedir);
+ }
+ applicationConfig.setOption(TuttiConfigOption.TUTTI_APPLICATION_BASEDIR.getKey(), tuttiBasedir.getAbsolutePath());
+
log.info(this + " is initializing...");
serviceConfig = new TuttiServiceConfig(applicationConfig);
-
-
- try {
- serviceConfig.prepareDirectories();
- } catch (IOException e) {
- throw Throwables.propagate(e);
- }
}
public ApplicationConfig getApplicationConfig() {
@@ -108,7 +139,7 @@
}
public void save() {
- applicationConfig.saveForUser();
+ applicationConfig.saveForUser(optionKeyToNotSave);
}
@Override
@@ -128,7 +159,7 @@
public boolean isShowNumberEditorButton() {
return applicationConfig.getOptionAsBoolean(TuttiConfigOption.SHOW_NUMBER_EDITOR_BUTTON.getKey());
}
-
+
public CoordinateEditorType getCoordinateEditorType() {
String value = applicationConfig.getOption(TuttiConfigOption.COORDINATE_EDITOR_TYPE.getKey());
return CoordinateEditorType.valueOf(value);
@@ -191,6 +222,10 @@
return serviceConfig.getTmpDirectory();
}
+ public File getNewTmpDirectory(String name) {
+ return new File(getTmpDirectory(), name + "_" + System.nanoTime());
+ }
+
public File getDataDirectory() {
return serviceConfig.getDataDirectory();
}
@@ -215,4 +250,24 @@
}
applicationConfig.setOption(TuttiConfigOption.PROTOCOL_ID.getKey(), protocolId);
}
+
+ public File getTuttiBasedir() {
+ return applicationConfig.getOptionAsFile(TuttiConfigOption.TUTTI_APPLICATION_BASEDIR.getKey());
+ }
+
+ public String getApplicationUpdateUrl() {
+ return applicationConfig.getOption(TuttiConfigOption.TUTTI_UPDATE_APPLICATION_URL.getKey());
+ }
+
+ public String getDatabaseUpdateUrl() {
+ return applicationConfig.getOption(TuttiConfigOption.TUTTI_UPDATE_DATABASE_URL.getKey());
+ }
+
+ public File getJreDirectory() {
+ return applicationConfig.getOptionAsFile(TuttiConfigOption.TUTTI_JRE_DIRECTORY.getKey());
+ }
+
+ public File getApplicationDirectory() {
+ return applicationConfig.getOptionAsFile(TuttiConfigOption.TUTTI_APPLICATION_DIRECTORY.getKey());
+ }
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java 2013-01-28 11:22:28 UTC (rev 248)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java 2013-01-28 11:26:25 UTC (rev 249)
@@ -41,6 +41,51 @@
*/
public enum TuttiConfigOption implements ApplicationConfig.OptionDef {
+ TUTTI_APPLICATION_BASEDIR(
+ "tutti.application.basedir",
+ n_("tutti.application.basedir.description"),
+ null,
+ File.class,
+ true,
+ true
+ ),
+
+ TUTTI_JRE_DIRECTORY(
+ "tutti.jre.directory",
+ n_("tutti.jre.directory.description"),
+ "${tutti.application.basedir}/jre",
+ File.class,
+ true,
+ true
+ ),
+
+ TUTTI_APPLICATION_DIRECTORY(
+ "tutti.application.directory",
+ n_("tutti.application.directory.description"),
+ "${tutti.application.basedir}/tutti-app",
+ File.class,
+ true,
+ true
+ ),
+
+ TUTTI_UPDATE_APPLICATION_URL(
+ "tutti.update.application.url",
+ n_("tutti.update.application.url.description"),
+ null,
+ String.class,
+ true,
+ false
+ ),
+
+ TUTTI_UPDATE_DATABASE_URL(
+ "tutti.update.database.url",
+ n_("tutti.update.database.url.description"),
+ null,
+ String.class,
+ true,
+ false
+ ),
+
UI_CONFIG_FILE(
"tutti.ui.config",
n_("tutti.config.ui.config"),
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-28 11:22:28 UTC (rev 248)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-28 11:26:25 UTC (rev 249)
@@ -77,7 +77,9 @@
tutti.action.validate=Valider
tutti.action.validateCatches=Valider les captures
tutti.action.validateCatches.tip=Valider les captures
+tutti.application.basedir.description=
tutti.application.config=Configuration de l'application Tutti
+tutti.application.directory.description=
tutti.application.name=Tutti
tutti.config.category.applications=Application
tutti.config.category.applications.description=Application
@@ -102,6 +104,7 @@
tutti.duration.format=dj Hh m'm'
tutti.errorTable.title=Table d'erreurs
tutti.file.protocol=Extension d'un fichier de protocole Tutti
+tutti.jre.directory.description=
tutti.label.attachmentEditor.file=Fichier
tutti.label.attachmentEditor.fileComment=Commentaire
tutti.label.attachmentEditor.fileName=Nom
@@ -332,6 +335,9 @@
tutti.to.be.done=< A FAIRE >
tutti.tooltip.attachment.none=Pas de pièce-jointes
tutti.tooltip.comment.none=Pas de commentaire
+tutti.update.application.url.description=
+tutti.update.database.url.description=
+tutti.update.location.description=
tutti.validator.error.comment.too.long=Taille de commentaire trop longue (limitée à %s caractères)
tutti.validator.error.createSpeciesBatch.batchWeight.invalidValue=Le poids du lot doit être strictement positif
tutti.validator.error.createSpeciesBatch.batchWeight.required=Le poids du lot est obligatoire
1
0
r248 - in trunk: . tutti-service/src/main/java/fr/ifremer/tutti/service tutti-service/src/main/java/fr/ifremer/tutti/service/config tutti-ui-swing tutti-ui-swing/src/main/assembly tutti-ui-swing/src/main/assembly/full tutti-ui-swing/src/main/assembly/min
by tchemit@users.forge.codelutin.com 28 Jan '13
by tchemit@users.forge.codelutin.com 28 Jan '13
28 Jan '13
Author: tchemit
Date: 2013-01-28 12:22:28 +0100 (Mon, 28 Jan 2013)
New Revision: 248
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/248
Log:
refs #1893: [TECH] - Mise ?\195?\160 jour automatique de l'outil
Added:
trunk/tutti-ui-swing/src/main/assembly/full-linux-i586.xml
trunk/tutti-ui-swing/src/main/assembly/full-linux-x64.xml
trunk/tutti-ui-swing/src/main/assembly/full-windows-i586.xml
trunk/tutti-ui-swing/src/main/assembly/full-windows-x64.xml
trunk/tutti-ui-swing/src/main/assembly/full/
trunk/tutti-ui-swing/src/main/assembly/full/README.txt
trunk/tutti-ui-swing/src/main/assembly/full/tutti.bat
trunk/tutti-ui-swing/src/main/assembly/full/tutti.sh
trunk/tutti-ui-swing/src/main/assembly/min/
trunk/tutti-ui-swing/src/main/assembly/min/README.txt
trunk/tutti-ui-swing/src/main/assembly/min/launch.bat
trunk/tutti-ui-swing/src/main/assembly/min/launch.sh
trunk/tutti-ui-swing/src/main/assembly/min/tutti.properties
trunk/tutti-ui-swing/src/main/assembly/min/update-application.properties
trunk/tutti-ui-swing/src/main/assembly/min/update-database.properties
trunk/tutti-ui-swing/src/main/assembly/min/update.bat
trunk/tutti-ui-swing/src/main/assembly/min/update.sh
trunk/tutti-ui-swing/src/main/assembly/min/version.appup
trunk/tutti-ui-swing/src/main/assembly/standalone.xml
trunk/tutti-ui-swing/src/main/assembly/tutti-full-component.xml
Removed:
trunk/tutti-ui-swing/src/main/assembly/bin.xml
trunk/tutti-ui-swing/src/main/assembly/tutti.bat
trunk/tutti-ui-swing/src/main/assembly/tutti.sh
Modified:
trunk/pom.xml
trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java
trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/config/TuttiServiceConfig.java
trunk/tutti-ui-swing/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2013-01-28 11:15:47 UTC (rev 247)
+++ trunk/pom.xml 2013-01-28 11:22:28 UTC (rev 248)
@@ -124,7 +124,7 @@
<!-- libraries version -->
- <nuitonUtilsVersion>2.6.6</nuitonUtilsVersion>
+ <nuitonUtilsVersion>2.6.7-SNAPSHOT</nuitonUtilsVersion>
<nuitonI18nVersion>2.5</nuitonI18nVersion>
<eugenePluginVersion>2.6.1</eugenePluginVersion>
Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java
===================================================================
--- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-01-28 11:15:47 UTC (rev 247)
+++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-01-28 11:22:28 UTC (rev 248)
@@ -48,10 +48,10 @@
import fr.ifremer.tutti.persistence.entities.referential.Vessel;
import fr.ifremer.tutti.persistence.entities.referential.Zone;
import fr.ifremer.tutti.persistence.service.TuttiPersistenceServiceLocator;
+import fr.ifremer.tutti.service.config.TuttiServiceConfig;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.nuiton.util.ApplicationConfig;
import java.io.IOException;
import java.util.List;
@@ -99,9 +99,9 @@
log.info("Open persistence driver " + getImplementationName());
}
- ApplicationConfig config = context.getConfig().getApplicationConfig();
+ TuttiServiceConfig serviceConfig = context.getConfig();
- TuttiPersistenceDevConfig devDriverConfig = new TuttiPersistenceDevConfig(config);
+ TuttiPersistenceDevConfig devDriverConfig = serviceConfig.getDevDriverConfig();
devDriver = new TuttiPersistenceDevImpl(devDriverConfig);
@@ -111,9 +111,22 @@
devDriver.open();
- TuttiPersistenceAdagioConfig driverConfig = new TuttiPersistenceAdagioConfig(config);
+ TuttiPersistenceAdagioConfig driverConfig = serviceConfig.getAdagioDriverConfig();
- if (!driverConfig.getDbDirectory().exists()) {
+ if (driverConfig.isDbExists()) {
+
+ // can use adagio driver
+
+// driverConfig.initConfig(context.getResourceLoader());
+
+ driver = TuttiPersistenceServiceLocator.getPersistenceService();
+
+ if (log.isInfoEnabled()) {
+ log.info("Will open persistence driver " + driver.getImplementationName());
+ }
+ } else {
+
+ // still on dev drvier
if (log.isWarnEnabled()) {
log.warn("--------------------------------------------------------------------");
@@ -125,16 +138,6 @@
}
driver = devDriver;
- } else {
- driverConfig.initConfig(context.getResourceLoader());
-
- // can now instanciate Spring context
-
- driver = TuttiPersistenceServiceLocator.getPersistenceService();
-
- if (log.isInfoEnabled()) {
- log.info("Will open persistence driver " + driver.getImplementationName());
- }
}
Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/config/TuttiServiceConfig.java
===================================================================
--- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/config/TuttiServiceConfig.java 2013-01-28 11:15:47 UTC (rev 247)
+++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/config/TuttiServiceConfig.java 2013-01-28 11:22:28 UTC (rev 248)
@@ -25,6 +25,8 @@
*/
import com.google.common.base.Preconditions;
+import fr.ifremer.tutti.persistence.config.TuttiPersistenceAdagioConfig;
+import fr.ifremer.tutti.persistence.config.TuttiPersistenceDevConfig;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -49,17 +51,31 @@
/** Delegate application config object containing configuration. */
protected final ApplicationConfig applicationConfig;
+ protected final TuttiPersistenceDevConfig devDriverConfig;
+
+ protected final TuttiPersistenceAdagioConfig adagioDriverConfig;
+
public TuttiServiceConfig(ApplicationConfig applicationConfig) {
this.applicationConfig = applicationConfig;
-// applicationConfig.loadDefaultOptions(TuttiServiceConfigOption.values());
+ devDriverConfig = new TuttiPersistenceDevConfig(applicationConfig);
+
+ adagioDriverConfig = new TuttiPersistenceAdagioConfig(applicationConfig);
}
public ApplicationConfig getApplicationConfig() {
return applicationConfig;
}
+ public TuttiPersistenceDevConfig getDevDriverConfig() {
+ return devDriverConfig;
+ }
+
+ public TuttiPersistenceAdagioConfig getAdagioDriverConfig() {
+ return adagioDriverConfig;
+ }
+
/** @return {@link TuttiServiceConfigOption#VERSION} value */
public Version getVersion() {
return applicationConfig.getOptionAsVersion(TuttiServiceConfigOption.VERSION.getKey());
Modified: trunk/tutti-ui-swing/pom.xml
===================================================================
--- trunk/tutti-ui-swing/pom.xml 2013-01-28 11:15:47 UTC (rev 247)
+++ trunk/tutti-ui-swing/pom.xml 2013-01-28 11:22:28 UTC (rev 248)
@@ -68,9 +68,15 @@
</maven.jar.main.class>
<redmine.releaseFiles>
- target/${project.build.finalName}-bin.zip
+ target/${project.build.finalName}-standalone.zip,
+ target/${project.build.finalName}-full-windows-i586.zip,
+ target/${project.build.finalName}-full-windows-x64.zip,
+ target/${project.build.finalName}-full-linux-i586.zip,
+ target/${project.build.finalName}-full-linux-x64.zip
</redmine.releaseFiles>
+ <jreVersion>1.7.10</jreVersion>
+
</properties>
<build>
@@ -234,7 +240,7 @@
<groupId>${project.groupId}</groupId>
<artifactId>tutti-persistence-adagio</artifactId>
<version>${project.version}</version>
- <scope>runtime</scope>
+ <!--<scope>runtime</scope>-->
</dependency>
@@ -367,6 +373,108 @@
<profiles>
<profile>
+ <id>prepare-jre-profile</id>
+ <activation>
+ <property>
+ <name>performRelease</name>
+ <value>true</value>
+ </property>
+ </activation>
+ <build>
+ <defaultGoal>process-compile</defaultGoal>
+ <plugins>
+
+ <!-- get jre distributions and unpack them -->
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>get-linux-i586-jre</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>
+ ${project.build.directory}/jre-linux-i586
+ </outputDirectory>
+ <artifactItems>
+ <artifactItem>
+ <groupId>com.oracle</groupId>
+ <artifactId>jre</artifactId>
+ <version>${jreVersion}</version>
+ <classifier>linux-i586</classifier>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ <execution>
+ <id>get-linux-x64-jre</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>
+ ${project.build.directory}/jre-linux-x64
+ </outputDirectory>
+ <artifactItems>
+ <artifactItem>
+ <groupId>com.oracle</groupId>
+ <artifactId>jre</artifactId>
+ <version>${jreVersion}</version>
+ <classifier>linux-x64</classifier>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ <execution>
+ <id>get-windows-i586-jre</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>
+ ${project.build.directory}/jre-windows-i586
+ </outputDirectory>
+ <artifactItems>
+ <artifactItem>
+ <groupId>com.oracle</groupId>
+ <artifactId>jre</artifactId>
+ <version>${jreVersion}</version>
+ <classifier>windows-i586</classifier>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ <execution>
+ <id>get-windows-x64-jre</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>
+ ${project.build.directory}/jre-windows-x64
+ </outputDirectory>
+ <artifactItems>
+ <artifactItem>
+ <groupId>com.oracle</groupId>
+ <artifactId>jre</artifactId>
+ <version>${jreVersion}</version>
+ <classifier>windows-x64</classifier>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+
+ <profile>
<id>assembly-profile</id>
<activation>
<property>
@@ -377,20 +485,40 @@
<build>
<defaultGoal>package</defaultGoal>
<plugins>
+
+ <!-- create assemblies -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
- <descriptors>
- <descriptor>src/main/assembly/bin.xml</descriptor>
- </descriptors>
<attach>false</attach>
+ <finalName>tutti-${project.version}</finalName>
</configuration>
<executions>
<execution>
+ <id>standalone</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
+ <configuration>
+ <descriptors>
+ <descriptor>
+ src/main/assembly/standalone.xml
+ </descriptor>
+ <descriptor>
+ src/main/assembly/full-linux-i586.xml
+ </descriptor>
+ <!--descriptor>
+ src/main/assembly/full-linux-x64.xml
+ </descriptor>
+ <descriptor>
+ src/main/assembly/full-windows-i586.xml
+ </descriptor>
+ <descriptor>
+ src/main/assembly/full-windows-x64.xml
+ </descriptor-->
+ </descriptors>
+ </configuration>
</execution>
</executions>
</plugin>
Deleted: trunk/tutti-ui-swing/src/main/assembly/bin.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/bin.xml 2013-01-28 11:15:47 UTC (rev 247)
+++ trunk/tutti-ui-swing/src/main/assembly/bin.xml 2013-01-28 11:22:28 UTC (rev 248)
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- #%L
- Tutti :: UI
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2012 Ifremer
- %%
- 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%
- -->
-
-
-<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
- <id>bin</id>
- <formats>
- <format>zip</format>
- </formats>
-
- <files>
- <file>
- <source>target/${project.build.finalName}.${project.packaging}</source>
- </file>
-
- </files>
- <fileSets>
- <fileSet>
- <directory>target/lib</directory>
- <outputDirectory>lib</outputDirectory>
- <includes>
- <include>*.jar</include>
- </includes>
- <excludes>
- <exclude>junit-*.jar</exclude>
- </excludes>
- </fileSet>
- <fileSet>
- <directory>src/main/assembly</directory>
- <outputDirectory />
- <filtered>true</filtered>
- <fileMode>0755</fileMode>
- <includes>
- <include>tutti.sh</include>
- <include>tutti.bat</include>
- </includes>
- </fileSet>
- <fileSet>
- <includes>
- <include>README*</include>
- <include>LICENSE*</include>
- </includes>
- </fileSet>
- </fileSets>
-</assembly>
Property changes on: trunk/tutti-ui-swing/src/main/assembly/full/README.txt
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Property changes on: trunk/tutti-ui-swing/src/main/assembly/full/tutti.bat
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/assembly/full/tutti.sh
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/full/tutti.sh (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/full/tutti.sh 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+export JAVA_COMMAND=`pwd`/jre/bin/java
+
+while true; do
+
+ cp tutti-app/update.sh .
+ ./update.sh
+ (cd tutti-app ; ./launch.sh)
+ exitcode=$?
+ echo "exitCode: $exitcode"
+
+ if [ ! "$exitcode" -eq "88" ]; then
+ # quit now!
+ exit $exitcode
+ fi
+done
\ No newline at end of file
Property changes on: trunk/tutti-ui-swing/src/main/assembly/full/tutti.sh
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/assembly/full-linux-i586.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/full-linux-i586.xml (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/full-linux-i586.xml 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Tutti :: UI
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2012 Ifremer
+ %%
+ 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%
+ -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+
+ <id>full-linux-i586</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <componentDescriptors>
+ <componentDescriptor>
+ src/main/assembly/tutti-full-component.xml
+ </componentDescriptor>
+ </componentDescriptors>
+
+ <fileSets>
+
+ <fileSet>
+ <directory>${project.build.directory}/jre-linux-i586/jre</directory>
+ <outputDirectory>jre</outputDirectory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+
+</assembly>
Property changes on: trunk/tutti-ui-swing/src/main/assembly/full-linux-i586.xml
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/assembly/full-linux-x64.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/full-linux-x64.xml (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/full-linux-x64.xml 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Tutti :: UI
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2012 Ifremer
+ %%
+ 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%
+ -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+
+ <id>full-linux-x64</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <componentDescriptors>
+ <componentDescriptor>
+ src/main/assembly/tutti-full-component.xml
+ </componentDescriptor>
+ </componentDescriptors>
+
+ <fileSets>
+
+ <fileSet>
+ <directory>${project.build.directory}/jre-linux-x64/jre</directory>
+ <outputDirectory>/jre</outputDirectory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+
+</assembly>
Property changes on: trunk/tutti-ui-swing/src/main/assembly/full-linux-x64.xml
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/assembly/full-windows-i586.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/full-windows-i586.xml (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/full-windows-i586.xml 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Tutti :: UI
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2012 Ifremer
+ %%
+ 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%
+ -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+
+ <id>full-windows-i586</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <componentDescriptors>
+ <componentDescriptor>
+ src/main/assembly/tutti-full-component.xml
+ </componentDescriptor>
+ </componentDescriptors>
+
+ <fileSets>
+
+ <fileSet>
+ <directory>${project.build.directory}/jre-windows-i586/jre</directory>
+ <outputDirectory>jre</outputDirectory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+
+</assembly>
Property changes on: trunk/tutti-ui-swing/src/main/assembly/full-windows-i586.xml
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/assembly/full-windows-x64.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/full-windows-x64.xml (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/full-windows-x64.xml 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Tutti :: UI
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2012 Ifremer
+ %%
+ 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%
+ -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+
+ <id>full-windows-x64</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <componentDescriptors>
+ <componentDescriptor>
+ src/main/assembly/tutti-full-component.xml
+ </componentDescriptor>
+ </componentDescriptors>
+
+ <fileSets>
+
+ <fileSet>
+ <directory>${project.build.directory}/jre-windows-x64/jre</directory>
+ <outputDirectory>jre</outputDirectory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+</assembly>
Property changes on: trunk/tutti-ui-swing/src/main/assembly/full-windows-x64.xml
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Property changes on: trunk/tutti-ui-swing/src/main/assembly/min/README.txt
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Copied: trunk/tutti-ui-swing/src/main/assembly/min/launch.bat (from rev 231, trunk/tutti-ui-swing/src/main/assembly/tutti.bat)
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/min/launch.bat (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/min/launch.bat 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,2 @@
+
+java -Xmx1024M -jar ${project.build.finalName}.${project.packaging} %1 %2 %3 %4 %5 %6 %7 %8 %9
Copied: trunk/tutti-ui-swing/src/main/assembly/min/launch.sh (from rev 231, trunk/tutti-ui-swing/src/main/assembly/tutti.sh)
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/min/launch.sh (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/min/launch.sh 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+MEMORY="-Xmx1024M"
+
+echo "java command: $JAVA_COMMAND"
+
+$JAVA_COMMAND $MEMORY -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar ${project.build.finalName}.${project.packaging} $*
+exitcode=$?
+echo "Stop Tutti with exitcode: $exitcode"
+exit $exitcode
Added: trunk/tutti-ui-swing/src/main/assembly/min/tutti.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/min/tutti.properties (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/min/tutti.properties 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,35 @@
+###
+# #%L
+# Tutti :: UI
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2012 - 2013 Ifremer
+# %%
+# 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%
+###
+
+# basedirectory of tutti full application (tutti + jre)
+tutti.application.basedir=..
+
+# directory where tutti database is stored
+tutti.persistence.db.directory=${tutti.application.basedir}/db
+
+# url to update jre and application
+tutti.update.application.url=file://${tutti.application.directory}/update-application.properties
+
+# url to update database
+tutti.update.database.url=file://${tutti.application.directory}/update-database.properties
Property changes on: trunk/tutti-ui-swing/src/main/assembly/min/tutti.properties
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/assembly/min/update-application.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/min/update-application.properties (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/min/update-application.properties 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,34 @@
+###
+# #%L
+# Tutti :: UI
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2012 - 2013 Ifremer
+# %%
+# 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%
+###
+tutti.version=1.1
+tutti.url=zip:file:/tmp/tutti-1.1-standalone.zip
+jre.version=1.7.10
+#linux.amd64.jre.version=1.7.10
+linux.amd64.jre.url=zip:file:~/.m2/repository/com/oracle/jre/1.7.10/jre-1.7.10-linux-x64.jar
+#linux.i386.jre.version=1.7.10
+linux.i386.jre.url=zip:file:~/.m2/repository/com/oracle/jre/1.7.10/jre-1.7.10-linux-i586.jar
+#windows.amd64.jre.version=1.7.10
+windows.amd64.jre.url=zip:file:~/.m2/repository/com/oracle/jre/1.7.10/jre-1.7.10-windows-x64.jar
+#windows.i386.jre.version=1.7.10
+windows.i386.jre.url=zip:file:~/.m2/repository/com/oracle/jre/1.7.10/jre-1.7.10-windows-i586.jar
Property changes on: trunk/tutti-ui-swing/src/main/assembly/min/update-application.properties
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/assembly/min/update-database.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/min/update-database.properties (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/min/update-database.properties 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,25 @@
+###
+# #%L
+# Tutti :: UI
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2012 - 2013 Ifremer
+# %%
+# 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%
+###
+adagiodb.version=1.0
+adagiodb.url=zip:file:/tmp/tutti-1.1-standalone.zip
Property changes on: trunk/tutti-ui-swing/src/main/assembly/min/update-database.properties
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Property changes on: trunk/tutti-ui-swing/src/main/assembly/min/update.bat
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/assembly/min/update.sh
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/min/update.sh (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/min/update.sh 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+if [ -d NEW/tutti-app ]; then
+ oldVersion=`cat tutti-app/version.appup`
+ newVersion=`cat NEW/tutti-app/version.appup`
+ echo "Update tutti version $oldVersion to $newVersion"
+ mkdir OLD
+ backupDate=`date -d %Y-%j`
+ backupdir=OLD/tutti-app-$oldVersion-$backupDate
+ echo "Backup tutti old version to $backupDir"
+ #mv tutti-app $backupDir
+ #mv NEW/tutti-app .
+fi
+
+if [ -d NEW/jre ]; then
+ oldVersion=`cat jre/version.appup`
+ newVersion=`cat NEW/jre/version.appup`
+ echo "Update jre version $oldVersion to $newVersion"
+ mkdir OLD
+ backupDate=`date -d %Y-%j`
+ backupdir=OLD/jre-$oldVersion-$backupDate
+ echo "Backup jre old version to $backupDir"
+ #mv jre $backupDir
+ #mv NEW/jre .
+fi
Property changes on: trunk/tutti-ui-swing/src/main/assembly/min/update.sh
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/tutti-ui-swing/src/main/assembly/min/version.appup
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/min/version.appup (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/min/version.appup 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1 @@
+${project.version}
\ No newline at end of file
Property changes on: trunk/tutti-ui-swing/src/main/assembly/min/version.appup
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Copied: trunk/tutti-ui-swing/src/main/assembly/standalone.xml (from rev 231, trunk/tutti-ui-swing/src/main/assembly/bin.xml)
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/standalone.xml (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/standalone.xml 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Tutti :: UI
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2012 Ifremer
+ %%
+ 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%
+ -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+ <id>standalone</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <fileSets>
+
+ <fileSet>
+ <directory>target</directory>
+ <outputDirectory/>
+ <includes>
+ <include>${project.build.finalName}.${project.packaging}</include>
+ </includes>
+ </fileSet>
+
+ <fileSet>
+ <directory>target/lib</directory>
+ <outputDirectory>lib</outputDirectory>
+ <includes>
+ <include>*.jar</include>
+ </includes>
+ <excludes>
+ <exclude>junit-*.jar</exclude>
+ </excludes>
+ </fileSet>
+
+ <fileSet>
+ <directory>src/main/assembly/min</directory>
+ <outputDirectory/>
+ <filtered>true</filtered>
+ <fileMode>0755</fileMode>
+ <includes>
+ <include>launch.sh</include>
+ <include>launch.bat</include>
+ </includes>
+ </fileSet>
+
+ <fileSet>
+ <includes>
+ <include>README*</include>
+ <include>LICENSE*</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+</assembly>
Added: trunk/tutti-ui-swing/src/main/assembly/tutti-full-component.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/tutti-full-component.xml (rev 0)
+++ trunk/tutti-ui-swing/src/main/assembly/tutti-full-component.xml 2013-01-28 11:22:28 UTC (rev 248)
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Tutti :: UI
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2012 Ifremer
+ %%
+ 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%
+ -->
+
+<component
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/component/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/component/1.1.2 http://maven.apache.org/xsd/component-1.1.2.xsd">
+
+ <fileSets>
+
+ <fileSet>
+ <directory>target</directory>
+ <outputDirectory>tutti-app</outputDirectory>
+ <includes>
+ <include>${project.build.finalName}.${project.packaging}</include>
+ </includes>
+ </fileSet>
+
+ <fileSet>
+ <directory>target/lib</directory>
+ <outputDirectory>tutti-app/lib</outputDirectory>
+ <includes>
+ <include>*.jar</include>
+ </includes>
+ <excludes>
+ <exclude>junit-*.jar</exclude>
+ </excludes>
+ </fileSet>
+
+ <fileSet>
+ <directory>src/main/assembly/min</directory>
+ <outputDirectory>tutti-app</outputDirectory>
+ <filtered>true</filtered>
+ <fileMode>0755</fileMode>
+ <includes>
+ <include>*.sh</include>
+ <include>*.bat</include>
+ </includes>
+ </fileSet>
+
+ <fileSet>
+ <directory>src/main/assembly/min</directory>
+ <outputDirectory>tutti-app</outputDirectory>
+ <filtered>true</filtered>
+ <includes>
+ <include>*</include>
+ </includes>
+ <excludes>
+ <exclude>*.sh</exclude>
+ <exclude>*.bat</exclude>
+ </excludes>
+ </fileSet>
+
+ <fileSet>
+ <directory>src/main/assembly/full</directory>
+ <outputDirectory/>
+ <filtered>true</filtered>
+ <fileMode>0755</fileMode>
+ <includes>
+ <include>tutti.sh</include>
+ <include>tutti.bat</include>
+ <include>README*</include>
+ </includes>
+ </fileSet>
+
+ <fileSet>
+ <includes>
+ <include>LICENSE*</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+</component>
Property changes on: trunk/tutti-ui-swing/src/main/assembly/tutti-full-component.xml
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Deleted: trunk/tutti-ui-swing/src/main/assembly/tutti.bat
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/tutti.bat 2013-01-28 11:15:47 UTC (rev 247)
+++ trunk/tutti-ui-swing/src/main/assembly/tutti.bat 2013-01-28 11:22:28 UTC (rev 248)
@@ -1,2 +0,0 @@
-
-java -Xmx1024M -jar ${project.build.finalName}.${project.packaging} %1 %2 %3 %4 %5 %6 %7 %8 %9
Deleted: trunk/tutti-ui-swing/src/main/assembly/tutti.sh
===================================================================
--- trunk/tutti-ui-swing/src/main/assembly/tutti.sh 2013-01-28 11:15:47 UTC (rev 247)
+++ trunk/tutti-ui-swing/src/main/assembly/tutti.sh 2013-01-28 11:22:28 UTC (rev 248)
@@ -1,5 +0,0 @@
-#!/bin/bash
-
-MEMORY="-Xmx1024M"
-
-java $MEMORY -jar ${project.build.finalName}.${project.packaging} $*
1
0
28 Jan '13
Author: tchemit
Date: 2013-01-28 12:15:47 +0100 (Mon, 28 Jan 2013)
New Revision: 247
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/247
Log:
refs #1874: [IMP/EXP] - Synchronisation de r?\195?\169f?\195?\169rentiel
Added:
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelper.java
trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelperTest.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeResult.java
Removed:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TableToSynchronize.java
Modified:
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfig.java
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfigOption.java
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImpl.java
trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseResource.java
trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImplTest.java
trunk/tutti-persistence-adagio/src/test/resources/log4j.properties
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeService.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiDatabaseMetadata.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiTable.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiTableMetadata.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -35,14 +35,18 @@
import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.hibernate.cfg.Environment;
import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
/**
* Usefull method around tutti entities.
@@ -111,16 +115,41 @@
statement.close();
}
} catch (AbstractMethodError e) {
- if (log.isWarnEnabled()) {
- log.warn("Fix this linkage error, damned spring :(");
+ if (log.isDebugEnabled()) {
+ log.debug("Fix this linkage error, damned hsqlsb 1.8.0.7:(");
}
- } catch (SQLException e) {
+ } catch (IllegalAccessError e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Fix this IllegalAccessError error, damned hsqlsb 1.8.0.7:(");
+ }
+ } catch (Exception e) {
if (log.isErrorEnabled()) {
log.error("Could not close statement, but do not care", e);
}
}
}
+ public static void closeSilently(ResultSet statement) {
+ try {
+ if (statement != null && !statement.isClosed()) {
+
+ statement.close();
+ }
+ } catch (AbstractMethodError e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Fix this linkage error, damned hsqlsb 1.8.0.7:(");
+ }
+ } catch (IllegalAccessError e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Fix this IllegalAccessError error, damned hsqlsb 1.8.0.7:(");
+ }
+ } catch (Exception e) {
+ if (log.isErrorEnabled()) {
+ log.error("Could not close statement, but do not care", e);
+ }
+ }
+ }
+
public static void closeSilently(Connection connection) {
try {
if (connection != null && !connection.isClosed()) {
@@ -135,6 +164,29 @@
}
}
+
+ public static Connection createConnection(Properties connectionProperties) throws SQLException {
+ return createConnection(
+ connectionProperties.getProperty(Environment.URL),
+ connectionProperties.getProperty(Environment.USER),
+ connectionProperties.getProperty(Environment.PASS)
+ );
+ }
+
+ public static String getUrl(Properties connectionProperties) {
+ return connectionProperties.getProperty(Environment.URL);
+ }
+
+ public static Connection createConnection(String jdbcUrl,
+ String user,
+ String password) throws SQLException {
+ Connection connection = DriverManager.getConnection(jdbcUrl,
+ user,
+ password);
+ connection.setAutoCommit(false);
+ return connection;
+ }
+
protected static class IdPredicate<B extends IdAware> implements Predicate<B> {
private final String id;
Added: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeResult.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeResult.java (rev 0)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeResult.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -0,0 +1,111 @@
+package fr.ifremer.tutti.persistence.service.synchro;
+
+/*
+ * #%L
+ * Tutti :: Persistence API
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 Ifremer
+ * %%
+ * 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.collect.HashMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
+
+import java.util.Collection;
+import java.util.Set;
+
+/**
+ * Result of a referential synchronize operation.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 1.0
+ */
+public class ReferentialSynchronizeResult {
+
+ protected Exception error;
+
+ protected final Multimap<String, String> inserts = HashMultimap.create();
+
+ protected final Multimap<String, String> updates = HashMultimap.create();
+
+ protected final Set<String> tableNames = Sets.newHashSet();
+
+ protected final String localUrl;
+
+ protected final String remoteUrl;
+
+ public ReferentialSynchronizeResult(String localUrl, String remoteUrl) {
+ this.localUrl = localUrl;
+ this.remoteUrl = remoteUrl;
+ }
+
+ public boolean isSuccess() {
+ return error == null;
+ }
+
+ public Exception getError() {
+ return error;
+ }
+
+ public void setError(Exception error) {
+ this.error = error;
+ }
+
+ public Set<String> getTableNames() {
+ return ImmutableSet.copyOf(tableNames);
+ }
+
+ public Collection<String> getInserts(String tableName) {
+ return inserts.get(tableName);
+ }
+
+ public Collection<String> getUpdates(String tableName) {
+ return updates.get(tableName);
+ }
+
+ public int getNbInserts(String tableName) {
+ return getInserts(tableName).size();
+ }
+
+ public int getNbUpdates(String tableName) {
+ return getUpdates(tableName).size();
+ }
+
+ public void addUpdate(String tableName, String pkAsString) {
+ updates.put(tableName, pkAsString);
+ }
+
+ public void addInsert(String tableName, String pkAsString) {
+ inserts.put(tableName, pkAsString);
+ }
+
+ public void addTableName(String tableName) {
+ tableNames.add(tableName);
+ }
+
+ public String getLocalUrl() {
+ return localUrl;
+ }
+
+ public String getRemoteUrl() {
+ return remoteUrl;
+ }
+}
Property changes on: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeResult.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeService.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeService.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeService.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -25,141 +25,42 @@
*/
import org.hibernate.dialect.Dialect;
-import org.springframework.dao.DataRetrievalFailureException;
+import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
+import java.util.Properties;
/**
- * Servide to synchronize referential.
+ * Service to synchronize referential.
*
* @author tchemit <chemit(a)codelutin.com>
* @since 1.0
*/
-@Transactional(readOnly = true)
+@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public interface ReferentialSynchronizeService {
/**
- * Load the internal datasource schema to synchronize.
+ * Get the db connexion informations for the internal data source.
*
- * @return the internal datasource schema
- * @see TuttiTableMetadata
+ * @return the db connexion for the internal data source
*/
- TuttiDatabaseMetadata loadInternalDb();
+ Properties getLocalConnectionProperties();
/**
- * Load the datasource schema for the given connectionand internla dialect.
+ * Gets the dialect used by the local database.
*
- * @param connection connection of the data source
- * @return the datasource schema
+ * @return the dialect used by the local database.
*/
- TuttiDatabaseMetadata loadExternalDb(Connection connection);
+ Dialect getLocalDialect();
/**
- * Load the datasource schema for the given connection and dialect.
+ * Launch the synchronize operation from the local data database supported
+ * by this service.
*
- * @param connection connection of the data source
- * @param dialect dialect to use
- * @return the datasource schema
+ * @param remoteConnectionProperties connection properties of the remote
+ * database used to synchronize referential
+ * @return result of the operation
+ * @see ReferentialSynchronizeResult
*/
- TuttiDatabaseMetadata loadExternalDb(Connection connection,
- Dialect dialect);
-
- /**
- * Check that the tow given datasource shemas are compatible for a
- * synchronize operation (same tables with same columns).
- * <p/>
- * If schemas are incompatible, then a
- * {@link DataRetrievalFailureException} exception will be thrown.
- *
- * @param schema1 schema 1 to check
- * @param schema2 schema 2 to check
- */
- void checkSchemas(TuttiDatabaseMetadata schema1,
- TuttiDatabaseMetadata schema2);
-
- /**
- * Gets the internal data source dialect.
- *
- * @return the dialect used by internal datasource.
- */
- Dialect getInternalDialect();
-
- /**
- * Gets the min updateDate for the internal datasource.
- *
- * @param schema the db schema
- * @return the last update date of the given table, or {@code null}
- * if table does not use a updateDate columns or if there
- * is no data in table.
- */
- Date getMinUpdateDate(TuttiDatabaseMetadata schema) throws SQLException;
-
- /**
- * Gets the min updateDate for the given datasource.
- *
- * @param connection connection to data source to query
- * @param schema the db schema
- * @return the last update date of the given table, or {@code null}
- * if table does not use a updateDate columns or if there
- * is no data in table.
- */
- Date getMinUpdateDate(Connection connection,
- TuttiDatabaseMetadata schema) throws SQLException;
-
- /**
- * Gets the last updateDate for the given {@code table} of the internal datasource.
- *
- * @param table the table to query
- * @param schema the db schema
- * @return the last update date of the given table, or {@code null}
- * if table does not use a updateDate columns or if there
- * is no data in table.
- */
- //TODO Make sure a new transaction is not created at each invoaction
- Date getLastUpdateDate(TableToSynchronize table,
- TuttiDatabaseMetadata schema) throws SQLException;
-
- /**
- * Gets the last updateDate for the given {@code table} using
- * the given datasource
- *
- * @param connection connection to data source to query
- * @param table the table to query
- * @param schema the db schema
- * @return the last update date of the given table, or {@code null}
- * if table does not use a updateDate columns or if there
- * is no data in table.
- */
- Date getLastUpdateDate(Connection connection,
- TableToSynchronize table,
- TuttiDatabaseMetadata schema) throws SQLException;
-
- List<Object[]> getDataToUpdate(TableToSynchronize table,
- TuttiDatabaseMetadata schema, Date fromDate) throws SQLException;
-
- List<Object[]> getDataToUpdate(Connection connection, TableToSynchronize table,
- TuttiDatabaseMetadata schema, Date fromDate) throws SQLException;
-
- Set<String> getExistingIds(TableToSynchronize table,
- TuttiDatabaseMetadata schema) throws SQLException;
-
- Set<String> getExistingIds(Connection connection,
- TableToSynchronize table,
- TuttiDatabaseMetadata schema) throws SQLException;
-
- void updateTable(TableToSynchronize table,
- TuttiDatabaseMetadata schema,
- Set<String> existingIds,
- List<Object[]> incomingData ) throws SQLException;
-
- void updateTable(Connection connection,
- TableToSynchronize table,
- TuttiDatabaseMetadata schema,
- Set<String> existingIds,
- List<Object[]> incomingData ) throws SQLException;
+ ReferentialSynchronizeResult synchronize(Properties remoteConnectionProperties);
}
Deleted: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TableToSynchronize.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TableToSynchronize.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TableToSynchronize.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -1,118 +0,0 @@
-package fr.ifremer.tutti.persistence.service.synchro;
-
-/*
- * #%L
- * Tutti :: Persistence API
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 - 2013 Ifremer
- * %%
- * 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 org.hibernate.tool.hbm2ddl.ColumnMetadata;
-
-import java.io.Serializable;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.Date;
-
-/**
- * Define a table to synch.
- *
- * @author tchemit <chemit(a)codelutin.com>
- * @since 1.0
- */
-public class TableToSynchronize implements Serializable {
-
- public static final String PK_ID = "id";
-
- public static final String PK_CODE = "code";
-
- public static final String UPDATE_DATE = "updateDate";
-
- private static final long serialVersionUID = 1L;
-
- public static TableToSynchronize newCode(String tableName) {
- return newCode(tableName, true);
- }
-
- public static TableToSynchronize newCode(String tableName, boolean updatable) {
- return new TableToSynchronize(tableName, PK_CODE, updatable);
- }
-
- public static TableToSynchronize newId(String tableName) {
- return newId(tableName, true);
- }
-
- public static TableToSynchronize newId(String tableName, boolean updatable) {
- return new TableToSynchronize(tableName, PK_ID, updatable);
- }
-
- /**
- * Name of the table.
- *
- * @since 1.0
- */
- protected final String tableName;
-
- /**
- * Name of the column which acts as primary key.
- *
- * @since 1.0
- */
- protected final String pkColumnName;
-
- /**
- * Optional restrict condition to add on query to select data to synchronize.
- *
- * @since 1.0
- */
- protected final boolean withUpdateColumn;
-
- public TableToSynchronize(String tableName,
- String pkColumnName,
- boolean withUpdateColumn) {
- this.tableName = tableName;
- this.pkColumnName = pkColumnName;
- this.withUpdateColumn = withUpdateColumn;
- }
-
- public void addRestrictFilter(PreparedStatement statement,
- TuttiTableMetadata meta,
- Date date) throws SQLException {
- ColumnMetadata updateDate = meta.getColumnMetadata(UPDATE_DATE);
- if (updateDate != null) {
-
- // can add a filteron updateDate column
- int columnsCount = meta.getColumnsCount();
- statement.setDate(columnsCount + 1, new java.sql.Date(date.getTime()));
- }
- }
-
- public String getTableName() {
- return tableName;
- }
-
- public String getPkColumnName() {
- return pkColumnName;
- }
-
- public boolean isWithUpdateColumn() {
- return withUpdateColumn;
- }
-}
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiDatabaseMetadata.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiDatabaseMetadata.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiDatabaseMetadata.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -34,6 +34,7 @@
import org.hibernate.tool.hbm2ddl.TableMetadata;
import java.sql.Connection;
+import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Map;
@@ -51,11 +52,14 @@
protected Map<String, TuttiTableMetadata> tables;
+ protected DatabaseMetaData meta;
+
public TuttiDatabaseMetadata(Connection connection, Dialect dialect) {
Preconditions.checkNotNull(connection);
Preconditions.checkNotNull(dialect);
try {
this.delegate = new DatabaseMetadata(connection, dialect, true);
+ this.meta = connection.getMetaData();
} catch (SQLException e) {
throw new RuntimeException(
"Could not init database meta on connection " + connection, e);
@@ -87,10 +91,11 @@
TuttiTableMetadata tuttiTableMetadata = tables.get(key);
if (tuttiTableMetadata == null) {
- TableMetadata tableMetadata = delegate.getTableMetadata(name, schema, catalog, isQuoted);
+ TableMetadata tableMetadata = delegate.getTableMetadata(
+ name, schema, catalog, isQuoted);
Preconditions.checkNotNull(tableMetadata,
"Could not find db table " + name);
- tuttiTableMetadata = new TuttiTableMetadata(tableMetadata);
+ tuttiTableMetadata = new TuttiTableMetadata(tableMetadata, meta);
Preconditions.checkNotNull(tuttiTableMetadata,
"Could not find db table " + name);
tables.put(key, tuttiTableMetadata);
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiTable.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiTable.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiTable.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -31,15 +31,15 @@
* @since 1.0
*/
public enum TuttiTable {
- STATUS(TableToSynchronize.newCode("STATUS", false)),
- QUALITY_FLAG(TableToSynchronize.newCode("QUALITY_FLAG", false)),
+ STATUS,
+ QUALITY_FLAG,
// PMFM
UNIT,
AGGREGATION_LEVEL,
PARAMETER_GROUP,
- QUALITATIVE_VALUE(false),
- PARAMETER(TableToSynchronize.newCode("PARAMETER")),
+ QUALITATIVE_VALUE,
+ PARAMETER,
MATRIX,
FRACTION,
METHOD,
@@ -58,12 +58,12 @@
//TODO Association LOCATIONHierarchyException(TableToSynchronize.newId("LOCATIONHierarchyException")),
// TAXON
- TAXONOMIC_LEVEL(TableToSynchronize.newCode("TAXONOMIC_LEVEL")),
+ TAXONOMIC_LEVEL,
REFERENCE_TAXON,
TAXON_NAME,
// TAXON GROUP
- TAXON_GROUP_TYPE(TableToSynchronize.newCode("TAXON_GROUP_TYPE")),
+ TAXON_GROUP_TYPE,
TAXON_GROUP,
// CONVERSION
@@ -74,7 +74,7 @@
VESSEL_TYPE,
//TODO Association VESSEL_REGISTRATION_PERIOD(false),
// VESSEL_FLEET_EVENT,
- VESSEL(TableToSynchronize.newCode("VESSEL")),
+ VESSEL,
// FEATURES
GEAR_PHYSICAL_FEATURES,
@@ -83,23 +83,5 @@
USER_PROFIL,
DEPARTMENT,
PERSON,
- ;
- private final TableToSynchronize meta;
-
- private TuttiTable() {
- this(true);
- }
-
- private TuttiTable(boolean updatable) {
- this.meta = TableToSynchronize.newId(name(), updatable);
- }
-
- private TuttiTable(TableToSynchronize meta) {
- this.meta = meta;
- }
-
- public TableToSynchronize getMeta() {
- return meta;
- }
}
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiTableMetadata.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiTableMetadata.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/TuttiTableMetadata.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -24,8 +24,12 @@
* #L%
*/
+import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
+import fr.ifremer.tutti.persistence.entities.TuttiEntities;
+import org.apache.commons.collections.CollectionUtils;
import org.hibernate.mapping.ForeignKey;
import org.hibernate.tool.hbm2ddl.ColumnMetadata;
import org.hibernate.tool.hbm2ddl.ForeignKeyMetadata;
@@ -33,35 +37,115 @@
import org.hibernate.tool.hbm2ddl.TableMetadata;
import java.lang.reflect.Field;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
import java.util.Map;
+import java.util.Set;
import java.util.SortedSet;
/**
- * TODO
+ * Overrides of the {@link TableMetadata} with some improvements:
+ * <ul>
+ * <li>Obtains number of columns via {@link #getColumnsCount()}</li>
+ * <li>Obtains all columns names available via {@link #getColumnNames()}</li>
+ * <li>Obtains primary key column names via {@link #getPkNames()}</li>
+ * <li>Is table a association table via {@link #isAssociationTable()}</li>
+ * </ul>
+ * <p/>
+ * And others methods used to synchronize referentials:
+ * <p/>
+ * <ul>
+ * <li>Obtains query to get all existing ids: {@link #getGetExistingIdsQuery()}</li>
+ * <li>Obtains query to update a row of the table (column names order is the one introduced by method {@link #getColumnNames()}: {@link #getUpdateQuery()}</li>
+ * <li>Obtains query to insert a row in the table (column names order is the one introduced by method {@link #getColumnNames()}: {@link #getInsertQuery()}</li>
+ * <li>Obtains query to get max update date (only if {@link #isWithUpdateDateColumn()} ()}: {@link #getGetMaxUpdateDateQuery()}</li>
+ * </ul>
*
* @author tchemit <chemit(a)codelutin.com>
- * @since TODO
+ * @since 1.0
*/
public class TuttiTableMetadata {
+ protected static final String QUERY_SELECT_MAX_UPDATE = "SELECT max(update_date) FROM %s";
+
+ protected static final String QUERY_SELECT_IDS = "SELECT %s FROM %s";
+
+ protected static final String QUERY_INSERT = "INSERT INTO %s (%s) VALUES (%s)";
+
+ protected static final String QUERY_UPDATE = "UPDATE %s SET %s WHERE %s = ?";
+
protected final TableMetadata delegate;
- protected Map<String, ColumnMetadata> columns;
+ protected final Map<String, ColumnMetadata> columns;
- public TuttiTableMetadata(TableMetadata delegate) {
+ protected final String getExistingIdsQuery;
+ protected final String insertQuery;
+
+ protected final String updateQuery;
+
+ protected final Set<String> pkNames;
+
+ protected final boolean withUpdateDateColumn;
+
+ protected final int pkIndex;
+
+ private final String getMaxUpdateDateQuery;
+
+ public TuttiTableMetadata(TableMetadata delegate,
+ DatabaseMetaData meta) {
+
Preconditions.checkNotNull(delegate);
this.delegate = delegate;
try {
Field field = TableMetadata.class.getDeclaredField("columns");
field.setAccessible(true);
- columns = (Map) field.get(delegate);
+ this.columns = (Map) field.get(delegate);
+ this.withUpdateDateColumn = columns.containsKey("update_date");
+ this.pkNames = initPrimaryKeys(meta);
+ Preconditions.checkNotNull(pkNames);
+
+ this.pkIndex = createPkIndex();
+ this.insertQuery = createInsertQuery();
+ this.updateQuery = createUpdateQuery();
+ this.getMaxUpdateDateQuery = createMaxUpdateDateQuery();
+
+ this.getExistingIdsQuery = String.format(QUERY_SELECT_IDS, Joiner.on(',').join(pkNames), getName());
} catch (Exception e) {
throw new RuntimeException("Could not init " + this, e);
}
}
+ public int getPkIndex() {
+ return pkIndex;
+ }
+
+ public boolean isAssociationTable() {
+ return CollectionUtils.isEmpty(pkNames);
+ }
+
+ public String getInsertQuery() {
+ return insertQuery;
+ }
+
+ public String getUpdateQuery() {
+ return updateQuery;
+ }
+
+ public String getGetExistingIdsQuery() {
+ return getExistingIdsQuery;
+ }
+
+ public String getGetMaxUpdateDateQuery() {
+ return getMaxUpdateDateQuery;
+ }
+
+ public boolean isWithUpdateDateColumn() {
+ return withUpdateDateColumn;
+ }
+
public int getColumnsCount() {
return columns.size();
}
@@ -97,4 +181,92 @@
public IndexMetadata getIndexMetadata(String indexName) {
return delegate.getIndexMetadata(indexName);
}
+
+ public Set<String> getPkNames() {
+ return pkNames;
+ }
+
+ protected Set<String> initPrimaryKeys(DatabaseMetaData meta) throws SQLException {
+
+ Set<String> result = Sets.newHashSet();
+ ResultSet rs = meta.getPrimaryKeys(getCatalog(), getSchema(), getName());
+ try {
+
+ while (rs.next()) {
+ result.add(rs.getString("COLUMN_NAME"));
+ }
+ rs.close();
+ return ImmutableSet.copyOf(result);
+ } finally {
+ TuttiEntities.closeSilently(rs);
+ }
+ }
+
+ protected String createInsertQuery() {
+
+
+ StringBuilder queryParams = new StringBuilder();
+ StringBuilder valueParams = new StringBuilder();
+
+ for (String columnName : getColumnNames()) {
+ queryParams.append(", ").append(columnName);
+ valueParams.append(", ?");
+ }
+
+ String result = String.format(QUERY_INSERT,
+ getName(),
+ queryParams.substring(2),
+ valueParams.substring(2));
+ return result;
+ }
+
+ protected String createUpdateQuery() {
+
+ String result = null;
+
+ if (!isAssociationTable()) {
+
+ StringBuilder updateParams = new StringBuilder();
+
+ for (String columnName : getColumnNames()) {
+ updateParams.append(", ").append(columnName).append(" = ?");
+ }
+
+ String pkColumnName = pkNames.iterator().next();
+
+ result = String.format(QUERY_UPDATE,
+ getName(),
+ updateParams.substring(2),
+ pkColumnName);
+ }
+ return result;
+ }
+
+ protected int createPkIndex() {
+
+ int result = -1;
+
+ if (!isAssociationTable()) {
+ String pkColumnName = pkNames.iterator().next().toLowerCase();
+
+ int i = 1;
+
+ for (String columnName : getColumnNames()) {
+ if (pkColumnName.equals(columnName)) {
+ result = i;
+ } else {
+ i++;
+ }
+ }
+ }
+
+ return result;
+ }
+
+
+ protected String createMaxUpdateDateQuery() {
+ String result = String.format(QUERY_SELECT_MAX_UPDATE, getName());
+ return result;
+ }
+
}
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfig.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfig.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfig.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -111,6 +111,11 @@
return config.getOptionAsFile(TuttiPersistenceAdagioConfigOption.DB_NAME.getKey());
}
+ public boolean isDbExists() {
+ File f = new File(getDbDirectory(), getDbName() + ".data");
+ return f.exists();
+ }
+
public File getDbEnumerationPath() {
return config.getOptionAsFile(TuttiPersistenceAdagioConfigOption.DB_ENUMERATION_PATH.getKey());
}
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfigOption.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfigOption.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfigOption.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -38,21 +38,30 @@
*/
public enum TuttiPersistenceAdagioConfigOption implements ApplicationConfig.OptionDef {
+ DB_DIRECTORY(
+ "tutti.persistence.db.directory",
+ "Répertoire où est la base de données",
+ "${tutti.data.directory}/db",
+ File.class,
+ true,
+ true),
+
DB_CONFIGURATION_PATH(
"tutti.persistence.db.configurationPath",
"Chemin du fichier de configuration d'Adagio",
- "${tutti.data.directory}/conf.properties",
+ "${tutti.persistence.db.directory}/conf.properties",
File.class,
true,
true),
- DB_DIRECTORY(
- "tutti.persistence.db.directory",
- "Répertoire où est la base de données",
- "${tutti.data.directory}/db",
+ DB_ENUMERATION_PATH(
+ "tutti.persistence.db.enumerationPath",
+ "Chemin du fichier de correspondance des constantes",
+ "${tutti.persistence.db.directory}/enumerations-v3.properties",
File.class,
true,
true),
+
DB_NAME(
"tutti.persistence.db.name",
"Nom du fichier de la base de données",
@@ -60,13 +69,7 @@
String.class,
true,
true),
- DB_ENUMERATION_PATH(
- "tutti.persistence.db.enumerationPath",
- "Chemin du fichier de correspondance des constantes",
- "${tutti.data.directory}/enumerations-v3.properties",
- File.class,
- true,
- true),
+
JDBC_USERNAME(
"tutti.persistence.jdbc.username",
"Login de l'utilisateur pour se connecter à la base de données",
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -82,7 +82,6 @@
protected Iterator<Object[]> queryList(String queryName, Object... params) {
Query query = createQuery(queryName, params);
-
Iterator result = query.iterate();
return result;
}
@@ -90,7 +89,6 @@
protected <T> Iterator<T> queryListTyped(String queryName, Object... params) {
Query query = createQuery(queryName, params);
-
Iterator result = query.iterate();
return result;
}
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -109,12 +109,12 @@
ProtocolPersistenceService.class);
}
- public static void close() {
- instance().shutdown();
- }
-
public static ReferentialSynchronizeService getReferentialSynchronizeService() {
return instance().getService("referentialSynchronizeService",
ReferentialSynchronizeService.class);
}
+
+ public static void close() {
+ instance().shutdown();
+ }
}
Added: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelper.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelper.java (rev 0)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelper.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -0,0 +1,392 @@
+package fr.ifremer.tutti.persistence.service.synchro;
+
+/*
+ * #%L
+ * Tutti :: Persistence Adagio (impl)
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 Ifremer
+ * %%
+ * 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.collect.Sets;
+import fr.ifremer.tutti.persistence.entities.TuttiEntities;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.tool.hbm2ddl.ColumnMetadata;
+import org.springframework.dao.DataRetrievalFailureException;
+import org.springframework.jdbc.support.JdbcUtils;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Date;
+import java.util.Properties;
+import java.util.Set;
+import java.util.SortedSet;
+
+/**
+ * Helper to synchronize referential between two databases.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 1.0
+ */
+public class ReferentialSynchronizeHelper {
+
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(ReferentialSynchronizeHelper.class);
+
+ /**
+ * Synchronize database given from {@code localProperties} (means the
+ * database to update) with remote database (means the database which
+ * contains the referential to use) given by {@code remoteProperties}
+ * using the given {@code dialect} to inspect databases metadatas.
+ *
+ * @param localProperties properties to connect to local database
+ * @param remoteProperties properties to connect to remove database
+ * @param dialect dialect used to seek metadata of databases.
+ * @return Result of the synchronize operation, if there is an error then
+ * the {@link ReferentialSynchronizeResult#isSuccess()} is {@code false}
+ * and you can get the error at
+ * {@link ReferentialSynchronizeResult#getError()}
+ */
+ public ReferentialSynchronizeResult synchronize(Properties localProperties,
+ Properties remoteProperties,
+ Dialect dialect) {
+
+ ReferentialSynchronizeResult result = new ReferentialSynchronizeResult(
+ TuttiEntities.getUrl(localProperties),
+ TuttiEntities.getUrl(remoteProperties));
+
+ Connection targetConnection = null;
+ Connection synchConnection = null;
+ try {
+
+ // create local connection
+ targetConnection = TuttiEntities.createConnection(localProperties);
+
+ // create remote Connection
+ synchConnection = TuttiEntities.createConnection(remoteProperties);
+
+
+ // load metas
+ TuttiDatabaseMetadata targetMeta = loadDatabaseMetadata(targetConnection, dialect);
+ TuttiDatabaseMetadata synchMeta = loadDatabaseMetadata(synchConnection, dialect);
+
+ // check schema
+ try {
+ checkSchemas(targetMeta, synchMeta);
+ } catch (DataRetrievalFailureException e) {
+ result.setError(e);
+ }
+
+ if (result.isSuccess()) {
+
+ // prepare target (desactivate constraints)
+ prepareSynch(targetConnection);
+
+ try {
+
+ for (TuttiTable tuttiTable : TuttiTable.values()) {
+
+ synchronizeTable(tuttiTable,
+ synchMeta,
+ targetConnection,
+ synchConnection,
+ result);
+ }
+ } finally {
+ releaseSynch(synchConnection);
+ }
+
+ targetConnection.commit();
+ }
+ } catch (SQLException e) {
+ try {
+ targetConnection.rollback();
+ } catch (SQLException e1) {
+
+ // ignore the rolback error
+ }
+ result.setError(e);
+ } finally {
+ JdbcUtils.closeConnection(synchConnection);
+ JdbcUtils.closeConnection(targetConnection);
+ }
+ return result;
+ }
+
+ /**
+ * Load the datasource schema for the given connection and dialect.
+ *
+ * @param connection connection of the data source
+ * @param dialect dialect to use
+ * @return the datasource schema
+ */
+ public TuttiDatabaseMetadata loadDatabaseMetadata(Connection connection,
+ Dialect dialect) {
+ TuttiDatabaseMetadata result = new TuttiDatabaseMetadata(connection, dialect);
+ for (TuttiTable tuttiTable : TuttiTable.values()) {
+
+ String tableName = tuttiTable.name();
+ if (log.isDebugEnabled()) {
+ log.debug("Load metas of table: " + tableName);
+ }
+ result.getTable(tableName);
+ }
+ return result;
+ }
+
+ /**
+ * Check that the tow given datasource shemas are compatible for a
+ * synchronize operation (same tables with same columns).
+ * <p/>
+ * If schemas are incompatible, then a
+ * {@link DataRetrievalFailureException} exception will be thrown.
+ *
+ * @param schema1 schema 1 to check
+ * @param schema2 schema 2 to check
+ */
+ public void checkSchemas(TuttiDatabaseMetadata schema1,
+ TuttiDatabaseMetadata schema2) {
+ Set<String> internalSchemaTableNames = schema1.getTableNames();
+ Set<String> externalSchemaTableNames = schema2.getTableNames();
+ if (!internalSchemaTableNames.equals(externalSchemaTableNames)) {
+ throw new DataRetrievalFailureException("Incompatible schemas");
+ }
+ for (String tableName : internalSchemaTableNames) {
+ TuttiTableMetadata internalTable = schema1.getTable(tableName);
+ TuttiTableMetadata externalTable = schema2.getTable(tableName);
+ Set<String> internalColumnNames = internalTable.getColumnNames();
+ Set<String> externalColumnNames = externalTable.getColumnNames();
+ if (!internalColumnNames.equals(externalColumnNames)) {
+ throw new DataRetrievalFailureException("Incompatible schema of table: " + tableName);
+ }
+ for (String columnName : internalColumnNames) {
+ ColumnMetadata internalColumn = internalTable.getColumnMetadata(columnName);
+ ColumnMetadata externalColumn = externalTable.getColumnMetadata(columnName);
+ String internalColumnTypeName = internalColumn.getTypeName();
+ String externalColumnTypeName = externalColumn.getTypeName();
+ if (!internalColumnTypeName.equals(externalColumnTypeName)) {
+ throw new DataRetrievalFailureException("Incompatible column type of table / column: " + tableName + " / " + columnName);
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets the last updateDate for the given {@code table} using
+ * the given datasource
+ *
+ * @param connection connection to data source to query
+ * @param table the table to query
+ * @return the last update date of the given table, or {@code null}
+ * if table does not use a updateDate columns or if there
+ * is no data in table.
+ */
+ public Date getLastUpdateDate(Connection connection,
+ TuttiTableMetadata table) throws SQLException {
+ Date result = null;
+
+ if (table.isWithUpdateDateColumn()) {
+
+ String sql = table.getGetMaxUpdateDateQuery();
+
+ PreparedStatement statement = connection.prepareStatement(sql);
+ try {
+ ResultSet resultSet = statement.executeQuery();
+ if (resultSet.next()) {
+ result = resultSet.getDate(1);
+ }
+ statement.close();
+ } finally {
+ TuttiEntities.closeSilently(statement);
+ }
+ }
+ return result;
+ }
+
+ public ResultSet getDataToUpdate(Connection connection,
+ TuttiTableMetadata table,
+ Date fromDate) throws SQLException {
+
+ SortedSet<String> columnNames = table.getColumnNames();
+ StringBuilder queryParams = new StringBuilder("");
+ for (String columnName : columnNames) {
+ queryParams.append(", ").append(columnName);
+ }
+ StringBuilder query = new StringBuilder("SELECT ");
+ query.append(queryParams.substring(2));
+ query.append(" FROM ").append(table.getName());
+
+ if (table.isWithUpdateDateColumn()) {
+
+ // add a filter
+ query.append(" WHERE update_date >= ?");
+ }
+ String sql = query.toString();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Query: " + sql);
+ }
+ PreparedStatement statement = connection.prepareStatement(sql);
+ if (table.isWithUpdateDateColumn()) {
+ statement.setDate(1, new java.sql.Date(fromDate.getTime()));
+ }
+
+ ResultSet result = statement.executeQuery();
+ return result;
+ }
+
+ public Set<String> getExistingIds(Connection connection,
+ TuttiTableMetadata table) throws SQLException {
+
+ String sql = table.getGetExistingIdsQuery();
+
+ PreparedStatement statement = connection.prepareStatement(sql);
+
+ Set<String> result = Sets.newHashSet();
+ try {
+ ResultSet resultSet = statement.executeQuery();
+ while (resultSet.next()) {
+ result.add(String.valueOf(resultSet.getObject(1)));
+ }
+ statement.close();
+ return result;
+ } finally {
+ TuttiEntities.closeSilently(statement);
+ }
+ }
+
+ public void updateTable(Connection connection,
+ TuttiTableMetadata table,
+ Set<String> existingIds,
+ ResultSet incomingData,
+ ReferentialSynchronizeResult result) throws SQLException {
+
+ int columnCount = table.getColumnsCount();
+
+
+ String tableName = table.getName();
+
+ int pkIndex = table.getPkIndex();
+
+ String insertSql = table.getInsertQuery();
+ String updateSql = table.getUpdateQuery();
+
+ PreparedStatement insertStatement = connection.prepareStatement(insertSql);
+ PreparedStatement updateStatement = connection.prepareStatement(updateSql);
+
+ result.addTableName(tableName);
+
+ do {
+
+ Object pk = incomingData.getObject(pkIndex);
+
+ String pkAsString = String.valueOf(pk);
+ PreparedStatement statement;
+ String sql;
+
+ boolean doUpdate = existingIds.contains(pkAsString);
+ if (doUpdate) {
+
+ // use update query
+ statement = updateStatement;
+ sql = updateSql;
+
+ result.addUpdate(tableName, pkAsString);
+ } else {
+
+ // use insert query
+ sql = insertSql;
+ statement = insertStatement;
+ result.addInsert(tableName, pkAsString);
+ }
+
+ for (int c = 1; c <= columnCount; c++) {
+ statement.setObject(c, incomingData.getObject(c));
+ }
+
+ if (doUpdate) {
+ statement.setObject(columnCount + 1, pk);
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("[%s] Execute query %s (pk:%s)", tableName, sql, pkAsString));
+ }
+
+ statement.executeUpdate();
+ }
+ while (incomingData.next());
+
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("[%s] INSERT count: %s", tableName, result.getNbInserts(tableName)));
+ log.debug(String.format("[%s] UPDATE count: %s", tableName, result.getNbUpdates(tableName)));
+ }
+ }
+
+ public void synchronizeTable(TuttiTable tuttiTable,
+ TuttiDatabaseMetadata dbMeta,
+ Connection localConnection,
+ Connection remoteConnection,
+ ReferentialSynchronizeResult result) throws SQLException {
+
+ TuttiTableMetadata table = dbMeta.getTable(tuttiTable.name());
+
+ Date updateDate = getLastUpdateDate(remoteConnection, table);
+
+ // get data to synch
+ ResultSet dataToUpdate = getDataToUpdate(remoteConnection,
+ table,
+ updateDate);
+
+ try {
+ if (dataToUpdate.next()) {
+
+ // there is some data to update
+
+ // gets existing ids in the target db
+ Set<String> existingIds = getExistingIds(localConnection,
+ table);
+
+ updateTable(localConnection,
+ table,
+ existingIds,
+ dataToUpdate,
+ result);
+ }
+
+ dataToUpdate.close();
+ } finally {
+ JdbcUtils.closeResultSet(dataToUpdate);
+ }
+ }
+
+ public static void prepareSynch(Connection connection) throws SQLException {
+ PreparedStatement statement = connection.prepareStatement("SET REFERENTIAL_INTEGRITY FALSE;");
+ statement.executeUpdate();
+ }
+
+ public static void releaseSynch(Connection connection) throws SQLException {
+ PreparedStatement statement = connection.prepareStatement("SET REFERENTIAL_INTEGRITY TRUE;");
+ statement.executeUpdate();
+ }
+}
Property changes on: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelper.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImpl.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImpl.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImpl.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -24,27 +24,15 @@
* #L%
*/
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import fr.ifremer.tutti.persistence.entities.TuttiEntities;
import fr.ifremer.tutti.persistence.service.AbstractPersistenceService;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.classic.Session;
+import org.apache.commons.dbcp.BasicDataSource;
+import org.hibernate.cfg.Environment;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.tool.hbm2ddl.ColumnMetadata;
-import org.springframework.dao.DataRetrievalFailureException;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedSet;
+import java.util.Properties;
/**
* TODO
@@ -55,313 +43,39 @@
@Service("referentialSynchronizeService")
public class ReferentialSynchronizeServiceImpl extends AbstractPersistenceService implements ReferentialSynchronizeService {
- /** Logger. */
- private static final Log log =
- LogFactory.getLog(ReferentialSynchronizeServiceImpl.class);
+ @Autowired
+ protected BasicDataSource dataSource;
- public static final String QUERY_SELECT_MAX_UPDATE = "SELECT max(update_date) FROM %s";
+ protected Dialect localDialect;
- public static final String QUERY_SELECT_IDS = "SELECT %s FROM %s";
+ protected Properties dbconnexionProperties;
- public static final String QUERY_INSERT = "INSERT INTO %s (%s) VALUES (%s)";
+ protected final ReferentialSynchronizeHelper helper =
+ new ReferentialSynchronizeHelper();
- public static final String QUERY_UPDATE = "UPDATE INTO %s (%s) VALUES (%s) WHERE %s = ?";
-
-
- protected Dialect dialect;
-
@Override
- public TuttiDatabaseMetadata loadInternalDb() {
- Connection connection = getConnection();
-
- return loadExternalDb(connection, getInternalDialect());
- }
-
- private Connection getConnection() {
- Session session = getCurrentSession();
- return session.connection();
- }
-
- @Override
- public TuttiDatabaseMetadata loadExternalDb(Connection connection) {
- return loadExternalDb(connection, getInternalDialect());
- }
-
- @Override
- public TuttiDatabaseMetadata loadExternalDb(Connection connection,
- Dialect dialect) {
- TuttiDatabaseMetadata result = new TuttiDatabaseMetadata(connection, dialect);
- for (TuttiTable tuttiTable : TuttiTable.values()) {
-
- TableToSynchronize meta = tuttiTable.getMeta();
- String tableName = meta.getTableName();
- if (log.isDebugEnabled()) {
- log.debug("Load metas of table: " + tableName);
- }
- result.getTable(tableName);
+ public Properties getLocalConnectionProperties() {
+ if (dbconnexionProperties == null) {
+ dbconnexionProperties = new Properties();
+ dbconnexionProperties.put(Environment.URL, dataSource.getUrl());
+ dbconnexionProperties.put(Environment.USER, dataSource.getUsername());
+ dbconnexionProperties.put(Environment.PASS, dataSource.getPassword());
}
- return result;
+ return dbconnexionProperties;
}
@Override
- public void checkSchemas(TuttiDatabaseMetadata schema1,
- TuttiDatabaseMetadata schema2) {
- Set<String> internalSchemaTableNames = schema1.getTableNames();
- Set<String> externalSchemaTableNames = schema2.getTableNames();
- if (!internalSchemaTableNames.equals(externalSchemaTableNames)) {
- throw new DataRetrievalFailureException("Incompatible schemas");
+ public Dialect getLocalDialect() {
+ if (localDialect == null) {
+ localDialect = ((SessionFactoryImplementor) sessionFactory).getSettings().getDialect();
}
- for (String tableName : internalSchemaTableNames) {
- TuttiTableMetadata internalTable = schema1.getTable(tableName);
- TuttiTableMetadata externalTable = schema2.getTable(tableName);
- Set<String> internalColumnNames = internalTable.getColumnNames();
- Set<String> externalColumnNames = externalTable.getColumnNames();
- if (!internalColumnNames.equals(externalColumnNames)) {
- throw new DataRetrievalFailureException("Incompatible schema of table: " + tableName);
- }
- for (String columnName : internalColumnNames) {
- ColumnMetadata internalColumn = internalTable.getColumnMetadata(columnName);
- ColumnMetadata externalColumn = externalTable.getColumnMetadata(columnName);
- String internalColumnTypeName = internalColumn.getTypeName();
- String externalColumnTypeName = externalColumn.getTypeName();
- if (!internalColumnTypeName.equals(externalColumnTypeName)) {
- throw new DataRetrievalFailureException("Incompatible column type of table / column: " + tableName + " / " + columnName);
- }
- }
- }
+ return localDialect;
}
@Override
- public Dialect getInternalDialect() {
- if (dialect == null) {
- dialect = ((SessionFactoryImplementor) sessionFactory).getSettings().getDialect();
- }
- return dialect;
+ public ReferentialSynchronizeResult synchronize(Properties remoteConnectionProperties) {
+ return helper.synchronize(getLocalConnectionProperties(),
+ remoteConnectionProperties,
+ getLocalDialect());
}
-
- @Override
- public Date getLastUpdateDate(TableToSynchronize table,
- TuttiDatabaseMetadata schema) throws SQLException {
-
- Date result = getLastUpdateDate(getConnection(), table, schema);
- return result;
- }
-
- @Override
- public Date getLastUpdateDate(Connection connection, TableToSynchronize table,
- TuttiDatabaseMetadata schema) throws SQLException {
- Date result = null;
-
- if (table.isWithUpdateColumn()) {
-
- TuttiTableMetadata tableMeta = schema.getTable(table.getTableName());
-
- String sql = String.format(QUERY_SELECT_MAX_UPDATE, tableMeta.getName());
-
- PreparedStatement statement = connection.prepareStatement(sql);
- try {
- ResultSet resultSet = statement.executeQuery();
- if (resultSet.next()) {
- result = resultSet.getDate(1);
- }
- statement.close();
- } finally {
- TuttiEntities.closeSilently(statement);
- }
- }
- return result;
- }
-
- @Override
- public Date getMinUpdateDate(TuttiDatabaseMetadata schema) throws SQLException {
- return getMinUpdateDate(getConnection(), schema);
- }
-
- @Override
- public Date getMinUpdateDate(Connection connection,
- TuttiDatabaseMetadata schema) throws SQLException {
- Date result = null;
- for (TuttiTable tuttiTable : TuttiTable.values()) {
- Date lastUpdateDate = getLastUpdateDate(connection, tuttiTable.getMeta(), schema);
- if (result == null || (lastUpdateDate != null && lastUpdateDate.before(result))) {
- result = lastUpdateDate;
- }
- }
- return result;
- }
-
- @Override
- public List<Object[]> getDataToUpdate(TableToSynchronize table,
- TuttiDatabaseMetadata schema, Date fromDate) throws SQLException {
- return getDataToUpdate(getConnection(), table, schema, fromDate);
- }
-
- @Override
- public List<Object[]> getDataToUpdate(Connection connection,
- TableToSynchronize table,
- TuttiDatabaseMetadata schema,
- Date fromDate) throws SQLException {
-
- TuttiTableMetadata tableMeta = schema.getTable(table.getTableName());
- SortedSet<String> columnNames = tableMeta.getColumnNames();
- StringBuilder queryParams = new StringBuilder("");
- for (String columnName : columnNames) {
- queryParams.append(", ").append(columnName);
- }
- StringBuilder query = new StringBuilder("SELECT ");
- query.append(queryParams.substring(2));
- query.append(" FROM ").append(tableMeta.getName());
-
- if (table.isWithUpdateColumn()) {
-
- // add a filter
- query.append(" WHERE update_date >= ?");
- }
- String sql = query.toString();
-
- if (log.isDebugEnabled()) {
- log.debug("Query: " + sql);
- }
- PreparedStatement statement = connection.prepareStatement(sql);
- if (table.isWithUpdateColumn()) {
- statement.setDate(1, new java.sql.Date(fromDate.getTime()));
- }
-
- List<Object[]> result = Lists.newArrayList();
- try {
- ResultSet resultSet = statement.executeQuery();
- int columnCount = resultSet.getMetaData().getColumnCount();
- while (resultSet.next()) {
- Object[] row = new Object[columnCount];
- for (int i = 0; i < columnCount; i++) {
- row[i] = resultSet.getObject(i + 1);
- }
- result.add(row);
- }
- statement.close();
- return result;
- } finally {
- TuttiEntities.closeSilently(statement);
- }
- }
-
- @Override
- public Set<String> getExistingIds(TableToSynchronize table,
- TuttiDatabaseMetadata schema) throws SQLException {
- return getExistingIds(getConnection(), table, schema);
- }
-
- @Override
- public Set<String> getExistingIds(Connection connection,
- TableToSynchronize table,
- TuttiDatabaseMetadata schema) throws SQLException {
-
- String sql = String.format(QUERY_SELECT_IDS,
- table.getPkColumnName(),
- table.getTableName());
-
- PreparedStatement statement = connection.prepareStatement(sql);
-
- Set<String> result = Sets.newHashSet();
- try {
- ResultSet resultSet = statement.executeQuery();
- while (resultSet.next()) {
- result.add(String.valueOf(resultSet.getObject(1)));
- }
- statement.close();
- return result;
- } finally {
- TuttiEntities.closeSilently(statement);
- }
- }
-
- @Override
- public void updateTable(TableToSynchronize table,
- TuttiDatabaseMetadata schema,
- Set<String> existingIds,
- List<Object[]> incomingData) throws SQLException {
-
- updateTable(getConnection(),
- table,
- schema,
- existingIds,
- incomingData);
- }
-
- @Override
- public void updateTable(Connection connection,
- TableToSynchronize table,
- TuttiDatabaseMetadata schema,
- Set<String> existingIds,
- List<Object[]> incomingData) throws SQLException {
-
- TuttiTableMetadata tableMeta = schema.getTable(table.getTableName());
- ColumnMetadata pkColumn = tableMeta.getColumnMetadata(table.getPkColumnName());
- String pkColumnName = pkColumn.getName();
- int pkIndex = 0;
- SortedSet<String> columnNames = tableMeta.getColumnNames();
- int columnCount = tableMeta.getColumnsCount();
-
- StringBuilder queryParams = new StringBuilder("");
- StringBuilder valueParams = new StringBuilder("");
- int i = 0;
-
- for (String columnName : columnNames) {
- queryParams.append(", ").append(columnName);
- valueParams.append(", ?");
- if (pkColumnName.equals(columnName)) {
- pkIndex = i;
- } else {
- i++;
- }
- }
-
- String tableName = tableMeta.getName();
-
- String insertSql = String.format(QUERY_INSERT, tableName, queryParams.substring(2), valueParams.substring(2));
- String updateSql = String.format(QUERY_UPDATE, tableName, queryParams.substring(2), valueParams.substring(2), pkColumnName);
-
- PreparedStatement insertStatement = connection.prepareStatement(insertSql);
- PreparedStatement updateStatement = connection.prepareStatement(updateSql);
-
- int nbInsert = 0;
- int nbUpdate = 0;
- for (Object[] row : incomingData) {
-
- Object pk = row[pkIndex];
-
- PreparedStatement statement;
-
- boolean doUpdate = existingIds.contains(String.valueOf(pk));
- if (doUpdate) {
-
- // use update query
- statement = updateStatement;
- nbUpdate++;
- } else {
-
- // use insert query
- statement = insertStatement;
- nbInsert++;
- }
-
- for (int c = 0; c < columnCount; c++) {
- statement.setObject(c + 1, row[c]);
- }
-
- if (doUpdate) {
- statement.setObject(columnCount + 1, pk);
- }
-
- statement.executeUpdate();
- }
-
- if (log.isInfoEnabled()) {
- log.info("[" + tableName + "] INSERT count: " + nbInsert);
- log.info("[" + tableName + "] UPDATE count: " + nbUpdate);
- }
-
-// connection.commit();
- }
-
}
Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseResource.java
===================================================================
--- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseResource.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseResource.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -32,6 +32,7 @@
import com.google.common.io.Files;
import fr.ifremer.tutti.persistence.config.TuttiPersistenceAdagioConfig;
import fr.ifremer.tutti.persistence.config.TuttiPersistenceAdagioConfigOption;
+import fr.ifremer.tutti.persistence.entities.TuttiEntities;
import fr.ifremer.tutti.persistence.service.TuttiPersistenceServiceLocator;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
@@ -45,7 +46,6 @@
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
-import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
@@ -234,7 +234,7 @@
if (log.isInfoEnabled()) {
log.info("Will use create script: " + scriptFile);
}
- Connection connection = DriverManager.getConnection(jdbcUrl, user, password);
+ Connection connection = TuttiEntities.createConnection(jdbcUrl, user, password);
if (log.isInfoEnabled()) {
log.info("Created connection at " + connection.getMetaData().getURL());
Added: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelperTest.java
===================================================================
--- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelperTest.java (rev 0)
+++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelperTest.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -0,0 +1,627 @@
+package fr.ifremer.tutti.persistence.service.synchro;
+
+/*
+ * #%L
+ * Tutti :: Persistence Adagio (impl)
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 - 2013 Ifremer
+ * %%
+ * 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.collect.Sets;
+import fr.ifremer.tutti.persistence.DatabaseResource;
+import fr.ifremer.tutti.persistence.entities.TuttiEntities;
+import fr.ifremer.tutti.persistence.service.TuttiPersistenceServiceLocator;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.dialect.Dialect;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
+import org.springframework.dao.DataRetrievalFailureException;
+import org.springframework.jdbc.support.JdbcUtils;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * TODO
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 1.0
+ */
+public class ReferentialSynchronizeHelperTest {
+
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(ReferentialSynchronizeHelperTest.class);
+
+ @ClassRule
+ public static final DatabaseResource dbResource = new DatabaseResource();
+
+ @Rule
+ public final TestName n = new TestName();
+
+ protected Connection externalConnection;
+
+ protected Connection internalConnection;
+
+ protected ReferentialSynchronizeHelper helper;
+
+ protected Dialect dialect;
+
+ protected Properties localConnectionProperties;
+
+ @Before
+ public void setUp() throws Exception {
+ helper = new ReferentialSynchronizeHelper();
+ ReferentialSynchronizeService service =
+ TuttiPersistenceServiceLocator.getReferentialSynchronizeService();
+ dialect = service.getLocalDialect();
+ localConnectionProperties = service.getLocalConnectionProperties();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ helper = null;
+ dialect = null;
+ localConnectionProperties = null;
+
+ try {
+ if (internalConnection != null && !internalConnection.isClosed()) {
+ internalConnection.rollback();
+ }
+ if (externalConnection != null && !externalConnection.isClosed()) {
+ externalConnection.rollback();
+ }
+ } finally {
+
+ JdbcUtils.closeConnection(internalConnection);
+ JdbcUtils.closeConnection(externalConnection);
+ }
+ }
+
+ @Test
+ public void loadDatabaseMetadata() throws Exception {
+
+ Assert.assertNotNull(dialect);
+
+ createInternalConnection();
+ TuttiDatabaseMetadata internalDb =
+ helper.loadDatabaseMetadata(internalConnection, dialect);
+ assertTuttiDatabaseMetadata(internalDb);
+
+ createExternalDb();
+ TuttiDatabaseMetadata externalDb =
+ helper.loadDatabaseMetadata(externalConnection, dialect);
+ assertTuttiDatabaseMetadata(externalDb);
+ }
+
+ @Test
+ public void checkSchemas() throws Exception {
+
+ createInternalConnection();
+
+ TuttiDatabaseMetadata internalDb =
+ helper.loadDatabaseMetadata(internalConnection, dialect);
+ Assert.assertNotNull(internalDb);
+
+ helper.checkSchemas(internalDb, internalDb);
+
+ // create a external empty db
+ createExternalDb();
+
+ TuttiDatabaseMetadata externalDb =
+ helper.loadDatabaseMetadata(externalConnection, dialect);
+ Assert.assertNotNull(externalDb);
+ helper.checkSchemas(internalDb, externalDb);
+
+ // add a column in a table and recheck schemas
+ PreparedStatement statement = externalConnection.prepareStatement("ALTER TABLE PUBLIC.LOCATION ADD newColumn" + System.nanoTime() + " int NOT NULL;");
+ statement.execute();
+ externalConnection.commit();
+
+ try {
+ // reload external schema, it has changed
+ externalDb = helper.loadDatabaseMetadata(externalConnection, dialect);
+
+ helper.checkSchemas(internalDb, externalDb);
+ Assert.fail();
+ } catch (DataRetrievalFailureException e) {
+
+ Assert.assertTrue(true);
+ }
+ }
+
+ @Test
+ public void getLastUpdateDate() throws Exception {
+
+ createInternalConnection();
+
+ TuttiDatabaseMetadata internalDb =
+ helper.loadDatabaseMetadata(internalConnection, dialect);
+ Assert.assertNotNull(internalDb);
+
+ getLastUpdateDate(TuttiTable.STATUS, internalDb, null);
+ getLastUpdateDate(TuttiTable.QUALITY_FLAG, internalDb, null);
+ getLastUpdateDate(TuttiTable.UNIT, internalDb, getSqlDate(2012, 8, 17));
+ getLastUpdateDate(TuttiTable.AGGREGATION_LEVEL, internalDb, getSqlDate(2011, 6, 9));
+ getLastUpdateDate(TuttiTable.PARAMETER_GROUP, internalDb, getSqlDate(2012, 10, 5));
+ getLastUpdateDate(TuttiTable.QUALITATIVE_VALUE, internalDb, null);
+ getLastUpdateDate(TuttiTable.PARAMETER, internalDb, getSqlDate(2012, 11, 13));
+ getLastUpdateDate(TuttiTable.MATRIX, internalDb, getSqlDate(2012, 8, 13));
+ getLastUpdateDate(TuttiTable.FRACTION, internalDb, getSqlDate(2011, 12, 21));
+ getLastUpdateDate(TuttiTable.METHOD, internalDb, getSqlDate(2012, 9, 28));
+ getLastUpdateDate(TuttiTable.PMFM, internalDb, getSqlDate(2012, 11, 13));
+ getLastUpdateDate(TuttiTable.GEAR_CLASSIFICATION, internalDb, getSqlDate(2012, 11, 15));
+ getLastUpdateDate(TuttiTable.GEAR, internalDb, getSqlDate(2012, 11, 22));
+ getLastUpdateDate(TuttiTable.LOCATION_CLASSIFICATION, internalDb, getSqlDate(2010, 10, 26));
+ getLastUpdateDate(TuttiTable.LOCATION_LEVEL, internalDb, getSqlDate(2012, 11, 22));
+ getLastUpdateDate(TuttiTable.LOCATION, internalDb, getSqlDate(2012, 11, 22));
+ getLastUpdateDate(TuttiTable.TAXONOMIC_LEVEL, internalDb, getSqlDate(2012, 4, 18));
+ getLastUpdateDate(TuttiTable.REFERENCE_TAXON, internalDb, getSqlDate(2012, 11, 15));
+ getLastUpdateDate(TuttiTable.TAXON_NAME, internalDb, getSqlDate(2012, 11, 15));
+ getLastUpdateDate(TuttiTable.TAXON_GROUP_TYPE, internalDb, getSqlDate(2012, 5, 24));
+ getLastUpdateDate(TuttiTable.TAXON_GROUP, internalDb, getSqlDate(2012, 9, 12));
+ getLastUpdateDate(TuttiTable.ROUND_WEIGHT_CONVERSION, internalDb, getSqlDate(2012, 10, 4));
+ getLastUpdateDate(TuttiTable.WEIGHT_LENGTH_CONVERSION, internalDb, getSqlDate(2012, 10, 23));
+ getLastUpdateDate(TuttiTable.VESSEL_TYPE, internalDb, getSqlDate(2012, 4, 25));
+ getLastUpdateDate(TuttiTable.VESSEL, internalDb, getSqlDate(2012, 11, 22));
+ getLastUpdateDate(TuttiTable.GEAR_PHYSICAL_FEATURES, internalDb, getSqlDate(2012, 11, 22));
+ getLastUpdateDate(TuttiTable.VESSEL_PHYSICAL_FEATURES, internalDb, null);
+ getLastUpdateDate(TuttiTable.USER_PROFIL, internalDb, getSqlDate(2009, 6, 18));
+ getLastUpdateDate(TuttiTable.DEPARTMENT, internalDb, getSqlDate(2012, 11, 15));
+ getLastUpdateDate(TuttiTable.PERSON, internalDb, getSqlDate(2012, 11, 30));
+
+ // try it on a empty db (all values are to null)
+
+ // create a external empty db
+ createExternalDb();
+
+ TuttiDatabaseMetadata externalDb =
+ helper.loadDatabaseMetadata(externalConnection, dialect);
+
+ for (TuttiTable tuttiTable : TuttiTable.values()) {
+ getLastUpdateDate(tuttiTable, externalDb, true, null);
+ }
+ }
+
+ @Test
+ public void getExistingIds() throws SQLException, IOException {
+
+ createInternalConnection();
+
+ TuttiDatabaseMetadata internalDb =
+ helper.loadDatabaseMetadata(internalConnection, dialect);
+ Assert.assertNotNull(internalDb);
+
+ getExistingIds(TuttiTable.STATUS, 4);
+ getExistingIds(TuttiTable.QUALITY_FLAG, 8);
+ getExistingIds(TuttiTable.UNIT, 30);
+ getExistingIds(TuttiTable.AGGREGATION_LEVEL, 8);
+ getExistingIds(TuttiTable.PARAMETER_GROUP, 11);
+ getExistingIds(TuttiTable.QUALITATIVE_VALUE, 1162);
+ getExistingIds(TuttiTable.PARAMETER, 294);
+ getExistingIds(TuttiTable.MATRIX, 16);
+ getExistingIds(TuttiTable.FRACTION, 52);
+ getExistingIds(TuttiTable.METHOD, 39);
+ getExistingIds(TuttiTable.PMFM, 538);
+ getExistingIds(TuttiTable.GEAR_CLASSIFICATION, 5);
+ getExistingIds(TuttiTable.GEAR, 185);
+ getExistingIds(TuttiTable.LOCATION_CLASSIFICATION, 3);
+ getExistingIds(TuttiTable.LOCATION_LEVEL, 78);
+ getExistingIds(TuttiTable.LOCATION, 17887);
+ getExistingIds(TuttiTable.TAXONOMIC_LEVEL, 30);
+ getExistingIds(TuttiTable.REFERENCE_TAXON, 8609);
+ getExistingIds(TuttiTable.TAXON_NAME, 16821);
+ getExistingIds(TuttiTable.TAXON_GROUP_TYPE, 4);
+ getExistingIds(TuttiTable.TAXON_GROUP, 13353);
+ getExistingIds(TuttiTable.ROUND_WEIGHT_CONVERSION, 3518);
+ getExistingIds(TuttiTable.WEIGHT_LENGTH_CONVERSION, 2579);
+ getExistingIds(TuttiTable.VESSEL_TYPE, 10);
+ getExistingIds(TuttiTable.VESSEL, 199299);
+ getExistingIds(TuttiTable.GEAR_PHYSICAL_FEATURES, 1);
+ getExistingIds(TuttiTable.VESSEL_PHYSICAL_FEATURES, 0);
+ getExistingIds(TuttiTable.USER_PROFIL, 4);
+ getExistingIds(TuttiTable.DEPARTMENT, 76);
+ getExistingIds(TuttiTable.PERSON, 417);
+
+ // try it on a empty db (nothing to synch)
+
+ // create a external empty db
+ createExternalDb();
+
+ for (TuttiTable tuttiTable : TuttiTable.values()) {
+ getExistingIds(tuttiTable, true, 0);
+ }
+ }
+
+ @Test
+ public void getDataToUpdate() throws SQLException, IOException {
+
+ Date fromDate = getDate(1980, 1, 1);
+
+ createInternalConnection();
+
+ TuttiDatabaseMetadata internalDb =
+ helper.loadDatabaseMetadata(internalConnection, dialect);
+ Assert.assertNotNull(internalDb);
+
+ getDataToUpdate(TuttiTable.STATUS, internalDb, internalConnection, fromDate, 4);
+ getDataToUpdate(TuttiTable.QUALITY_FLAG, internalDb, internalConnection, fromDate, 8);
+ getDataToUpdate(TuttiTable.UNIT, internalDb, internalConnection, fromDate, 30);
+ getDataToUpdate(TuttiTable.AGGREGATION_LEVEL, internalDb, internalConnection, fromDate, 8);
+ getDataToUpdate(TuttiTable.PARAMETER_GROUP, internalDb, internalConnection, fromDate, 11);
+ getDataToUpdate(TuttiTable.QUALITATIVE_VALUE, internalDb, internalConnection, fromDate, 1162);
+ getDataToUpdate(TuttiTable.PARAMETER, internalDb, internalConnection, fromDate, 294);
+ getDataToUpdate(TuttiTable.MATRIX, internalDb, internalConnection, fromDate, 16);
+ getDataToUpdate(TuttiTable.FRACTION, internalDb, internalConnection, fromDate, 52);
+ getDataToUpdate(TuttiTable.METHOD, internalDb, internalConnection, fromDate, 39);
+ getDataToUpdate(TuttiTable.PMFM, internalDb, internalConnection, fromDate, 538);
+ getDataToUpdate(TuttiTable.GEAR_CLASSIFICATION, internalDb, internalConnection, fromDate, 5);
+ getDataToUpdate(TuttiTable.GEAR, internalDb, internalConnection, fromDate, 185);
+ getDataToUpdate(TuttiTable.LOCATION_CLASSIFICATION, internalDb, internalConnection, fromDate, 3);
+ getDataToUpdate(TuttiTable.LOCATION_LEVEL, internalDb, internalConnection, fromDate, 78);
+ getDataToUpdate(TuttiTable.LOCATION, internalDb, internalConnection, fromDate, 17887);
+ getDataToUpdate(TuttiTable.TAXONOMIC_LEVEL, internalDb, internalConnection, fromDate, 30);
+ getDataToUpdate(TuttiTable.REFERENCE_TAXON, internalDb, internalConnection, fromDate, 8609);
+ getDataToUpdate(TuttiTable.TAXON_NAME, internalDb, internalConnection, fromDate, 16821);
+ getDataToUpdate(TuttiTable.TAXON_GROUP_TYPE, internalDb, internalConnection, fromDate, 4);
+ getDataToUpdate(TuttiTable.TAXON_GROUP, internalDb, internalConnection, fromDate, 13353);
+ getDataToUpdate(TuttiTable.ROUND_WEIGHT_CONVERSION, internalDb, internalConnection, fromDate, 3518);
+ getDataToUpdate(TuttiTable.WEIGHT_LENGTH_CONVERSION, internalDb, internalConnection, fromDate, 2579);
+ getDataToUpdate(TuttiTable.VESSEL_TYPE, internalDb, internalConnection, fromDate, 10);
+ getDataToUpdate(TuttiTable.VESSEL, internalDb, internalConnection, fromDate, 199299);
+ getDataToUpdate(TuttiTable.GEAR_PHYSICAL_FEATURES, internalDb, internalConnection, fromDate, 1);
+ getDataToUpdate(TuttiTable.VESSEL_PHYSICAL_FEATURES, internalDb, internalConnection, fromDate, 0);
+ getDataToUpdate(TuttiTable.USER_PROFIL, internalDb, internalConnection, fromDate, 4);
+ getDataToUpdate(TuttiTable.DEPARTMENT, internalDb, internalConnection, fromDate, 76);
+ getDataToUpdate(TuttiTable.PERSON, internalDb, internalConnection, fromDate, 417);
+
+ // try it on a empty db (nothing to synch)
+
+ // create a external empty db
+ createExternalDb();
+
+ TuttiDatabaseMetadata externalDb =
+ helper.loadDatabaseMetadata(externalConnection, dialect);
+
+ for (TuttiTable tuttiTable : TuttiTable.values()) {
+ getDataToUpdate(tuttiTable, externalDb, externalConnection, fromDate, 0);
+ }
+ }
+
+ @Test
+ public void updateTable() throws SQLException, IOException {
+
+ Date fromDate = getDate(1980, 1, 1);
+
+ createInternalConnection();
+
+ TuttiDatabaseMetadata internalDb =
+ helper.loadDatabaseMetadata(internalConnection, dialect);
+ Assert.assertNotNull(internalDb);
+
+ // create a external empty db
+ createExternalDb();
+
+ TuttiDatabaseMetadata externalDb =
+ helper.loadDatabaseMetadata(externalConnection, dialect);
+ Assert.assertNotNull(externalDb);
+
+ updateTable(TuttiTable.STATUS, internalDb, internalConnection, externalConnection, fromDate, 4, 0);
+ updateTable(TuttiTable.QUALITY_FLAG, internalDb, internalConnection, externalConnection, fromDate, 8, 0);
+ updateTable(TuttiTable.UNIT, internalDb, internalConnection, externalConnection, fromDate, 30, 0);
+ updateTable(TuttiTable.AGGREGATION_LEVEL, internalDb, internalConnection, externalConnection, fromDate, 8, 0);
+ updateTable(TuttiTable.PARAMETER_GROUP, internalDb, internalConnection, externalConnection, fromDate, 11, 0);
+ updateTable(TuttiTable.QUALITATIVE_VALUE, internalDb, internalConnection, externalConnection, fromDate, 1162, 0);
+ updateTable(TuttiTable.PARAMETER, internalDb, internalConnection, externalConnection, fromDate, 294, 0);
+ updateTable(TuttiTable.MATRIX, internalDb, internalConnection, externalConnection, fromDate, 16, 0);
+ updateTable(TuttiTable.FRACTION, internalDb, internalConnection, externalConnection, fromDate, 52, 0);
+ updateTable(TuttiTable.METHOD, internalDb, internalConnection, externalConnection, fromDate, 39, 0);
+ updateTable(TuttiTable.PMFM, internalDb, internalConnection, externalConnection, fromDate, 538, 0);
+ updateTable(TuttiTable.GEAR_CLASSIFICATION, internalDb, internalConnection, externalConnection, fromDate, 5, 0);
+ updateTable(TuttiTable.GEAR, internalDb, internalConnection, externalConnection, fromDate, 185, 0);
+ updateTable(TuttiTable.LOCATION_CLASSIFICATION, internalDb, internalConnection, externalConnection, fromDate, 3, 0);
+ updateTable(TuttiTable.LOCATION_LEVEL, internalDb, internalConnection, externalConnection, fromDate, 78, 0);
+ updateTable(TuttiTable.LOCATION, internalDb, internalConnection, externalConnection, fromDate, 17887, 0);
+ updateTable(TuttiTable.TAXONOMIC_LEVEL, internalDb, internalConnection, externalConnection, fromDate, 30, 0);
+ updateTable(TuttiTable.REFERENCE_TAXON, internalDb, internalConnection, externalConnection, fromDate, 8609, 0);
+ updateTable(TuttiTable.TAXON_NAME, internalDb, internalConnection, externalConnection, fromDate, 16821, 0);
+ updateTable(TuttiTable.TAXON_GROUP_TYPE, internalDb, internalConnection, externalConnection, fromDate, 4, 0);
+ updateTable(TuttiTable.TAXON_GROUP, internalDb, internalConnection, externalConnection, fromDate, 13353, 0);
+ updateTable(TuttiTable.ROUND_WEIGHT_CONVERSION, internalDb, internalConnection, externalConnection, fromDate, 3518, 0);
+ updateTable(TuttiTable.WEIGHT_LENGTH_CONVERSION, internalDb, internalConnection, externalConnection, fromDate, 2579, 0);
+ updateTable(TuttiTable.VESSEL_TYPE, internalDb, internalConnection, externalConnection, fromDate, 10, 0);
+ updateTable(TuttiTable.VESSEL, internalDb, internalConnection, externalConnection, fromDate, 199299, 0);
+ updateTable(TuttiTable.GEAR_PHYSICAL_FEATURES, internalDb, internalConnection, externalConnection, fromDate, 1, 0);
+ updateTable(TuttiTable.VESSEL_PHYSICAL_FEATURES, internalDb, internalConnection, externalConnection, fromDate, 0, 0);
+ updateTable(TuttiTable.USER_PROFIL, internalDb, internalConnection, externalConnection, fromDate, 4, 0);
+ updateTable(TuttiTable.DEPARTMENT, internalDb, internalConnection, externalConnection, fromDate, 76, 0);
+ updateTable(TuttiTable.PERSON, internalDb, internalConnection, externalConnection, fromDate, 417, 0);
+
+ externalConnection.rollback();
+
+ fromDate = getDate(2012, 1, 1);
+
+ if (log.isInfoEnabled()) {
+ log.info("From " + fromDate);
+ }
+
+ updateTable(TuttiTable.STATUS, internalDb, internalConnection, externalConnection, fromDate, 4, 0);
+ updateTable(TuttiTable.QUALITY_FLAG, internalDb, internalConnection, externalConnection, fromDate, 8, 0);
+ updateTable(TuttiTable.UNIT, internalDb, internalConnection, externalConnection, fromDate, 2, 0);
+ updateTable(TuttiTable.AGGREGATION_LEVEL, internalDb, internalConnection, externalConnection, fromDate, 0, 0);
+ updateTable(TuttiTable.PARAMETER_GROUP, internalDb, internalConnection, externalConnection, fromDate, 6, 0);
+ updateTable(TuttiTable.QUALITATIVE_VALUE, internalDb, internalConnection, externalConnection, fromDate, 1162, 0);
+ updateTable(TuttiTable.PARAMETER, internalDb, internalConnection, externalConnection, fromDate, 36, 0);
+ updateTable(TuttiTable.MATRIX, internalDb, internalConnection, externalConnection, fromDate, 1, 0);
+ updateTable(TuttiTable.FRACTION, internalDb, internalConnection, externalConnection, fromDate, 0, 0);
+ updateTable(TuttiTable.METHOD, internalDb, internalConnection, externalConnection, fromDate, 5, 0);
+ updateTable(TuttiTable.PMFM, internalDb, internalConnection, externalConnection, fromDate, 51, 0);
+ updateTable(TuttiTable.GEAR_CLASSIFICATION, internalDb, internalConnection, externalConnection, fromDate, 1, 0);
+ updateTable(TuttiTable.GEAR, internalDb, internalConnection, externalConnection, fromDate, 94, 0);
+ updateTable(TuttiTable.LOCATION_CLASSIFICATION, internalDb, internalConnection, externalConnection, fromDate, 0, 0);
+ updateTable(TuttiTable.LOCATION_LEVEL, internalDb, internalConnection, externalConnection, fromDate, 23, 0);
+ updateTable(TuttiTable.LOCATION, internalDb, internalConnection, externalConnection, fromDate, 5333, 0);
+ updateTable(TuttiTable.TAXONOMIC_LEVEL, internalDb, internalConnection, externalConnection, fromDate, 28, 0);
+ updateTable(TuttiTable.REFERENCE_TAXON, internalDb, internalConnection, externalConnection, fromDate, 781, 0);
+ updateTable(TuttiTable.TAXON_NAME, internalDb, internalConnection, externalConnection, fromDate, 2393, 0);
+ updateTable(TuttiTable.TAXON_GROUP_TYPE, internalDb, internalConnection, externalConnection, fromDate, 1, 0);
+ updateTable(TuttiTable.TAXON_GROUP, internalDb, internalConnection, externalConnection, fromDate, 1149, 0);
+ updateTable(TuttiTable.ROUND_WEIGHT_CONVERSION, internalDb, internalConnection, externalConnection, fromDate, 3518, 0);
+ updateTable(TuttiTable.WEIGHT_LENGTH_CONVERSION, internalDb, internalConnection, externalConnection, fromDate, 83, 0);
+ updateTable(TuttiTable.VESSEL_TYPE, internalDb, internalConnection, externalConnection, fromDate, 2, 0);
+ updateTable(TuttiTable.VESSEL, internalDb, internalConnection, externalConnection, fromDate, 181608, 0);
+ updateTable(TuttiTable.GEAR_PHYSICAL_FEATURES, internalDb, internalConnection, externalConnection, fromDate, 1, 0);
+ updateTable(TuttiTable.VESSEL_PHYSICAL_FEATURES, internalDb, internalConnection, externalConnection, fromDate, 0, 0);
+ updateTable(TuttiTable.USER_PROFIL, internalDb, internalConnection, externalConnection, fromDate, 0, 0);
+ updateTable(TuttiTable.DEPARTMENT, internalDb, internalConnection, externalConnection, fromDate, 25, 0);
+ updateTable(TuttiTable.PERSON, internalDb, internalConnection, externalConnection, fromDate, 194, 0);
+ }
+
+ protected ResultSet getDataToUpdate(TuttiTable tuttiTable,
+ TuttiDatabaseMetadata db,
+ Connection connection,
+ Date fromDate,
+ int expectedResult) throws SQLException {
+
+ TuttiTableMetadata table = db.getTable(tuttiTable.name());
+ ResultSet actual = helper.getDataToUpdate(connection, table, fromDate);
+
+ Assert.assertNotNull(actual);
+ int nbRows = 0;
+ while (actual.next()) {
+ nbRows++;
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("getDataToUpdate(TuttiTable." + tuttiTable + ", internalDb, fromDate, " + nbRows + ");");
+ }
+ Assert.assertEquals(expectedResult, nbRows);
+ return actual;
+ }
+
+ protected void updateTable(TuttiTable tuttiTable,
+ TuttiDatabaseMetadata synchroDb,
+ Connection synchConnection,
+ Connection targetConnection,
+ Date fromDate,
+ int expectedInserts,
+ int expectedUpdates) throws SQLException {
+
+ // internal is syncrho
+ ReferentialSynchronizeResult result = new ReferentialSynchronizeResult(
+ targetConnection.getMetaData().getURL(),
+ synchConnection.getMetaData().getURL()
+ );
+
+ String tableName = tuttiTable.name();
+
+ TuttiTableMetadata table = synchroDb.getTable(tableName);
+
+ ResultSet dataToUpdate =
+ helper.getDataToUpdate(synchConnection, table, fromDate);
+
+ if (dataToUpdate.next()) {
+ ReferentialSynchronizeHelper.prepareSynch(targetConnection);
+
+ try {
+ helper.updateTable(targetConnection,
+ table,
+ Sets.<String>newHashSet(),
+ dataToUpdate,
+ result);
+ } finally {
+ ReferentialSynchronizeHelper.releaseSynch(targetConnection);
+ }
+
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("updateTable(TuttiTable." + tuttiTable +
+ ", internalDb, externalDb, internalConnection, " +
+ "externalConnection, fromDate, " +
+ result.getNbInserts(tableName) + ", 0);");
+ }
+ Assert.assertNotNull(result.getTableNames());
+ if (expectedInserts + expectedUpdates == 0) {
+
+ Assert.assertEquals(0, result.getTableNames().size());
+ } else {
+ Assert.assertEquals(1, result.getTableNames().size());
+ Assert.assertTrue(result.getTableNames().contains(tableName));
+ }
+ Assert.assertEquals(expectedInserts, result.getNbInserts(tableName));
+ Assert.assertEquals(expectedUpdates, result.getNbUpdates(tableName));
+ }
+
+ protected void getLastUpdateDate(TuttiTable tuttiTable,
+ TuttiDatabaseMetadata db,
+ Date expected) throws SQLException {
+ getLastUpdateDate(tuttiTable, db, false, expected);
+ }
+
+ protected void getLastUpdateDate(TuttiTable tuttiTable,
+ TuttiDatabaseMetadata db,
+ boolean external,
+ Date expected) throws SQLException {
+
+ TuttiTableMetadata table = db.getTable(tuttiTable.name());
+ Date actual;
+ if (external) {
+ actual = helper.getLastUpdateDate(externalConnection, table);
+ } else {
+ actual = helper.getLastUpdateDate(internalConnection, table);
+
+ }
+ if (expected == null) {
+
+ Assert.assertNull(actual);
+ } else {
+
+ assertDate(expected, actual);
+ }
+ }
+
+ protected void getExistingIds(TuttiTable tuttiTable,
+ int expectedResult) throws SQLException {
+ getExistingIds(tuttiTable, false, expectedResult);
+ }
+
+ protected void getExistingIds(TuttiTable tuttiTable,
+ boolean external,
+ int expectedResult) throws SQLException {
+
+
+ TuttiDatabaseMetadata internalDb = helper.loadDatabaseMetadata(internalConnection, dialect);
+ TuttiTableMetadata table = internalDb.getTable(tuttiTable.name());
+ Assert.assertNotNull(internalDb);
+ Set<String> actual;
+ if (external) {
+ actual = helper.getExistingIds(externalConnection, table);
+ } else {
+ actual = helper.getExistingIds(internalConnection, table);
+ }
+ Assert.assertNotNull(actual);
+ Assert.assertEquals(expectedResult, actual.size());
+ }
+
+ protected void assertTuttiDatabaseMetadata(TuttiDatabaseMetadata db) {
+ Assert.assertNotNull(db);
+ Assert.assertEquals(TuttiTable.values().length, db.getTableCount());
+
+ assertDatabaseMetadata(TuttiTable.STATUS, db, false, false);
+ assertDatabaseMetadata(TuttiTable.QUALITY_FLAG, db, false, false);
+ assertDatabaseMetadata(TuttiTable.UNIT, db, false, true);
+ assertDatabaseMetadata(TuttiTable.AGGREGATION_LEVEL, db, false, true);
+ assertDatabaseMetadata(TuttiTable.PARAMETER_GROUP, db, false, true);
+ assertDatabaseMetadata(TuttiTable.QUALITATIVE_VALUE, db, false, false);
+ assertDatabaseMetadata(TuttiTable.PARAMETER, db, false, true);
+ assertDatabaseMetadata(TuttiTable.MATRIX, db, false, true);
+ assertDatabaseMetadata(TuttiTable.FRACTION, db, false, true);
+ assertDatabaseMetadata(TuttiTable.METHOD, db, false, true);
+ assertDatabaseMetadata(TuttiTable.PMFM, db, false, true);
+ assertDatabaseMetadata(TuttiTable.GEAR_CLASSIFICATION, db, false, true);
+ assertDatabaseMetadata(TuttiTable.GEAR, db, false, true);
+ assertDatabaseMetadata(TuttiTable.LOCATION_CLASSIFICATION, db, false, true);
+ assertDatabaseMetadata(TuttiTable.LOCATION_LEVEL, db, false, true);
+ assertDatabaseMetadata(TuttiTable.LOCATION, db, false, true);
+ assertDatabaseMetadata(TuttiTable.TAXONOMIC_LEVEL, db, false, true);
+ assertDatabaseMetadata(TuttiTable.REFERENCE_TAXON, db, false, true);
+ assertDatabaseMetadata(TuttiTable.TAXON_NAME, db, false, true);
+ assertDatabaseMetadata(TuttiTable.TAXON_GROUP_TYPE, db, false, true);
+ assertDatabaseMetadata(TuttiTable.TAXON_GROUP, db, false, true);
+ assertDatabaseMetadata(TuttiTable.ROUND_WEIGHT_CONVERSION, db, false, true);
+ assertDatabaseMetadata(TuttiTable.WEIGHT_LENGTH_CONVERSION, db, false, true);
+ assertDatabaseMetadata(TuttiTable.VESSEL_TYPE, db, false, true);
+ assertDatabaseMetadata(TuttiTable.VESSEL, db, false, true);
+ assertDatabaseMetadata(TuttiTable.GEAR_PHYSICAL_FEATURES, db, false, true);
+ assertDatabaseMetadata(TuttiTable.VESSEL_PHYSICAL_FEATURES, db, false, true);
+ assertDatabaseMetadata(TuttiTable.USER_PROFIL, db, false, true);
+ assertDatabaseMetadata(TuttiTable.DEPARTMENT, db, false, true);
+ assertDatabaseMetadata(TuttiTable.PERSON, db, false, true);
+ }
+
+ protected void assertDatabaseMetadata(TuttiTable tableName,
+ TuttiDatabaseMetadata db,
+ boolean associationTable,
+ boolean withUpdateDateColumn) {
+ TuttiTableMetadata table = db.getTable(tableName.name());
+ Assert.assertNotNull(table);
+ if (!ObjectUtils.equals(associationTable, table.isAssociationTable())) {
+ if (log.isWarnEnabled()) {
+ log.warn("[" + tableName + "] associationTable should be " + associationTable);
+ }
+ }
+ if (!ObjectUtils.equals(withUpdateDateColumn, table.isWithUpdateDateColumn())) {
+ if (log.isWarnEnabled()) {
+ log.warn("[" + tableName + "] withUpdateDateColumn should be " + associationTable);
+ }
+ }
+ Assert.assertEquals(associationTable, table.isAssociationTable());
+ Assert.assertEquals(withUpdateDateColumn, table.isWithUpdateDateColumn());
+ }
+
+ public static void assertDate(Date expected, Date actual) {
+ Calendar expectedCal = Calendar.getInstance();
+ expectedCal.setTime(expected);
+ Calendar actualCal = Calendar.getInstance();
+ actualCal.setTime(actual);
+ Assert.assertEquals(expectedCal.get(Calendar.YEAR), actualCal.get(Calendar.YEAR));
+ Assert.assertEquals(expectedCal.get(Calendar.MONTH), actualCal.get(Calendar.MONTH));
+ Assert.assertEquals(expectedCal.get(Calendar.DAY_OF_MONTH), actualCal.get(Calendar.DAY_OF_MONTH));
+ }
+
+
+ public static Date getSqlDate(int year, int month, int day) {
+ return getDate(year, month - 1, day);
+ }
+
+ public static Date getDate(int year, int month, int day) {
+ Date fromDate = DateUtils.setYears(
+ DateUtils.setMonths(
+ DateUtils.setDays(new Date(), day),
+ month),
+ year);
+ return fromDate;
+ }
+
+ protected void createExternalDb() throws IOException, SQLException {
+ externalConnection = dbResource.createEmptyDb(n.getMethodName(), "newDb");
+ Assert.assertNotNull(externalConnection);
+ }
+
+ protected void createInternalConnection() throws SQLException {
+ internalConnection =
+ TuttiEntities.createConnection(localConnectionProperties);
+
+ }
+}
Property changes on: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeHelperTest.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImplTest.java
===================================================================
--- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImplTest.java 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImplTest.java 2013-01-28 11:15:47 UTC (rev 247)
@@ -26,30 +26,26 @@
import fr.ifremer.tutti.persistence.DatabaseResource;
import fr.ifremer.tutti.persistence.service.TuttiPersistenceServiceLocator;
-import org.apache.commons.lang3.time.DateUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.hibernate.dialect.Dialect;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
-import org.junit.Test;
-import org.springframework.dao.DataRetrievalFailureException;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.rules.TestName;
+import org.springframework.jdbc.support.JdbcUtils;
import java.io.IOException;
import java.sql.Connection;
-import java.sql.PreparedStatement;
import java.sql.SQLException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
/**
* @author tchemit <chemit(a)codelutin.com>
* @since 1.0
*/
+@Ignore
public class ReferentialSynchronizeServiceImplTest {
/** Logger. */
@@ -59,10 +55,15 @@
@ClassRule
public static final DatabaseResource dbResource = new DatabaseResource();
+ @Rule
+ public final TestName n = new TestName();
+
protected ReferentialSynchronizeService service;
protected Connection externalConnection;
+ protected Connection internalConnection;
+
@Before
public void setUp() throws Exception {
service = TuttiPersistenceServiceLocator.getReferentialSynchronizeService();
@@ -71,338 +72,13 @@
@After
public void tearDown() throws Exception {
service = null;
- if (externalConnection != null) {
- if (!externalConnection.isClosed()) {
- externalConnection.close();
- }
- externalConnection = null;
- }
+ JdbcUtils.closeConnection(internalConnection);
+ JdbcUtils.closeConnection(externalConnection);
}
- @Test
- public void loadInternalDb() throws Exception {
-
- Dialect dialect = service.getInternalDialect();
- Assert.assertNotNull(dialect);
-
- TuttiDatabaseMetadata tuttiDatabaseMetadata = service.loadInternalDb();
- Assert.assertNotNull(tuttiDatabaseMetadata);
- }
-
- @Test
- public void checkSchemas() throws Exception {
-
- TuttiDatabaseMetadata internalDb = service.loadInternalDb();
- Assert.assertNotNull(internalDb);
- service.checkSchemas(internalDb, internalDb);
-
- // create a external empty db
- externalConnection = dbResource.createEmptyDb("checkSchemas", "newDb");
+ protected void createExternalDb() throws IOException, SQLException {
+ externalConnection = dbResource.createEmptyDb(n.getMethodName(), "newDb");
Assert.assertNotNull(externalConnection);
-
- TuttiDatabaseMetadata externalDb = service.loadExternalDb(externalConnection);
- Assert.assertNotNull(externalDb);
- service.checkSchemas(internalDb, externalDb);
-
- // add a column in a table and recheck schemas
- PreparedStatement statement = externalConnection.prepareStatement("ALTER TABLE PUBLIC.LOCATION ADD newColumn" + System.nanoTime() + " int NOT NULL;");
- statement.execute();
- externalConnection.commit();
-
- try {
- // reload external schema, it has changed
- externalDb = service.loadExternalDb(externalConnection);
-
- service.checkSchemas(internalDb, externalDb);
- Assert.fail();
- } catch (DataRetrievalFailureException e) {
-
- Assert.assertTrue(true);
- }
}
- @Test
- public void getLastUpdateDate() throws Exception {
-
- TuttiDatabaseMetadata internalDb = service.loadInternalDb();
- Assert.assertNotNull(internalDb);
-
- getLastUpdateDate(TuttiTable.STATUS, internalDb, null);
- getLastUpdateDate(TuttiTable.QUALITY_FLAG, internalDb, null);
- getLastUpdateDate(TuttiTable.UNIT, internalDb, getSqlDate(2012, 8, 17));
- getLastUpdateDate(TuttiTable.AGGREGATION_LEVEL, internalDb, getSqlDate(2011, 6, 9));
- getLastUpdateDate(TuttiTable.PARAMETER_GROUP, internalDb, getSqlDate(2012, 10, 5));
- getLastUpdateDate(TuttiTable.QUALITATIVE_VALUE, internalDb, null);
- getLastUpdateDate(TuttiTable.PARAMETER, internalDb, getSqlDate(2012, 11, 13));
- getLastUpdateDate(TuttiTable.MATRIX, internalDb, getSqlDate(2012, 8, 13));
- getLastUpdateDate(TuttiTable.FRACTION, internalDb, getSqlDate(2011, 12, 21));
- getLastUpdateDate(TuttiTable.METHOD, internalDb, getSqlDate(2012, 9, 28));
- getLastUpdateDate(TuttiTable.PMFM, internalDb, getSqlDate(2012, 11, 13));
- getLastUpdateDate(TuttiTable.GEAR_CLASSIFICATION, internalDb, getSqlDate(2012, 11, 15));
- getLastUpdateDate(TuttiTable.GEAR, internalDb, getSqlDate(2012, 11, 22));
- getLastUpdateDate(TuttiTable.LOCATION_CLASSIFICATION, internalDb, getSqlDate(2010, 10, 26));
- getLastUpdateDate(TuttiTable.LOCATION_LEVEL, internalDb, getSqlDate(2012, 11, 22));
- getLastUpdateDate(TuttiTable.LOCATION, internalDb, getSqlDate(2012, 11, 22));
- getLastUpdateDate(TuttiTable.TAXONOMIC_LEVEL, internalDb, getSqlDate(2012, 4, 18));
- getLastUpdateDate(TuttiTable.REFERENCE_TAXON, internalDb, getSqlDate(2012, 11, 15));
- getLastUpdateDate(TuttiTable.TAXON_NAME, internalDb, getSqlDate(2012, 11, 15));
- getLastUpdateDate(TuttiTable.TAXON_GROUP_TYPE, internalDb, getSqlDate(2012, 5, 24));
- getLastUpdateDate(TuttiTable.TAXON_GROUP, internalDb, getSqlDate(2012, 9, 12));
- getLastUpdateDate(TuttiTable.ROUND_WEIGHT_CONVERSION, internalDb, getSqlDate(2012, 10, 4));
- getLastUpdateDate(TuttiTable.WEIGHT_LENGTH_CONVERSION, internalDb, getSqlDate(2012, 10, 23));
- getLastUpdateDate(TuttiTable.VESSEL_TYPE, internalDb, getSqlDate(2012, 4, 25));
- getLastUpdateDate(TuttiTable.VESSEL, internalDb, getSqlDate(2012, 11, 22));
- getLastUpdateDate(TuttiTable.GEAR_PHYSICAL_FEATURES, internalDb, getSqlDate(2012, 11, 22));
- getLastUpdateDate(TuttiTable.VESSEL_PHYSICAL_FEATURES, internalDb, null);
- getLastUpdateDate(TuttiTable.USER_PROFIL, internalDb, getSqlDate(2009, 6, 18));
- getLastUpdateDate(TuttiTable.DEPARTMENT, internalDb, getSqlDate(2012, 11, 15));
- getLastUpdateDate(TuttiTable.PERSON, internalDb, getSqlDate(2012, 11, 30));
-
- // try it on a empty db (all values are to null)
-
- // create a external empty db
- externalConnection = dbResource.createEmptyDb("getLastUpdateDate", "newDb");
- Assert.assertNotNull(externalConnection);
-
- TuttiDatabaseMetadata externalDb =
- service.loadExternalDb(externalConnection);
-
- for (TuttiTable tuttiTable : TuttiTable.values()) {
- getLastUpdateDate(tuttiTable, externalDb, true, null);
- }
- }
-
- @Test
- public void getMinUpdateDate() throws Exception {
-
- TuttiDatabaseMetadata internalDb = service.loadInternalDb();
- Assert.assertNotNull(internalDb);
-
- Date minUpdateDate = service.getMinUpdateDate(internalDb);
- Assert.assertNotNull(minUpdateDate);
-
- if (log.isInfoEnabled()) {
- log.info("Min update date: " + minUpdateDate);
- }
-
- assertDate(getSqlDate(2009, 6, 18), minUpdateDate);
-
- // try it on a empty db (no min update_date since no data)
-
- // create a external empty db
- externalConnection = dbResource.createEmptyDb("getMinUpdateDate", "newDb");
- Assert.assertNotNull(externalConnection);
-
- TuttiDatabaseMetadata externalDb =
- service.loadExternalDb(externalConnection);
-
- Date minUpdateDate2 = service.getMinUpdateDate(externalConnection,
- internalDb);
- Assert.assertNull(minUpdateDate2);
- }
-
- @Test
- public void getDataToUpdate() throws SQLException, IOException {
-
- Date fromDate = getDate(2012, 1, 1);
-
- TuttiDatabaseMetadata internalDb = service.loadInternalDb();
- Assert.assertNotNull(internalDb);
-
- getDataToUpdate(TuttiTable.STATUS, internalDb, fromDate, 4);
- getDataToUpdate(TuttiTable.QUALITY_FLAG, internalDb, fromDate, 8);
- getDataToUpdate(TuttiTable.UNIT, internalDb, fromDate, 2);
- getDataToUpdate(TuttiTable.AGGREGATION_LEVEL, internalDb, fromDate, 0);
- getDataToUpdate(TuttiTable.PARAMETER_GROUP, internalDb, fromDate, 6);
- getDataToUpdate(TuttiTable.QUALITATIVE_VALUE, internalDb, fromDate, 1162);
- getDataToUpdate(TuttiTable.PARAMETER, internalDb, fromDate, 36);
- getDataToUpdate(TuttiTable.MATRIX, internalDb, fromDate, 1);
- getDataToUpdate(TuttiTable.FRACTION, internalDb, fromDate, 0);
- getDataToUpdate(TuttiTable.METHOD, internalDb, fromDate, 5);
- getDataToUpdate(TuttiTable.PMFM, internalDb, fromDate, 51);
- getDataToUpdate(TuttiTable.GEAR_CLASSIFICATION, internalDb, fromDate, 1);
- getDataToUpdate(TuttiTable.GEAR, internalDb, fromDate, 94);
- getDataToUpdate(TuttiTable.LOCATION_CLASSIFICATION, internalDb, fromDate, 0);
- getDataToUpdate(TuttiTable.LOCATION_LEVEL, internalDb, fromDate, 23);
- getDataToUpdate(TuttiTable.LOCATION, internalDb, fromDate, 5333);
- getDataToUpdate(TuttiTable.TAXONOMIC_LEVEL, internalDb, fromDate, 28);
- getDataToUpdate(TuttiTable.REFERENCE_TAXON, internalDb, fromDate, 781);
- getDataToUpdate(TuttiTable.TAXON_NAME, internalDb, fromDate, 2393);
- getDataToUpdate(TuttiTable.TAXON_GROUP_TYPE, internalDb, fromDate, 1);
- getDataToUpdate(TuttiTable.TAXON_GROUP, internalDb, fromDate, 1149);
- getDataToUpdate(TuttiTable.ROUND_WEIGHT_CONVERSION, internalDb, fromDate, 3518);
- getDataToUpdate(TuttiTable.WEIGHT_LENGTH_CONVERSION, internalDb, fromDate, 83);
- getDataToUpdate(TuttiTable.VESSEL_TYPE, internalDb, fromDate, 2);
- getDataToUpdate(TuttiTable.VESSEL, internalDb, fromDate, 181608);
- getDataToUpdate(TuttiTable.GEAR_PHYSICAL_FEATURES, internalDb, fromDate, 1);
- getDataToUpdate(TuttiTable.VESSEL_PHYSICAL_FEATURES, internalDb, fromDate, 0);
- getDataToUpdate(TuttiTable.USER_PROFIL, internalDb, fromDate, 0);
- getDataToUpdate(TuttiTable.DEPARTMENT, internalDb, fromDate, 25);
- getDataToUpdate(TuttiTable.PERSON, internalDb, fromDate, 194);
-
- // try it on a empty db (nothing to synch)
-
- // create a external empty db
- externalConnection = dbResource.createEmptyDb("getDataToUpdate", "newDb");
- Assert.assertNotNull(externalConnection);
-
- TuttiDatabaseMetadata externalDb =
- service.loadExternalDb(externalConnection);
-
- for (TuttiTable tuttiTable : TuttiTable.values()) {
- getDataToUpdate(tuttiTable, externalDb, true, fromDate, 0);
- }
- }
-
- @Test
- public void getExistingIds() throws SQLException, IOException {
-
- TuttiDatabaseMetadata internalDb = service.loadInternalDb();
- Assert.assertNotNull(internalDb);
-
- getExistingIds(TuttiTable.STATUS, internalDb, 4);
- getExistingIds(TuttiTable.QUALITY_FLAG, internalDb, 8);
- getExistingIds(TuttiTable.UNIT, internalDb, 30);
- getExistingIds(TuttiTable.AGGREGATION_LEVEL, internalDb, 8);
- getExistingIds(TuttiTable.PARAMETER_GROUP, internalDb, 11);
- getExistingIds(TuttiTable.QUALITATIVE_VALUE, internalDb, 1162);
- getExistingIds(TuttiTable.PARAMETER, internalDb, 294);
- getExistingIds(TuttiTable.MATRIX, internalDb, 16);
- getExistingIds(TuttiTable.FRACTION, internalDb, 52);
- getExistingIds(TuttiTable.METHOD, internalDb, 39);
- getExistingIds(TuttiTable.PMFM, internalDb, 538);
- getExistingIds(TuttiTable.GEAR_CLASSIFICATION, internalDb, 5);
- getExistingIds(TuttiTable.GEAR, internalDb, 185);
- getExistingIds(TuttiTable.LOCATION_CLASSIFICATION, internalDb, 3);
- getExistingIds(TuttiTable.LOCATION_LEVEL, internalDb, 78);
- getExistingIds(TuttiTable.LOCATION, internalDb, 17887);
- getExistingIds(TuttiTable.TAXONOMIC_LEVEL, internalDb, 30);
- getExistingIds(TuttiTable.REFERENCE_TAXON, internalDb, 8609);
- getExistingIds(TuttiTable.TAXON_NAME, internalDb, 16821);
- getExistingIds(TuttiTable.TAXON_GROUP_TYPE, internalDb, 4);
- getExistingIds(TuttiTable.TAXON_GROUP, internalDb, 13353);
- getExistingIds(TuttiTable.ROUND_WEIGHT_CONVERSION, internalDb, 3518);
- getExistingIds(TuttiTable.WEIGHT_LENGTH_CONVERSION, internalDb, 2579);
- getExistingIds(TuttiTable.VESSEL_TYPE, internalDb, 10);
- getExistingIds(TuttiTable.VESSEL, internalDb, 199299);
- getExistingIds(TuttiTable.GEAR_PHYSICAL_FEATURES, internalDb, 1);
- getExistingIds(TuttiTable.VESSEL_PHYSICAL_FEATURES, internalDb, 0);
- getExistingIds(TuttiTable.USER_PROFIL, internalDb, 4);
- getExistingIds(TuttiTable.DEPARTMENT, internalDb, 76);
- getExistingIds(TuttiTable.PERSON, internalDb, 417);
-
- // try it on a empty db (nothing to synch)
-
- // create a external empty db
- externalConnection = dbResource.createEmptyDb("getExistingIds", "newDb");
- Assert.assertNotNull(externalConnection);
-
- TuttiDatabaseMetadata externalDb =
- service.loadExternalDb(externalConnection);
-
- for (TuttiTable tuttiTable : TuttiTable.values()) {
- getExistingIds(tuttiTable, externalDb, true, 0);
- }
- }
-
- protected void getExistingIds(TuttiTable tuttiTable,
- TuttiDatabaseMetadata db,
- int expectedResult) throws SQLException {
- getExistingIds(tuttiTable, db, false, expectedResult);
- }
-
- protected void getExistingIds(TuttiTable tuttiTable,
- TuttiDatabaseMetadata db,
- boolean external,
- int expectedResult) throws SQLException {
-
- TuttiDatabaseMetadata internalDb = service.loadInternalDb();
- Assert.assertNotNull(internalDb);
- Set<String> actual;
- if (external) {
- actual = service.getExistingIds(externalConnection,
- tuttiTable.getMeta(), db);
- } else {
- actual = service.getExistingIds(tuttiTable.getMeta(), db);
- }
- Assert.assertNotNull(actual);
- Assert.assertEquals(expectedResult, actual.size());
- }
-
- protected void getDataToUpdate(TuttiTable tuttiTable,
- TuttiDatabaseMetadata db,
- Date fromDate,
- int expectedResult) throws SQLException {
- getDataToUpdate(tuttiTable, db, false, fromDate, expectedResult);
- }
-
- protected void getDataToUpdate(TuttiTable tuttiTable,
- TuttiDatabaseMetadata db,
- boolean external,
- Date fromDate, int expectedResult) throws SQLException {
-
- TuttiDatabaseMetadata internalDb = service.loadInternalDb();
- Assert.assertNotNull(internalDb);
- List<Object[]> actual;
- if (external) {
- actual = service.getDataToUpdate(externalConnection,
- tuttiTable.getMeta(), db, fromDate);
- } else {
- actual = service.getDataToUpdate(tuttiTable.getMeta(), db, fromDate);
- }
- Assert.assertNotNull(actual);
- Assert.assertEquals(expectedResult, actual.size());
- }
-
- protected void getLastUpdateDate(TuttiTable tuttiTable,
- TuttiDatabaseMetadata db,
- Date expected) throws SQLException {
- getLastUpdateDate(tuttiTable, db, false, expected);
- }
-
- protected void getLastUpdateDate(TuttiTable tuttiTable,
- TuttiDatabaseMetadata db,
- boolean external,
- Date expected) throws SQLException {
-
- Date actual;
- if (external) {
- actual = service.getLastUpdateDate(externalConnection,
- tuttiTable.getMeta(), db);
- } else {
- actual = service.getLastUpdateDate(tuttiTable.getMeta(), db);
-
- }
- if (expected == null) {
-
- Assert.assertNull(actual);
- } else {
-
- assertDate(expected, actual);
- }
- }
-
- protected void assertDate(Date expected, Date actual) {
- Calendar expectedCal = Calendar.getInstance();
- expectedCal.setTime(expected);
- Calendar actualCal = Calendar.getInstance();
- actualCal.setTime(actual);
- Assert.assertEquals(expectedCal.get(Calendar.YEAR), actualCal.get(Calendar.YEAR));
- Assert.assertEquals(expectedCal.get(Calendar.MONTH), actualCal.get(Calendar.MONTH));
- Assert.assertEquals(expectedCal.get(Calendar.DAY_OF_MONTH), actualCal.get(Calendar.DAY_OF_MONTH));
- }
-
- protected Date getSqlDate(int year, int month, int day) {
- return getDate(year, month - 1, day);
- }
-
- protected Date getDate(int year, int month, int day) {
- Date fromDate = DateUtils.setYears(
- DateUtils.setMonths(
- DateUtils.setDays(new Date(), day),
- month),
- year);
- return fromDate;
- }
-
}
Modified: trunk/tutti-persistence-adagio/src/test/resources/log4j.properties
===================================================================
--- trunk/tutti-persistence-adagio/src/test/resources/log4j.properties 2013-01-28 10:13:27 UTC (rev 246)
+++ trunk/tutti-persistence-adagio/src/test/resources/log4j.properties 2013-01-28 11:15:47 UTC (rev 247)
@@ -23,19 +23,19 @@
###
# Global logging configuration
-log4j.rootCategory=DEBUG, A1
+log4j.rootCategory=WARN, A1
log4j.logger.no.api=DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %-4r [%t] %-5p %c %x - %m%n
log4j.logger.org.springframework=WARN
-log4j.logger.org.apache.commons.beanutils=WARN
+#log4j.logger.org.apache.commons.beanutils=WARN
log4j.logger.org.hibernate=WARN
#log4j.logger.org.hibernate.SQL=DEBUG
-log4j.logger.net.sf.ehcache=WARN
+#log4j.logger.net.sf.ehcache=WARN
log4j.logger.fr.ifremer.adagio.core=DEBUG
log4j.logger.fr.ifremer.tutti=INFO
1
0
r246 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/config java/fr/ifremer/tutti/ui/swing/content/cruise java/fr/ifremer/tutti/ui/swing/content/operation resources/i18n
by kmorin@users.forge.codelutin.com 28 Jan '13
by kmorin@users.forge.codelutin.com 28 Jan '13
28 Jan '13
Author: kmorin
Date: 2013-01-28 11:13:27 +0100 (Mon, 28 Jan 2013)
New Revision: 246
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/246
Log:
closes #1854 [ERGO] - Format d'affichage (coordonn?\195?\169es, dates)
Modified:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUI.css
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-01-28 09:08:49 UTC (rev 245)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-01-28 10:13:27 UTC (rev 246)
@@ -369,6 +369,8 @@
if (log.isDebugEnabled()) {
log.debug("disable JXDatePicker editor" + picker.getName());
}
+ String dateFormat = getConfig().getDateFormat();
+ picker.setFormats(dateFormat);
picker.getEditor().setEditable(false);
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java 2013-01-28 09:08:49 UTC (rev 245)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java 2013-01-28 10:13:27 UTC (rev 246)
@@ -28,6 +28,11 @@
import fr.ifremer.tutti.service.TuttiServiceTechnicalException;
import fr.ifremer.tutti.service.config.TuttiServiceConfig;
import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType;
+import java.awt.Color;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import javax.swing.KeyStroke;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.logging.Log;
@@ -37,12 +42,6 @@
import org.nuiton.util.ArgumentsParserException;
import org.nuiton.util.Version;
-import javax.swing.KeyStroke;
-import java.awt.Color;
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
/**
* Tutti application config.
*
@@ -168,6 +167,10 @@
return result;
}
+ public String getDateFormat() {
+ return applicationConfig.getOption(TuttiConfigOption.DATE_FORMAT.getKey());
+ }
+
public Version getVersion() {
return serviceConfig.getVersion();
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java 2013-01-28 09:08:49 UTC (rev 245)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java 2013-01-28 10:13:27 UTC (rev 246)
@@ -89,23 +89,34 @@
new Color(192, 192, 192).toString(),
Color.class
),
+
COLOR_ROW_INVALID(
"tutti.ui.color.rowInvalid",
n_("tutti.config.ui.color.rowInvalid"),
new Color(255, 128, 128).toString(),
- Color.class),
+ Color.class
+ ),
SHORTCUT_CLOSE_POPUP(
"tutti.ui.shortcut.closePopup",
n_("tutti.config.ui.shortcut.closePopup"),
"alt pressed F",
- KeyStroke.class),
+ KeyStroke.class
+ ),
COORDINATE_EDITOR_TYPE(
"tutti.ui.coordinateEditorType",
n_("tutti.config.ui.coordinateEditorType"),
CoordinateEditorType.DD.toString(),
- CoordinateEditorType.class);
+ CoordinateEditorType.class
+ ),
+
+ DATE_FORMAT(
+ "tutti.ui.dateFormat",
+ n_("tutti.config.ui.dateFormat"),
+ "dd/MM/yyyy",
+ String.class
+ );
/** Configuration key. */
private final String key;
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java 2013-01-28 09:08:49 UTC (rev 245)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java 2013-01-28 10:13:27 UTC (rev 246)
@@ -108,6 +108,7 @@
CALLBACK_UI)
.addOption(TuttiConfigOption.COLOR_ROW_INVALID)
.addOption(TuttiConfigOption.COLOR_ROW_READ_ONLY)
+ .addOption(TuttiConfigOption.DATE_FORMAT)
.addOption(TuttiConfigOption.COORDINATE_EDITOR_TYPE);
// SHORTCUT
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUI.css
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUI.css 2013-01-28 09:08:49 UTC (rev 245)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUI.css 2013-01-28 10:13:27 UTC (rev 246)
@@ -100,7 +100,6 @@
#beginDateField {
date: {model.getBeginDate()};
- formats: {"dd/MM/yyyy"};
}
#endDateLabel {
@@ -110,7 +109,6 @@
#endDateField {
date: {model.getEndDate()};
- formats: {"dd/MM/yyyy"};
}
#trawlNetLabel {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css 2013-01-28 09:08:49 UTC (rev 245)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css 2013-01-28 10:13:27 UTC (rev 246)
@@ -73,16 +73,6 @@
numberPattern: {INT_6_DIGITS_PATTERN};
}
-#dateLabel {
- text: "tutti.label.fishingOperation.date";
- labelFor: {dateField};
-}
-
-#dateField {
- date: {model.getDate()};
- formats: {"dd/MM/yyyy"};
-}
-
#strataLabel {
text: "tutti.label.fishingOperation.strata";
labelFor: {strataComboBox};
@@ -285,7 +275,6 @@
#gearShootingStartDateField {
date: {model.getGearShootingStartDate()};
- formats: {"dd/MM/yyyy"};
}
#gearShootingStartTimeField {
@@ -373,7 +362,6 @@
#gearShootingEndDateField {
date: {model.getGearShootingEndDate()};
- formats: {"dd/MM/yyyy"};
}
#gearShootingEndTimeField {
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-28 09:08:49 UTC (rev 245)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-28 10:13:27 UTC (rev 246)
@@ -93,6 +93,7 @@
tutti.config.ui.color.rowReadOnly=Cellule non éditable
tutti.config.ui.config=Chemin du fichier de configuration des interfaces graphiques
tutti.config.ui.coordinateEditorType=
+tutti.config.ui.dateFormat=Format de dates
tutti.config.ui.shortcut.closePopup=Fermer une popup
tutti.config.ui.showNumberEditorButton=Afficher le pavé numérique de saisie
tutti.config.ui.useSexagecimalEditor=Utiliser l'éditeur sexagécimal pour entrer des coordonnées
1
0
28 Jan '13
Author: kmorin
Date: 2013-01-28 10:08:49 +0100 (Mon, 28 Jan 2013)
New Revision: 245
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/245
Log:
- refactor
- refs #1845 [ERGO] - Principe d'enregistrement lors de la fermeture de l'?\195?\169cran
Added:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicRowModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicTabUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicTabUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java
Removed:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java
Modified:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentRowModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyRowModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiTabContainerUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/CaracteristicRow.java
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -77,7 +77,10 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import javax.swing.JOptionPane;
+import static org.nuiton.i18n.I18n._;
+
/**
* Contract of any UI handler.
*
@@ -213,6 +216,15 @@
public void closeDialog(TuttiUI ui) {
SwingUtil.getParentContainer(ui, JDialog.class).setVisible(false);
}
+
+ public int askSaveBeforeLeaving(Component parent) {
+ int i = JOptionPane.showConfirmDialog(
+ parent,
+ _("tutti.dialog.askSaveBeforeLeaving.message"),
+ _("tutti.dialog.askSaveBeforeLeaving.title"),
+ JOptionPane.YES_NO_CANCEL_OPTION);
+ return i;
+ }
//------------------------------------------------------------------------//
//-- Internal methods --//
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -38,6 +38,7 @@
import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
import fr.ifremer.tutti.ui.swing.MainUI;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicTabUIModel;
import fr.ifremer.tutti.ui.swing.content.operation.fishing.environment.EnvironmentTabUI;
import fr.ifremer.tutti.ui.swing.content.operation.fishing.environment.EnvironmentTabUIModel;
import fr.ifremer.tutti.ui.swing.content.operation.fishing.gearshooting.GearShootingTabUI;
@@ -45,6 +46,7 @@
import fr.ifremer.tutti.ui.swing.content.operation.fishing.hydrology.HydrologyTabUI;
import fr.ifremer.tutti.ui.swing.content.operation.fishing.hydrology.HydrologyTabUIModel;
import fr.ifremer.tutti.ui.swing.util.AbstractTuttiTabContainerUIHandler;
+import fr.ifremer.tutti.ui.swing.util.TabHandler;
import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
import java.awt.BorderLayout;
@@ -52,6 +54,7 @@
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.JLabel;
+import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import org.apache.commons.collections.CollectionUtils;
@@ -64,7 +67,8 @@
* @author tchemit <chemit(a)codelutin.com>
* @since 0.1
*/
-public class EditFishingOperationUIHandler extends AbstractTuttiTabContainerUIHandler<EditFishingOperationUIModel> {
+public class EditFishingOperationUIHandler extends AbstractTuttiTabContainerUIHandler<EditFishingOperationUIModel>
+ implements TabHandler {
/** Logger. */
private static final Log log =
@@ -308,6 +312,31 @@
}
@Override
+ public boolean onHideTab() {
+ boolean result = true;
+ if (isAModelModified()) {
+ int answer = askSaveBeforeLeaving(ui);
+ switch (answer) {
+ case JOptionPane.OK_OPTION:
+ ui.getSaveFishingOperationAction().actionPerformed(null);
+ break;
+
+ case JOptionPane.NO_OPTION:
+ parentUi.getHandler().reloadFishingOperation();
+ break;
+
+ case JOptionPane.CANCEL_OPTION:
+ result = false;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public void onShowTab() {
+ }
+
+ @Override
protected JTabbedPane getTabPanel() {
return ui.getFishingOperationTabPane();
}
@@ -321,6 +350,14 @@
//-- Public methods --//
//------------------------------------------------------------------------//
+ public CaracteristicTabUIModel[] getSubModels() {
+ return new CaracteristicTabUIModel[] {
+ ui.getGearShootingTabContent().getModel(),
+ ui.getEnvironmentTabContent().getModel(),
+ ui.getHydrologyTabContent().getModel()
+ };
+ }
+
public void clearFishingOperation() {
EditFishingOperationUIModel model = getModel();
model.fromBean(new FishingOperation());
@@ -336,8 +373,7 @@
boolean empty = bean == null;
EditFishingOperationUIModel model = getModel();
-
- if (empty || !bean.equals(model.getFishingOperation()) || fishingOperationMonitor.wasModified()) {
+ if (empty || !bean.equals(model.getFishingOperation()) || isAModelModified()) {
if (empty) {
bean = new FishingOperation();
}
@@ -491,11 +527,21 @@
}
protected boolean areAllModelsValid() {
- GearShootingTabUIModel gearShootingModel = ui.getGearShootingTabContent().getModel();
- EnvironmentTabUIModel environmentModel = ui.getEnvironmentTabContent().getModel();
- HydrologyTabUIModel hydrologyModel = ui.getHydrologyTabContent().getModel();
- return getModel().isValid() && gearShootingModel.isValid()
- && environmentModel.isValid() && hydrologyModel.isValid();
+ boolean result = getModel().isValid();
+ CaracteristicTabUIModel[] subModels = getSubModels();
+ for (CaracteristicTabUIModel subModel : subModels) {
+ result &= subModel.isValid();
+ }
+ return result;
}
-
+
+ protected boolean isAModelModified() {
+ boolean result = getModel().isModify();
+ CaracteristicTabUIModel[] subModels = getSubModels();
+ for (CaracteristicTabUIModel subModel : subModels) {
+ result |= subModel.isModify();
+ }
+ return result;
+ }
+
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -144,6 +144,7 @@
model.addPropertyChangeListener(FishingOperationsUIModel.PROPERTY_SELECTED_FISHING_OPERATION, new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
+ log.debug("propertyChange " + FishingOperationsUIModel.PROPERTY_SELECTED_FISHING_OPERATION);
selectFishingOperation((FishingOperation) evt.getNewValue());
}
});
@@ -151,6 +152,7 @@
model.addPropertyChangeListener(FishingOperationsUIModel.PROPERTY_FISHING_OPERATION, new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
+ log.debug("propertyChange " + FishingOperationsUIModel.PROPERTY_FISHING_OPERATION);
ui.getFishingOperationComboBox().setData(null);
ui.getFishingOperationComboBox().setData((List<FishingOperation>) evt.getNewValue());
}
@@ -221,9 +223,7 @@
if (log.isInfoEnabled()) {
log.info("New selected fishingOperation: " + fishingOperation);
}
- // back to fishingOperation tab
- ui.getTabPane().setSelectedIndex(0);
-
+
// back to general tab of fishingOperation tabs
ui.getFishingOperationTabContent().getFishingOperationTabPane().setSelectedIndex(0);
@@ -237,6 +237,10 @@
// propagate fishingOperation to his tabs
ui.getFishingOperationTabContent().getHandler().selectFishingOperation(fishingOperation);
+ if (ui.getFishingOperationTabContent().getModel().isCreate()) {
+ // back to fishingOperation tab
+ ui.getTabPane().setSelectedIndex(0);
+ }
ui.getCatchesTabContent().getHandler().selectFishingOperation(fishingOperation,
fishingOperationText);
@@ -246,6 +250,8 @@
} else {
ui.getFishingOperationTabContent().getHandler().clearFishingOperation();
+ // back to fishingOperation tab
+ ui.getTabPane().setSelectedIndex(0);
}
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -25,8 +25,13 @@
* #L%
*/
+import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
import fr.ifremer.tutti.ui.swing.AbstractTuttiAction;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicTabUIModel;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.environment.EnvironmentTabUIModel;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.gearshooting.GearShootingTabUIModel;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.hydrology.HydrologyTabUIModel;
import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType;
import org.apache.commons.logging.Log;
@@ -80,6 +85,22 @@
// save modified fishing operation
FishingOperation toSave = beanToSave.toBean();
+
+ CaracteristicTabUIModel[] subModels = handler.getSubModels();
+ for (CaracteristicTabUIModel subModel : subModels) {
+ Class modelClass = subModel.getClass();
+ CaracteristicMap caracteristics = subModel.getCaracteristicMap();
+
+ if (modelClass.isAssignableFrom(EnvironmentTabUIModel.class)) {
+ toSave.setEnvironmentCaracteristics(caracteristics);
+
+ } else if (modelClass.isAssignableFrom(GearShootingTabUIModel.class)) {
+ toSave.setGearShootingCaracteristics(caracteristics);
+
+ } else if (modelClass.isAssignableFrom(HydrologyTabUIModel.class)) {
+ toSave.setHydrologyCaracteristics(caracteristics);
+ }
+ }
handler.showInformationMessage(
"[ Trait - Caractéristiques générales ] " +
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicRowModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicRowModel.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicRowModel.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -0,0 +1,53 @@
+
+package fr.ifremer.tutti.ui.swing.content.operation.fishing;
+
+import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
+import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
+import java.io.Serializable;
+
+/**
+ *
+ * @author kmorin <kmorin(a)codelutin.com>
+ */
+public abstract class CaracteristicRowModel<RM extends CaracteristicRowModel<RM>> extends AbstractTuttiBeanUIModel<Serializable, RM> {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String PROPERTY_KEY = "key";
+
+ public static final String PROPERTY_VALUE = "value";
+
+ protected Caracteristic key;
+
+ protected Serializable value;
+
+ public CaracteristicRowModel() {
+ super(Serializable.class, null, null);
+ }
+
+ public CaracteristicRowModel(Caracteristic key, Serializable value) {
+ this();
+ this.key = key;
+ this.value = value;
+ }
+
+ public Caracteristic getKey() {
+ return key;
+ }
+
+ public void setKey(Caracteristic key) {
+ Object oldValue = getKey();
+ this.key = key;
+ firePropertyChange(PROPERTY_KEY, oldValue, key);
+ }
+
+ public Serializable getValue() {
+ return value;
+ }
+
+ public void setValue(Serializable value) {
+ Object oldValue = getValue();
+ this.value = value;
+ firePropertyChange(PROPERTY_VALUE, oldValue, value);
+ }
+}
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicTabUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicTabUIHandler.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicTabUIHandler.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -0,0 +1,248 @@
+
+package fr.ifremer.tutti.ui.swing.content.operation.fishing;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
+import fr.ifremer.tutti.persistence.entities.TuttiEntities;
+import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
+import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
+import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
+import fr.ifremer.tutti.ui.swing.TuttiUI;
+import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI;
+import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
+import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
+import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel;
+import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler;
+import java.util.List;
+import jaxx.runtime.swing.editor.bean.BeanComboBox;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ *
+ * @author kmorin <kmorin(a)codelutin.com>
+ */
+public abstract class CaracteristicTabUIHandler
+ <RM extends CaracteristicRowModel<RM>,
+ M extends CaracteristicTabUIModel<RM, M>,
+ TM extends AbstractTuttiTableModel<RM>>
+ extends AbstractTuttiTableUIHandler<RM, M> {
+
+ private static final Log log = LogFactory.getLog(CaracteristicTabUIHandler.class);
+
+ public CaracteristicTabUIHandler(EditFishingOperationUI parentUi, String... properties) {
+ super(parentUi.getHandler().getContext(), properties);
+ }
+
+ //------------------------------------------------------------------------//
+ //-- AbstractTuttiTableUIHandler methods --//
+ //------------------------------------------------------------------------//
+
+ @Override
+ protected TM getTableModel() {
+ return (TM) getTable().getModel();
+ }
+
+ @Override
+ protected boolean isRowValid(RM row) {
+ //TODO
+ return row.getValue() != null;
+ }
+
+ @Override
+ protected void onRowModified(int rowIndex, RM row, String propertyName, Object oldValue, Object newValue) {
+ recomputeRowValidState(row);
+ super.onRowModified(rowIndex, row, propertyName, oldValue, newValue);
+ }
+
+ @Override
+ protected void saveSelectedRowIfRequired(TuttiBeanMonitor<RM> rowMonitor, RM row) {
+ if (row.isValid()) {
+ // there is a valid bean attached to the monitor
+
+ if (rowMonitor.wasModified()) {
+
+ // monitored bean was modified, save it
+ if (log.isInfoEnabled()) {
+ log.info("Row " + row + " was modified, will save it");
+ }
+
+ saveRow(row);
+
+ }
+ }
+ }
+
+ //------------------------------------------------------------------------//
+ //-- AbstractTuttiUIHandler methods --//
+ //------------------------------------------------------------------------//
+
+ @Override
+ public M getModel() {
+ return (M) getUI().getModel();
+ }
+
+ @Override
+ protected void onAfterSelectedRowChanged(int oldRowIndex,
+ RM oldRow,
+ int newRowIndex,
+ RM newRow) {
+
+ super.onAfterSelectedRowChanged(oldRowIndex, oldRow, newRowIndex, newRow);
+ getModel().setRemoveCaracteristicEnabled(newRow != null);
+ }
+
+ @Override
+ public void beforeInitUI() {
+ M model = createModel();
+ getUI().setContextValue(model);
+ }
+
+ @Override
+ public void afterInitUI() {
+ initUI(getUI());
+
+ initBeanComboBox(getKeyCombo(), Lists.<Caracteristic>newArrayList(), null);
+
+ }
+
+ @Override
+ public void onCloseUI() {
+ if (log.isInfoEnabled()) {
+ log.info("closing: " + getUI());
+ }
+ }
+
+ //------------------------------------------------------------------------//
+ //-- Protected methods --//
+ //------------------------------------------------------------------------//
+
+ protected void saveRow(RM row) {
+
+ if (row.isValid()) {
+ CaracteristicMap caracteristics = getModel().getCaracteristicMap();
+ Preconditions.checkNotNull(caracteristics);
+
+ caracteristics.put(row.getKey(), row.getValue());
+ }
+ }
+
+ protected abstract M createModel();
+
+ protected abstract TuttiUI getUI();
+
+ protected abstract BeanComboBox<Caracteristic> getKeyCombo();
+
+ protected abstract CaracteristicMap getCaracteristics(FishingOperation operation);
+
+ protected abstract List<String> getProtocolPmfmIds(TuttiProtocol protocol);
+
+ //------------------------------------------------------------------------//
+ //-- Public methods --//
+ //------------------------------------------------------------------------//
+
+ /** Adds a row with the parameter selected in the combo box */
+ public void addRow() {
+ BeanComboBox<Caracteristic> keyCombo = getKeyCombo();
+ Caracteristic selectedItem = (Caracteristic) keyCombo.getSelectedItem();
+ TM tableModel = getTableModel();
+
+ RM row = tableModel.createNewRow();
+ row.setKey(selectedItem);
+// tableModel.addNewRow(row);
+ getModel().getRows().add(row);
+
+ int rowIndex = tableModel.getRowCount() - 1;
+ tableModel.fireTableRowsInserted(rowIndex, rowIndex);
+
+ keyCombo.removeItem(selectedItem);
+ selectFirstInCombo(keyCombo);
+
+ M model = getModel();
+ model.setModify(true);
+ recomputeRowValidState(row);
+ }
+
+ /** Resets the table with the data from the database */
+ public void reset(FishingOperation fishingOperation) {
+ TM tableModel = getTableModel();
+ M model = getModel();
+
+ CaracteristicMap caracteristicMap = getCaracteristics(fishingOperation);
+ if (caracteristicMap == null) {
+ caracteristicMap = new CaracteristicMap();
+ }
+ model.setCaracteristicMap(caracteristicMap);
+
+ TuttiProtocol protocol = TuttiUIUtil.getProtocol(getUI());
+ List<String> pmfmIds = Lists.newArrayList();
+ if (protocol != null) {
+ List<String> protocolPmfmId = getProtocolPmfmIds(protocol);
+ if (protocolPmfmId != null) {
+ pmfmIds.addAll(protocolPmfmId);
+ }
+ }
+
+ List<RM> rows = Lists.newArrayList();
+ List<Caracteristic> caracteristics = Lists.newArrayList(caracteristicMap.keySet());
+
+ List<Caracteristic> availableCaracteristics = model.getAvailableCaracteristics();
+ for (String id : pmfmIds) {
+ Caracteristic caracteristic = TuttiEntities.findById(availableCaracteristics, id);
+ if (!caracteristics.contains(caracteristic)) {
+ caracteristics.add(caracteristic);
+ }
+ }
+
+ for (Caracteristic key : caracteristics) {
+ RM newRow = tableModel.createNewRow();
+ newRow.setKey(key);
+ newRow.setValue(caracteristicMap.get(key));
+ rows.add(newRow);
+ }
+
+ model.setRows(rows);
+
+ List<Caracteristic> caracteristicList = Lists.newArrayList();
+
+ for (Caracteristic caracteristic : availableCaracteristics) {
+ if (!caracteristics.contains(caracteristic)) {
+ caracteristicList.add(caracteristic);
+ }
+ }
+
+ BeanComboBox<Caracteristic> keyCombo = getKeyCombo();
+ keyCombo.setData(caracteristicList);
+ selectFirstInCombo(keyCombo);
+ model.setModify(false);
+ }
+
+ public void removeCaracteristic() {
+ int rowIndex = getTable().getSelectedRow();
+
+ Preconditions.checkState(rowIndex != -1,
+ "Cant remove caracteristic if no caracteristic selected");
+
+ RM row = getTableModel().getEntry(rowIndex);
+
+ CaracteristicMap caracteristicMap = getModel().getCaracteristicMap();
+ if (caracteristicMap != null) {
+ caracteristicMap.remove(row.getKey());
+ }
+
+ //add the row in the combo
+ BeanComboBox keyCombo = getKeyCombo();
+ keyCombo.addItem(row.getKey());
+ selectFirstInCombo(keyCombo);
+
+ // remove the row from the model
+ getModel().getRows().remove(rowIndex);
+
+ // refresh all the table
+ getTableModel().fireTableRowsDeleted(rowIndex, rowIndex);
+
+ getModel().removeRowInError(row);
+
+ }
+}
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicTabUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicTabUIModel.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/CaracteristicTabUIModel.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -0,0 +1,76 @@
+
+package fr.ifremer.tutti.ui.swing.content.operation.fishing;
+
+import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
+import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
+import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
+import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
+import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel;
+import fr.ifremer.tutti.ui.swing.util.table.CaracteristicRow;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * @author kmorin <kmorin(a)codelutin.com>
+ * @since 1.0
+ */
+public abstract class CaracteristicTabUIModel<RM extends AbstractTuttiBeanUIModel<Serializable, RM>, M extends CaracteristicTabUIModel<RM, M>>
+ extends AbstractTuttiTableUIModel<FishingOperation, RM, M> {
+
+ public static final String PROPERTY_CARACTERISTIC_MAP = "caracteristicMap";
+
+ public static final String PROPERTY_REMOVE_CARACTERISTIC_ENABLED = "removeCaracteristicEnabled";
+
+ public static final String PROPERTY_AVAILABLE_CARACTERISTICS = "availableCaracteristics";
+
+ protected List<Caracteristic> availableCaracteristics;
+
+ /**
+ * Caracteristics
+ *
+ * @since 1.0
+ */
+ protected CaracteristicMap caracteristicMap;
+
+ /**
+ * Can user remove a selected caracteristic?
+ *
+ * @since 1.0
+ */
+ protected boolean removeCaracteristicEnabled;
+
+ public CaracteristicTabUIModel() {
+ super(FishingOperation.class, null, null);
+ }
+
+ public List<Caracteristic> getAvailableCaracteristics() {
+ return availableCaracteristics;
+ }
+
+ public void setAvailableCaracteristics(List<Caracteristic> availableCaracteristics) {
+ Object oldValue = getAvailableCaracteristics();
+ this.availableCaracteristics = availableCaracteristics;
+ firePropertyChange(PROPERTY_AVAILABLE_CARACTERISTICS, oldValue, availableCaracteristics);
+ }
+
+ public CaracteristicMap getCaracteristicMap() {
+ return caracteristicMap;
+ }
+
+ public void setCaracteristicMap(CaracteristicMap caracteristicMap) {
+ Object oldValue = getCaracteristicMap();
+ this.caracteristicMap = caracteristicMap != null ? (CaracteristicMap) caracteristicMap.clone() : null;
+ firePropertyChange(PROPERTY_CARACTERISTIC_MAP, oldValue, this.caracteristicMap);
+ }
+
+ public boolean isRemoveCaracteristicEnabled() {
+ return removeCaracteristicEnabled;
+ }
+
+ public void setRemoveCaracteristicEnabled(boolean removeCaracteristicEnabled) {
+ Object oldValue = isRemoveCaracteristicEnabled();
+ this.removeCaracteristicEnabled = removeCaracteristicEnabled;
+ firePropertyChange(PROPERTY_REMOVE_CARACTERISTIC_ENABLED, oldValue, removeCaracteristicEnabled);
+ }
+}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentRowModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentRowModel.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentRowModel.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -1,89 +1,12 @@
+
package fr.ifremer.tutti.ui.swing.content.operation.fishing.environment;
-/*
- * #%L
- * Tutti :: UI
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 Ifremer
- * %%
- * 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 fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicRowModel;
-import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
-import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
-import fr.ifremer.tutti.ui.swing.util.table.CaracteristicRow;
-import org.nuiton.util.beans.Binder;
-import org.nuiton.util.beans.BinderFactory;
-
-import java.io.Serializable;
-
/**
- * @author kmorin
- * @since 0.3
+ *
+ * @author kmorin <kmorin(a)codelutin.com>
*/
-public class EnvironmentRowModel extends AbstractTuttiBeanUIModel<CaracteristicRow, EnvironmentRowModel> {
+public class EnvironmentRowModel extends CaracteristicRowModel<EnvironmentRowModel> {
- private static final long serialVersionUID = 1L;
-
- public static final String PROPERTY_KEY = "key";
-
- public static final String PROPERTY_VALUE = "value";
-
- protected static final Binder<CaracteristicRow, EnvironmentRowModel> fromBeanBinder =
- BinderFactory.newBinder(CaracteristicRow.class,
- EnvironmentRowModel.class);
-
- protected static final Binder<EnvironmentRowModel, CaracteristicRow> toBeanBinder =
- BinderFactory.newBinder(EnvironmentRowModel.class,
- CaracteristicRow.class);
-
- protected Caracteristic key;
-
- protected Serializable value;
-
- public EnvironmentRowModel() {
- super(CaracteristicRow.class, fromBeanBinder, toBeanBinder);
- }
-
- public EnvironmentRowModel(Caracteristic key, Serializable value) {
- this();
- this.key = key;
- this.value = value;
- }
-
- public Caracteristic getKey() {
- return key;
- }
-
- public void setKey(Caracteristic key) {
- Object oldValue = getKey();
- this.key = key;
- firePropertyChange(PROPERTY_KEY, oldValue, key);
- }
-
- public Serializable getValue() {
- return value;
- }
-
- public void setValue(Serializable value) {
- Object oldValue = getValue();
- this.value = value;
- firePropertyChange(PROPERTY_VALUE, oldValue, value);
- }
-
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIHandler.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIHandler.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -24,33 +24,28 @@
* #L%
*/
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
-import fr.ifremer.tutti.persistence.entities.TuttiEntities;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
import fr.ifremer.tutti.service.DecoratorService;
+import fr.ifremer.tutti.ui.swing.TuttiUI;
import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI;
-import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
-import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicTabUIHandler;
import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueEditor;
import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueRenderer;
-import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler;
+import java.util.List;
import jaxx.runtime.swing.editor.bean.BeanComboBox;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.table.DefaultTableColumnModelExt;
-import java.util.List;
-
/**
* @author kmorin
* @since 0.3
*/
-public class EnvironmentTabUIHandler extends AbstractTuttiTableUIHandler<EnvironmentRowModel, EnvironmentTabUIModel> {
+public class EnvironmentTabUIHandler extends CaracteristicTabUIHandler<EnvironmentRowModel, EnvironmentTabUIModel, EnvironmentTableModel> {
private final static Log log =
LogFactory.getLog(EnvironmentTabUIHandler.class);
@@ -64,82 +59,56 @@
public EnvironmentTabUIHandler(EditFishingOperationUI parentUi,
EnvironmentTabUI ui) {
- super(parentUi.getHandler().getContext(),
- EnvironmentRowModel.PROPERTY_VALUE);
+ super(parentUi, EnvironmentRowModel.PROPERTY_VALUE);
this.ui = ui;
}
//------------------------------------------------------------------------//
- //-- AbstractTuttiTableUIHandler methods --//
+ //-- CaracteristicTabUIHandler methods --//
//------------------------------------------------------------------------//
@Override
- protected EnvironmentTableModel getTableModel() {
- return (EnvironmentTableModel) getTable().getModel();
+ protected TuttiUI getUI() {
+ return ui;
}
@Override
- protected JXTable getTable() {
- return ui.getEnvironmentTable();
+ protected BeanComboBox<Caracteristic> getKeyCombo() {
+ return ui.getNewRowKey();
}
-
+
@Override
- protected boolean isRowValid(EnvironmentRowModel row) {
- //TODO
- return row.getValue() != null;
+ protected EnvironmentTabUIModel createModel() {
+ return new EnvironmentTabUIModel();
}
@Override
- protected void onRowModified(int rowIndex,
- EnvironmentRowModel row,
- String propertyName,
- Object oldValue,
- Object newValue) {
- recomputeRowValidState(row);
- super.onRowModified(rowIndex, row, propertyName, oldValue, newValue);
+ protected CaracteristicMap getCaracteristics(FishingOperation operation) {
+ return operation.getEnvironmentCaracteristics();
}
-
+
@Override
- protected void saveSelectedRowIfRequired(TuttiBeanMonitor<EnvironmentRowModel> rowMonitor,
- EnvironmentRowModel row) {
- if (row.isValid()) {
- // there is a valid bean attached to the monitor
-
- if (rowMonitor.wasModified()) {
-
- // monitored bean was modified, save it
- if (log.isInfoEnabled()) {
- log.info("Row " + row + " was modified, will save it");
- }
-
- saveRow(row);
-
- }
- }
+ protected List<String> getProtocolPmfmIds(TuttiProtocol protocol) {
+ return protocol.getEnvironmentPmfmId();
}
-
+
//------------------------------------------------------------------------//
- //-- AbstractTuttiUIHandler methods --//
+ //-- AbstractTuttiTableUIHandler methods --//
//------------------------------------------------------------------------//
@Override
- public EnvironmentTabUIModel getModel() {
- return ui.getModel();
+ protected JXTable getTable() {
+ return ui.getEnvironmentTable();
}
- @Override
- public void beforeInitUI() {
- EnvironmentTabUIModel model = new EnvironmentTabUIModel();
- ui.setContextValue(model);
- }
+ //------------------------------------------------------------------------//
+ //-- AbstractTuttiUIHandler methods --//
+ //------------------------------------------------------------------------//
@Override
public void afterInitUI() {
- initUI(ui);
+ super.afterInitUI();
- initBeanComboBox(ui.getNewRowKey(),
- Lists.<Caracteristic>newArrayList(), null);
-
JXTable table = getTable();
// create table column model
@@ -170,149 +139,4 @@
initTable(table);
}
- @Override
- public void onCloseUI() {
- if (log.isInfoEnabled()) {
- log.info("closing: " + ui);
- }
- }
-
- @Override
- protected void onAfterSelectedRowChanged(int oldRowIndex,
- EnvironmentRowModel oldRow,
- int newRowIndex,
- EnvironmentRowModel newRow) {
-
- super.onAfterSelectedRowChanged(oldRowIndex, oldRow, newRowIndex, newRow);
- getModel().setRemoveCaracteristicEnabled(newRow != null);
- }
-
- //------------------------------------------------------------------------//
- //-- Public methods --//
- //------------------------------------------------------------------------//
-
- /** Adds a row with the parameter selected in the combo box */
- public void addRow() {
- BeanComboBox<Caracteristic> keyCombo = ui.getNewRowKey();
- Caracteristic selectedItem = (Caracteristic) keyCombo.getSelectedItem();
-
- EnvironmentRowModel row = getTableModel().createNewRow();
- row.setKey(selectedItem);
- getTableModel().addNewRow(row);
-
- EnvironmentTableModel tableModel = getTableModel();
- int rowIndex = tableModel.getRowCount() - 1;
- tableModel.fireTableRowsInserted(rowIndex, rowIndex);
-
- keyCombo.removeItem(selectedItem);
- selectFirstInCombo(keyCombo);
-
- EnvironmentTabUIModel model = getModel();
- model.setModify(true);
- recomputeRowValidState(row);
- }
-
- /** Resets the table with the data from the database */
- public void reset(FishingOperation fishingOperation) {
- EnvironmentTableModel tableModel = getTableModel();
- EnvironmentTabUIModel model = getModel();
- model.setFishingOperation(fishingOperation);
-
- CaracteristicMap environmentCaracteristics = fishingOperation.getEnvironmentCaracteristics();
- if (environmentCaracteristics == null) {
- environmentCaracteristics = new CaracteristicMap();
- }
-
- TuttiProtocol protocol = TuttiUIUtil.getProtocol(ui);
- List<String> environmentPmfmIds = Lists.newArrayList();
- if (protocol != null) {
- List<String> protocolEnvironmentPmfmId = protocol.getEnvironmentPmfmId();
- if (protocolEnvironmentPmfmId != null) {
- environmentPmfmIds.addAll(protocolEnvironmentPmfmId);
- }
- }
-
- List<EnvironmentRowModel> rows = Lists.newArrayList();
- List<Caracteristic> caracteristics = Lists.newArrayList(environmentCaracteristics.keySet());
-
- List<Caracteristic> availableCaracteristics = model.getAvailableCaracteristics();
- for (String id : environmentPmfmIds) {
- Caracteristic caracteristic = TuttiEntities.findById(availableCaracteristics, id);
- if (!caracteristics.contains(caracteristic)) {
- caracteristics.add(caracteristic);
- }
- }
-
- for (Caracteristic key : caracteristics) {
- EnvironmentRowModel newRow = tableModel.createNewRow();
- newRow.setKey(key);
- newRow.setValue(environmentCaracteristics.get(key));
- rows.add(newRow);
- }
-
- model.setRows(rows);
-
- List<Caracteristic> caracteristicList = Lists.newArrayList();
-
- for (Caracteristic caracteristic : availableCaracteristics) {
- if (!caracteristics.contains(caracteristic)) {
- caracteristicList.add(caracteristic);
- }
- }
-
- ui.getNewRowKey().setData(caracteristicList);
- selectFirstInCombo(ui.getNewRowKey());
- model.setModify(false);
- }
-
- public void removeCaracteristic() {
- int rowIndex = getTable().getSelectedRow();
-
- Preconditions.checkState(rowIndex != -1,
- "Cant remove caracteristic if no caracteristic selected");
-
- EnvironmentRowModel row = getTableModel().getEntry(rowIndex);
-
- FishingOperation fishingOperation = getModel().getFishingOperation();
- Preconditions.checkNotNull(fishingOperation);
-
- CaracteristicMap caracteristicMap = fishingOperation.getEnvironmentCaracteristics();
- if (caracteristicMap != null) {
- caracteristicMap.remove(row.getKey());
- }
-
-
- //add the row in the combo
- BeanComboBox keyCombo = ui.getNewRowKey();
- keyCombo.addItem(row.getKey());
- selectFirstInCombo(keyCombo);
-
- // remove the row from the model
- getModel().getRows().remove(rowIndex);
-
- // refresh all the table
- getTableModel().fireTableRowsDeleted(rowIndex, rowIndex);
-
- getModel().removeRowInError(row);
-
- }
-
- //------------------------------------------------------------------------//
- //-- Protected methods --//
- //------------------------------------------------------------------------//
-
- protected void saveRow(EnvironmentRowModel row) {
-
- if (row.isValid()) {
- FishingOperation fishingOperation = getModel().getFishingOperation();
- Preconditions.checkNotNull(fishingOperation);
-
- if (fishingOperation.getEnvironmentCaracteristics() == null) {
- fishingOperation.setEnvironmentCaracteristics(new CaracteristicMap());
- }
-
- fishingOperation.getEnvironmentCaracteristics().put(row.getKey(), row.getValue());
- }
- }
-
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIModel.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIModel.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -24,87 +24,21 @@
* #L%
*/
-import com.google.common.collect.Lists;
-import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
-import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
-import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
-import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel;
-import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import org.nuiton.util.beans.Binder;
-import org.nuiton.util.beans.BinderModelBuilder;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicTabUIModel;
-import java.io.Serializable;
-import java.util.List;
-
/**
* @author kmorin
* @since 0.3
*/
-public class EnvironmentTabUIModel extends AbstractTuttiTableUIModel<FishingOperation, EnvironmentRowModel, EnvironmentTabUIModel> {
+public class EnvironmentTabUIModel extends CaracteristicTabUIModel<EnvironmentRowModel, EnvironmentTabUIModel> {
private static final long serialVersionUID = 1L;
public static final String TITLE = "tutti.label.tab.fishingOperation.environment";
- public static final String PROPERTY_REMOVE_CARACTERISTIC_ENABLED = "removeCaracteristicEnabled";
-
- protected List<Caracteristic> availableCaracteristics;
-
- /**
- * Fishing operation associated with the caracteristics
- *
- * @since 0.3
- */
- protected FishingOperation fishingOperation;
-
- /**
- * Can user remove a selected caracteristic?
- *
- * @since 0.3
- */
- protected boolean removeCaracteristicEnabled;
-
- protected static final Binder<FishingOperation, EnvironmentTabUIModel> fromBeanBinder = BinderModelBuilder.newEmptyBuilder(FishingOperation.class, EnvironmentTabUIModel.class)
- .toBinder();
-
- protected static final Binder<EnvironmentTabUIModel, FishingOperation> toBeanBinder = BinderModelBuilder.newEmptyBuilder(EnvironmentTabUIModel.class, FishingOperation.class)
- .toBinder();
-
- public EnvironmentTabUIModel() {
- super(FishingOperation.class, fromBeanBinder, toBeanBinder);
- }
-
@Override
public String getTitle() {
return TITLE;
}
-
- public List<Caracteristic> getAvailableCaracteristics() {
- return availableCaracteristics;
- }
-
- public void setAvailableCaracteristics(List<Caracteristic> caracteristics) {
- availableCaracteristics = caracteristics;
- }
-
- public FishingOperation getFishingOperation() {
- return fishingOperation;
- }
-
- public void setFishingOperation(FishingOperation fishingOperation) {
- this.fishingOperation = fishingOperation;
- }
- public boolean isRemoveCaracteristicEnabled() {
- return removeCaracteristicEnabled;
- }
-
- public void setRemoveCaracteristicEnabled(boolean removeCaracteristicEnabled) {
- Object oldValue = isRemoveCaracteristicEnabled();
- this.removeCaracteristicEnabled = removeCaracteristicEnabled;
- firePropertyChange(PROPERTY_REMOVE_CARACTERISTIC_ENABLED, oldValue, removeCaracteristicEnabled);
- }
-
}
Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -1,86 +0,0 @@
-package fr.ifremer.tutti.ui.swing.content.operation.fishing.gearshooting;
-
-/*
- * #%L
- * Tutti :: UI
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 Ifremer
- * %%
- * 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 fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
-import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
-import fr.ifremer.tutti.ui.swing.util.table.CaracteristicRow;
-import java.io.Serializable;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.nuiton.util.beans.Binder;
-import org.nuiton.util.beans.BinderFactory;
-
-/**
- * @author kmorin
- * @since 0.3
- */
-public class GearShootingRowModel extends AbstractTuttiBeanUIModel<CaracteristicRow, GearShootingRowModel> {
-
- private static final long serialVersionUID = 1L;
-
- private static final Log log = LogFactory.getLog(GearShootingRowModel.class);
-
- public static final String PROPERTY_KEY = "key";
-
- public static final String PROPERTY_VALUE = "value";
-
- protected static final Binder<CaracteristicRow, GearShootingRowModel> fromBeanBinder =
- BinderFactory.newBinder(CaracteristicRow.class,
- GearShootingRowModel.class);
-
- protected static final Binder<GearShootingRowModel, CaracteristicRow> toBeanBinder =
- BinderFactory.newBinder(GearShootingRowModel.class,
- CaracteristicRow.class);
-
- protected Caracteristic key;
-
- protected Serializable value;
-
- public GearShootingRowModel() {
- super(CaracteristicRow.class, fromBeanBinder, toBeanBinder);
- }
-
- public Caracteristic getKey() {
- return key;
- }
-
- public void setKey(Caracteristic key) {
- Object oldValue = getKey();
- this.key = key;
- firePropertyChange(PROPERTY_KEY, oldValue, key);
- }
-
- public Serializable getValue() {
- return value;
- }
-
- public void setValue(Serializable value) {
- Object oldValue = getValue();
- this.value = value;
- firePropertyChange(PROPERTY_VALUE, oldValue, value);
- }
-
-}
Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java (from rev 244, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentRowModel.java)
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -0,0 +1,12 @@
+
+package fr.ifremer.tutti.ui.swing.content.operation.fishing.gearshooting;
+
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicRowModel;
+
+/**
+ *
+ * @author kmorin <kmorin(a)codelutin.com>
+ */
+public class GearShootingRowModel extends CaracteristicRowModel<GearShootingRowModel> {
+
+}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIHandler.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIHandler.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -25,32 +25,28 @@
*/
import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
-import fr.ifremer.tutti.persistence.entities.TuttiEntities;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
import fr.ifremer.tutti.service.DecoratorService;
+import fr.ifremer.tutti.ui.swing.TuttiUI;
import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI;
-import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
-import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicTabUIHandler;
import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueEditor;
import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueRenderer;
-import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler;
+import java.util.List;
import jaxx.runtime.swing.editor.bean.BeanComboBox;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.table.DefaultTableColumnModelExt;
-import java.util.List;
-
/**
* @author kmorin
* @since 0.3
*/
-public class GearShootingTabUIHandler extends AbstractTuttiTableUIHandler<GearShootingRowModel, GearShootingTabUIModel> {
+public class GearShootingTabUIHandler extends CaracteristicTabUIHandler<GearShootingRowModel, GearShootingTabUIModel, GearShootingTableModel> {
private final static Log log =
LogFactory.getLog(GearShootingTabUIHandler.class);
@@ -64,83 +60,56 @@
public GearShootingTabUIHandler(EditFishingOperationUI parentUi,
GearShootingTabUI ui) {
- super(parentUi.getHandler().getContext(),
- GearShootingRowModel.PROPERTY_VALUE);
+ super(parentUi, GearShootingRowModel.PROPERTY_VALUE);
this.ui = ui;
}
-
+
//------------------------------------------------------------------------//
- //-- AbstractTuttiTableUIHandler methods --//
+ //-- CaracteristicTabUIHandler methods --//
//------------------------------------------------------------------------//
@Override
- protected GearShootingTableModel getTableModel() {
- return (GearShootingTableModel) getTable().getModel();
+ protected TuttiUI getUI() {
+ return ui;
}
@Override
- protected JXTable getTable() {
- return ui.getGearShootingTable();
+ protected BeanComboBox<Caracteristic> getKeyCombo() {
+ return ui.getNewRowKey();
}
-
+
@Override
- protected boolean isRowValid(GearShootingRowModel row) {
- //TODO
- return row.getValue() != null;
+ protected GearShootingTabUIModel createModel() {
+ return new GearShootingTabUIModel();
}
-
+
@Override
- protected void onRowModified(int rowIndex,
- GearShootingRowModel row,
- String propertyName,
- Object oldValue,
- Object newValue) {
- recomputeRowValidState(row);
- super.onRowModified(rowIndex, row, propertyName, oldValue, newValue);
+ protected CaracteristicMap getCaracteristics(FishingOperation operation) {
+ return operation.getGearShootingCaracteristics();
}
@Override
- protected void saveSelectedRowIfRequired(TuttiBeanMonitor<GearShootingRowModel> rowMonitor,
- GearShootingRowModel row) {
-
- if (row.isValid()) {
- // there is a valid bean attached to the monitor
-
- if (rowMonitor.wasModified()) {
-
- // monitored bean was modified, save it
- if (log.isInfoEnabled()) {
- log.info("Row " + row + " was modified, will save it");
- }
-
- saveRow(row);
-
- }
- }
+ protected List<String> getProtocolPmfmIds(TuttiProtocol protocol) {
+ return protocol.getGearPmfmId();
}
-
+
//------------------------------------------------------------------------//
- //-- AbstractTuttiUIHandler methods --//
+ //-- AbstractTuttiTableUIHandler methods --//
//------------------------------------------------------------------------//
@Override
- public GearShootingTabUIModel getModel() {
- return ui.getModel();
+ protected JXTable getTable() {
+ return ui.getGearShootingTable();
}
- @Override
- public void beforeInitUI() {
- GearShootingTabUIModel model = new GearShootingTabUIModel();
- ui.setContextValue(model);
- }
+ //------------------------------------------------------------------------//
+ //-- AbstractTuttiUIHandler methods --//
+ //------------------------------------------------------------------------//
@Override
public void afterInitUI() {
- initUI(ui);
+ super.afterInitUI();
- initBeanComboBox(ui.getNewRowKey(),
- Lists.<Caracteristic>newArrayList(), null);
-
JXTable table = getTable();
// create table column model
@@ -173,100 +142,10 @@
initTable(table);
}
- @Override
- public void onCloseUI() {
- if (log.isInfoEnabled()) {
- log.info("closing: " + ui);
- }
- }
-
- @Override
- protected void onAfterSelectedRowChanged(int oldRowIndex,
- GearShootingRowModel oldRow,
- int newRowIndex,
- GearShootingRowModel newRow) {
-
- super.onAfterSelectedRowChanged(oldRowIndex, oldRow, newRowIndex, newRow);
- getModel().setRemoveCaracteristicEnabled(newRow != null);
- }
-
//------------------------------------------------------------------------//
//-- Public methods --//
//------------------------------------------------------------------------//
- /** Adds a row with the parameter selected in the combo box */
- public void addRow() {
- BeanComboBox<Caracteristic> keyCombo = ui.getNewRowKey();
- Caracteristic selectedItem = (Caracteristic) keyCombo.getSelectedItem();
-
- GearShootingRowModel row = getTableModel().createNewRow();
- row.setKey(selectedItem);
- getModel().getRows().add(row);
-
- GearShootingTableModel tableModel = getTableModel();
- int rowIndex = tableModel.getRowCount() - 1;
- tableModel.fireTableRowsInserted(rowIndex, rowIndex);
-
- keyCombo.removeItem(selectedItem);
- selectFirstInCombo(keyCombo);
-
- GearShootingTabUIModel model = getModel();
- model.setModify(true);
- recomputeRowValidState(row);
- }
-
- /** Resets the table with the data from the database */
- public void reset(FishingOperation fishingOperation) {
- GearShootingTableModel tableModel = getTableModel();
- GearShootingTabUIModel model = getModel();
- model.setFishingOperation(fishingOperation);
-
- CaracteristicMap gearShootingCaracteristics = fishingOperation.getGearShootingCaracteristics();
- if (gearShootingCaracteristics == null) {
- gearShootingCaracteristics = new CaracteristicMap();
- }
-
- TuttiProtocol protocol = TuttiUIUtil.getProtocol(ui);
- List<String> gearPmfmIds = Lists.newArrayList();
- if (protocol != null) {
- List<String> protocolGearPmfmId = protocol.getGearPmfmId();
- if (protocolGearPmfmId != null) {
- gearPmfmIds.addAll(protocolGearPmfmId);
- }
- }
-
- List<GearShootingRowModel> rows = Lists.newArrayList();
- List<Caracteristic> caracteristics = Lists.newArrayList(gearShootingCaracteristics.keySet());
-
- List<Caracteristic> availableCaracteristics = model.getAvailableCaracteristics();
- for (String id : gearPmfmIds) {
- Caracteristic caracteristic = TuttiEntities.findById(availableCaracteristics, id);
- if (!caracteristics.contains(caracteristic)) {
- caracteristics.add(caracteristic);
- }
- }
-
- for (Caracteristic key : caracteristics) {
- GearShootingRowModel newRow = tableModel.createNewRow();
- newRow.setKey(key);
- newRow.setValue(gearShootingCaracteristics.get(key));
- rows.add(newRow);
- }
- model.setRows(rows);
-
- List<Caracteristic> caracteristicList = Lists.newArrayList();
-
- for (Caracteristic caracteristic : availableCaracteristics) {
- if (!caracteristics.contains(caracteristic)) {
- caracteristicList.add(caracteristic);
- }
- }
-
- ui.getNewRowKey().setData(caracteristicList);
- selectFirstInCombo(ui.getNewRowKey());
- model.setModify(false);
- }
-
public void removeCaracteristic() {
int rowIndex = getTable().getSelectedRow();
@@ -275,10 +154,7 @@
GearShootingRowModel row = getTableModel().getEntry(rowIndex);
- FishingOperation fishingOperation = getModel().getFishingOperation();
- Preconditions.checkNotNull(fishingOperation);
-
- CaracteristicMap caracteristicMap = fishingOperation.getGearShootingCaracteristics();
+ CaracteristicMap caracteristicMap = getModel().getCaracteristicMap();
if (caracteristicMap != null) {
caracteristicMap.remove(row.getKey());
}
@@ -298,20 +174,4 @@
}
- //------------------------------------------------------------------------//
- //-- Protected methods --//
- //------------------------------------------------------------------------//
-
- protected void saveRow(GearShootingRowModel row) {
- if (row.isValid()) {
- FishingOperation fishingOperation = getModel().getFishingOperation();
- Preconditions.checkNotNull(fishingOperation);
-
- if (fishingOperation.getGearShootingCaracteristics() == null) {
- fishingOperation.setGearShootingCaracteristics(new CaracteristicMap());
- }
- fishingOperation.getGearShootingCaracteristics().put(row.getKey(), row.getValue());
- }
- }
-
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIModel.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIModel.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -24,17 +24,8 @@
* #L%
*/
-import com.google.common.collect.Maps;
-import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
-import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
-import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
-import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel;
-import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel;
-import org.nuiton.util.beans.Binder;
-import org.nuiton.util.beans.BinderModelBuilder;
-
-import java.io.Serializable;
-import java.util.List;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicRowModel;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicTabUIModel;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -43,71 +34,17 @@
* @author kmorin
* @since 0.3
*/
-public class GearShootingTabUIModel extends AbstractTuttiTableUIModel<FishingOperation, GearShootingRowModel, GearShootingTabUIModel> {
+public class GearShootingTabUIModel extends CaracteristicTabUIModel<GearShootingRowModel, GearShootingTabUIModel> {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(GearShootingTabUIModel.class);
public static final String TITLE = "tutti.label.tab.fishingOperation.gearShooting";
-
- public static final String PROPERTY_REMOVE_CARACTERISTIC_ENABLED = "removeCaracteristicEnabled";
-
- protected List<Caracteristic> availableCaracteristics;
-
- /**
- * Fishing operation associated with the caracteristics
- *
- * @since 0.3
- */
- protected FishingOperation fishingOperation;
-
- /**
- * Can user remove a selected caracteristic?
- *
- * @since 0.3
- */
- protected boolean removeCaracteristicEnabled;
- protected static final Binder<FishingOperation, GearShootingTabUIModel> fromBeanBinder = BinderModelBuilder.newEmptyBuilder(FishingOperation.class, GearShootingTabUIModel.class)
- .toBinder();
-
- protected static final Binder<GearShootingTabUIModel, FishingOperation> toBeanBinder = BinderModelBuilder.newEmptyBuilder(GearShootingTabUIModel.class, FishingOperation.class)
- .toBinder();
-
- public GearShootingTabUIModel() {
- super(FishingOperation.class, fromBeanBinder, toBeanBinder);
- }
-
@Override
public String getTitle() {
return TITLE;
}
-
- public List<Caracteristic> getAvailableCaracteristics() {
- return availableCaracteristics;
- }
-
- public void setAvailableCaracteristics(List<Caracteristic> availableCaracteristics) {
- this.availableCaracteristics = availableCaracteristics;
- }
- public FishingOperation getFishingOperation() {
- return fishingOperation;
- }
-
- public void setFishingOperation(FishingOperation fishingOperation) {
- this.fishingOperation = fishingOperation;
- }
-
- public boolean isRemoveCaracteristicEnabled() {
- return removeCaracteristicEnabled;
- }
-
- public void setRemoveCaracteristicEnabled(boolean removeCaracteristicEnabled) {
- Object oldValue = isRemoveCaracteristicEnabled();
- this.removeCaracteristicEnabled = removeCaracteristicEnabled;
- firePropertyChange(PROPERTY_REMOVE_CARACTERISTIC_ENABLED, oldValue, removeCaracteristicEnabled);
- }
-
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyRowModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyRowModel.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyRowModel.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -26,6 +26,8 @@
import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicRowModel;
+import fr.ifremer.tutti.ui.swing.util.table.CaracteristicRow;
import org.nuiton.util.beans.Binder;
import org.nuiton.util.beans.BinderFactory;
@@ -35,28 +37,16 @@
* @author kmorin
* @since 0.3
*/
-public class HydrologyRowModel extends AbstractTuttiBeanUIModel<Caracteristic, HydrologyRowModel> {
+public class HydrologyRowModel extends CaracteristicRowModel<HydrologyRowModel> {
private static final long serialVersionUID = 1L;
- public static final String PROPERTY_KEY = "key";
-
public static final String PROPERTY_GEAR_SHOOTING_START_VALUE = "gearShootingStartValue";
public static final String PROPERTY_GEAR_SHOOTING_END_VALUE = "gearShootingEndValue";
public static final String PROPERTY_AVERAGE_VALUE = "averageValue";
- protected static final Binder<Caracteristic, HydrologyRowModel> fromBeanBinder =
- BinderFactory.newBinder(Caracteristic.class,
- HydrologyRowModel.class);
-
- protected static final Binder<HydrologyRowModel, Caracteristic> toBeanBinder =
- BinderFactory.newBinder(HydrologyRowModel.class,
- Caracteristic.class);
-
- protected Caracteristic key;
-
protected Serializable gearShootingStartValue;
protected Serializable gearShootingEndValue;
@@ -64,7 +54,7 @@
protected Serializable averageValue;
public HydrologyRowModel() {
- super(Caracteristic.class, fromBeanBinder, toBeanBinder);
+ super();
}
public HydrologyRowModel(Caracteristic key) {
@@ -80,16 +70,6 @@
this.averageValue = averageValue;
}
- public Caracteristic getKey() {
- return key;
- }
-
- public void setKey(Caracteristic key) {
- Object oldValue = getKey();
- this.key = key;
- firePropertyChange(PROPERTY_KEY, oldValue, key);
- }
-
public Serializable getGearShootingStartValue() {
return gearShootingStartValue;
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIHandler.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIHandler.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -33,32 +33,31 @@
import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
import fr.ifremer.tutti.service.DecoratorService;
+import fr.ifremer.tutti.ui.swing.TuttiUI;
import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicTabUIHandler;
import fr.ifremer.tutti.ui.swing.util.HydrologicCaracteristicUtil;
import fr.ifremer.tutti.ui.swing.util.HydrologicCaracteristicUtil.Type;
-import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueEditor;
import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueRenderer;
-import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler;
-import jaxx.runtime.swing.editor.bean.BeanComboBox;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jdesktop.swingx.JXTable;
-import org.jdesktop.swingx.table.DefaultTableColumnModelExt;
-
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import jaxx.runtime.swing.editor.bean.BeanComboBox;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jdesktop.swingx.JXTable;
+import org.jdesktop.swingx.table.DefaultTableColumnModelExt;
/**
* @author kmorin
* @since 0.3
*/
-public class HydrologyTabUIHandler extends AbstractTuttiTableUIHandler<HydrologyRowModel, HydrologyTabUIModel> {
+public class HydrologyTabUIHandler extends CaracteristicTabUIHandler<HydrologyRowModel, HydrologyTabUIModel, HydrologyTableModel> {
private final static Log log =
LogFactory.getLog(HydrologyTabUIHandler.class);
@@ -74,7 +73,7 @@
public HydrologyTabUIHandler(EditFishingOperationUI parentUi,
HydrologyTabUI ui) {
- super(parentUi.getHandler().getContext(),
+ super(parentUi,
HydrologyRowModel.PROPERTY_GEAR_SHOOTING_START_VALUE,
HydrologyRowModel.PROPERTY_AVERAGE_VALUE,
HydrologyRowModel.PROPERTY_GEAR_SHOOTING_END_VALUE
@@ -82,57 +81,51 @@
this.ui = ui;
}
+
//------------------------------------------------------------------------//
- //-- AbstractTuttiTableUIHandler methods --//
+ //-- CaracteristicTabUIHandler methods --//
//------------------------------------------------------------------------//
@Override
- protected JXTable getTable() {
- return ui.getHydrologyTable();
+ protected TuttiUI getUI() {
+ return ui;
}
@Override
- protected HydrologyTableModel getTableModel() {
- return (HydrologyTableModel) getTable().getModel();
+ protected BeanComboBox<Caracteristic> getKeyCombo() {
+ return ui.getNewRowKey();
}
-
+
@Override
- protected boolean isRowValid(HydrologyRowModel row) {
- //TODO
- return row.getGearShootingStartValue() != null ||
- row.getGearShootingEndValue() != null ||
- row.getAverageValue() != null;
+ protected HydrologyTabUIModel createModel() {
+ return new HydrologyTabUIModel();
}
+
+ @Override
+ protected CaracteristicMap getCaracteristics(FishingOperation operation) {
+ return operation.getHydrologyCaracteristics();
+ }
-
@Override
- protected void onRowModified(int rowIndex,
- HydrologyRowModel row,
- String propertyName,
- Object oldValue,
- Object newValue) {
- recomputeRowValidState(row);
- super.onRowModified(rowIndex, row, propertyName, oldValue, newValue);
+ protected List<String> getProtocolPmfmIds(TuttiProtocol protocol) {
+ return protocol.getHydrologyPmfmId();
}
+
+ //------------------------------------------------------------------------//
+ //-- AbstractTuttiTableUIHandler methods --//
+ //------------------------------------------------------------------------//
@Override
- protected void saveSelectedRowIfRequired(TuttiBeanMonitor<HydrologyRowModel> rowMonitor,
- HydrologyRowModel row) {
+ protected JXTable getTable() {
+ return ui.getHydrologyTable();
+ }
- if (row.isValid()) {
- // there is a valid bean attached to the monitor
-
- if (rowMonitor.wasModified()) {
-
- // monitored bean was modified, save it
- if (log.isInfoEnabled()) {
- log.info("Row " + row + " was modified, will save it");
- }
-
- saveRow(row);
-
- }
- }
+ @Override
+ protected boolean isRowValid(HydrologyRowModel row) {
+ //TODO
+ return row.getGearShootingStartValue() != null ||
+ row.getGearShootingEndValue() != null ||
+ row.getAverageValue() != null;
}
//------------------------------------------------------------------------//
@@ -140,11 +133,6 @@
//------------------------------------------------------------------------//
@Override
- public HydrologyTabUIModel getModel() {
- return ui.getModel();
- }
-
- @Override
public void beforeInitUI() {
HydrologyTabUIModel model = new HydrologyTabUIModel();
ui.setContextValue(model);
@@ -173,11 +161,8 @@
@Override
public void afterInitUI() {
- initUI(ui);
+ super.afterInitUI();
- initBeanComboBox(ui.getNewRowKey(),
- Lists.<Caracteristic>newArrayList(), null);
-
JXTable table = getTable();
// create table column model
@@ -225,58 +210,21 @@
initTable(table);
}
- @Override
- public void onCloseUI() {
- if (log.isInfoEnabled()) {
- log.info("closing: " + ui);
- }
- }
-
- @Override
- protected void onAfterSelectedRowChanged(int oldRowIndex,
- HydrologyRowModel oldRow,
- int newRowIndex,
- HydrologyRowModel newRow) {
-
- super.onAfterSelectedRowChanged(oldRowIndex, oldRow, newRowIndex, newRow);
- getModel().setRemoveCaracteristicEnabled(newRow != null);
- }
-
//------------------------------------------------------------------------//
//-- Public methods --//
//------------------------------------------------------------------------//
- /** Adds a row with the parameter selected in the combo box */
- public void addRow() {
- BeanComboBox<Caracteristic> keyCombo = ui.getNewRowKey();
- Caracteristic selectedItem = (Caracteristic) keyCombo.getSelectedItem();
-
- HydrologyRowModel row = getTableModel().createNewRow();
- row.setKey(selectedItem);
- getModel().getRows().add(row);
-
- HydrologyTableModel tableModel = getTableModel();
- int rowIndex = tableModel.getRowCount() - 1;
- tableModel.fireTableRowsInserted(rowIndex, rowIndex);
-
- keyCombo.removeItem(selectedItem);
- selectFirstInCombo(keyCombo);
-
- HydrologyTabUIModel model = getModel();
- model.setModify(true);
- recomputeRowValidState(row);
- }
-
/** Resets the table with the data from the database */
+ @Override
public void reset(FishingOperation fishingOperation) {
HydrologyTableModel tableModel = getTableModel();
HydrologyTabUIModel model = getModel();
- model.setFishingOperation(fishingOperation);
CaracteristicMap hydrologyCaracteristics = fishingOperation.getHydrologyCaracteristics();
if (hydrologyCaracteristics == null) {
hydrologyCaracteristics = new CaracteristicMap();
}
+ model.setCaracteristicMap(hydrologyCaracteristics);
TuttiProtocol protocol = TuttiUIUtil.getProtocol(ui);
List<String> gearPmfmIds = Lists.newArrayList();
@@ -330,6 +278,7 @@
model.setModify(false);
}
+ @Override
public void removeCaracteristic() {
int rowIndex = getTable().getSelectedRow();
@@ -338,14 +287,11 @@
HydrologyRowModel row = getTableModel().getEntry(rowIndex);
- FishingOperation fishingOperation = getModel().getFishingOperation();
- Preconditions.checkNotNull(fishingOperation);
-
Map<Type, Caracteristic> caracteristics = availableGlobalCaracteristics.get(row.getKey());
for (Type type : caracteristics.keySet()) {
Caracteristic caracteristic = caracteristics.get(type);
- CaracteristicMap caracteristicMap = fishingOperation.getHydrologyCaracteristics();
+ CaracteristicMap caracteristicMap = getModel().getCaracteristicMap();
if (caracteristicMap != null) {
caracteristicMap.remove(caracteristic);
}
@@ -369,14 +315,12 @@
//-- Protected methods --//
//------------------------------------------------------------------------//
+ @Override
protected void saveRow(HydrologyRowModel row) {
if (row.isValid()) {
- FishingOperation fishingOperation = getModel().getFishingOperation();
- Preconditions.checkNotNull(fishingOperation);
+ CaracteristicMap caracteristicMap = getModel().getCaracteristicMap();
+ Preconditions.checkNotNull(caracteristicMap);
- if (fishingOperation.getHydrologyCaracteristics() == null) {
- fishingOperation.setHydrologyCaracteristics(new CaracteristicMap());
- }
Map<Type, Caracteristic> caracteristics = availableGlobalCaracteristics.get(row.getKey());
CaracteristicMap map = new CaracteristicMap();
for (Type type : caracteristics.keySet()) {
@@ -393,7 +337,7 @@
}
map.put(caracteristics.get(type), value);
}
- fishingOperation.getHydrologyCaracteristics().putAll(map);
+ caracteristicMap.putAll(map);
}
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIModel.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIModel.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -24,18 +24,7 @@
* #L%
*/
-import com.google.common.collect.Maps;
-import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
-import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
-import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
-import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel;
-import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import org.nuiton.util.beans.Binder;
-import org.nuiton.util.beans.BinderModelBuilder;
-
-import java.util.List;
+import fr.ifremer.tutti.ui.swing.content.operation.fishing.CaracteristicTabUIModel;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -44,7 +33,7 @@
* @author kmorin
* @since 0.3
*/
-public class HydrologyTabUIModel extends AbstractTuttiTableUIModel<FishingOperation, HydrologyRowModel, HydrologyTabUIModel> {
+public class HydrologyTabUIModel extends CaracteristicTabUIModel<HydrologyRowModel, HydrologyTabUIModel> {
private static final long serialVersionUID = 1L;
@@ -52,66 +41,8 @@
public static final String TITLE = "tutti.label.tab.fishingOperation.hydrology";
- public static final String PROPERTY_REMOVE_CARACTERISTIC_ENABLED = "removeCaracteristicEnabled";
-
- public static final String PROPERTY_AVAILABLE_CARACTERISTICS = "availableCaracteristics";
-
- protected List<Caracteristic> availableCaracteristics;
-
- /**
- * Fishing operation associated with the caracteristics
- *
- * @since 0.3
- */
- protected FishingOperation fishingOperation;
-
- /**
- * Can user remove a selected caracteristic?
- *
- * @since 0.3
- */
- protected boolean removeCaracteristicEnabled;
-
- protected static final Binder<FishingOperation, HydrologyTabUIModel> fromBeanBinder = BinderModelBuilder.newEmptyBuilder(FishingOperation.class, HydrologyTabUIModel.class)
- .toBinder();
-
- protected static final Binder<HydrologyTabUIModel, FishingOperation> toBeanBinder = BinderModelBuilder.newEmptyBuilder(HydrologyTabUIModel.class, FishingOperation.class)
- .toBinder();
-
- public HydrologyTabUIModel() {
- super(FishingOperation.class, fromBeanBinder, toBeanBinder);
- }
-
@Override
public String getTitle() {
return TITLE;
}
-
- public List<Caracteristic> getAvailableCaracteristics() {
- return availableCaracteristics;
- }
-
- public void setAvailableCaracteristics(List<Caracteristic> availableCaracteristics) {
- Object oldValue = getAvailableCaracteristics();
- this.availableCaracteristics = availableCaracteristics;
- firePropertyChange(PROPERTY_AVAILABLE_CARACTERISTICS, oldValue, availableCaracteristics);
- }
-
- public FishingOperation getFishingOperation() {
- return fishingOperation;
- }
-
- public void setFishingOperation(FishingOperation fishingOperation) {
- this.fishingOperation = fishingOperation;
- }
-
- public boolean isRemoveCaracteristicEnabled() {
- return removeCaracteristicEnabled;
- }
-
- public void setRemoveCaracteristicEnabled(boolean removeCaracteristicEnabled) {
- Object oldValue = isRemoveCaracteristicEnabled();
- this.removeCaracteristicEnabled = removeCaracteristicEnabled;
- firePropertyChange(PROPERTY_REMOVE_CARACTERISTIC_ENABLED, oldValue, removeCaracteristicEnabled);
- }
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiTabContainerUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiTabContainerUIHandler.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiTabContainerUIHandler.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -113,9 +113,9 @@
int currentIndex = tabPanel.getSelectedIndex();
boolean mustChangeTab = onTabChanged(currentIndex, index);
- if (mustChangeTab) {
- super.setSelectedIndex(index);
- }
+ if (mustChangeTab) {
+ super.setSelectedIndex(index);
+ }
}
});
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/CaracteristicRow.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/CaracteristicRow.java 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/CaracteristicRow.java 2013-01-28 09:08:49 UTC (rev 245)
@@ -35,33 +35,33 @@
private static final long serialVersionUID = 1L;
- protected Caracteristic[] caracteristics;
+ protected Object[] values;
- protected String name;
+ protected Caracteristic key;
- public CaracteristicRow(String name, Caracteristic... caracteristics) {
- this.name = name;
- this.caracteristics = caracteristics;
+ public CaracteristicRow(Caracteristic key, Object... values) {
+ this.key = key;
+ this.values = values;
}
- public Caracteristic[] getCaracteristics() {
- return caracteristics;
+ public Object[] getValues() {
+ return values;
}
- public void setCaracteristics(Caracteristic... caracteristics) {
- this.caracteristics = caracteristics;
+ public void setValues(Object... values) {
+ this.values = values;
}
- public String getName() {
- return name;
+ public Caracteristic getKey() {
+ return key;
}
- public void setName(String name) {
- this.name = name;
+ public void setKey(Caracteristic key) {
+ this.key = key;
}
@Override
public String getLabel() {
- return name;
+ return key.getName();
}
}
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-24 15:34:52 UTC (rev 244)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-28 09:08:49 UTC (rev 245)
@@ -96,6 +96,8 @@
tutti.config.ui.shortcut.closePopup=Fermer une popup
tutti.config.ui.showNumberEditorButton=Afficher le pavé numérique de saisie
tutti.config.ui.useSexagecimalEditor=Utiliser l'éditeur sexagécimal pour entrer des coordonnées
+tutti.dialog.askSaveBeforeLeaving.message=Vous avez fait des modifications qu vous n'avez pas enregistrées. Voulez-vous les enregistrer ?
+tutti.dialog.askSaveBeforeLeaving.title=Modifications non enregistrées
tutti.duration.format=dj Hh m'm'
tutti.errorTable.title=Table d'erreurs
tutti.file.protocol=Extension d'un fichier de protocole Tutti
1
0
r244 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split java/fr/ifremer/tutti/ui/swing/util resources/i18n
by kmorin@users.forge.codelutin.com 24 Jan '13
by kmorin@users.forge.codelutin.com 24 Jan '13
24 Jan '13
Author: kmorin
Date: 2013-01-24 16:34:52 +0100 (Thu, 24 Jan 2013)
New Revision: 244
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/244
Log:
enable to add a species which is not in the protocol
Added:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUI.css
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUI.jaxx
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUIModel.java
Modified:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.css
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.jaxx
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiAction.java 2013-01-23 15:58:55 UTC (rev 243)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiAction.java 2013-01-24 15:34:52 UTC (rev 244)
@@ -189,7 +189,7 @@
JLabel label = new JLabel();
EmptyBorder border = new EmptyBorder(5, 5, 5, 5);
label.setBorder(border);
- label.setText(_("tutti.message.action.running", actionName));
+ label.setText(_("tutti.message.action.running", actionDescription));
panel.add(label, BorderLayout.CENTER);
JProgressBar progressBar = new JProgressBar();
progressBar.setBorder(border);
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesAction.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesAction.java 2013-01-24 15:34:52 UTC (rev 244)
@@ -0,0 +1,88 @@
+
+package fr.ifremer.tutti.ui.swing.content.operation.catches.species.split;
+
+import com.google.common.collect.Lists;
+import fr.ifremer.tutti.persistence.TuttiPersistence;
+import fr.ifremer.tutti.persistence.entities.referential.Species;
+import fr.ifremer.tutti.service.PersistenceService;
+import fr.ifremer.tutti.ui.swing.AbstractTuttiAction;
+import fr.ifremer.tutti.ui.swing.TuttiUIContext;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
+import java.util.concurrent.Executors;
+import javax.swing.SwingUtilities;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import static org.nuiton.i18n.I18n._;
+/**
+ *
+ * @author kmorin <kmorin(a)codelutin.com>
+ */
+public class AddSpeciesAction extends AbstractTuttiAction<CreateSpeciesBatchUIModel, CreateSpeciesBatchUIHandler> {
+
+ private static final long serialVersionUID = 1L;
+
+ /** Logger. */
+ private static final Log log = LogFactory.getLog(AddSpeciesAction.class);
+
+ protected AddSpeciesUI popup;
+
+ protected List<Species> allSpecies;
+
+ public AddSpeciesAction(CreateSpeciesBatchUIHandler handler) {
+ super(handler,
+ "addSpecies",
+ "add",
+ null,
+ _("tutti.action.addSpecies.tip"),
+ false
+ );
+
+ popup = new AddSpeciesUI(getHandler().getUi());
+ popup.getValidateButton().addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ getHandler().closeDialog(popup);
+ }
+ });
+
+ TuttiPersistence persistenceService = getContext().getService(PersistenceService.class);
+ allSpecies = persistenceService.getAllSpecies();
+ }
+
+ @Override
+ protected void doAction(ActionEvent event) {
+ CreateSpeciesBatchUIHandler handler = getHandler();
+ AddSpeciesUIModel model = popup.getModel();
+ model.setSelectedSpecies(null);
+
+ List<Species> availableSpecies = handler.getModel().getAvailableSpecies();
+ List<Species> species = Lists.newArrayList(allSpecies);
+ species.removeAll(availableSpecies);
+ model.setSpecies(species);
+
+ // open the popup asynchronously because the setVisible(true) method returns
+ // only after setVisible(false) has been called and this prevents the loading to hide.
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ getHandler().openDialog(popup, _("tutti.title.createBatch"));
+
+ Species species = popup.getModel().getSelectedSpecies();
+ if (species != null) {
+ CreateSpeciesBatchUIHandler handler = getHandler();
+ CreateSpeciesBatchUIModel model = handler.getModel();
+
+ List<Species> availableSpecies = Lists.newArrayList(model.getAvailableSpecies());
+ availableSpecies.add(species);
+ model.setAvailableSpecies(availableSpecies);
+ model.setSpecies(species);
+ }
+ }
+ });
+ }
+
+}
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUI.css
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUI.css (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUI.css 2013-01-24 15:34:52 UTC (rev 244)
@@ -0,0 +1,8 @@
+#speciesCombo {
+ showReset: true;
+ i18nPrefix: "tutti.property.";
+ bean: {model};
+ property: selectedSpecies;
+ selectedItem: {model.getSelectedSpecies()};
+ data: {model.getSpecies()};
+}
\ No newline at end of file
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUI.jaxx
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUI.jaxx (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUI.jaxx 2013-01-24 15:34:52 UTC (rev 244)
@@ -0,0 +1,37 @@
+<JPanel layout='{new BorderLayout()}' id='addSpeciesPopup'
+ implements='fr.ifremer.tutti.ui.swing.TuttiUI<AddSpeciesUIModel, AddSpeciesUIHandler>'>
+
+ <import>
+ fr.ifremer.tutti.persistence.entities.referential.Species
+ jaxx.runtime.swing.editor.bean.BeanComboBox
+ </import>
+
+ <script><![CDATA[
+
+public AddSpeciesUI(CreateSpeciesBatchUI parentUI) {
+ JAXXUtil.initContext(this, parentUI);
+ AddSpeciesUIHandler handler = new AddSpeciesUIHandler(parentUI, this);
+ setContextValue(handler);
+ handler.beforeInitUI();
+}
+
+protected void $afterCompleteSetup() { handler.afterInitUI(); }
+ ]]></script>
+
+ <AddSpeciesUIHandler id='handler'
+ initializer='getContextValue(AddSpeciesUIHandler.class)' />
+
+ <AddSpeciesUIModel id='model'
+ initializer='getContextValue(AddSpeciesUIModel.class)'/>
+
+ <BeanComboBox id='speciesCombo' constraints='BorderLayout.CENTER'
+ constructorParams='this' genericType='Species' />
+
+ <JPanel layout='{new GridLayout(1, 0)}' constraints='BorderLayout.SOUTH'>
+ <JButton id='cancelButton' text='tutti.action.cancel'
+ onActionPerformed='model.setSelectedSpecies(null); handler.closeDialog(this)'/>
+ <JButton id='validateButton' text='tutti.action.validate'
+ onActionPerformed='handler.closeDialog(this)'/>
+ </JPanel>
+
+</JPanel>
\ No newline at end of file
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUIHandler.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUIHandler.java 2013-01-24 15:34:52 UTC (rev 244)
@@ -0,0 +1,60 @@
+
+package fr.ifremer.tutti.ui.swing.content.operation.catches.species.split;
+
+import com.google.common.collect.Lists;
+import fr.ifremer.tutti.persistence.TuttiPersistence;
+import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
+import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
+import fr.ifremer.tutti.persistence.entities.referential.Species;
+import fr.ifremer.tutti.service.PersistenceService;
+import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler;
+import fr.ifremer.tutti.ui.swing.TuttiUI;
+import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUI;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.List;
+import javax.swing.JDialog;
+import jaxx.runtime.SwingUtil;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ *
+ * @author kmorin <kmorin(a)codelutin.com>
+ */
+public class AddSpeciesUIHandler extends AbstractTuttiUIHandler<AddSpeciesUIModel> {
+
+ private static final Log log = LogFactory.getLog(AddSpeciesUIHandler.class);
+
+ protected AddSpeciesUI ui;
+
+ public AddSpeciesUIHandler(CreateSpeciesBatchUI parentUI, AddSpeciesUI ui) {
+ super(parentUI.getHandler().getContext());
+ this.ui = ui;
+ }
+
+ @Override
+ public void beforeInitUI() {
+ AddSpeciesUIModel model = new AddSpeciesUIModel();
+ ui.setContextValue(model);
+ }
+
+ @Override
+ public void afterInitUI() {
+ initUI(ui);
+
+ initBeanComboBox(ui.getSpeciesCombo(),
+ Lists.<Species>newArrayList(),
+ null);
+ }
+
+ @Override
+ public void onCloseUI() {
+ }
+
+ @Override
+ public AddSpeciesUIModel getModel() {
+ return ui.getModel();
+ }
+
+}
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUIModel.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/AddSpeciesUIModel.java 2013-01-24 15:34:52 UTC (rev 244)
@@ -0,0 +1,47 @@
+
+package fr.ifremer.tutti.ui.swing.content.operation.catches.species.split;
+
+import com.google.common.collect.Lists;
+import fr.ifremer.tutti.persistence.entities.referential.Species;
+import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
+import java.util.List;
+
+/**
+ *
+ * @author kmorin <kmorin(a)codelutin.com>
+ */
+public class AddSpeciesUIModel extends AbstractTuttiBeanUIModel<AddSpeciesUIModel, AddSpeciesUIModel> {
+
+ public static final String PROPERTY_SPECIES = "species";
+
+ public static final String PROPERTY_SELECTED_SPECIES = "selectedSpecies";
+
+ protected List<Species> species = Lists.newArrayList();
+
+ protected Species selectedSpecies;
+
+ public AddSpeciesUIModel() {
+ super(AddSpeciesUIModel.class, null, null);
+ }
+
+ public List<Species> getSpecies() {
+ return species;
+ }
+
+ public void setSpecies(List<Species> species) {
+ Object oldValue = getSpecies();
+ this.species = Lists.newArrayList(species);
+ firePropertyChange(PROPERTY_SPECIES, oldValue, this.species);
+ }
+
+ public Species getSelectedSpecies() {
+ return selectedSpecies;
+ }
+
+ public void setSelectedSpecies(Species selectedSpecies) {
+ Object oldValue = getSelectedSpecies();
+ this.selectedSpecies = selectedSpecies;
+ firePropertyChange(PROPERTY_SELECTED_SPECIES, oldValue, selectedSpecies);
+ }
+
+}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.css
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.css 2013-01-23 15:58:55 UTC (rev 243)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.css 2013-01-24 15:34:52 UTC (rev 244)
@@ -52,6 +52,10 @@
data: {model.getAvailableSpecies()};
}
+#addSpeciesButton {
+ action: {addSpeciesAction};
+}
+
#sortedUnsortedCategoryLabel {
text: "tutti.label.createSpeciesBatch.sortedUnsortedCategory";
labelFor: {sortedUnsortedCategoryComboBox};
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.jaxx
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.jaxx 2013-01-23 15:58:55 UTC (rev 243)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.jaxx 2013-01-24 15:34:52 UTC (rev 244)
@@ -68,6 +68,8 @@
<CreateSpeciesBatchUIModel id='model'
initializer='getContextValue(CreateSpeciesBatchUIModel.class)'/>
+ <AddSpeciesAction id='addSpeciesAction' constructorParams='handler'/>
+
<SwingValidatorMessageTableModel id='errorTableModel'/>
<BeanValidator id='validator' bean='model' errorTableModel='errorTableModel'
@@ -91,6 +93,9 @@
<BeanComboBox id='speciesComboBox' constructorParams='this'
genericType='Species'/>
</cell>
+ <cell>
+ <JButton id='addSpeciesButton'/>
+ </cell>
</row>
<!-- Sorted / Unsorted Category -->
@@ -98,7 +103,7 @@
<cell anchor='west'>
<JLabel id='sortedUnsortedCategoryLabel'/>
</cell>
- <cell weightx='1.0'>
+ <cell weightx='1.0' columns='2'>
<BeanComboBox id='sortedUnsortedCategoryComboBox'
constructorParams='this'
genericType='CaracteristicQualitativeValue'/>
@@ -110,14 +115,14 @@
<cell anchor='west'>
<JLabel id='batchWeightLabel'/>
</cell>
- <cell weightx='1.0'>
+ <cell weightx='1.0' columns='2'>
<NumberEditor id='batchWeightField' constructorParams='this'/>
</cell>
</row>
<!-- Form Actions -->
<row>
- <cell columns='2'>
+ <cell columns='3'>
<JPanel layout='{new GridLayout(1, 0)}'>
<JButton id='cancelButton' onActionPerformed='handler.cancel()'/>
<JButton id='saveButton' onActionPerformed='handler.save()'/>
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIHandler.java 2013-01-23 15:58:55 UTC (rev 243)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIHandler.java 2013-01-24 15:34:52 UTC (rev 244)
@@ -32,9 +32,11 @@
import fr.ifremer.tutti.persistence.entities.referential.Species;
import fr.ifremer.tutti.service.PersistenceService;
import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler;
+import fr.ifremer.tutti.ui.swing.TuttiUI;
import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUI;
import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUIModel;
import fr.ifremer.tutti.ui.swing.util.Cancelable;
+import java.awt.Dimension;
import jaxx.runtime.validator.swing.SwingValidatorMessageTableRenderer;
import jaxx.runtime.validator.swing.SwingValidatorUtil;
import org.apache.commons.logging.Log;
@@ -194,6 +196,10 @@
closeDialog(ui);
}
+ public void openDialog(TuttiUI dialogContent, String title) {
+ openDialog(ui, dialogContent, title, ui.getPreferredSize());
+ }
+
//------------------------------------------------------------------------//
//-- Public methods --//
//------------------------------------------------------------------------//
@@ -226,7 +232,7 @@
speciesToUse.addAll(allSpecies);
}
- ui.getSpeciesComboBox().setData(speciesToUse);
+ model.setAvailableSpecies(speciesToUse);
}
public void save() {
@@ -238,4 +244,9 @@
// close dialog
closeDialog(ui);
}
+
+ public CreateSpeciesBatchUI getUi() {
+ return ui;
+ }
+
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel.java 2013-01-23 15:58:55 UTC (rev 243)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel.java 2013-01-24 15:34:52 UTC (rev 244)
@@ -31,6 +31,8 @@
import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
/**
* Model of {@link CreateSpeciesBatchUI}.
@@ -40,6 +42,8 @@
*/
public class CreateSpeciesBatchUIModel extends AbstractTuttiBeanUIModel<CreateSpeciesBatchUIModel, CreateSpeciesBatchUIModel> {
+ private final static Log log = LogFactory.getLog(CreateSpeciesBatchUIModel.class);
+
private static final long serialVersionUID = 1L;
public static final String PROPERTY_AVAILABLE_SPECIES = "availableSpecies";
@@ -90,10 +94,13 @@
}
public List<Species> getAvailableSpecies() {
+ log.info("getAvailableSpecies " + availableSpecies);
return availableSpecies;
}
public void setAvailableSpecies(List<Species> availableSpecies) {
+
+ log.info("setAvailableSpecies " + availableSpecies);
Object oldValue = getAvailableSpecies();
this.availableSpecies = availableSpecies;
firePropertyChange(PROPERTY_AVAILABLE_SPECIES, oldValue, availableSpecies);
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java 2013-01-23 15:58:55 UTC (rev 243)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java 2013-01-24 15:34:52 UTC (rev 244)
@@ -307,7 +307,7 @@
String duration = "";
if (startDate != null && endDate != null) {
duration = DurationFormatUtils.formatPeriod(
- startDate.getTime(), endDate.getTime() + 60000, _(format));
+ startDate.getTime(), endDate.getTime(), _(format));
}
return duration;
}
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-23 15:58:55 UTC (rev 243)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-24 15:34:52 UTC (rev 244)
@@ -2,6 +2,7 @@
tutti.about.message=<h3>Tutti</h3><p><strong>Outil de saisie de données d'opérations et de captures au cours des campagnes halieutiques.</strong></p><br/><p>Ce logiciel permettra la saisie en mer des données d'opération de pêche (positions, environnement, engin, etc) et des captures associées (composition de la capture en espèces scientifiques avec poids, nombres, tailles etc) pour l'ensemble des campagnes halieutiques réalisées par l'Ifremer.</p><p>Ce projet a été initiée en 2012 par l'<a href\="http\://www.ifremer.fr">Ifremer</a> et réalisé par la société <a href\="http\://codelutin.com">Codelutin</a>.</p><hr/><br/><p>Pour plus d'informations, vous pouvez visiter le <a href\="http\://maven-site.forge.codelutin.com/tutti">site du projet</a>.</p><p>Projet hébergé sur la forge <a href\="http\://forge.codelutin.com/projects/tutti">Forge.codelutin.com</a>.</p>
tutti.action.about=À propos
tutti.action.about.tip=À Propos
+tutti.action.addSpecies.tip=Ajouter une espèce
tutti.action.cancel=Annuler
tutti.action.cancel.editCruise=Annuler
tutti.action.cancel.editCruise.tip=Annuler l'édition (ou la création) de la campagne
@@ -73,6 +74,7 @@
tutti.action.site.tip=Accéder au site du projet Tutti
tutti.action.splitSpeciesBatch=Catégoriser le lot
tutti.action.splitSpeciesBatch.tip=Catégoriser le lot courant (celui de la ligne sélectionné)
+tutti.action.validate=Valider
tutti.action.validateCatches=Valider les captures
tutti.action.validateCatches.tip=Valider les captures
tutti.application.config=Configuration de l'application Tutti
1
0
r243 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/config java/fr/ifremer/tutti/ui/swing/content/operation java/fr/ifremer/tutti/ui/swing/util/editor resources/fr/ifremer/tutti/ui/swing/content/operation resources/i18n
by kmorin@users.forge.codelutin.com 23 Jan '13
by kmorin@users.forge.codelutin.com 23 Jan '13
23 Jan '13
Author: kmorin
Date: 2013-01-23 16:58:55 +0100 (Wed, 23 Jan 2013)
New Revision: 243
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/243
Log:
add the DMD editor + debug validation
Added:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/CoordinateEditorType.java
Modified:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUI.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUI.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUI.java 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUI.java 2013-01-23 15:58:55 UTC (rev 243)
@@ -117,5 +117,13 @@
* @since 0.1
*/
public static final String DECIMAL3_PATTERN = "\\d{0,6}|\\d{1,6}.\\d{0,3}";
+
+ /**
+ * Pattern to use for decimal numeric values with 2 digits + 3 decimal digits in
+ * editors.
+ *
+ * @since 1.0
+ */
+ public static final String DECIMAL2_3_PATTERN = "\\d{0,2}|\\d{1,2}\\.\\d{0,3}";
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfig.java 2013-01-23 15:58:55 UTC (rev 243)
@@ -27,6 +27,7 @@
import com.google.common.base.Throwables;
import fr.ifremer.tutti.service.TuttiServiceTechnicalException;
import fr.ifremer.tutti.service.config.TuttiServiceConfig;
+import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.logging.Log;
@@ -129,8 +130,9 @@
return applicationConfig.getOptionAsBoolean(TuttiConfigOption.SHOW_NUMBER_EDITOR_BUTTON.getKey());
}
- public boolean isUseSexagecimalEditor() {
- return applicationConfig.getOptionAsBoolean(TuttiConfigOption.USE_SEXAGECIMAL_EDITOR.getKey());
+ public CoordinateEditorType getCoordinateEditorType() {
+ String value = applicationConfig.getOption(TuttiConfigOption.COORDINATE_EDITOR_TYPE.getKey());
+ return CoordinateEditorType.valueOf(value);
}
public String getProgramId() {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigOption.java 2013-01-23 15:58:55 UTC (rev 243)
@@ -24,6 +24,7 @@
* #L%
*/
+import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType;
import org.nuiton.util.ApplicationConfig;
import javax.swing.KeyStroke;
@@ -100,11 +101,11 @@
"alt pressed F",
KeyStroke.class),
- USE_SEXAGECIMAL_EDITOR(
- "tutti.ui.useSexagecimalEditor",
- n_("tutti.config.ui.useSexagecimalEditor"),
- "false",
- Boolean.class);
+ COORDINATE_EDITOR_TYPE(
+ "tutti.ui.coordinateEditorType",
+ n_("tutti.config.ui.coordinateEditorType"),
+ CoordinateEditorType.DD.toString(),
+ CoordinateEditorType.class);
/** Configuration key. */
private final String key;
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java 2013-01-23 15:58:55 UTC (rev 243)
@@ -108,7 +108,7 @@
CALLBACK_UI)
.addOption(TuttiConfigOption.COLOR_ROW_INVALID)
.addOption(TuttiConfigOption.COLOR_ROW_READ_ONLY)
- .addOption(TuttiConfigOption.USE_SEXAGECIMAL_EDITOR);
+ .addOption(TuttiConfigOption.COORDINATE_EDITOR_TYPE);
// SHORTCUT
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css 2013-01-23 15:58:55 UTC (rev 243)
@@ -137,9 +137,8 @@
text: "tutti.label.fishingOperation.gearShootingEnd";
}
-
CardLayout2Ext {
- selected: {handler.getConfig().isUseSexagecimalEditor() ? "DMS" : "DD"};
+ selected: { ((CoordinateEditorType)handler.getConfig().getCoordinateEditorType()).toString() };
}
#traitVesselPanel {
@@ -192,6 +191,13 @@
numberPattern: {INT_2_DIGITS_PATTERN};
}
+.decimalMinute {
+ showReset: false;
+ useFloat: true;
+ useSign: false;
+ numberPattern: {DECIMAL2_3_PATTERN};
+}
+
.second {
showReset: false;
useFloat: false;
@@ -219,6 +225,17 @@
model: {model.getGearShootingStartLongitudeSecond()};
}
+#gearShootingStartLongitudeDMDDegreeField {
+ property: gearShootingStartLongitudeDegree;
+ model: {model.getGearShootingStartLongitudeDegree()};
+ numberPattern: {SIGNED_INT_3_DIGITS_PATTERN};
+}
+
+#gearShootingStartLongitudeDMDMinuteField {
+ property: gearShootingStartLongitudeDecimalMinute;
+ model: {model.getGearShootingStartLongitudeDecimalMinute()};
+}
+
#gearShootingStartLongitudeDDField {
property: gearShootingStartLongitude;
model: {model.getGearShootingStartLongitude()};
@@ -247,6 +264,17 @@
model: {model.getGearShootingStartLatitudeSecond()};
}
+#gearShootingStartLatitudeDMDDegreeField {
+ property: gearShootingStartLatitudeDegree;
+ model: {model.getGearShootingStartLatitudeDegree()};
+ numberPattern: {SIGNED_INT_2_DIGITS_PATTERN};
+}
+
+#gearShootingStartLatitudeDMDMinuteField {
+ property: gearShootingStartLatitudeDecimalMinute;
+ model: {model.getGearShootingStartLatitudeDecimalMinute()};
+}
+
#gearShootingStartLatitudeDDField {
property: gearShootingStartLatitude;
model: {model.getGearShootingStartLatitude()};
@@ -285,6 +313,17 @@
model: {model.getGearShootingEndLongitudeSecond()};
}
+#gearShootingEndLongitudeDMDDegreeField {
+ property: gearShootingEndLongitudeDegree;
+ model: {model.getGearShootingEndLongitudeDegree()};
+ numberPattern: {SIGNED_INT_3_DIGITS_PATTERN};
+}
+
+#gearShootingEndLongitudeDMDMinuteField {
+ property: gearShootingEndLongitudeDecimalMinute;
+ model: {model.getGearShootingEndLongitudeDecimalMinute()};
+}
+
#gearShootingEndLongitudeDDField {
property: gearShootingEndLongitude;
model: {model.getGearShootingEndLongitude()};
@@ -313,6 +352,17 @@
model: {model.getGearShootingEndLatitudeSecond()};
}
+#gearShootingEndLatitudeDMDDegreeField {
+ property: gearShootingEndLatitudeDegree;
+ model: {model.getGearShootingEndLatitudeDegree()};
+ numberPattern: {SIGNED_INT_2_DIGITS_PATTERN};
+}
+
+#gearShootingEndLatitudeDMDMinuteField {
+ property: gearShootingEndLatitudeDecimalMinute;
+ model: {model.getGearShootingEndLatitudeDecimalMinute()};
+}
+
#gearShootingEndLatitudeDDField {
property: gearShootingEndLatitude;
model: {model.getGearShootingEndLatitude()};
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-01-23 15:58:55 UTC (rev 243)
@@ -30,11 +30,12 @@
fr.ifremer.tutti.persistence.entities.referential.Gear
fr.ifremer.tutti.persistence.entities.referential.Person
fr.ifremer.tutti.persistence.entities.referential.Vessel
-
- fr.ifremer.tutti.ui.swing.util.editor.SimpleTimeEditor
+
fr.ifremer.tutti.ui.swing.content.operation.fishing.environment.EnvironmentTabUI
fr.ifremer.tutti.ui.swing.content.operation.fishing.gearshooting.GearShootingTabUI
fr.ifremer.tutti.ui.swing.content.operation.fishing.hydrology.HydrologyTabUI
+ fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType
+ fr.ifremer.tutti.ui.swing.util.editor.SimpleTimeEditor
jaxx.runtime.swing.editor.bean.BeanComboBox
jaxx.runtime.swing.editor.bean.BeanListHeader
@@ -100,6 +101,10 @@
component='gearShootingStartLatitudeDMSMinuteField'/>
<field name='gearShootingStartLatitudeSecond'
component='gearShootingStartLatitudeDMSSecondField'/>
+ <field name='gearShootingStartLatitudeDecimalDegree'
+ component='gearShootingStartLatitudeDMDDegreeField'/>
+ <field name='gearShootingStartLatitudeDecimalMinute'
+ component='gearShootingStartLatitudeDMDMinuteField'/>
<field name='gearShootingStartLongitude'
component='gearShootingStartLongitudeDDField'/>
<field name='gearShootingStartLongitudeDegree'
@@ -108,6 +113,10 @@
component='gearShootingStartLongitudeDMSMinuteField'/>
<field name='gearShootingStartLongitudeSecond'
component='gearShootingStartLongitudeDMSSecondField'/>
+ <field name='gearShootingStartLongitudeDecimalDegree'
+ component='gearShootingStartLongitudeDMDDegreeField'/>
+ <field name='gearShootingStartLongitudeDecimalMinute'
+ component='gearShootingStartLongitudeDMDMinuteField'/>
<field name='gearShootingEndLatitude'
component='gearShootingEndLatitudeDDField'/>
<field name='gearShootingEndLatitudeDegree'
@@ -116,6 +125,10 @@
component='gearShootingEndLatitudeDMSMinuteField'/>
<field name='gearShootingEndLatitudeSecond'
component='gearShootingEndLatitudeDMSSecondField'/>
+ <field name='gearShootingEndLatitudeDecimalDegree'
+ component='gearShootingEndLatitudeDMDDegreeField'/>
+ <field name='gearShootingEndLatitudeDecimalMinute'
+ component='gearShootingEndLatitudeDMDMinuteField'/>
<field name='gearShootingEndLongitude'
component='gearShootingEndLongitudeDDField'/>
<field name='gearShootingEndLongitudeDegree'
@@ -124,6 +137,10 @@
component='gearShootingEndLongitudeDMSMinuteField'/>
<field name='gearShootingEndLongitudeSecond'
component='gearShootingEndLongitudeDMSSecondField'/>
+ <field name='gearShootingEndLongitudeDecimalDegree'
+ component='gearShootingEndLongitudeDMDDegreeField'/>
+ <field name='gearShootingEndLongitudeDecimalMinute'
+ component='gearShootingEndLongitudeDMDMinuteField'/>
</BeanValidator>
<CardLayout2Ext id='gearShootingStartLongitudeLayout'
@@ -239,7 +256,16 @@
id='gearShootingStartLatitudeDMSSecondField'
constructorParams='this' styleClass='second'/>
</JPanel>
- <!-- -->
+ <JPanel layout="{new GridLayout(1,0)}"
+ constraints='"DMD"'>
+ <NumberEditor
+ id='gearShootingStartLatitudeDMDDegreeField'
+ constructorParams='this' styleClass='degree'/>
+
+ <NumberEditor
+ id='gearShootingStartLatitudeDMDMinuteField'
+ constructorParams='this' styleClass='decimalMinute'/>
+ </JPanel>
</JPanel>
</cell>
<cell weightx='1'>
@@ -261,6 +287,16 @@
id='gearShootingStartLongitudeDMSSecondField'
constructorParams='this' styleClass='second'/>
</JPanel>
+ <JPanel layout="{new GridLayout(1,0)}"
+ constraints='"DMD"'>
+ <NumberEditor
+ id='gearShootingStartLongitudeDMDDegreeField'
+ constructorParams='this' styleClass='degree'/>
+
+ <NumberEditor
+ id='gearShootingStartLongitudeDMDMinuteField'
+ constructorParams='this' styleClass='decimalMinute'/>
+ </JPanel>
</JPanel>
</cell>
<cell>
@@ -295,6 +331,16 @@
id='gearShootingEndLatitudeDMSSecondField'
constructorParams='this' styleClass='second'/>
</JPanel>
+ <JPanel layout="{new GridLayout(1,0)}"
+ constraints='"DMD"'>
+ <NumberEditor
+ id='gearShootingEndLatitudeDMDDegreeField'
+ constructorParams='this' styleClass='degree'/>
+
+ <NumberEditor
+ id='gearShootingEndLatitudeDMDMinuteField'
+ constructorParams='this' styleClass='decimalMinute'/>
+ </JPanel>
</JPanel>
</cell>
<cell weightx='1'>
@@ -316,6 +362,16 @@
id='gearShootingEndLongitudeDMSSecondField'
constructorParams='this' styleClass='second'/>
</JPanel>
+ <JPanel layout="{new GridLayout(1,0)}"
+ constraints='"DMD"'>
+ <NumberEditor
+ id='gearShootingEndLongitudeDMDDegreeField'
+ constructorParams='this' styleClass='degree'/>
+
+ <NumberEditor
+ id='gearShootingEndLongitudeDMDMinuteField'
+ constructorParams='this' styleClass='decimalMinute'/>
+ </JPanel>
</JPanel>
</cell>
<cell>
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-01-23 15:58:55 UTC (rev 243)
@@ -47,19 +47,17 @@
import fr.ifremer.tutti.ui.swing.util.AbstractTuttiTabContainerUIHandler;
import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTabbedPane;
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
-
/**
* Handler for UI {@link EditFishingOperationUI}.
*
@@ -117,6 +115,7 @@
public void beforeInitUI() {
EditFishingOperationUIModel model = new EditFishingOperationUIModel();
+ model.setCoordinateEditorType(getConfig().getCoordinateEditorType());
model.setValidationContext(getContext().getValidationContext());
model.addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_EMPTY, new PropertyChangeListener() {
@@ -419,34 +418,6 @@
//TODO
}
- public void setGearShootingStartLatitude(String text) {
- getModel().setGearShootingStartLatitude(Float.valueOf(text));
- }
-
- public void setGearShootingStartLatitudeDegree(String text) {
- getModel().setGearShootingStartLatitude(Float.valueOf(text));
- }
-
- public void setGearShootingStartLatitudeMinute(String text) {
- getModel().setGearShootingStartLatitude(Float.valueOf(text));
- }
-
- public void setGearShootingStartLatitudeSecond(String text) {
- getModel().setGearShootingStartLatitude(Float.valueOf(text));
- }
-
- public void setGearShootingStartLongitude(String text) {
- getModel().setGearShootingStartLongitude(Float.valueOf(text));
- }
-
- public void setGearShootingEndLatitude(String text) {
- getModel().setGearShootingEndLatitude(Float.valueOf(text));
- }
-
- public void setGearShootingEndLongitude(String text) {
- getModel().setGearShootingEndLongitude(Float.valueOf(text));
- }
-
public FishingOperationsUI getParentUi() {
return parentUi;
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java 2013-01-23 15:58:55 UTC (rev 243)
@@ -34,9 +34,12 @@
import fr.ifremer.tutti.persistence.entities.referential.Vessel;
import fr.ifremer.tutti.persistence.spatial.SexagecimalPosition;
import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
+import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.nuiton.util.beans.Binder;
import org.nuiton.util.beans.BinderFactory;
@@ -51,6 +54,8 @@
public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<FishingOperation, EditFishingOperationUIModel> {
private static final long serialVersionUID = 1L;
+
+ private static final Log log = LogFactory.getLog(EditFishingOperationUIModel.class);
public static final String TITLE =
n_("tutti.label.tab.fishingOperation.general");
@@ -70,8 +75,10 @@
public static final String PROPERTY_GEAR_SHOOTING_START_LATITUDE = "gearShootingStartLatitude";
public static final String PROPERTY_GEAR_SHOOTING_START_LATITUDE_DEGREE = "gearShootingStartLatitudeDegree";
-
+
public static final String PROPERTY_GEAR_SHOOTING_START_LATITUDE_MINUTE = "gearShootingStartLatitudeMinute";
+
+ public static final String PROPERTY_GEAR_SHOOTING_START_LATITUDE_DECIMAL_MINUTE = "gearShootingStartLatitudeDecimalMinute";
public static final String PROPERTY_GEAR_SHOOTING_START_LATITUDE_SECOND = "gearShootingStartLatitudeSecond";
@@ -80,6 +87,8 @@
public static final String PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DEGREE = "gearShootingStartLongitudeDegree";
public static final String PROPERTY_GEAR_SHOOTING_START_LONGITUDE_MINUTE = "gearShootingStartLongitudeMinute";
+
+ public static final String PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DECIMAL_MINUTE = "gearShootingStartLongitudeDecimalMinute";
public static final String PROPERTY_GEAR_SHOOTING_START_LONGITUDE_SECOND = "gearShootingStartLongitudeSecond";
@@ -90,6 +99,8 @@
public static final String PROPERTY_GEAR_SHOOTING_END_LATITUDE_DEGREE = "gearShootingEndLatitudeDegree";
public static final String PROPERTY_GEAR_SHOOTING_END_LATITUDE_MINUTE = "gearShootingEndLatitudeMinute";
+
+ public static final String PROPERTY_GEAR_SHOOTING_END_LATITUDE_DECIMAL_MINUTE = "gearShootingEndLatitudeDecimalMinute";
public static final String PROPERTY_GEAR_SHOOTING_END_LATITUDE_SECOND = "gearShootingEndLatitudeSecond";
@@ -98,6 +109,8 @@
public static final String PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DEGREE = "gearShootingEndLongitudeDegree";
public static final String PROPERTY_GEAR_SHOOTING_END_LONGITUDE_MINUTE = "gearShootingEndLongitudeMinute";
+
+ public static final String PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DECIMAL_MINUTE = "gearShootingEndLongitudeDecimalMinute";
public static final String PROPERTY_GEAR_SHOOTING_END_LONGITUDE_SECOND = "gearShootingEndLongitudeSecond";
@@ -184,6 +197,8 @@
protected Integer trawlNetNumber;
+ protected CoordinateEditorType coordinateEditorType;
+
protected static Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder =
BinderFactory.newBinder(EditFishingOperationUIModel.class,
FishingOperation.class);
@@ -291,7 +306,11 @@
}
return result;
}
-
+
+ public Integer getGearShootingStartLatitudeDecimalDegree() {
+ return getGearShootingStartLatitudeDegree();
+ }
+
public void setGearShootingStartLatitudeDegree(Integer degree) {
Object oldValue = getGearShootingStartLatitudeDegree();
boolean sign = degree != null && degree < 0;
@@ -302,6 +321,10 @@
gearShootingStartLatitudeAsSexagecimal.setDegre(degree);
firePropertyChange(PROPERTY_GEAR_SHOOTING_START_LATITUDE_DEGREE, oldValue, degree);
}
+
+ public void setGearShootingStartLatitudeDecimalDegree(Integer degree) {
+ setGearShootingStartLatitudeDegree(degree);
+ }
public Integer getGearShootingStartLatitudeMinute() {
return gearShootingStartLatitudeAsSexagecimal.getMinute();
@@ -311,7 +334,17 @@
Object oldValue = getGearShootingStartLatitudeMinute();
gearShootingStartLatitudeAsSexagecimal.setMinute(minute);
firePropertyChange(PROPERTY_GEAR_SHOOTING_START_LATITUDE_MINUTE, oldValue, minute);
+ }
+
+ public Float getGearShootingStartLatitudeDecimalMinute() {
+ return gearShootingStartLatitudeAsSexagecimal.getMinuteDecimale();
+ }
+ public void setGearShootingStartLatitudeDecimalMinute(Float decimalMinute) {
+ gearShootingStartLatitudeAsSexagecimal.setMinuteDecimale(decimalMinute);
+ // 2013-01-22 kmorin: pass null as previous value,
+ // otherwise the filed is not filled with the value (I cannot explain why... :()
+ firePropertyChange(PROPERTY_GEAR_SHOOTING_START_LATITUDE_DECIMAL_MINUTE, null, decimalMinute);
}
public Integer getGearShootingStartLatitudeSecond() {
@@ -342,6 +375,10 @@
}
return result;
}
+
+ public Integer getGearShootingStartLongitudeDecimalDegree() {
+ return getGearShootingStartLongitudeDegree();
+ }
public void setGearShootingStartLongitudeDegree(Integer degree) {
Object oldValue = getGearShootingStartLongitudeDegree();
@@ -353,6 +390,10 @@
gearShootingStartLongitudeAsSexagecimal.setDegre(degree);
firePropertyChange(PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DEGREE, oldValue, degree);
}
+
+ public void setGearShootingStartLongitudeDecimalDegree(Integer degree) {
+ setGearShootingStartLongitudeDegree(degree);
+ }
public Integer getGearShootingStartLongitudeMinute() {
return gearShootingStartLongitudeAsSexagecimal.getMinute();
@@ -362,7 +403,17 @@
Object oldValue = getGearShootingStartLongitudeMinute();
gearShootingStartLongitudeAsSexagecimal.setMinute(minute);
firePropertyChange(PROPERTY_GEAR_SHOOTING_START_LONGITUDE_MINUTE, oldValue, minute);
+ }
+
+ public Float getGearShootingStartLongitudeDecimalMinute() {
+ return gearShootingStartLongitudeAsSexagecimal.getMinuteDecimale();
+ }
+ public void setGearShootingStartLongitudeDecimalMinute(Float decimalMinute) {
+ gearShootingStartLongitudeAsSexagecimal.setMinuteDecimale(decimalMinute);
+ // 2013-01-22 kmorin: pass null as previous value,
+ // otherwise the filed is not filled with the value (I cannot explain why... :()
+ firePropertyChange(PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DECIMAL_MINUTE, null, decimalMinute);
}
public Integer getGearShootingStartLongitudeSecond() {
@@ -410,6 +461,10 @@
}
return result;
}
+
+ public Integer getGearShootingEndLatitudeDecimalDegree() {
+ return getGearShootingEndLatitudeDegree();
+ }
public void setGearShootingEndLatitudeDegree(Integer degree) {
Object oldValue = getGearShootingEndLatitudeDegree();
@@ -421,6 +476,10 @@
gearShootingEndLatitudeAsSexagecimal.setDegre(degree);
firePropertyChange(PROPERTY_GEAR_SHOOTING_END_LATITUDE_DEGREE, oldValue, degree);
}
+
+ public void setGearShootingEndLatitudeDecimalDegree(Integer degree) {
+ setGearShootingEndLatitudeDegree(degree);
+ }
public Integer getGearShootingEndLatitudeMinute() {
return gearShootingEndLatitudeAsSexagecimal.getMinute();
@@ -430,7 +489,17 @@
Object oldValue = getGearShootingEndLatitudeMinute();
gearShootingEndLatitudeAsSexagecimal.setMinute(minute);
firePropertyChange(PROPERTY_GEAR_SHOOTING_END_LATITUDE_MINUTE, oldValue, minute);
+ }
+
+ public Float getGearShootingEndLatitudeDecimalMinute() {
+ return gearShootingEndLatitudeAsSexagecimal.getMinuteDecimale();
+ }
+ public void setGearShootingEndLatitudeDecimalMinute(Float decimalMinute) {
+ gearShootingEndLatitudeAsSexagecimal.setMinuteDecimale(decimalMinute);
+ // 2013-01-22 kmorin: pass null as previous value,
+ // otherwise the filed is not filled with the value (I cannot explain why... :()
+ firePropertyChange(PROPERTY_GEAR_SHOOTING_END_LATITUDE_DECIMAL_MINUTE, null, decimalMinute);
}
public Integer getGearShootingEndLatitudeSecond() {
@@ -460,6 +529,10 @@
}
return result;
}
+
+ public Integer getGearShootingEndLongitudeDecimalDegree() {
+ return getGearShootingEndLongitudeDegree();
+ }
public void setGearShootingEndLongitudeDegree(Integer degree) {
Object oldValue = getGearShootingEndLongitudeDegree();
@@ -471,6 +544,10 @@
gearShootingEndLongitudeAsSexagecimal.setDegre(degree);
firePropertyChange(PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DEGREE, oldValue, degree);
}
+
+ public void setGearShootingEndLongitudeDecimalDegree(Integer degree) {
+ setGearShootingEndLongitudeDegree(degree);
+ }
public Integer getGearShootingEndLongitudeMinute() {
return gearShootingEndLongitudeAsSexagecimal.getMinute();
@@ -480,9 +557,19 @@
Object oldValue = getGearShootingEndLongitudeMinute();
gearShootingEndLongitudeAsSexagecimal.setMinute(minute);
firePropertyChange(PROPERTY_GEAR_SHOOTING_END_LONGITUDE_MINUTE, oldValue, minute);
+ }
+ public Float getGearShootingEndLongitudeDecimalMinute() {
+ return gearShootingEndLongitudeAsSexagecimal.getMinuteDecimale();
}
+ public void setGearShootingEndLongitudeDecimalMinute(Float decimalMinute) {
+ gearShootingEndLongitudeAsSexagecimal.setMinuteDecimale(decimalMinute);
+ // 2013-01-22 kmorin: pass null as previous value,
+ // otherwise the filed is not filled with the value (I cannot explain why... :()
+ firePropertyChange(PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DECIMAL_MINUTE, null, decimalMinute);
+ }
+
public Integer getGearShootingEndLongitudeSecond() {
return gearShootingEndLongitudeAsSexagecimal.getSeconde();
}
@@ -614,6 +701,14 @@
firePropertyChange(PROPERTY_TRAWL_NET_NUMBER, oldValue, trawlNetNumber);
}
+ public CoordinateEditorType getCoordinateEditorType() {
+ return coordinateEditorType;
+ }
+
+ public void setCoordinateEditorType(CoordinateEditorType coordinateEditorType) {
+ this.coordinateEditorType = coordinateEditorType;
+ }
+
@Override
protected FishingOperation newEntity() {
return fishingOperation;
@@ -631,6 +726,7 @@
setGearShootingStartLatitudeDegree(degree);
setGearShootingStartLatitudeMinute(position.getMinute());
setGearShootingStartLatitudeSecond(position.getSeconde());
+ setGearShootingStartLatitudeDecimalMinute(position.getMinuteDecimale());
position = SexagecimalPosition.valueOf(gearShootingStartLongitude);
degree = position.getDegre();
@@ -640,6 +736,7 @@
setGearShootingStartLongitudeDegree(degree);
setGearShootingStartLongitudeMinute(position.getMinute());
setGearShootingStartLongitudeSecond(position.getSeconde());
+ setGearShootingStartLongitudeDecimalMinute(position.getMinuteDecimale());
position = SexagecimalPosition.valueOf(gearShootingEndLatitude);
degree = position.getDegre();
@@ -652,6 +749,7 @@
setGearShootingEndLatitudeDegree(degree);
setGearShootingEndLatitudeMinute(position.getMinute());
setGearShootingEndLatitudeSecond(position.getSeconde());
+ setGearShootingEndLatitudeDecimalMinute(position.getMinuteDecimale());
position = SexagecimalPosition.valueOf(gearShootingEndLongitude);
degree = position.getDegre();
@@ -661,6 +759,7 @@
setGearShootingEndLongitudeDegree(degree);
setGearShootingEndLongitudeMinute(position.getMinute());
setGearShootingEndLongitudeSecond(position.getSeconde());
+ setGearShootingEndLongitudeDecimalMinute(position.getMinuteDecimale());
}
public void convertGearShootingCoordinatesDMSToDD() {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-01-23 15:58:55 UTC (rev 243)
@@ -28,6 +28,7 @@
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
import fr.ifremer.tutti.ui.swing.AbstractTuttiAction;
import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
+import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -73,7 +74,7 @@
log.warn("Won't save new fishing operation, use explicit save button instead...");
}
} else if (beanToSave.isValid()) {
- if (handler.getConfig().isUseSexagecimalEditor()) {
+ if (beanToSave.getCoordinateEditorType() != CoordinateEditorType.DD) {
beanToSave.convertGearShootingCoordinatesDMSToDD();
}
Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/CoordinateEditorType.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/CoordinateEditorType.java (rev 0)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/CoordinateEditorType.java 2013-01-23 15:58:55 UTC (rev 243)
@@ -0,0 +1,13 @@
+
+package fr.ifremer.tutti.ui.swing.util.editor;
+
+/**
+ *
+ * @author kmorin <kmorin(a)codelutin.com>
+ * @since 1.0
+ */
+public enum CoordinateEditorType {
+
+ DMS, DD, DMD
+
+}
Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml 2013-01-23 15:58:55 UTC (rev 243)
@@ -38,7 +38,8 @@
<param name="doubleParams">min:90.0|max:90.0</param>
<param name="expression">
<![CDATA[
- useSexagecimalFormat || ( -doubles.min <= gearShootingStartLatitude && gearShootingStartLatitude <= doubles.max )
+ !"DD".equals(coordinateEditorType.toString()) ||
+ ( -doubles.min <= gearShootingStartLatitude && gearShootingStartLatitude <= doubles.max )
]]>
</param>
@@ -54,7 +55,7 @@
<param name="intParams">min:90|max:90</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || (
+ !"DMS".equals(coordinateEditorType.toString()) || (
( -ints.min < getGearShootingStartLatitudeDegree() && getGearShootingStartLatitudeDegree() < ints.max )
|| (
( getGearShootingStartLatitudeDegree() == ints.max || getGearShootingStartLatitudeDegree() == -ints.min )
@@ -69,14 +70,37 @@
</field-validator>
</field>
+
+ <field name="gearShootingStartLatitudeDecimalDegree">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="intParams">min:90|max:90</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) || (
+ ( -ints.min < getGearShootingStartLatitudeDecimalDegree() && getGearShootingStartLatitudeDecimalDegree() < ints.max )
+ || (
+ ( getGearShootingStartLatitudeDecimalDegree() == ints.max || getGearShootingStartLatitudeDecimalDegree() == -ints.min )
+ && getGearShootingStartLatitudeDecimalMinute() == 0.0
+ )
+ )
+ ]]>
+ </param>
+
+ <message>tutti.validator.warning.latitude.degree.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingStartLatitudeMinute">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingStartLatitudeMinute() && getGearShootingStartLatitudeMinute() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingStartLatitudeMinute() && getGearShootingStartLatitudeMinute() < ints.max )
]]>
</param>
@@ -85,14 +109,31 @@
</field-validator>
</field>
+
+ <field name="gearShootingStartLatitudeDecimalMinute">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="doubleParams">min:0.0|max:60.0</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) ||
+ ( doubles.min <= getGearShootingStartLatitudeDecimalMinute() && getGearShootingStartLatitudeDecimalMinute() < doubles.max )
+ ]]>
+ </param>
+ <message>tutti.validator.warning.latitude.minute.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingStartLatitudeSecond">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingStartLatitudeSecond() && getGearShootingStartLatitudeSecond() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingStartLatitudeSecond() && getGearShootingStartLatitudeSecond() < ints.max )
]]>
</param>
@@ -110,7 +151,8 @@
<param name="doubleParams">min:180.0|max:180.0</param>
<param name="expression">
<![CDATA[
- useSexagecimalFormat || ( -doubles.min <= gearShootingStartLongitude && gearShootingStartLongitude <= doubles.max )
+ !"DD".equals(coordinateEditorType.toString()) ||
+ ( -doubles.min <= gearShootingStartLongitude && gearShootingStartLongitude <= doubles.max )
]]>
</param>
@@ -126,7 +168,7 @@
<param name="intParams">min:180|max:180</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || (
+ !"DMS".equals(coordinateEditorType.toString()) || (
(-ints.min < getGearShootingStartLongitudeDegree() && getGearShootingStartLongitudeDegree() < ints.max)
|| (
( getGearShootingStartLongitudeDegree() == ints.max || getGearShootingStartLongitudeDegree() == -ints.min )
@@ -141,14 +183,37 @@
</field-validator>
</field>
+
+ <field name="gearShootingStartLongitudeDecimalDegree">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="intParams">min:180|max:180</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) || (
+ (-ints.min < getGearShootingStartLongitudeDecimalDegree() && getGearShootingStartLongitudeDecimalDegree() < ints.max)
+ || (
+ ( getGearShootingStartLongitudeDecimalDegree() == ints.max || getGearShootingStartLongitudeDecimalDegree() == -ints.min )
+ && getGearShootingStartLongitudeDecimalMinute() == 0.0
+ )
+ )
+ ]]>
+ </param>
+
+ <message>tutti.validator.warning.longitude.degree.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingStartLongitudeMinute">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingStartLongitudeMinute() && getGearShootingStartLongitudeMinute() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingStartLongitudeMinute() && getGearShootingStartLongitudeMinute() < ints.max )
]]>
</param>
@@ -157,14 +222,31 @@
</field-validator>
</field>
+
+ <field name="gearShootingStartLongitudeDecimalMinute">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="doubleParams">min:0.0|max:60.0</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) ||
+ ( doubles.min <= getGearShootingStartLongitudeDecimalMinute() && getGearShootingStartLongitudeDecimalMinute() < doubles.max )
+ ]]>
+ </param>
+ <message>tutti.validator.warning.longitude.minute.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingStartLongitudeSecond">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingStartLongitudeSecond() && getGearShootingStartLongitudeSecond() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingStartLongitudeSecond() && getGearShootingStartLongitudeSecond() < ints.max )
]]>
</param>
@@ -182,7 +264,8 @@
<param name="doubleParams">min:90.0|max:90.0</param>
<param name="expression">
<![CDATA[
- useSexagecimalFormat || ( -doubles.min <= gearShootingEndLatitude && gearShootingEndLatitude <= doubles.max )
+ !"DD".equals(coordinateEditorType.toString()) ||
+ ( -doubles.min <= gearShootingEndLatitude && gearShootingEndLatitude <= doubles.max )
]]>
</param>
@@ -199,7 +282,7 @@
<param name="intParams">min:90|max:90</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || (
+ !"DMS".equals(coordinateEditorType.toString()) || (
(-ints.min < getGearShootingEndLatitudeDegree() && getGearShootingEndLatitudeDegree() < ints.max)
|| (
( getGearShootingEndLatitudeDegree() == ints.max || getGearShootingEndLatitudeDegree() == -ints.min )
@@ -214,14 +297,37 @@
</field-validator>
</field>
+
+ <field name="gearShootingEndLatitudeDecimalDegree">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="intParams">min:90|max:90</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) || (
+ (-ints.min < getGearShootingEndLatitudeDecimalDegree() && getGearShootingEndLatitudeDecimalDegree() < ints.max)
+ || (
+ ( getGearShootingEndLatitudeDecimalDegree() == ints.max || getGearShootingEndLatitudeDecimalDegree() == -ints.min )
+ && getGearShootingEndLatitudeDecimalMinute() == 0.0
+ )
+ )
+ ]]>
+ </param>
+
+ <message>tutti.validator.warning.latitude.degree.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingEndLatitudeMinute">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingEndLatitudeMinute() && getGearShootingEndLatitudeMinute() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingEndLatitudeMinute() && getGearShootingEndLatitudeMinute() < ints.max )
]]>
</param>
@@ -230,14 +336,31 @@
</field-validator>
</field>
+
+ <field name="gearShootingEndLatitudeDecimalMinute">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="doubleParams">min:0.0|max:60.0</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) ||
+ ( doubles.min <= getGearShootingEndLatitudeDecimalMinute() && getGearShootingEndLatitudeDecimalMinute() < doubles.max )
+ ]]>
+ </param>
+ <message>tutti.validator.warning.latitude.minute.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingEndLatitudeSecond">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingEndLatitudeSecond() && getGearShootingEndLatitudeSecond() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingEndLatitudeSecond() && getGearShootingEndLatitudeSecond() < ints.max )
]]>
</param>
@@ -255,7 +378,8 @@
<param name="doubleParams">min:180.0|max:180.0</param>
<param name="expression">
<![CDATA[
- useSexagecimalFormat || ( -doubles.min <= gearShootingEndLongitude && gearShootingEndLongitude <= doubles.max )
+ !"DD".equals(coordinateEditorType.toString()) ||
+ ( -doubles.min <= gearShootingEndLongitude && gearShootingEndLongitude <= doubles.max )
]]>
</param>
@@ -271,7 +395,7 @@
<param name="intParams">min:180|max:180</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || (
+ !"DMS".equals(coordinateEditorType.toString()) || (
(-ints.min < getGearShootingEndLongitudeDegree() && getGearShootingEndLongitudeDegree() < ints.max)
|| (
( getGearShootingEndLongitudeDegree() == ints.max || getGearShootingEndLongitudeDegree() == -ints.min )
@@ -286,14 +410,37 @@
</field-validator>
</field>
+
+ <field name="gearShootingEndLongitudeDecimalDegree">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="intParams">min:180|max:180</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) || (
+ (-ints.min < getGearShootingEndLongitudeDecimalDegree() && getGearShootingEndLongitudeDecimalDegree() < ints.max)
+ || (
+ ( getGearShootingEndLongitudeDecimalDegree() == ints.max || getGearShootingEndLongitudeDecimalDegree() == -ints.min )
+ && getGearShootingEndLongitudeDecimalMinute() == 0.0
+ )
+ )
+ ]]>
+ </param>
+
+ <message>tutti.validator.warning.longitude.degree.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingEndLongitudeMinute">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingEndLongitudeMinute() && getGearShootingEndLongitudeMinute() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingEndLongitudeMinute() && getGearShootingEndLongitudeMinute() < ints.max )
]]>
</param>
@@ -303,13 +450,30 @@
</field>
+ <field name="gearShootingEndLongitudeDecimalMinute">
+
+ <field-validator type="fieldexpressionwithparams">
+ <param name="doubleParams">min:0.0|max:60.0</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) ||
+ ( doubles.min <= getGearShootingEndLongitudeDecimalMinute() && getGearShootingEndLongitudeDecimalMinute() < doubles.max )
+ ]]>
+ </param>
+ <message>tutti.validator.warning.longitude.minute.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingEndLongitudeSecond">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingEndLongitudeSecond() && getGearShootingEndLongitudeSecond() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingEndLongitudeSecond() && getGearShootingEndLongitudeSecond() < ints.max )
]]>
</param>
Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml 2013-01-23 15:58:55 UTC (rev 243)
@@ -74,13 +74,14 @@
<!--gear shooting start latitude validation -->
- <field name="gearShootingStartLatitude">
+ <field name="gearShootingStartLatitude">
<field-validator type="fieldexpressionwithparams">
<param name="doubleParams">min:90.0|max:90.0</param>
<param name="expression">
<![CDATA[
- useSexagecimalFormat || ( -doubles.min <= gearShootingStartLatitude && gearShootingStartLatitude <= doubles.max )
+ !"DD".equals(coordinateEditorType.toString()) ||
+ ( -doubles.min <= gearShootingStartLatitude && gearShootingStartLatitude <= doubles.max )
]]>
</param>
@@ -96,7 +97,7 @@
<param name="intParams">min:90|max:90</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || (
+ !"DMS".equals(coordinateEditorType.toString()) || (
( -ints.min < getGearShootingStartLatitudeDegree() && getGearShootingStartLatitudeDegree() < ints.max )
|| (
( getGearShootingStartLatitudeDegree() == ints.max || getGearShootingStartLatitudeDegree() == -ints.min )
@@ -111,14 +112,37 @@
</field-validator>
</field>
+
+ <field name="gearShootingStartLatitudeDecimalDegree">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="intParams">min:90|max:90</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) || (
+ ( -ints.min < getGearShootingStartLatitudeDecimalDegree() && getGearShootingStartLatitudeDecimalDegree() < ints.max )
+ || (
+ ( getGearShootingStartLatitudeDecimalDegree() == ints.max || getGearShootingStartLatitudeDecimalDegree() == -ints.min )
+ && getGearShootingStartLatitudeDecimalMinute() == 0.0
+ )
+ )
+ ]]>
+ </param>
+
+ <message>tutti.validator.warning.latitude.degree.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingStartLatitudeMinute">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingStartLatitudeMinute() && getGearShootingStartLatitudeMinute() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingStartLatitudeMinute() && getGearShootingStartLatitudeMinute() < ints.max )
]]>
</param>
@@ -127,14 +151,31 @@
</field-validator>
</field>
+
+ <field name="gearShootingStartLatitudeDecimalMinute">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="doubleParams">min:0.0|max:60.0</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) ||
+ ( doubles.min <= getGearShootingStartLatitudeDecimalMinute() && getGearShootingStartLatitudeDecimalMinute() < doubles.max )
+ ]]>
+ </param>
+ <message>tutti.validator.warning.latitude.minute.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingStartLatitudeSecond">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingStartLatitudeSecond() && getGearShootingStartLatitudeSecond() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingStartLatitudeSecond() && getGearShootingStartLatitudeSecond() < ints.max )
]]>
</param>
@@ -152,7 +193,8 @@
<param name="doubleParams">min:180.0|max:180.0</param>
<param name="expression">
<![CDATA[
- useSexagecimalFormat || ( -doubles.min <= gearShootingStartLongitude && gearShootingStartLongitude <= doubles.max )
+ !"DD".equals(coordinateEditorType.toString()) ||
+ ( -doubles.min <= gearShootingStartLongitude && gearShootingStartLongitude <= doubles.max )
]]>
</param>
@@ -168,7 +210,7 @@
<param name="intParams">min:180|max:180</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || (
+ !"DMS".equals(coordinateEditorType.toString()) || (
(-ints.min < getGearShootingStartLongitudeDegree() && getGearShootingStartLongitudeDegree() < ints.max)
|| (
( getGearShootingStartLongitudeDegree() == ints.max || getGearShootingStartLongitudeDegree() == -ints.min )
@@ -183,14 +225,37 @@
</field-validator>
</field>
+
+ <field name="gearShootingStartLongitudeDecimalDegree">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="intParams">min:180|max:180</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) || (
+ (-ints.min < getGearShootingStartLongitudeDecimalDegree() && getGearShootingStartLongitudeDecimalDegree() < ints.max)
+ || (
+ ( getGearShootingStartLongitudeDecimalDegree() == ints.max || getGearShootingStartLongitudeDecimalDegree() == -ints.min )
+ && getGearShootingStartLongitudeDecimalMinute() == 0.0
+ )
+ )
+ ]]>
+ </param>
+
+ <message>tutti.validator.warning.longitude.degree.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingStartLongitudeMinute">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingStartLongitudeMinute() && getGearShootingStartLongitudeMinute() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingStartLongitudeMinute() && getGearShootingStartLongitudeMinute() < ints.max )
]]>
</param>
@@ -199,14 +264,31 @@
</field-validator>
</field>
+
+ <field name="gearShootingStartLongitudeDecimalMinute">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="doubleParams">min:0.0|max:60.0</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) ||
+ ( doubles.min <= getGearShootingStartLongitudeDecimalMinute() && getGearShootingStartLongitudeDecimalMinute() < doubles.max )
+ ]]>
+ </param>
+ <message>tutti.validator.warning.longitude.minute.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingStartLongitudeSecond">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingStartLongitudeSecond() && getGearShootingStartLongitudeSecond() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingStartLongitudeSecond() && getGearShootingStartLongitudeSecond() < ints.max )
]]>
</param>
@@ -224,7 +306,8 @@
<param name="doubleParams">min:90.0|max:90.0</param>
<param name="expression">
<![CDATA[
- useSexagecimalFormat || ( -doubles.min <= gearShootingEndLatitude && gearShootingEndLatitude <= doubles.max )
+ !"DD".equals(coordinateEditorType.toString()) ||
+ ( -doubles.min <= gearShootingEndLatitude && gearShootingEndLatitude <= doubles.max )
]]>
</param>
@@ -241,7 +324,7 @@
<param name="intParams">min:90|max:90</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || (
+ !"DMS".equals(coordinateEditorType.toString()) || (
(-ints.min < getGearShootingEndLatitudeDegree() && getGearShootingEndLatitudeDegree() < ints.max)
|| (
( getGearShootingEndLatitudeDegree() == ints.max || getGearShootingEndLatitudeDegree() == -ints.min )
@@ -256,14 +339,37 @@
</field-validator>
</field>
+
+ <field name="gearShootingEndLatitudeDecimalDegree">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="intParams">min:90|max:90</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) || (
+ (-ints.min < getGearShootingEndLatitudeDecimalDegree() && getGearShootingEndLatitudeDecimalDegree() < ints.max)
+ || (
+ ( getGearShootingEndLatitudeDecimalDegree() == ints.max || getGearShootingEndLatitudeDecimalDegree() == -ints.min )
+ && getGearShootingEndLatitudeDecimalMinute() == 0.0
+ )
+ )
+ ]]>
+ </param>
+
+ <message>tutti.validator.warning.latitude.degree.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingEndLatitudeMinute">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingEndLatitudeMinute() && getGearShootingEndLatitudeMinute() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingEndLatitudeMinute() && getGearShootingEndLatitudeMinute() < ints.max )
]]>
</param>
@@ -272,14 +378,31 @@
</field-validator>
</field>
+
+ <field name="gearShootingEndLatitudeDecimalMinute">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="doubleParams">min:0.0|max:60.0</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) ||
+ ( doubles.min <= getGearShootingEndLatitudeDecimalMinute() && getGearShootingEndLatitudeDecimalMinute() < doubles.max )
+ ]]>
+ </param>
+ <message>tutti.validator.warning.latitude.minute.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingEndLatitudeSecond">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingEndLatitudeSecond() && getGearShootingEndLatitudeSecond() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingEndLatitudeSecond() && getGearShootingEndLatitudeSecond() < ints.max )
]]>
</param>
@@ -297,7 +420,8 @@
<param name="doubleParams">min:180.0|max:180.0</param>
<param name="expression">
<![CDATA[
- useSexagecimalFormat || ( -doubles.min <= gearShootingEndLongitude && gearShootingEndLongitude <= doubles.max )
+ !"DD".equals(coordinateEditorType.toString()) ||
+ ( -doubles.min <= gearShootingEndLongitude && gearShootingEndLongitude <= doubles.max )
]]>
</param>
@@ -313,7 +437,7 @@
<param name="intParams">min:180|max:180</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || (
+ !"DMS".equals(coordinateEditorType.toString()) || (
(-ints.min < getGearShootingEndLongitudeDegree() && getGearShootingEndLongitudeDegree() < ints.max)
|| (
( getGearShootingEndLongitudeDegree() == ints.max || getGearShootingEndLongitudeDegree() == -ints.min )
@@ -328,14 +452,37 @@
</field-validator>
</field>
+
+ <field name="gearShootingEndLongitudeDecimalDegree">
+ <field-validator type="fieldexpressionwithparams">
+ <param name="intParams">min:180|max:180</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) || (
+ (-ints.min < getGearShootingEndLongitudeDecimalDegree() && getGearShootingEndLongitudeDecimalDegree() < ints.max)
+ || (
+ ( getGearShootingEndLongitudeDecimalDegree() == ints.max || getGearShootingEndLongitudeDecimalDegree() == -ints.min )
+ && getGearShootingEndLongitudeDecimalMinute() == 0.0
+ )
+ )
+ ]]>
+ </param>
+
+ <message>tutti.validator.warning.longitude.degree.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingEndLongitudeMinute">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingEndLongitudeMinute() && getGearShootingEndLongitudeMinute() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingEndLongitudeMinute() && getGearShootingEndLongitudeMinute() < ints.max )
]]>
</param>
@@ -345,13 +492,30 @@
</field>
+ <field name="gearShootingEndLongitudeDecimalMinute">
+
+ <field-validator type="fieldexpressionwithparams">
+ <param name="doubleParams">min:0.0|max:60.0</param>
+ <param name="expression">
+ <![CDATA[
+ !"DMD".equals(coordinateEditorType.toString()) ||
+ ( doubles.min <= getGearShootingEndLongitudeDecimalMinute() && getGearShootingEndLongitudeDecimalMinute() < doubles.max )
+ ]]>
+ </param>
+ <message>tutti.validator.warning.longitude.minute.outOfBounds</message>
+
+ </field-validator>
+
+ </field>
+
<field name="gearShootingEndLongitudeSecond">
<field-validator type="fieldexpressionwithparams">
<param name="intParams">min:0|max:60</param>
<param name="expression">
<![CDATA[
- !useSexagecimalFormat || ( ints.min <= getGearShootingEndLongitudeSecond() && getGearShootingEndLongitudeSecond() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) ||
+ ( ints.min <= getGearShootingEndLongitudeSecond() && getGearShootingEndLongitudeSecond() < ints.max )
]]>
</param>
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-23 15:56:31 UTC (rev 242)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-23 15:58:55 UTC (rev 243)
@@ -90,9 +90,11 @@
tutti.config.ui.color.rowInvalid=Ligne invalide
tutti.config.ui.color.rowReadOnly=Cellule non éditable
tutti.config.ui.config=Chemin du fichier de configuration des interfaces graphiques
+tutti.config.ui.coordinateEditorType=
tutti.config.ui.shortcut.closePopup=Fermer une popup
tutti.config.ui.showNumberEditorButton=Afficher le pavé numérique de saisie
tutti.config.ui.useSexagecimalEditor=Utiliser l'éditeur sexagécimal pour entrer des coordonnées
+tutti.duration.format=dj Hh m'm'
tutti.errorTable.title=Table d'erreurs
tutti.file.protocol=Extension d'un fichier de protocole Tutti
tutti.label.attachmentEditor.file=Fichier
1
0
r242 - trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/spatial
by kmorin@users.forge.codelutin.com 23 Jan '13
by kmorin@users.forge.codelutin.com 23 Jan '13
23 Jan '13
Author: kmorin
Date: 2013-01-23 16:56:31 +0100 (Wed, 23 Jan 2013)
New Revision: 242
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/242
Log:
add methods for the DMD editor
Modified:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/spatial/SexagecimalPosition.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/spatial/SexagecimalPosition.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/spatial/SexagecimalPosition.java 2013-01-23 14:09:16 UTC (rev 241)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/spatial/SexagecimalPosition.java 2013-01-23 15:56:31 UTC (rev 242)
@@ -27,6 +27,8 @@
import org.apache.commons.lang3.ObjectUtils;
import java.io.Serializable;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
/**
* Define a geo spatial position coordinate in degre, minute, second.
@@ -38,6 +40,8 @@
private static final long serialVersionUID = 1L;
+ private static final Log log = LogFactory.getLog(SexagecimalPosition.class);
+
protected boolean sign;
protected Integer degre;
@@ -169,6 +173,17 @@
public Integer getMinute() {
return minute;
}
+
+ public Float getMinuteDecimale() {
+ Float minuteDecimale = null;
+ if (minute != null) {
+ minuteDecimale = minute.floatValue();
+ if (seconde != null) {
+ minuteDecimale += seconde.floatValue() / 60;
+ }
+ }
+ return minuteDecimale;
+ }
public Integer getSeconde() {
return seconde;
@@ -185,6 +200,19 @@
public void setMinute(Integer minute) {
this.minute = minute;
}
+
+ public void setMinuteDecimale(Float minuteDecimale) {
+ if (minuteDecimale == null) {
+ minute = null;
+ seconde = null;
+
+ } else {
+ Double entier = Math.floor(minuteDecimale);
+ minute = entier.intValue();
+ Double reste = Math.floor((minuteDecimale - entier) * 60);
+ seconde = reste.intValue();
+ }
+ }
public void setSeconde(Integer seconde) {
this.seconde = seconde;
1
0
r241 - trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/service
by blavenier@users.forge.codelutin.com 23 Jan '13
by blavenier@users.forge.codelutin.com 23 Jan '13
23 Jan '13
Author: blavenier
Date: 2013-01-23 15:09:16 +0100 (Wed, 23 Jan 2013)
New Revision: 241
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/241
Log:
- Add fake impl of getCaracteristic(pmfmId)
Modified:
trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceDevImpl.java
Modified: trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceDevImpl.java
===================================================================
--- trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceDevImpl.java 2013-01-23 10:00:00 UTC (rev 240)
+++ trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceDevImpl.java 2013-01-23 14:09:16 UTC (rev 241)
@@ -40,6 +40,8 @@
import java.util.List;
+import javax.naming.OperationNotSupportedException;
+
import static fr.ifremer.tutti.persistence.TuttiPersistenceDevImpl.getKey;
/**
@@ -229,8 +231,12 @@
public boolean isSortedQualitativeValue(CaracteristicQualitativeValue value) {
return value !=null && value.getId().equals("311");
}
+
+ @Override
+ public Caracteristic getCaracteristic(Integer pmfmId) {
+ throw new RuntimeException("getCaracteristic() not supports is only support in tutti-persistence-adagio");
+ }
-
protected <B extends IdAware> List<B> getData(String entityType) {
List<B> result = (List<B>) cache.get(entityType);
return result;
@@ -257,4 +263,6 @@
Caracteristic result = data.get(0);
return result;
}
+
+
}
1
0
r240 - in trunk: tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service tutti-persistence-adagio/src/main/resources tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service
by blavenier@users.forge.codelutin.com 23 Jan '13
by blavenier@users.forge.codelutin.com 23 Jan '13
23 Jan '13
Author: blavenier
Date: 2013-01-23 11:00:00 +0100 (Wed, 23 Jan 2013)
New Revision: 240
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/240
Log:
ref refs #1920: [Persistence] Adagio Donnees thematiques
- Add storage of EnvironmentCaracteristics and GearShootingCaracteristics in createFishingOperation()
- Add loading of EnvironmentCaracteristics and GearShootingCaracteristics in getFishingOperation()
- Add of FishingOperation.save(), and manage cas when caracteristics have been deleted
Modified:
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java
trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java
trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml
trunk/tutti-persistence-adagio/src/main/resources/tutti-db-enumerations.properties
trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseFixtures.java
trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceTest.java
trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java 2013-01-23 10:00:00 UTC (rev 240)
@@ -129,6 +129,8 @@
Person getPerson(Integer personId);
Gear getGear(Integer gearId);
+
+ Caracteristic getCaracteristic(Integer pmfmId);
boolean isSortedQualitativeValue(CaracteristicQualitativeValue value);
}
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java 2013-01-23 10:00:00 UTC (rev 240)
@@ -35,6 +35,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.Resource;
+import java.io.Serializable;
import java.util.Iterator;
/**
@@ -118,4 +119,9 @@
}
return query;
}
+
+ protected <T extends Serializable> T load(Class<? extends T> clazz, Serializable id) {
+ T load = (T) getCurrentSession().load(clazz, id);
+ return load;
+ }
}
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java 2013-01-23 10:00:00 UTC (rev 240)
@@ -54,10 +54,16 @@
import fr.ifremer.adagio.core.dao.referential.QualityFlag;
import fr.ifremer.adagio.core.dao.referential.QualityFlagDao;
import fr.ifremer.adagio.core.dao.referential.gear.GearDao;
+import fr.ifremer.adagio.core.dao.referential.gear.GearImpl;
import fr.ifremer.adagio.core.dao.referential.location.Location;
import fr.ifremer.adagio.core.dao.referential.location.LocationDao;
+import fr.ifremer.adagio.core.dao.referential.pmfm.Pmfm;
import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmDao;
+import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmImpl;
+import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValue;
import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueDao;
+import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueDaoImpl;
+import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueImpl;
import fr.ifremer.adagio.core.dao.referential.vessel.VesselDao;
import fr.ifremer.adagio.core.dao.technical.synchronization.SynchronizationStatus;
import fr.ifremer.tutti.persistence.entities.data.Cruise;
@@ -247,15 +253,24 @@
if (result.getGear() == null) {
Iterator<Object[]> list = queryList(
"allCruiseGears",
- "cruiseId", IntegerType.INSTANCE, Integer.valueOf(id));
+ "cruiseId", IntegerType.INSTANCE, Integer.valueOf(id),
+ "pmfmIdTrawlNet", IntegerType.INSTANCE, enumeration.PMFM_ID_TRAWL_NET);
List<Gear> gears = Lists.newArrayList();
+ int maxTrawlNetFound = 0;
while (list.hasNext()) {
Object[] gearRow = list.next();
Gear target = referentielService.getGear((Integer) gearRow[0]);
+ Float trawlNet = (Float) gearRow[1];
+ if (trawlNet != null && trawlNet.intValue() > maxTrawlNetFound) {
+ maxTrawlNetFound = trawlNet.intValue();
+ }
gears.add(target);
}
result.setGear(gears);
+ if (maxTrawlNetFound > 0) {
+ result.setTrawlNet(maxTrawlNetFound);
+ }
}
return result;
}
@@ -502,10 +517,12 @@
GearPhysicalFeatures gearPhysicalFeature = GearPhysicalFeatures.Factory.newInstance();
gearPhysicalFeature.setFishingTrip(fishingTrip);
- fr.ifremer.adagio.core.dao.referential.gear.Gear gear = gearDao.load(gearId);
- if (gear == null) {
- throw new DataRetrievalFailureException("Gear not found with id=" + gearId);
- }
+
+ fr.ifremer.adagio.core.dao.referential.gear.Gear gear = (fr.ifremer.adagio.core.dao.referential.gear.Gear)getCurrentSession().load(GearImpl.class, gearId);
+ //fr.ifremer.adagio.core.dao.referential.gear.Gear gear = gearDao.load(gearId);
+ //if (gear == null) {
+ // throw new DataRetrievalFailureException("Gear not found with id=" + gearId);
+ //}
gearPhysicalFeature.setGear(gear);
if (fishingTrip.getGearPhysicalFeatures() == null) {
fishingTrip.setGearPhysicalFeatures(Lists.newArrayList(gearPhysicalFeature));
@@ -547,7 +564,9 @@
}
gearPhysicalMeasurement.setQualityFlag(qualityFlagDao.load(enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
gearPhysicalMeasurement.setDepartment(scientificCruise.getRecorderDepartment());
- gearPhysicalMeasurement.setPmfm(pmfmDao.load(pmfmId));
+ Pmfm pmfm = (Pmfm)getCurrentSession().load(PmfmImpl.class, pmfmId);
+ gearPhysicalMeasurement.setPmfm(pmfm);
+ //gearPhysicalMeasurement.setPmfm(pmfmDao.load(pmfmId));
}
return gearPhysicalMeasurement;
@@ -577,7 +596,9 @@
gearPhysicalMeasurement.setNumericalValue(numericalValue);
}
else if (qualitativevalueId != null) {
- gearPhysicalMeasurement.setQualitativeValue(qualitativeValueDao.load(qualitativevalueId));
+ QualitativeValue qv = (QualitativeValue)getCurrentSession().load(QualitativeValueImpl.class, qualitativevalueId);
+ gearPhysicalMeasurement.setQualitativeValue(qv);
+ //gearPhysicalMeasurement.setQualitativeValue(qualitativeValueDao.load(qualitativevalueId));
}
return gearPhysicalMeasurement;
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-01-23 10:00:00 UTC (rev 240)
@@ -24,17 +24,22 @@
* #L%
*/
+import java.io.Serializable;
import java.sql.Timestamp;
+import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.hibernate.FlushMode;
import org.hibernate.type.IntegerType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
@@ -42,9 +47,14 @@
import org.springframework.stereotype.Service;
import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import fr.ifremer.adagio.core.dao.data.fishingArea.FishingArea;
+import fr.ifremer.adagio.core.dao.data.fishingArea.FishingArea2RegulationLocation;
+import fr.ifremer.adagio.core.dao.data.fishingArea.FishingArea2RegulationLocationPK;
import fr.ifremer.adagio.core.dao.data.measure.GearPhysicalMeasurement;
import fr.ifremer.adagio.core.dao.data.measure.GearUseMeasurement;
+import fr.ifremer.adagio.core.dao.data.measure.Measurement;
import fr.ifremer.adagio.core.dao.data.measure.VesselUseMeasurement;
import fr.ifremer.adagio.core.dao.data.operation.FishingOperationDao;
import fr.ifremer.adagio.core.dao.data.operation.Operation;
@@ -56,14 +66,23 @@
import fr.ifremer.adagio.core.dao.data.vessel.feature.use.VesselUseFeatures;
import fr.ifremer.adagio.core.dao.data.vessel.feature.use.isActive;
import fr.ifremer.adagio.core.dao.data.vessel.position.VesselPosition;
-import fr.ifremer.adagio.core.dao.referential.QualityFlagDao;
-import fr.ifremer.adagio.core.dao.referential.gear.Gear;
+import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl;
import fr.ifremer.adagio.core.dao.referential.gear.GearDao;
+import fr.ifremer.adagio.core.dao.referential.gear.GearImpl;
import fr.ifremer.adagio.core.dao.referential.location.LocationDao;
-import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmDao;
-import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId;
-import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueDao;
+import fr.ifremer.adagio.core.dao.referential.location.LocationExtendDao;
+import fr.ifremer.adagio.core.dao.referential.location.LocationImpl;
+import fr.ifremer.adagio.core.dao.referential.location.LocationLevelId;
+import fr.ifremer.adagio.core.dao.referential.pmfm.Pmfm;
+import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmImpl;
+import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValue;
+import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueImpl;
+import fr.ifremer.adagio.core.service.referential.location.LocationService;
+import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
+import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
+import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType;
+import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation;
/**
* @author tchemit <chemit(a)codelutin.com>
@@ -80,29 +99,20 @@
protected MeasurementService measurementService;
@Autowired(required = true)
- protected ReferentialPersistenceService referentielService;
+ protected ReferentialPersistenceService referentialService;
+ @Resource(name = "scientificCruiseDao")
+ protected ScientificCruiseDao scientificCruiseDao;
+
@Resource(name = "fishingOperationDao")
protected FishingOperationDao fishingOperationDao;
+
+ @Resource(name = "locationService")
+ protected LocationService locationService;
- @Resource(name = "gearDao")
- protected GearDao gearDao;
-
@Resource(name = "locationDao")
- protected LocationDao locationDao;
-
- @Resource(name = "scientificCruiseDao")
- protected ScientificCruiseDao scientificCruiseDao;
+ protected LocationExtendDao locationDao;
- @Resource(name = "qualityFlagDao")
- protected QualityFlagDao qualityFlagDao;
-
- @Resource(name = "pmfmDao")
- protected PmfmDao pmfmDao;
-
- @Resource(name = "qualitativeValueDao")
- protected QualitativeValueDao qualitativeValueDao;
-
protected static Float DEFAULT_EMPTY_LATITUDE = 0.0001f;
protected static Float DEFAULT_EMPTY_LONGITUDE = 0.0001f;
@@ -124,7 +134,10 @@
"pmfmIdTrawlDistance", IntegerType.INSTANCE, enumeration.PMFM_ID_TRAWL_DISTANCE,
"pmfmIdRectilinearOperation", IntegerType.INSTANCE, enumeration.PMFM_ID_RECTILINEAR_OPERATION,
"pmfmIdHaulValid", IntegerType.INSTANCE, enumeration.PMFM_ID_HAUL_VALID,
- "pmfmTrawlNetNumber", IntegerType.INSTANCE, enumeration.PMFM_ID_TRAWL_NET_NUMBER
+ "pmfmIdTrawlNetNumber", IntegerType.INSTANCE, enumeration.PMFM_ID_TRAWL_NET_NUMBER,
+ "locationLevelIdStrata", IntegerType.INSTANCE, enumeration.LOCATION_LEVEL_ID_STRATA,
+ "locationLevelIdSubStrata", IntegerType.INSTANCE, enumeration.LOCATION_LEVEL_ID_SUB_STRATA,
+ "locationLevelIdLocalite", IntegerType.INSTANCE, enumeration.LOCATION_LEVEL_ID_LOCALITE
);
if (source == null) {
@@ -176,7 +189,7 @@
Integer gearId = (Integer)source[colIndex++];
if (gearId != null) {
// TODO TC : activer un cache sur getGear()
- fr.ifremer.tutti.persistence.entities.referential.Gear gear = referentielService.getGear(gearId);
+ fr.ifremer.tutti.persistence.entities.referential.Gear gear = referentialService.getGear(gearId);
result.setGear(gear);
}
@@ -210,18 +223,50 @@
// Haul valid ?
Integer haulValidQualitativeId = (Integer)source[colIndex++];
- if (haulValidQualitativeId != null) {
- result.setFishingOperationValid((enumeration.QUALITATIVE_HAUL_VALID_YES.equals(haulValidQualitativeId)));
- }
+ //if (haulValidQualitativeId != null) {
+ // result.setFishingOperationValid((enumeration.QUALITATIVE_HAUL_VALID_YES.equals(haulValidQualitativeId)));
+ //}
// Trawl net number (override the value found in the OP name)
Float trawlNetNumber = (Float)source[colIndex++];
if (trawlNetNumber != null) {
result.setTrawlNetNumber(trawlNetNumber.intValue());
}
+
+ // Strata :
+ Integer strataId = (Integer)source[colIndex++];
+ if (strataId != null) {
+ FishingOperationLocation strata = new FishingOperationLocation();
+ strata.setId(strataId.toString());
+ result.setStrata(strata);
+ }
+ // Sub Strata :
+ Integer subStrataId = (Integer)source[colIndex++];
+ if (subStrataId != null) {
+ FishingOperationLocation subStrata = new FishingOperationLocation();
+ subStrata.setId(subStrataId.toString());
+ result.setSubStrata(subStrata);
+ }
+
+ // Localite :
+ Integer localiteId = (Integer)source[colIndex++];
+ if (localiteId != null) {
+ FishingOperationLocation localite = new FishingOperationLocation();
+ localite.setId(localiteId.toString());
+ result.setLocation(localite);
+ }
+
+ // Retrieve environment caracteristics :
+ getEnvironmentCaracteristics(id, result);
+
+ // Retrieve gear shooting caracteristics :
+ getGearShootingCaracteristics(id, result);
+
return result;
}
+
+
@Override
public FishingOperation createFishingOperation(FishingOperation bean) {
@@ -231,21 +276,145 @@
if (bean.getCruise() == null || bean.getCruise().getId() == null) {
throw new IllegalArgumentException("fishingOperation.getCruise() could not be null");
}
+ getCurrentSession().setFlushMode(FlushMode.COMMIT);
fr.ifremer.adagio.core.dao.data.operation.FishingOperation fishingOperation = fr.ifremer.adagio.core.dao.data.operation.FishingOperation.Factory.newInstance();
beanToEntity(bean, fishingOperation, true);
fishingOperationDao.create(fishingOperation);
-
bean.setId(String.valueOf(fishingOperation.getId()));
+ getCurrentSession().flush();
return bean;
+ }
+
+ @Override
+ public FishingOperation saveFishingOperation(FishingOperation bean) {
+ if (bean == null) {
+ throw new IllegalArgumentException("fishingOperation could not be null");
+ }
+ if (bean.getId() == null || bean.getId().isEmpty()) {
+ throw new IllegalArgumentException("fishingOperation.id could not be null");
+ }
+ if (bean.getCruise() == null || bean.getCruise().getId() == null) {
+ throw new IllegalArgumentException("fishingOperation.getCruise() could not be null");
+ }
+ getCurrentSession().clear();
+ getCurrentSession().setFlushMode(FlushMode.COMMIT);
+ fr.ifremer.adagio.core.dao.data.operation.FishingOperation fishingOperation = fishingOperationDao.load(Integer.valueOf(bean.getId()));
+ beanToEntity(bean, fishingOperation, true);
+ fishingOperationDao.update(fishingOperation);
+ getCurrentSession().flush();
+ return bean;
}
+ //------------------------------------------------------------------------//
+ //-- Internal methods --//
+ //------------------------------------------------------------------------//
+
+ protected void getEnvironmentCaracteristics(String fishingOperationId, FishingOperation result) {
+ // retrieve fishing operation caracteristics
+ Iterator<Object[]> list = queryList(
+ "fishingOperationEnvironment",
+ "fishingOperationId", IntegerType.INSTANCE, Integer.valueOf(fishingOperationId)
+ );
+
+ CaracteristicMap environmentCaracteristics = new CaracteristicMap();
+ while (list.hasNext()) {
+ int colIndex=0;
+ Object[] source = list.next();
+ Integer pmfmId = (Integer)source[colIndex++];
+ Float numericalValue = (Float)source[colIndex++];
+ String alphanumericalValue = (String)source[colIndex++];
+ Integer qualitativeValueId = (Integer)source[colIndex++];
+
+ // Trawl distance
+ if (enumeration.PMFM_ID_TRAWL_DISTANCE.equals(pmfmId)) {
+ result.setTrawlDistance(numericalValue);
+ }
+
+ // Rectilinear operation ?
+ else if (enumeration.PMFM_ID_RECTILINEAR_OPERATION.equals(pmfmId)) {
+ result.setFishingOperationRectiligne(enumeration.QUALITATIVE_RECTILINEAR_OPERATION_YES.equals(qualitativeValueId));
+ }
+
+ // Haul valid ?
+ else if (enumeration.PMFM_ID_HAUL_VALID.equals(pmfmId)) {
+ result.setFishingOperationValid(enumeration.QUALITATIVE_HAUL_VALID_YES.equals(qualitativeValueId));
+ }
+
+ // Station Number :
+ else if (enumeration.PMFM_ID_STATION_NUMBER.equals(pmfmId)) {
+ result.setStationNumber(alphanumericalValue);
+ }
+
+ // Environment caracteristic
+ else {
+ Caracteristic environmentCaracteristic = referentialService.getCaracteristic(pmfmId);
+ Serializable value = null;
+ if (environmentCaracteristic.getCaracteristicType() == CaracteristicType.NUMBER) {
+ value = numericalValue;
+ }
+ else if (environmentCaracteristic.getCaracteristicType() == CaracteristicType.TEXT) {
+ value = alphanumericalValue;
+ }
+ else if (environmentCaracteristic.getCaracteristicType() == CaracteristicType.QUALITATIVE) {
+ value = qualitativeValueId;
+ }
+ environmentCaracteristics.put(environmentCaracteristic, value);
+ }
+ }
+
+ if (environmentCaracteristics.size() > 0) {
+ result.setEnvironmentCaracteristics(environmentCaracteristics);
+ }
+ }
+
+ protected void getGearShootingCaracteristics(String fishingOperationId, FishingOperation result) {
+ // retrieve fishing operation caracteristics
+ Iterator<Object[]> list = queryList(
+ "fishingOperationGearShooting",
+ "fishingOperationId", IntegerType.INSTANCE, Integer.valueOf(fishingOperationId)
+ );
+
+ CaracteristicMap gearShootingCaracteristics = new CaracteristicMap();
+ while (list.hasNext()) {
+ int colIndex=0;
+ Object[] source = list.next();
+ Integer pmfmId = (Integer)source[colIndex++];
+ Float numericalValue = (Float)source[colIndex++];
+ String alphanumericalValue = (String)source[colIndex++];
+ Integer qualitativeValueId = (Integer)source[colIndex++];
+
+ // Trawl distance
+ if (enumeration.PMFM_ID_TRAWL_NET_NUMBER.equals(pmfmId)) {
+ result.setTrawlNetNumber(numericalValue.intValue());
+ }
+
+ // Gear Shooting Caracteristics
+ else {
+ Caracteristic gearShootingCaracteristic = referentialService.getCaracteristic(pmfmId);
+ Serializable value = null;
+ if (gearShootingCaracteristic.getCaracteristicType() == CaracteristicType.NUMBER) {
+ value = numericalValue;
+ }
+ else if (gearShootingCaracteristic.getCaracteristicType() == CaracteristicType.TEXT) {
+ value = alphanumericalValue;
+ }
+ else if (gearShootingCaracteristic.getCaracteristicType() == CaracteristicType.QUALITATIVE) {
+ value = qualitativeValueId;
+ }
+ gearShootingCaracteristics.put(gearShootingCaracteristic, value);
+ }
+ }
+
+ if (gearShootingCaracteristics.size() > 0) {
+ result.setGearShootingCaracteristics(gearShootingCaracteristics);
+ }
+ }
+
protected void beanToEntity(FishingOperation source, fr.ifremer.adagio.core.dao.data.operation.FishingOperation target, boolean copyIfNull) {
-
// Retrieve entities : FishingTrip and ScientificCruise
ScientificCruise scientificCruise = null;
FishingTrip fishingTrip = target.getFishingTrip();
if (fishingTrip == null) {
- // TODO BLA éviter ici un rechargement de fishingTrip :
scientificCruise = scientificCruiseDao.load(Integer.valueOf(source.getCruise().getId()));
fishingTrip = scientificCruise.getFishingTrips().iterator().next();
fishingTrip.getOperations().add(target); // Inverse link
@@ -262,10 +431,10 @@
if (target.getVesselPositions() != null) {
for (Iterator iterator = target.getVesselPositions().iterator(); iterator.hasNext();) {
VesselPosition position = (VesselPosition) iterator.next();
- if (position.getDateTime() != null && position.getDateTime().equals(target.getStartDateTime())) {
+ if (position.getDateTime() != null && position.getDateTime().getTime() == target.getStartDateTime().getTime()) {
startPosition = position;
}
- else if (position.getDateTime() == null || position.getDateTime().equals(target.getEndDateTime())) {
+ else if (position.getDateTime() == null || (target.getEndDateTime() != null && position.getDateTime().getTime() == target.getEndDateTime().getTime())) {
endPosition = position;
}
}
@@ -277,20 +446,26 @@
gearUseFeatures = GearUseFeatures.Factory.newInstance();
gearUseFeatures.setOperation(target);
if (target.getGearUseFeatures() == null) {
- target.setGearUseFeatures(Lists.newArrayList(gearUseFeatures));
+ target.setGearUseFeatures(Sets.newHashSet(gearUseFeatures));
} else {
target.getGearUseFeatures().add(gearUseFeatures);
}
} else {
gearUseFeatures = target.getGearUseFeatures().iterator().next();
}
+
+ // Create a list to store all updates, then remove not updated items
+ Set<GearUseMeasurement> notChangedGearUseMeasurements = new HashSet<GearUseMeasurement>();
+ if (gearUseFeatures.getGearUseMeasurements() != null) {
+ notChangedGearUseMeasurements.addAll(gearUseFeatures.getGearUseMeasurements());
+ }
// Retrieve entities : Vessel Use Features
VesselUseFeatures vesselUseFeatures = null;
if (target.getVesselUseFeatures() == null || target.getVesselUseFeatures().size() == 0) {
vesselUseFeatures = VesselUseFeatures.Factory.newInstance();
if (target.getVesselUseFeatures() == null) {
- target.setVesselUseFeatures(Lists.newArrayList(vesselUseFeatures));
+ target.setVesselUseFeatures(Sets.newHashSet(vesselUseFeatures));
vesselUseFeatures.setOperation(target);
} else {
target.getVesselUseFeatures().add(vesselUseFeatures);
@@ -300,6 +475,12 @@
vesselUseFeatures = target.getVesselUseFeatures().iterator().next();
}
+ // Create a list to store all updates, then remove not updated items
+ Set<VesselUseMeasurement> notChangedVesselUseMeasurements = new HashSet<VesselUseMeasurement>();
+ if (vesselUseFeatures.getVesselUseMeasurements() != null) {
+ notChangedVesselUseMeasurements.addAll(vesselUseFeatures.getVesselUseMeasurements());
+ }
+
// Retrieve entities : Gear Physical Features
GearPhysicalFeatures gearPhysicalFeatures = target.getGearPhysicalFeatures();
if (gearPhysicalFeatures == null && source.getGear() != null && source.getGear().getId() != null) {
@@ -309,26 +490,44 @@
}
target.setGearPhysicalFeatures(gearPhysicalFeatures);
if (gearPhysicalFeatures.getOperations() == null) {
- gearPhysicalFeatures.setOperations(Lists.newArrayList((Operation)target));
+ gearPhysicalFeatures.setOperations(Sets.newHashSet((Operation)target));
} else {
gearPhysicalFeatures.getOperations().add(target);
}
}
- // Retrieve tarwl net, from Gear physical features
+ // Retrieve entities : Fishing Area
+ FishingArea fishingArea = null;
+ if (gearUseFeatures.getFishingAreas() == null || gearUseFeatures.getFishingAreas().size() == 0) {
+ fishingArea = FishingArea.Factory.newInstance();
+ if (gearUseFeatures.getFishingAreas() == null) {
+ gearUseFeatures.setFishingAreas(Sets.newHashSet(fishingArea));
+ fishingArea.setGearUseFeatures(gearUseFeatures);
+ } else {
+ gearUseFeatures.getFishingAreas().add(fishingArea);
+ fishingArea.setGearUseFeatures(gearUseFeatures);
+ }
+ } else {
+ fishingArea = gearUseFeatures.getFishingAreas().iterator().next();
+ // Reset all other fishing areas
+ }
+
+ // Retrieve trawl net, from Gear physical features
int trawlNet = 1; // default value
GearPhysicalMeasurement gpmTrawlNet = measurementService.getGearPhysicalMeasurement(gearPhysicalFeatures, enumeration.PMFM_ID_TRAWL_NET);
if (gpmTrawlNet != null && gpmTrawlNet.getNumericalValue() != null) {
trawlNet = gpmTrawlNet.getNumericalValue().intValue();
- }
-
+ }
+
StringBuffer nameBuffer = new StringBuffer();
// StationNumber
if (copyIfNull && source.getStationNumber() == null) {
- setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_STATION_NUMBER, null, "", null);
+ //setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_STATION_NUMBER, null, "", null);
} else if (source.getStationNumber() != null) {
- setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_STATION_NUMBER, null, source.getStationNumber(), null);
+ VesselUseMeasurement vum = setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_STATION_NUMBER, null, source.getStationNumber(), null);
+ notChangedVesselUseMeasurements.remove(vum);
+
nameBuffer.append(source.getStationNumber());
}
@@ -342,14 +541,12 @@
if (nameBuffer.length() > 0) {
nameBuffer.append(FISHING_OPERATION_NAME_SEPARATOR);
}
- // TODO BL : store OP N° ? or compute it ?
nameBuffer.append(source.getFishingOperationNumber());
}
// Trawl net number
if (copyIfNull && source.getTrawlNetNumber() == null) {
- // Remove from Gear Use Features
- removeGearUseMeasurement(gearUseFeatures, enumeration.PMFM_ID_TRAWL_NET_NUMBER);
+ // Nothing to do : will be removed later, using notChangedGearUseMeasurements
if (nameBuffer.length() > 0) {
nameBuffer.append(FISHING_OPERATION_NAME_SEPARATOR);
}
@@ -358,7 +555,9 @@
throw new DataIntegrityViolationException("An operation could not have a 'trawl net number' greater than 'trawl net' defined in the cruise.");
}
// Store into Gear Use Features
- setGearUseMeasurement(scientificCruise, gearUseFeatures, enumeration.PMFM_ID_TRAWL_NET_NUMBER, Float.valueOf(source.getTrawlNetNumber()), null, null);
+ GearUseMeasurement gum = setGearUseMeasurement(scientificCruise, gearUseFeatures, enumeration.PMFM_ID_TRAWL_NET_NUMBER, Float.valueOf(source.getTrawlNetNumber()), null, null);
+ notChangedGearUseMeasurements.remove(gum);
+
// Store into the name attribute :
if (nameBuffer.length() > 0) {
nameBuffer.append(FISHING_OPERATION_NAME_SEPARATOR);
@@ -394,19 +593,24 @@
// Trawl distance
if (copyIfNull && source.getTrawlDistance() == null) {
- removeVesselUseMeasurement(vesselUseFeatures, enumeration.PMFM_ID_TRAWL_DISTANCE);
+ // Nothing to do : will be removed later, using notChangedVesselUseMeasurements
} else if (source.getTrawlDistance() != null) {
- setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_TRAWL_DISTANCE, source.getTrawlDistance(), null, null);
+ VesselUseMeasurement vum = setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_TRAWL_DISTANCE, source.getTrawlDistance(), null, null);
+ notChangedVesselUseMeasurements.remove(vum);
}
// Rectilinear operation
- setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_RECTILINEAR_OPERATION, null, null, source.isFishingOperationRectiligne()?enumeration.QUALITATIVE_RECTILINEAR_OPERATION_YES:enumeration.QUALITATIVE_RECTILINEAR_OPERATION_NO);
-
+ {
+ VesselUseMeasurement vum = setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_RECTILINEAR_OPERATION, null, null, source.isFishingOperationRectiligne()?enumeration.QUALITATIVE_RECTILINEAR_OPERATION_YES:enumeration.QUALITATIVE_RECTILINEAR_OPERATION_NO);
+ notChangedVesselUseMeasurements.remove(vum);
+ }
+
// Operation is valid ?
if (copyIfNull && source.getFishingOperationValid() == null) {
removeVesselUseMeasurement(vesselUseFeatures, enumeration.PMFM_ID_HAUL_VALID);
} else if (source.getFishingOperationValid() != null) {
- setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_HAUL_VALID, null, null, source.getFishingOperationValid().booleanValue()?enumeration.QUALITATIVE_HAUL_VALID_YES:enumeration.QUALITATIVE_HAUL_VALID_NO);
+ VesselUseMeasurement vum = setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_HAUL_VALID, null, null, source.getFishingOperationValid().booleanValue()?enumeration.QUALITATIVE_HAUL_VALID_YES:enumeration.QUALITATIVE_HAUL_VALID_NO);
+ notChangedVesselUseMeasurements.remove(vum);
}
// Comment
@@ -421,7 +625,7 @@
// Quality Flag :
if (target.getQualityFlag() == null) {
- target.setQualityFlag(qualityFlagDao.load(enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
+ target.setQualityFlag(load(QualityFlagImpl.class, enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
}
// Settings not null properties :
@@ -452,7 +656,7 @@
vesselUseFeatures.setCreationDate(calendar.getTime());
}
if (vesselUseFeatures.getQualityFlag() == null) {
- vesselUseFeatures.setQualityFlag(qualityFlagDao.load(enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
+ vesselUseFeatures.setQualityFlag(load(QualityFlagImpl.class, enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
}
// GearUseFeatures :
@@ -472,15 +676,14 @@
gearUseFeatures.setCreationDate(calendar.getTime());
}
if (gearUseFeatures.getQualityFlag() == null) {
- gearUseFeatures.setQualityFlag(qualityFlagDao.load(enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
+ gearUseFeatures.setQualityFlag(load(QualityFlagImpl.class, enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
}
// GearUseFeatures.Gear
if (copyIfNull && source.getGear() == null) {
gearUseFeatures.setGear(null);
} else if (source.getGear() != null && source.getGear().getId() != null) {
- Gear gear = gearDao.load(Integer.valueOf(source.getGear().getId()));
- gearUseFeatures.setGear(gear);
+ gearUseFeatures.setGear(load(GearImpl.class, Integer.valueOf(source.getGear().getId())));
}
// Start position :
@@ -493,7 +696,7 @@
startPosition = VesselPosition.Factory.newInstance();
startPosition.setOperation(target);
if (target.getVesselPositions() == null) {
- target.setVesselPositions(Lists.newArrayList(startPosition));
+ target.setVesselPositions(Sets.newHashSet(startPosition));
}
target.getVesselPositions().add(startPosition);
}
@@ -542,12 +745,130 @@
target.getVesselPositions().remove(endPosition);
}
+ // Environment Caracteristics
+ CaracteristicMap environmentCaracteristics = source.getEnvironmentCaracteristics();
+ if (copyIfNull && environmentCaracteristics == null || environmentCaracteristics.size() == 0) {
+ // Nothing to do : will be removed later, using notChangedVesselUseMeasurements
+ }
+ else if (environmentCaracteristics != null && environmentCaracteristics.size() > 0) {
+ for (Caracteristic caracteristic : environmentCaracteristics.keySet()) {
+ VesselUseMeasurement vum = setVesselUseMeasurement(scientificCruise, vesselUseFeatures, caracteristic, environmentCaracteristics.get(caracteristic));
+ notChangedVesselUseMeasurements.remove(vum);
+ }
+ }
+
+ // Removed unecessary Vessel Use Measurement
+
+ // Gear shooting Caracteristics
+ CaracteristicMap gearShootingCaracteristics = source.getGearShootingCaracteristics();
+ if (copyIfNull && gearShootingCaracteristics == null || gearShootingCaracteristics.size() == 0) {
+ // Nothing to do : will be removed later, using notChangedGearUseMeasurements
+ }
+ else if (gearShootingCaracteristics != null && gearShootingCaracteristics.size() > 0) {
+ for (Caracteristic caracteristic : gearShootingCaracteristics.keySet()) {
+ GearUseMeasurement gum = setGearUseMeasurement(scientificCruise, gearUseFeatures, caracteristic, environmentCaracteristics.get(caracteristic));
+ notChangedGearUseMeasurements.remove(gum);
+ }
+ }
+
+ // Removed not changed measurements (in Vessel & Gear Use Measurement lists)
+ if (vesselUseFeatures.getVesselUseMeasurements() != null && notChangedVesselUseMeasurements.size() > 0) {
+ for (VesselUseMeasurement vum : notChangedVesselUseMeasurements) {
+ vesselUseFeatures.getVesselUseMeasurements().remove(vum);
+ }
+ }
+ if (gearUseFeatures.getGearUseMeasurements() != null && notChangedGearUseMeasurements.size() > 0) {
+ for (GearUseMeasurement gum : notChangedGearUseMeasurements) {
+ gearUseFeatures.getGearUseMeasurements().remove(gum);
+ }
+ }
+
+ // Fishing Area :
+ Integer statisticalLocationId = null;
+ if (source.getGearShootingStartLatitude() != null && source.getGearShootingStartLongitude() != null) {
+ statisticalLocationId = locationService.getLocationIdByLatLong(source.getGearShootingStartLatitude(), source.getGearShootingStartLongitude());
+ }
+ if (statisticalLocationId == null && source.getGearShootingEndLatitude() != null && source.getGearShootingEndLongitude() != null) {
+ statisticalLocationId = locationService.getLocationIdByLatLong(source.getGearShootingEndLatitude(), source.getGearShootingEndLongitude());
+ }
+
+ // Strata :
+ if (copyIfNull && (source.getStrata() == null || source.getStrata().getId() == null)) {
+ // TODO remove from fishing Area ?
+ }
+ else if (source.getStrata() != null && source.getStrata().getId() != null) {
+ FishingArea2RegulationLocation fa2rl = FishingArea2RegulationLocation.Factory.newInstance();
+ FishingArea2RegulationLocationPK fa2rlPK = new FishingArea2RegulationLocationPK();
+ fa2rl.setFishingArea2RegulationLocationPk(fa2rlPK);
+ fa2rlPK.setFishingArea(fishingArea);
+ fa2rlPK.setLocation(load(LocationImpl.class, Integer.valueOf(source.getStrata().getId())));
+ if (fishingArea.getRegulationLocation() == null) {
+ fishingArea.setRegulationLocation(Sets.newHashSet(fa2rl));
+ }
+ else {
+ fishingArea.getRegulationLocation().add(fa2rl);
+ }
+ if (statisticalLocationId == null) {
+ statisticalLocationId = Integer.valueOf(source.getStrata().getId());
+ }
+ }
+
+ // Sub-Strata :
+ if (copyIfNull && (source.getSubStrata() == null || source.getSubStrata().getId() == null)) {
+ // TODO remove from fishing Area ?
+ }
+ else if (source.getSubStrata() != null && source.getSubStrata().getId() != null) {
+ FishingArea2RegulationLocation fa2rl = FishingArea2RegulationLocation.Factory.newInstance();
+ FishingArea2RegulationLocationPK fa2rlPK = new FishingArea2RegulationLocationPK();
+ fa2rl.setFishingArea2RegulationLocationPk(fa2rlPK);
+ fa2rlPK.setFishingArea(fishingArea);
+ fa2rlPK.setLocation(load(LocationImpl.class, Integer.valueOf(source.getSubStrata().getId())));
+ if (fishingArea.getRegulationLocation() == null) {
+ fishingArea.setRegulationLocation(Sets.newHashSet(fa2rl));
+ }
+ else {
+ fishingArea.getRegulationLocation().add(fa2rl);
+ }
+ if (statisticalLocationId == null) {
+ statisticalLocationId = Integer.valueOf(source.getSubStrata().getId());
+ }
+ }
+
+ // Localite :
+ if (copyIfNull && (source.getLocation() == null || source.getLocation().getId() == null)) {
+ // TODO remove from fishing Area ?
+ }
+ else if (source.getLocation() != null && source.getLocation().getId() != null) {
+ FishingArea2RegulationLocation fa2rl = FishingArea2RegulationLocation.Factory.newInstance();
+ FishingArea2RegulationLocationPK fa2rlPK = new FishingArea2RegulationLocationPK();
+ fa2rl.setFishingArea2RegulationLocationPk(fa2rlPK);
+ fa2rlPK.setFishingArea(fishingArea);
+ fa2rlPK.setLocation(load(LocationImpl.class, Integer.valueOf(source.getLocation().getId())));
+ if (fishingArea.getRegulationLocation() == null) {
+ fishingArea.setRegulationLocation(Sets.newHashSet(fa2rl));
+ }
+ else {
+ fishingArea.getRegulationLocation().add(fa2rl);
+ }
+ if (statisticalLocationId == null) {
+ statisticalLocationId = Integer.valueOf(source.getLocation().getId());
+ }
+ }
+
+ // Fishing Area location (should be a statistical location)
+ if (copyIfNull && statisticalLocationId == null) {
+ gearUseFeatures.getFishingAreas().remove(fishingArea);
+ //Nothing to do : a gearUseFeatures.getFishingAreas().clear() has been done before
+ if (fishingArea.getRegulationLocation() != null) {
+ fishingArea.getRegulationLocation().clear();
+ }
+ }
+ else if (statisticalLocationId != null) {
+ fishingArea.setLocation(load(LocationImpl.class, statisticalLocationId));
+ //gearUseFeatures.getFishingAreas().add(fishingArea);
+ }
}
- @Override
- public FishingOperation saveFishingOperation(FishingOperation bean) {
- return null;
- }
/**
* Test if the date has millisecond set. This yes, return null, then return the date itself.
@@ -646,14 +967,14 @@
vesselUseMeasurement = VesselUseMeasurement.Factory.newInstance();
vesselUseMeasurement.setVesselUseFeatures(vesselUseFeatures);
if (vesselUseFeatures.getVesselUseMeasurements() == null) {
- vesselUseFeatures.setVesselUseMeasurements(Lists.newArrayList(vesselUseMeasurement));
+ vesselUseFeatures.setVesselUseMeasurements(Sets.newHashSet(vesselUseMeasurement));
}
else {
vesselUseFeatures.getVesselUseMeasurements().add(vesselUseMeasurement);
}
- vesselUseMeasurement.setQualityFlag(qualityFlagDao.load(enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
+ vesselUseMeasurement.setQualityFlag(load(QualityFlagImpl.class, enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
vesselUseMeasurement.setDepartment(scientificCruise.getRecorderDepartment());
- vesselUseMeasurement.setPmfm(pmfmDao.load(pmfmId));
+ vesselUseMeasurement.setPmfm(load(PmfmImpl.class, pmfmId));
}
return vesselUseMeasurement;
@@ -683,12 +1004,50 @@
vesselUseMeasurement.setNumericalValue(numericalValue);
}
else if (qualitativevalueId != null) {
- vesselUseMeasurement.setQualitativeValue(qualitativeValueDao.load(qualitativevalueId));
+ vesselUseMeasurement.setQualitativeValue(load(QualitativeValueImpl.class, qualitativevalueId));
}
return vesselUseMeasurement;
}
+ protected VesselUseMeasurement setVesselUseMeasurement(ScientificCruise scientificCruise, VesselUseFeatures vesselUseFeatures,
+ Integer pmfmId,
+ Serializable value) {
+ VesselUseMeasurement vesselUseMeasurement = getVesselUseMeasurement(scientificCruise, vesselUseFeatures, pmfmId, true);
+
+ if (value instanceof String) {
+ vesselUseMeasurement.setAlphanumericalValue((String)value);
+ }
+ else if (value instanceof Float) {
+ vesselUseMeasurement.setNumericalValue((Float)value);
+ }
+ else if (value instanceof Integer) {
+ vesselUseMeasurement.setQualitativeValue(load(QualitativeValueImpl.class, (Integer)value));
+ }
+
+ return vesselUseMeasurement;
+ }
+
+ protected VesselUseMeasurement setVesselUseMeasurement(ScientificCruise scientificCruise, VesselUseFeatures vesselUseFeatures,
+ Caracteristic caracteristic, Serializable value) {
+ VesselUseMeasurement vesselUseMeasurement = getVesselUseMeasurement(scientificCruise, vesselUseFeatures, Integer.valueOf(caracteristic.getId()), true);
+ setMeasurement(vesselUseMeasurement, caracteristic, value);
+ return vesselUseMeasurement;
+ }
+
+ protected void setMeasurement(Measurement measurement, Caracteristic caracteristic, Serializable value) {
+ if (caracteristic.getCaracteristicType() == CaracteristicType.TEXT) {
+ measurement.setAlphanumericalValue((String)value);
+ }
+ else if (caracteristic.getCaracteristicType() == CaracteristicType.NUMBER) {
+ measurement.setNumericalValue((Float)value);
+ }
+ else if (caracteristic.getCaracteristicType() == CaracteristicType.QUALITATIVE) {
+ QualitativeValue qv = (QualitativeValue)getCurrentSession().load(QualitativeValueImpl.class, Integer.valueOf((String)value));
+ measurement.setQualitativeValue(qv);
+ }
+ }
+
protected GearUseMeasurement setGearUseMeasurement(ScientificCruise scientificCruise, GearUseFeatures gearUseFeatures,
Integer pmfmId,
Float numericalValue,
@@ -703,12 +1062,20 @@
gearUseMeasurement.setNumericalValue(numericalValue);
}
else if (qualitativevalueId != null) {
- gearUseMeasurement.setQualitativeValue(qualitativeValueDao.load(qualitativevalueId));
+ QualitativeValue qv = (QualitativeValue)getCurrentSession().load(QualitativeValueImpl.class, qualitativevalueId);
+ gearUseMeasurement.setQualitativeValue(qv);
}
return gearUseMeasurement;
}
+ protected GearUseMeasurement setGearUseMeasurement(ScientificCruise scientificCruise, GearUseFeatures gearUseFeatures,
+ Caracteristic caracteristic, Serializable value) {
+ GearUseMeasurement gearUseMeasurement = getGearUseMeasurement(scientificCruise, gearUseFeatures, Integer.valueOf(caracteristic.getId()), true);
+ setMeasurement(gearUseMeasurement, caracteristic, value);
+ return gearUseMeasurement;
+ }
+
protected GearUseMeasurement getGearUseMeasurement(ScientificCruise scientificCruise, GearUseFeatures gearUseFeatures,
Integer pmfmId, boolean createIfNotExists) {
GearUseMeasurement gearUseMeasurement = null;
@@ -728,14 +1095,15 @@
gearUseMeasurement = GearUseMeasurement.Factory.newInstance();
gearUseMeasurement.setGearUseFeatures(gearUseFeatures);
if (gearUseFeatures.getGearUseMeasurements() == null) {
- gearUseFeatures.setGearUseMeasurements(Lists.newArrayList(gearUseMeasurement));
+ gearUseFeatures.setGearUseMeasurements(Sets.newHashSet(gearUseMeasurement));
}
else {
gearUseFeatures.getGearUseMeasurements().add(gearUseMeasurement);
}
- gearUseMeasurement.setQualityFlag(qualityFlagDao.load(enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
+ gearUseMeasurement.setQualityFlag(load(QualityFlagImpl.class, enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED));
gearUseMeasurement.setDepartment(scientificCruise.getRecorderDepartment());
- gearUseMeasurement.setPmfm(pmfmDao.load(pmfmId));
+ Pmfm pmfm = (Pmfm)getCurrentSession().load(PmfmImpl.class, pmfmId);
+ gearUseMeasurement.setPmfm(pmfm);
}
return gearUseMeasurement;
@@ -750,5 +1118,4 @@
gearUseFeatures.getGearUseMeasurements().remove(gearUseMeasurement);
// TOBO BLa : vérifier qu'il ne faut pas dao.delete() en plus
}
-
}
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-01-23 10:00:00 UTC (rev 240)
@@ -385,59 +385,59 @@
@Override
public Caracteristic getSizeCategoryCaracteristic() {
Integer pmfmId = enumeration.PMFM_ID_SIZE_CATEGORY;
- Caracteristic result = loadCaracteristic(pmfmId);
+ Caracteristic result = getCaracteristic(pmfmId);
return result;
}
@Override
public Caracteristic getSexCaracteristic() {
Integer pmfmId = enumeration.PMFM_ID_SEX;
- Caracteristic result = loadCaracteristic(pmfmId);
+ Caracteristic result = getCaracteristic(pmfmId);
return result;
}
@Override
public Caracteristic getSortedUnsortedCaracteristic() {
Integer pmfmId = enumeration.PMFM_ID_SORTED_UNSORTED;
- Caracteristic result = loadCaracteristic(pmfmId);
+ Caracteristic result = getCaracteristic(pmfmId);
return result;
}
@Override
public Caracteristic getMaturityCaracteristic() {
Integer pmfmId = enumeration.PMFM_ID_MATURITY;
- Caracteristic result = loadCaracteristic(pmfmId);
+ Caracteristic result = getCaracteristic(pmfmId);
return result;
}
@Override
public Caracteristic getMacroWasteCategoryCaracteristic() {
Integer pmfmId = enumeration.PMFM_ID_MACRO_WASTE_CATEGORY;
- Caracteristic result = loadCaracteristic(pmfmId);
+ Caracteristic result = getCaracteristic(pmfmId);
return result;
}
@Override
public Caracteristic getMacroWasteSizeCategoryCaracteristic() {
Integer pmfmId = enumeration.PMFM_ID_MACRO_WASTE_SIZE_CATEGORY;
- Caracteristic result = loadCaracteristic(pmfmId);
+ Caracteristic result = getCaracteristic(pmfmId);
return result;
}
- //------------------------------------------------------------------------//
- //-- Internal methods --//
- //------------------------------------------------------------------------//
-
- protected Caracteristic loadCaracteristic(Integer pmfmId) {
-
+ @Override
+ public Caracteristic getCaracteristic(Integer pmfmId) {
Object[] source = queryUniqueWithStatus("pmfmById",
"pmfmId", IntegerType.INSTANCE, pmfmId,
"unitIdNone", IntegerType.INSTANCE, enumeration.UNIT_ID_NONE);
-
Caracteristic target = loadCaracteristic(source);
return target;
}
+ //------------------------------------------------------------------------//
+ //-- Internal methods --//
+ //------------------------------------------------------------------------//
+
+
protected Caracteristic loadCaracteristic(Object[] source) {
Integer pmfmId = (Integer) source[0];
Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java
===================================================================
--- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java 2013-01-23 10:00:00 UTC (rev 240)
@@ -118,6 +118,12 @@
@Value("${LocationLevelId.RECTANGLE_STATISTIQUE_MED}")
public final Integer RECTANGLE_STATISTIQUE_MED = null;
+
+ @Value("${LocationLevelId.RECTANGLE_STATISTIQUE}")
+ public final Integer RECTANGLE_STATISTIQUE = null;
+
+ @Value("${LocationLevelId.FAO_ZONE}")
+ public final Integer FAO_ZONE = null;
@Value("${QualitativeValueId.VRAC}")
public final Integer QUALITATIVE_VRAC_ID = null;
Modified: trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml
===================================================================
--- trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml 2013-01-23 10:00:00 UTC (rev 240)
@@ -130,11 +130,16 @@
<![CDATA[
SELECT
gpf.gear.id AS gearId,
+ MAX(CASE gpm.pmfm.id
+ WHEN :pmfmIdTrawlNet THEN gpm.numericalValue
+ ELSE 0
+ END) as trawlNet,
count(o.id) as operationCount
FROM
ScientificCruiseImpl sc
JOIN sc.fishingTrips ft
JOIN ft.gearPhysicalFeatures gpf
+ LEFT OUTER JOIN gpf.gearPhysicalMeasurements gpm
LEFT OUTER JOIN gpf.operations o
WHERE
sc.id = :cruiseId
@@ -143,6 +148,7 @@
ORDER BY count(o.id) DESC
]]>
<query-param name="cruiseId" type="java.lang.Integer"/>
+ <query-param name="pmfmIdTrawlNet" type="java.lang.Integer"/>
</query>
<query cacheable="true" name="allCruiseSecondaryVessels">
@@ -166,30 +172,68 @@
<![CDATA[
SELECT
o.name as name,
- o.startDateTime as startDateTime,
- o.endDateTime as endDateTime,
- o.comments as comments,
- guf.gear.id as gearId,
+ max(o.startDateTime) as startDateTime,
+ max(o.endDateTime) as endDateTime,
+ max(o.comments) as comments,
+ max(guf.gear.id) as gearId,
(select vp_start from VesselPositionImpl vp_start where vp_start.operation.id = o.id and vp_start.dateTime = o.startDateTime) as startVesselPosition,
(select vp_end from VesselPositionImpl vp_end where vp_end.operation.id = o.id and vp_end.dateTime = o.endDateTime) as endVesselPosition,
(select vum.numericalValue from VesselUseMeasurementImpl vum where vum.vesselUseFeatures.id=vuf.id and vum.pmfm.id=:pmfmIdTrawlDistance) as trawlDistance,
(select vum2.qualitativeValue.id from VesselUseMeasurementImpl vum2 where vum2.vesselUseFeatures.id=vuf.id and vum2.pmfm.id=:pmfmIdRectilinearOperation) as rectilinearQualitativeId,
(select vum3.qualitativeValue.id from VesselUseMeasurementImpl vum3 where vum3.vesselUseFeatures.id=vuf.id and vum3.pmfm.id=:pmfmIdHaulValid) as haulValidQualitativeId,
- (select gum.numericalValue from GearUseMeasurementImpl gum where gum.gearUseFeatures.id=guf.id and gum.pmfm.id=:pmfmTrawlNetNumber) as trawlNetNumber
+ (select gum.numericalValue from GearUseMeasurementImpl gum where gum.gearUseFeatures.id=guf.id and gum.pmfm.id=:pmfmIdTrawlNetNumber) as trawlNetNumber,
+ max(case when (rl.locationLevel.id = :locationLevelIdStrata) then rl.id else null end) AS strataId,
+ max(case when (rl.locationLevel.id = :locationLevelIdSubStrata) then rl.id else null end) AS subStrataId,
+ max(case when (rl.locationLevel.id = :locationLevelIdLocalite) then rl.id else null end) AS localiteId
FROM
FishingOperationImpl o
INNER JOIN o.gearUseFeatures guf
INNER JOIN o.vesselUseFeatures vuf
+ LEFT OUTER JOIN guf.fishingAreas fa
+ LEFT OUTER JOIN fa.regulationLocation fa2rl
+ LEFT OUTER JOIN fa2rl.id.location rl
WHERE
o.id=:fishingOperationId
+ GROUP BY o.name
]]>
<query-param name="fishingOperationId" type="java.lang.Integer"/>
<query-param name="pmfmIdTrawlDistance" type="java.lang.Integer"/>
<query-param name="pmfmIdRectilinearOperation" type="java.lang.Integer"/>
<query-param name="pmfmIdHaulValid" type="java.lang.Integer"/>
- <query-param name="pmfmTrawlNetNumber" type="java.lang.Integer"/>
+ <query-param name="pmfmIdTrawlNetNumber" type="java.lang.Integer"/>
</query>
+ <query cacheable="true" name="fishingOperationEnvironment">
+ <![CDATA[
+ SELECT
+ vum.pmfm.id as pmfmId,
+ vum.numericalValue as numericalValue,
+ vum.alphanumericalValue as alphanumericalValue,
+ vum.qualitativeValue.id as qualitativeValueId
+ from
+ VesselUseFeaturesImpl vuf
+ join vuf.vesselUseMeasurements vum
+ WHERE
+ vuf.operation = :fishingOperationId
+ ]]>
+ <query-param name="fishingOperationId" type="java.lang.Integer"/>
+ </query>
+
+ <query cacheable="true" name="fishingOperationGearShooting">
+ <![CDATA[
+ SELECT
+ gum.pmfm.id as pmfmId,
+ gum.numericalValue as numericalValue,
+ gum.alphanumericalValue as alphanumericalValue,
+ gum.qualitativeValue.id as qualitativeValueId
+ from
+ GearUseFeaturesImpl guf
+ join guf.gearUseMeasurements gum
+ WHERE
+ guf.operation = :fishingOperationId
+ ]]>
+ <query-param name="fishingOperationId" type="java.lang.Integer"/>
+ </query>
<!-- ===================================================================== -->
<!-- === Requete techniques sur référentiels [REF-TXXX] === -->
Modified: trunk/tutti-persistence-adagio/src/main/resources/tutti-db-enumerations.properties
===================================================================
--- trunk/tutti-persistence-adagio/src/main/resources/tutti-db-enumerations.properties 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/main/resources/tutti-db-enumerations.properties 2013-01-23 10:00:00 UTC (rev 240)
@@ -304,9 +304,9 @@
LocationLevelId.LOCALITE=22
LocationLevelId.STRATA=23
#TODO Creer la bonne valeur
-LocationLevelId.SUBSTRATA=-23
+LocationLevelId.SUBSTRATA=113
#TODO Mettre la bonne valeur
-LocationLevelId.PROGRAM=21
+LocationLevelId.PROGRAM=101
MethodId.DECLARATION=1
Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseFixtures.java
===================================================================
--- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseFixtures.java 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseFixtures.java 2013-01-23 10:00:00 UTC (rev 240)
@@ -43,4 +43,17 @@
public String fishingVesselCode() {
return "851751";
}
+
+ public String strataId() {
+ return "20990"; /*= Strate 24E4*/
+ }
+
+ public String subStrataId() {
+ // TODO TC : change ID into a real substrata !
+ return "6080"; /*= Rectangle 24E4 */
+ }
+
+ public String localite() {
+ return "21525"; /*= Localité 4F1 */
+ }
}
Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceTest.java
===================================================================
--- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceTest.java 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceTest.java 2013-01-23 10:00:00 UTC (rev 240)
@@ -109,7 +109,7 @@
calendar.add(Calendar.MONTH, 1); // add one month
cruise.setEndDate(calendar.getTime());
-
+
Country country = null;
List<Country> countries = referentialService.getAllCountry();
for (Country aCountry : countries) {
Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java
===================================================================
--- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java 2013-01-21 15:51:02 UTC (rev 239)
+++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java 2013-01-23 10:00:00 UTC (rev 240)
@@ -24,15 +24,22 @@
* #L%
*/
+import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import fr.ifremer.tutti.persistence.DatabaseResource;
+import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
import fr.ifremer.tutti.persistence.entities.data.Cruise;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
+import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
+import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType;
+import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation;
import fr.ifremer.tutti.persistence.entities.referential.Gear;
import org.junit.Before;
@@ -89,6 +96,9 @@
@Test
public void createFishingOperation(/*FishingOperation bean*/) {
+ // -----------------------------------------------------------------------------
+ // Prepare data and other entities
+ // -----------------------------------------------------------------------------
Calendar calendar = new GregorianCalendar();
FishingOperation reloadedFishingOperation = null;
FishingOperation createdFishingOperation = null;
@@ -110,8 +120,52 @@
cruise = cruiseService.createCruise(cruise);
assertNotNull(cruise.getId());
-
+ // Retrieve some environment caracteristics
+ List<Caracteristic> allEnvironmentCaracteristics = referentialService.getAllFishingOperationEnvironmentCaracteristic();
+ CaracteristicMap environmentCaracteristics = new CaracteristicMap();
+ CaracteristicMap environmentValuesOneEntry = new CaracteristicMap();
+ for(Caracteristic caracteristic : allEnvironmentCaracteristics) {
+ Serializable value = null;
+ if (caracteristic.getCaracteristicType() == CaracteristicType.NUMBER) {
+ value = new Float(1.0f);
+ }
+ else if (caracteristic.getCaracteristicType() == CaracteristicType.TEXT) {
+ value = new String("some text");
+ }
+ else if (caracteristic.getCaracteristicType() == CaracteristicType.QUALITATIVE) {
+ // Choose the first qualitative value
+ value = caracteristic.getQualitativeValue(0).getId();
+ }
+ environmentCaracteristics.put(caracteristic, value);
+ if (environmentValuesOneEntry.size() == 0) {
+ environmentValuesOneEntry.put(caracteristic, value);
+ }
+ }
+
+ // Retrieve some gear use caracteristics
+ List<Caracteristic> allGearShootingCaracteristics = referentialService.getAllFishingOperationGearCaracteristic();
+ CaracteristicMap gearShootingCaracteristics = new CaracteristicMap();
+ CaracteristicMap gearShootingCaracteristicsOneEntry = new CaracteristicMap();
+ for(Caracteristic caracteristic : allEnvironmentCaracteristics) {
+ Serializable value = null;
+ if (caracteristic.getCaracteristicType() == CaracteristicType.NUMBER) {
+ value = new Float(1.0f);
+ }
+ else if (caracteristic.getCaracteristicType() == CaracteristicType.TEXT) {
+ value = new String("some text");
+ }
+ else if (caracteristic.getCaracteristicType() == CaracteristicType.QUALITATIVE) {
+ // Choose the first qualitative value
+ value = caracteristic.getQualitativeValue(0).getId();
+ }
+ gearShootingCaracteristics.put(caracteristic, value);
+ if (gearShootingCaracteristicsOneEntry.size() == 0) {
+ gearShootingCaracteristicsOneEntry.put(caracteristic, value);
+ }
+ }
+
+
// Create new fishing operation :
FishingOperation fishingOperation = new FishingOperation();
@@ -157,19 +211,28 @@
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MILLISECOND, 99);
fishingOperation.setGearShootingEndDate(calendar.getTime());
-
- fishingOperation.setGearShootingStartLatitude(33.2541f);
- fishingOperation.setGearShootingStartLongitude(-5.514f);
- fishingOperation.setGearShootingEndLatitude(33.7441f);
+ fishingOperation.setGearShootingStartLatitude(47.6f);
+ fishingOperation.setGearShootingStartLongitude(-5.05f);
+ fishingOperation.setGearShootingEndLatitude(47.9854f);
fishingOperation.setGearShootingEndLongitude(-5.597f);
fishingOperation.setTrawlDistance(100.12345f);
fishingOperation.setFishingOperationRectiligne(true);
fishingOperation.setFishingOperationValid(Boolean.TRUE);
-
fishingOperation.setComment("Unit test createFishingOperation() - Part n°2 : All properties set");
-
fishingOperation.setGear(cruiseGear);
+ fishingOperation.setEnvironmentCaracteristics(environmentCaracteristics);
+ fishingOperation.setGearShootingCaracteristics(gearShootingCaracteristics);
+
+ FishingOperationLocation strata = new FishingOperationLocation();
+ strata.setId(dbResource.getFixtures().strataId());
+ fishingOperation.setStrata(strata);
+ FishingOperationLocation subStrata = new FishingOperationLocation();
+ subStrata.setId(dbResource.getFixtures().subStrataId());
+ fishingOperation.setSubStrata(subStrata);
+ FishingOperationLocation localite = new FishingOperationLocation();
+ localite.setId(dbResource.getFixtures().localite());
+ fishingOperation.setLocation(localite);
// Store fishing operation into database :
createdFishingOperation = service.createFishingOperation(fishingOperation);
@@ -197,6 +260,19 @@
assertEquals(fishingOperation.isFishingOperationRectiligne(), reloadedFishingOperation.isFishingOperationRectiligne());
assertEquals(fishingOperation.getFishingOperationValid(), reloadedFishingOperation.getFishingOperationValid());
assertEquals(fishingOperation.getComment(), reloadedFishingOperation.getComment());
+ assertNotNull(reloadedFishingOperation.getEnvironmentCaracteristics());
+ assertEquals(environmentCaracteristics.size(), fishingOperation.getEnvironmentCaracteristics().size());
+ assertNotNull(reloadedFishingOperation.getGearShootingCaracteristics());
+ assertEquals(gearShootingCaracteristics.size(), reloadedFishingOperation.getGearShootingCaracteristics().size());
+ assertNotNull(reloadedFishingOperation.getStrata());
+ assertNotNull(reloadedFishingOperation.getStrata().getId());
+ assertEquals(fishingOperation.getStrata().getId(), reloadedFishingOperation.getStrata().getId());
+ assertNotNull(reloadedFishingOperation.getSubStrata());
+ assertNotNull(reloadedFishingOperation.getSubStrata().getId());
+ assertEquals(fishingOperation.getSubStrata().getId(), reloadedFishingOperation.getSubStrata().getId());
+ assertNotNull(reloadedFishingOperation.getLocation());
+ assertNotNull(reloadedFishingOperation.getLocation().getId());
+ assertEquals(fishingOperation.getLocation().getId(), reloadedFishingOperation.getLocation().getId());
// -----------------------------------------------------------------------------
// 3. Test :
@@ -228,8 +304,8 @@
assertEquals(fishingOperation.getFishingOperationValid(), reloadedFishingOperation.getFishingOperationValid());
// -----------------------------------------------------------------------------
- // 4. Test :
- // - try to save a operation using a gear not declared uin the cruise
+ // 4. Test exceptions :
+ // - try to save a operation using a gear not declared in the cruise
// - try to save a operation using a trawl net number bigger than the cruise trawl net
// -----------------------------------------------------------------------------
fishingOperation.setId(null);
@@ -252,6 +328,7 @@
}
catch(DataIntegrityViolationException dive) {
assertNotNull(dive);
+ fishingOperation.setGear(cruiseGear);
}
fishingOperation.setTrawlNetNumber(new Integer(3));
@@ -261,11 +338,43 @@
}
catch(DataIntegrityViolationException dive) {
assertNotNull(dive);
+ fishingOperation.setTrawlNetNumber(new Integer(1));
}
- //reloadedFishingOperation = service.getFishingOperation(createdFishingOperation.getId());
- //assertEquals(fishingOperation.getGearShootingStartLatitude(), reloadedFishingOperation.getGearShootingStartLatitude());
- //assertEquals(fishingOperation.getGearShootingStartLongitude(), reloadedFishingOperation.getGearShootingStartLongitude());
+ // -----------------------------------------------------------------------------
+ // 5. Test update (delete unecessary data)
+ // - remove positons
+ // - remove strata, substrata, localite
+ // - remove some environment carateristics
+ // - remove some gear shooting carateristics
+ // -----------------------------------------------------------------------------
+ fishingOperation.setId(reloadedFishingOperation.getId());
+ fishingOperation.setGearShootingStartLatitude(null);
+ fishingOperation.setGearShootingStartLongitude(null);
+ fishingOperation.setGearShootingEndDate(null);
+ fishingOperation.setGearShootingEndLatitude(null);
+ fishingOperation.setGearShootingEndLongitude(null);
+ fishingOperation.setTrawlDistance(null);
+ fishingOperation.setStrata(null);
+ fishingOperation.setSubStrata(null);
+ fishingOperation.setLocation(null);
+ fishingOperation.setEnvironmentCaracteristics(environmentValuesOneEntry);
+ fishingOperation.setGearShootingCaracteristics(gearShootingCaracteristicsOneEntry);
+ fishingOperation.setComment(fishingOperation.getComment() + "\n\nUnit test createFishingOperation() - Part n°5 : check if deleted sub items in DB");
+ createdFishingOperation = service.saveFishingOperation(fishingOperation);
+ reloadedFishingOperation = service.getFishingOperation(createdFishingOperation.getId());
+ assertNull(reloadedFishingOperation.getGearShootingStartLatitude());
+ assertNull(reloadedFishingOperation.getGearShootingStartLongitude());
+ assertNull(reloadedFishingOperation.getGearShootingEndDate());
+ assertNull(reloadedFishingOperation.getGearShootingEndLatitude());
+ assertNull(reloadedFishingOperation.getGearShootingEndLongitude());
+ assertNull(reloadedFishingOperation.getStrata());
+ assertNull(reloadedFishingOperation.getSubStrata());
+ assertNull(reloadedFishingOperation.getLocation());
+ assertNotNull(reloadedFishingOperation.getEnvironmentCaracteristics());
+ assertEquals(environmentValuesOneEntry.size(), reloadedFishingOperation.getEnvironmentCaracteristics().size());
+ assertNotNull(reloadedFishingOperation.getGearShootingCaracteristics());
+ assertEquals(gearShootingCaracteristicsOneEntry.size(), reloadedFishingOperation.getGearShootingCaracteristics().size());
}
@Test
1
0