This is an automated email from the git hooks/post-receive script. New commit to branch feature/7457 in repository observe. See http://git.codelutin.com/observe.git commit dc968c0cc5a337d5fba1ce9f132f64ab80b1b9ec Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 16 12:58:51 2015 +0200 Ajout du module de définition de l'API des services (volontairement très neutre). On pousse ici l'état du travail déjà effecté mais non neutre (utilisation topia) (src/main/fromRefactor) --- observe-services-api/LICENSE.txt | 0 observe-services-api/README.txt | 0 observe-services-api/pom.xml | 63 +++ .../fr/ird/observe/services/Commit.java | 20 + .../fr/ird/observe/services/NoTransaction.java | 20 + .../fr/ird/observe/services/ObserveService.java | 26 ++ .../observe/services/ObserveServiceContext.java | 84 ++++ .../observe/services/ObserveServiceFactory.java | 90 +++++ .../services/ObserveServiceFactoryProvider.java | 17 + .../ird/observe/services/ObserveServicesCache.java | 189 +++++++++ .../ird/observe/services/ReplicationService.java | 33 ++ .../observe/services/data/DataSelectionModel.java | 440 +++++++++++++++++++++ .../ird/observe/services/data/OpenableService.java | 25 ++ .../fr/ird/observe/services/data/TripService.java | 36 ++ .../data/longline/ActivityLonglineService.java | 31 ++ .../data/longline/BaitsCompositionService.java | 20 + .../longline/BranchlinesCompositionService.java | 20 + .../data/longline/CatchLonglineService.java | 34 ++ .../services/data/longline/EncounterService.java | 20 + .../longline/FloatlinesCompositionService.java | 20 + .../longline/GearUseFeaturesLonglineService.java | 27 ++ .../data/longline/HooksCompositionService.java | 20 + .../longline/LonglineDetailCompositionService.java | 23 ++ .../longline/LonglineGlobalCompositionService.java | 16 + .../services/data/longline/SensorUsedService.java | 23 ++ .../services/data/longline/SetLonglineService.java | 32 ++ .../observe/services/data/longline/TdrService.java | 23 ++ .../data/longline/TripLonglineService.java | 33 ++ .../services/data/seine/ActivitySeineService.java | 36 ++ .../services/data/seine/FloatingObjectService.java | 36 ++ .../data/seine/GearUseFeaturesSeineService.java | 27 ++ .../services/data/seine/NonTargetCatchService.java | 20 + .../data/seine/NonTargetSampleService.java | 34 ++ .../data/seine/ObjectObservedSpeciesService.java | 20 + .../data/seine/ObjectSchoolEstimateService.java | 20 + .../observe/services/data/seine/RouteService.java | 31 ++ .../services/data/seine/SchoolEstimateService.java | 20 + .../services/data/seine/SetSeineService.java | 30 ++ .../services/data/seine/TargetCatchService.java | 28 ++ .../services/data/seine/TargetSampleService.java | 34 ++ .../services/data/seine/TripSeineService.java | 33 ++ .../services/operation/ComputeDataService.java | 18 + .../services/operation/GpsImportService.java | 27 ++ .../operation/ObsoleteReferenceToReplace.java | 111 ++++++ .../services/operation/SynchronizeService.java | 38 ++ .../services/operation/ValidationService.java | 18 + .../referential/AbstractReferentialCache.java | 143 +++++++ .../services/referential/ReferentialService.java | 70 ++++ .../fr/ird/observe/services/ObserveService.java | 13 + .../observe/services/ObserveServiceContext.java | 10 + .../observe/services/ObserveServiceFactory.java | 78 ++++ .../services/ObserveServiceFactoryProvider.java | 14 + .../services/service/ReferentialService.java | 36 ++ .../fr/ird/observe/services/spi/NoDataAccess.java | 19 + .../java/fr/ird/observe/services/spi/Write.java | 19 + .../services/FakeObserveServiceContext.java | 10 + .../FakeObserveServiceFactoryProvider.java | 19 + .../services/ObserveServiceFactoryTest.java | 20 + ....observe.services.ObserveServiceFactoryProvider | 1 + .../src/test/resources/log4j.properties | 32 ++ pom.xml | 5 +- 61 files changed, 2454 insertions(+), 1 deletion(-) diff --git a/observe-services-api/LICENSE.txt b/observe-services-api/LICENSE.txt new file mode 100644 index 0000000..e69de29 diff --git a/observe-services-api/README.txt b/observe-services-api/README.txt new file mode 100644 index 0000000..e69de29 diff --git a/observe-services-api/pom.xml b/observe-services-api/pom.xml new file mode 100644 index 0000000..0a79ce5 --- /dev/null +++ b/observe-services-api/pom.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>fr.ird.observe</groupId> + <artifactId>observe</artifactId> + <version>4.0.2-SNAPSHOT</version> + </parent> + + <artifactId>observe-services-api</artifactId> + + <name>ObServe :: Services API</name> + <description>ObServe services API module</description> + + <dependencies> + + <!-- sibling dependencies --> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>observe-services-model</artifactId> + <version>${project.version}</version> + </dependency> + + + <!-- commons dependencies --> + + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </dependency> + + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + </dependency> + + <!-- Logging --> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-jcl</artifactId> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <scope>test</scope> + </dependency> + + <!-- test dependencies --> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + </dependency> + + </dependencies> + + +</project> \ No newline at end of file diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/Commit.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/Commit.java new file mode 100644 index 0000000..0e52dc6 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/Commit.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Place this on every method that need a commit. + * + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Commit { + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/NoTransaction.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/NoTransaction.java new file mode 100644 index 0000000..6839d32 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/NoTransaction.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Place this on every method that do not need a transaction. + * + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface NoTransaction { + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveService.java new file mode 100644 index 0000000..335c670 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveService.java @@ -0,0 +1,26 @@ +package fr.ird.observe.services; + + +import com.google.common.base.Predicate; +import fr.ird.observe.entities.EntityMap; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.util.List; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ObserveService { + + <E extends TopiaEntity> EntityMap findAllUsages(E entity); + + <E extends TopiaEntity> List<E> getList(Class<E> klass); + + <E extends TopiaEntity> List<E> getList(Class<E> klass, Predicate<E> predicate); + + void setServiceContext(ObserveServiceContext serviceContext); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServiceContext.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServiceContext.java new file mode 100644 index 0000000..320d53e --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServiceContext.java @@ -0,0 +1,84 @@ +package fr.ird.observe.services; + +import fr.ird.observe.BinderService; +import fr.ird.observe.DecoratorService; +import fr.ird.observe.IObserveConfig; +import fr.ird.observe.ObserveApplicationContext; +import fr.ird.observe.db.DataSource; +import fr.ird.observe.entities.constants.ReferenceLocale; +import org.nuiton.topia.TopiaContext; + +import java.util.Date; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class ObserveServiceContext { + + /** + * Configuration. + */ + protected final IObserveConfig config; + + /** + * Data Source. + */ + protected final DataSource dataSource; + + protected final DecoratorService decoratorService; + + private final BinderService binderService; + + /** + * Current transaction. + */ + protected TopiaContext transaction; + + /** + * Application context. + */ + protected ObserveApplicationContext applicationContext; + + public ObserveServiceContext(ObserveApplicationContext applicationContext, DataSource dataSource) { + this.applicationContext = applicationContext; + this.config = applicationContext.getConfig(); + this.dataSource = dataSource; + this.decoratorService = applicationContext.getDecoratorService(); + this.binderService = applicationContext.getBinderService(); + } + + public TopiaContext getTransaction() { + return transaction; + } + + public IObserveConfig getConfig() { + return config; + } + + public ReferenceLocale getReferentielLocale() { + return decoratorService.getReferentielLocale(); + } + + public Date now() { + return new Date(); + } + + public DecoratorService getDecoratorService() { + return decoratorService; + } + + public BinderService getBinderService() { + return binderService; + } + + protected void setTransaction(TopiaContext transaction) { + this.transaction = transaction; + } + + protected DataSource getDataSource() { + return dataSource; + } +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServiceFactory.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServiceFactory.java new file mode 100644 index 0000000..25dcb33 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServiceFactory.java @@ -0,0 +1,90 @@ +package fr.ird.observe.services; + +import com.google.common.base.Preconditions; +import fr.ird.observe.ObserveApplicationContext; +import fr.ird.observe.db.DataSource; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.HashSet; +import java.util.ServiceLoader; +import java.util.Set; + +/** + * Created on 4/24/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class ObserveServiceFactory { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveServiceFactory.class); + + protected final ObserveApplicationContext applicationContext; + + protected static Set<ObserveServiceFactoryProvider> providers; + + public ObserveServiceFactory(ObserveApplicationContext applicationContext) { + this.applicationContext = applicationContext; + if (log.isInfoEnabled()) { + log.info("Init new ServiceFactory for applicationContext: " + applicationContext); + } + } + + public <S extends ObserveService> S newService(DataSource dataSource, Class<S> serviceType) { + + Preconditions.checkNotNull(dataSource, "dataSource can't be null."); + Preconditions.checkNotNull(serviceType, "serviceType can't be null."); + Preconditions.checkNotNull(dataSource, "dataSource can't be null."); + + ObserveServiceFactoryProvider provider = getProvider(dataSource); + + if (log.isDebugEnabled()) { + log.debug("Using provider: " + provider); + } + ObserveServiceContext serviceContext = new ObserveServiceContext(applicationContext, dataSource); + + S service = provider.newService(serviceType, serviceContext); + if (log.isInfoEnabled()) { + log.info("New service created: " + service + " for dataSource: " + toString(dataSource)); + } + return service; + + } + + protected static Set<ObserveServiceFactoryProvider> getProviders() { + + if (providers == null) { + providers = new HashSet<ObserveServiceFactoryProvider>(); + + ServiceLoader<ObserveServiceFactoryProvider> load = ServiceLoader.load(ObserveServiceFactoryProvider.class); + for (ObserveServiceFactoryProvider observeServiceFactoryProvider : load) { + + providers.add(observeServiceFactoryProvider); + } + } + + return providers; + + } + + protected static ObserveServiceFactoryProvider getProvider(DataSource dataSource) { + + ObserveServiceFactoryProvider result = null; + for (ObserveServiceFactoryProvider provider : getProviders()) { + if (provider.acceptDataSource(dataSource)) { + result = provider; + break; + } + } + + Preconditions.checkState(result != null, "No provider found for dataSource: " + dataSource); + return result; + + } + + protected String toString(DataSource dataSource) { + return dataSource.getClass().getName() + "#" + System.identityHashCode(dataSource); + } +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServiceFactoryProvider.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServiceFactoryProvider.java new file mode 100644 index 0000000..abc3386 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServiceFactoryProvider.java @@ -0,0 +1,17 @@ +package fr.ird.observe.services; + +import fr.ird.observe.db.DataSource; + +/** + * Created on 5/4/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ObserveServiceFactoryProvider { + + boolean acceptDataSource(DataSource dataSource); + + <S extends ObserveService> S newService(Class<S> serviceType, ObserveServiceContext serviceContext); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServicesCache.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServicesCache.java new file mode 100644 index 0000000..ae59dcb --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ObserveServicesCache.java @@ -0,0 +1,189 @@ +package fr.ird.observe.services; + +import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.Iterables; +import fr.ird.observe.ObserveTechnicalException; +import fr.ird.observe.db.DataSource; +import fr.ird.observe.db.event.DataSourceEvent; +import fr.ird.observe.db.event.DataSourceListener; +import fr.ird.observe.db.event.DataSourceListenerAdapter; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.Closeable; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ExecutionException; + +/** + * Created on 5/4/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class ObserveServicesCache implements Closeable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveServicesCache.class); + + protected final ObserveServiceFactory factory; + + protected final LoadingCache<ServiceKey<? extends ObserveService>, ObserveService> cache; + + protected final Set<DataSource> usedDataSource; + + protected final DataSourceListener dataSourceListener; + + public ObserveServicesCache(ObserveServiceFactory factory) { + + this.factory = factory; + + this.usedDataSource = new HashSet<DataSource>(); + + this.cache = CacheBuilder.newBuilder().build(new CacheLoader<ServiceKey<? extends ObserveService>, ObserveService>() { + + @Override + public ObserveService load(ServiceKey<? extends ObserveService> key) throws Exception { + + Preconditions.checkNotNull(key, "service key can't be null"); + + boolean add = usedDataSource.add(key.dataSource); + if (add) { + registerDataSource(key.dataSource); + } + ObserveService service = ObserveServicesCache.this.factory.newService(key.dataSource, key.serviceType); + + if (log.isInfoEnabled()) { + log.info("Adding service " + service + " in cache"); + } + return service; + + } + }); + this.dataSourceListener = new DataSourceListenerAdapter() { + + @Override + public void onClosed(DataSourceEvent event) { + + // remove any cache entry using this dataSource + DataSource source = event.getSource(); + unregisterDataSource(source); + + } + }; + } + + public <S extends ObserveService> S getService(DataSource dataSource, Class<S> serviceType) { + + Preconditions.checkNotNull(dataSource, "dataSource can't be null."); + Preconditions.checkNotNull(serviceType, "serviceType can't be null."); + + ServiceKey<S> key = new ServiceKey<S>(dataSource, serviceType); + + try { + + S s = (S) cache.get(key); + return s; + + } catch (ExecutionException e) { + throw new ObserveTechnicalException("Could not get service: " + serviceType, e); + } + + } + + @Override + public void close() { + + removeDataSource(cache.asMap().keySet()); + usedDataSource.clear(); + + } + + protected void registerDataSource(DataSource dataSource) { + + if (log.isInfoEnabled()) { + log.info("Register new dataSource: " + factory.toString(dataSource)); + } + usedDataSource.add(dataSource); + dataSource.addDataSourceListener(dataSourceListener); + + } + + protected void unregisterDataSource(final DataSource dataSource) { + + if (log.isInfoEnabled()) { + log.info("Unregister new dataSource: " + factory.toString(dataSource)); + } + + Iterable<ServiceKey<?>> keysToRemove = Iterables.filter(cache.asMap().keySet(), new Predicate<ServiceKey<? extends ObserveService>>() { + + @Override + public boolean apply(ServiceKey<? extends ObserveService> input) { + return input.dataSource == dataSource; + } + }); + removeDataSource(keysToRemove); + usedDataSource.remove(dataSource); + + } + + protected synchronized void removeDataSource(Iterable<ServiceKey<?>> keysToRemove) { + + Map<ServiceKey<? extends ObserveService>, ObserveService> map = cache.asMap(); + + for (ServiceKey<? extends ObserveService> serviceKey : keysToRemove) { + ObserveService service = map.get(serviceKey); + if (log.isInfoEnabled()) { + log.info("Removing service from cache: " + service); + } + } + cache.invalidateAll(keysToRemove); + + } + + + static class ServiceKey<S extends ObserveService> { + + protected final DataSource dataSource; + + protected final Class<S> serviceType; + + ServiceKey(DataSource dataSource, Class<S> serviceType) { + + Preconditions.checkNotNull(dataSource, "dataSource can't be null."); + Preconditions.checkNotNull(serviceType, "serviceType can't be null."); + + this.dataSource = dataSource; + this.serviceType = serviceType; + + } + + @Override + public boolean equals(Object o) { + + if (this == o) return true; + if (!(o instanceof ServiceKey)) return false; + + ServiceKey<?> that = (ServiceKey<?>) o; + // On doit utiliser une égalité de référence pour la dataSource + return dataSource == that.dataSource && serviceType.equals(that.serviceType); + + } + + @Override + public int hashCode() { + + int result = dataSource.hashCode(); + result = 31 * result + serviceType.hashCode(); + return result; + + } + } + + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ReplicationService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ReplicationService.java new file mode 100644 index 0000000..335d53a --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/ReplicationService.java @@ -0,0 +1,33 @@ +package fr.ird.observe.services; + +import fr.ird.observe.SendMessageAble; +import fr.ird.observe.db.DataSource; +import fr.ird.observe.db.DataSourceException; +import fr.ird.observe.services.spi.Write; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.util.List; + +/** + * Created on 5/3/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ReplicationService extends ObserveService { + + @Write + void replicateObsoletesEntities(List<TopiaEntity> obsoleteEntities, DataSource source, SendMessageAble messanger) throws DataSourceException; + + @Write + void replicateReferentiel(DataSource srcService) throws DataSourceException; + + @Write + void replicateReferentiel(DataSource srcService, List<String> ids, SendMessageAble messanger) throws DataSourceException; + + @Write + void replicateAllData(DataSource srcService) throws DataSourceException; + + @Write + void replicateData(DataSource srcService, String... ids) throws DataSourceException; +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/DataSelectionModel.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/DataSelectionModel.java new file mode 100644 index 0000000..f4d5bd7 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/DataSelectionModel.java @@ -0,0 +1,440 @@ +/* + * #%L + * ObServe :: Business + * %% + * Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + * %% + * 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% + */ +package fr.ird.observe.services.data; + +import fr.ird.observe.entities.Entities; +import fr.ird.observe.entities.Trips; +import fr.ird.observe.entities.referentiel.Program; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.util.TopiaEntityHelper; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +/** + * Un modèle pour représenter la sélection de données. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 1.4 + */ +public class DataSelectionModel implements Serializable { + + public static final String PROPERTY_USE_REFERENTIEL = "useReferentiel"; + + public static final String PROPERTY_USE_DATA = "useData"; + + public static final String PROPERTY_USE_OPEN_DATA = "useOpenData"; + + public static final String PROPERTY_SELECTED_DATA = "selectedData"; + + public static final String PROPERTY_SELECTED_REFERENTIEL = "selectedReferentiel"; + + public static final String PROPERTY_DATAS = "datas"; + + /** Logger */ + private static final Log log = LogFactory.getLog(DataSelectionModel.class); + + private static final long serialVersionUID = 2L; + + /** un drapeau pour selectionner ou non les donnees observers */ + protected boolean useData; + + /** un drapeau pour selectionner ou non des donnees observers ouvertes */ + protected boolean useOpenData; + + /** un drapeau pour selectionner ou non des donnees observer */ + protected boolean useReferentiel; + + /** la liste des programs utilisables (qui ont des marees) */ + protected transient Map<String, List<String>> datas; + + /** + * Le cache des entités chargées pour construire le modèle de sélection. + * + * Ces entités pourront ensuite être injectées dans les noeuds sans avoir à les recharger. + * + * @since 4.0 + */ + protected final Map<String, ? super TopiaEntity> entityCache; + + /** la liste des marees selectionnee */ + protected transient Set<String> selectedData; + + /** la liste des referentiels possibles */ + protected final Set<Class<?>> referentiel; + + /** la liste des referentiels selectionnes */ + protected final Set<Class<?>> selectedReferentiel; + + /** nb marees */ + protected int nbTrips; + + /** nb referentiels */ + protected final int nbReferentiels; + + protected final PropertyChangeSupport pcs; + + public DataSelectionModel() { + pcs = new PropertyChangeSupport(this); + Class<?>[] classes = TopiaEntityHelper.getContracts(Entities.REFERENCE_ENTITIES); + List<Class<?>> list = Arrays.asList(classes); + referentiel = new HashSet<Class<?>>(list); + selectedReferentiel = new HashSet<Class<?>>(); + nbReferentiels = referentiel.size(); + entityCache = new TreeMap<String, TopiaEntity>(); + } + + public boolean isUseReferentiel() { + return useReferentiel; + } + + public boolean isUseData() { + return useData; + } + + public boolean isUseOpenData() { + return useOpenData; + } + + public boolean isEmpty() { + if (isUseReferentiel()) { + if (!isReferentielEmpty()) { + return false; + } + } + if (isUseData()) { + if (!isDataEmpty()) { + return false; + } + } + return true; + } + + public void cacheEntity(TopiaEntity entity) { + entityCache.put(entity.getTopiaId(), entity); + } + + public TopiaEntity getEntityCache(String id) { + return (TopiaEntity) entityCache.get(id); + } + + public boolean isReferentielEmpty() { + return selectedReferentiel.isEmpty(); + } + + public boolean isReferentielFull() { + return selectedReferentiel.size() == nbReferentiels; + } + + public boolean isDataEmpty() { + return selectedData == null || selectedData.isEmpty(); + } + + public boolean isDataFull() { + return selectedData != null && selectedData.size() == nbTrips; + } + + public Set<Class<?>> getSelectedReferentiel() { + return selectedReferentiel; + } + + public Map<String, List<String>> getDatas() { + if (datas == null) { + datas = new HashMap<String, List<String>>(); + } + return datas; + } + + public Set<String> getSelectedData() { + if (selectedData == null) { + selectedData = new HashSet<String>(); + } + return selectedData; + } + + public Map<String, List<String>> getSelectedDataByProgram() { + if (datas == null || selectedData == null || selectedData.isEmpty()) { + return Collections.emptyMap(); + } + Map<String, List<String>> result = + new HashMap<String, List<String>>(datas.size()); + + for (String m : selectedData) { + + // on recherche son program + for (String p : datas.keySet()) { + if (datas.get(p).contains(m)) { + List<String> trips = result.get(p); + if (trips == null) { + trips = new ArrayList<String>(); + result.put(p, trips); + } + trips.add(m); + break; + } + } + } + return result; + } + + public boolean isSelectedData(String id) { + + if (Trips.isTripId(id)) { + + // recherche directe sur les ids de marees + return getSelectedData().contains(id); + } + + if (id.startsWith(Program.class.getName())) { + // on doit verifier que toutes les marees du program sont sélectionnées + List<String> tripIds = datas.get(id); + if (tripIds != null || tripIds.isEmpty()) { + + // pas de marées + return false; + } + + for (String tripId : tripIds) { + if (!isSelectedData(tripId)) { + + // au moins une marée non sélectionnée + + return false; + } + } + + // toutes les marées sont sélectionnée + return true; + } + + // ne devrait pas arrivée + return false; + + } + + public boolean isSelectedReferentiel(Class<?> type) { + checkReferentielType(type); + return getSelectedReferentiel().contains(type); + } + + public void setUseReferentiel(boolean useReferentiel) { + this.useReferentiel = useReferentiel; + firePropertyChange(PROPERTY_USE_REFERENTIEL, useReferentiel); + } + + public void setUseData(boolean useData) { + this.useData = useData; + firePropertyChange(PROPERTY_USE_DATA, useData); + } + + public void setUseOpenData(boolean useOpenData) { + this.useOpenData = useOpenData; + firePropertyChange(PROPERTY_USE_OPEN_DATA, useOpenData); + } + + public void addSelectedReferentiel(Class<?> type) { + checkReferentielType(type); + if (log.isDebugEnabled()) { + log.debug("Add referentiel type " + type); + } + getSelectedReferentiel().add(type); + firePropertyChange(PROPERTY_SELECTED_REFERENTIEL, selectedReferentiel); + } + + public void addAllSelectedReferentiel() { + getSelectedReferentiel().addAll(referentiel); + firePropertyChange(PROPERTY_SELECTED_REFERENTIEL, selectedReferentiel); + } + + public void removeSelectedReferentiel(Class<?> type) { + checkReferentielType(type); + if (log.isDebugEnabled()) { + log.debug("remove referentiel type " + type); + } + getSelectedReferentiel().remove(type); + firePropertyChange(PROPERTY_SELECTED_REFERENTIEL, selectedReferentiel); + } + + public void removeAll() { + getSelectedReferentiel().clear(); + getSelectedData().clear(); + firePropertyChange(PROPERTY_SELECTED_REFERENTIEL, selectedReferentiel); + firePropertyChange(PROPERTY_SELECTED_DATA, selectedData); + } + + public void removeAllSelectedReferentiel() { + getSelectedReferentiel().clear(); + firePropertyChange(PROPERTY_SELECTED_REFERENTIEL, selectedReferentiel); + } + + public void setDatas(Map<String, List<String>> datas) { + this.datas = datas; + + // on compte le count de marées totale + int nbTrips = 0; + if (datas != null) { + for (List<String> marees : datas.values()) { + nbTrips += marees.size(); + } + } + this.nbTrips = nbTrips; + + if (log.isDebugEnabled()) { + log.debug("Nb program registred : " + (datas == null ? 0 : datas.size())); + log.debug("Nb trip registred : " + this.nbTrips); + } + firePropertyChange(PROPERTY_DATAS, datas); + } + + public void addSelectedData(String id) { + + if (Trips.isTripId(id)) { + + // ajout d'une marée + if (log.isDebugEnabled()) { + log.debug("Add Trip " + id); + } + getSelectedData().add(id); + } else if (id.startsWith(Program.class.getName())) { + + // ajout de toutes les marées du program + + if (log.isDebugEnabled()) { + log.debug("Add all trips of program " + id); + } + getSelectedData().addAll(datas.get(id)); + } + + + firePropertyChange(PROPERTY_SELECTED_DATA, selectedData); + } + + public void addAllSelectedData() { + if (log.isDebugEnabled()) { + log.debug("All all data."); + } + for (List<String> p : datas.values()) { + getSelectedData().addAll(p); + } + firePropertyChange(PROPERTY_SELECTED_DATA, selectedData); + } + + public void removeSelectedData(String id) { + if (Trips.isTripId(id)) { + + // ajout d'une marée + if (log.isDebugEnabled()) { + log.debug("Remove maree " + id); + } + getSelectedData().remove(id); + } else if (id.startsWith(Program.class.getName())) { + + // ajout de toutes les marées du program + + if (log.isDebugEnabled()) { + log.debug("Remove all marees of program " + id); + } + getSelectedData().removeAll(datas.get(id)); + } + firePropertyChange(PROPERTY_SELECTED_DATA, selectedData); + } + + public void removeAllSelectedData() { + if (selectedData != null) { + selectedData.clear(); + } + firePropertyChange(PROPERTY_SELECTED_DATA, selectedData); + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + pcs.addPropertyChangeListener(listener); + } + + public void addPropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + pcs.addPropertyChangeListener(propertyName, listener); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + pcs.removePropertyChangeListener(listener); + } + + public void removePropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + pcs.removePropertyChangeListener(propertyName, listener); + } + + protected void firePropertyChange(String propertyName, Object newValue) { + pcs.firePropertyChange(propertyName, null, newValue); + } + + protected void firePropertyChange(String propertyName, + Object oldValue, + Object newValue) { + pcs.firePropertyChange(propertyName, oldValue, newValue); + } + + protected void checkReferentielType(Class<?> type) { + + if (!referentiel.contains(type)) { + throw new IllegalArgumentException("given <" + type + "> is not in referentiel universe : " + referentiel); + } + + } + + public void destroy() { + + removeAll(); + // suppression de tous les listeners + PropertyChangeListener[] listeners = pcs.getPropertyChangeListeners(); + for (PropertyChangeListener l : listeners) { + removePropertyChangeListener(l); + } + + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + destroy(); + } + + public void copyDataTo(DataSelectionModel dataSelectionModel) { + + dataSelectionModel.setDatas(datas); + dataSelectionModel.entityCache.clear(); + dataSelectionModel.entityCache.putAll((Map) entityCache); + + } +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/OpenableService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/OpenableService.java new file mode 100644 index 0000000..94bb250 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/OpenableService.java @@ -0,0 +1,25 @@ +package fr.ird.observe.services.data; + +import fr.ird.observe.entities.OpenableEntity; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; +import org.nuiton.topia.persistence.TopiaEntity; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface OpenableService extends ObserveService { + + String[] getOpenIds(); + + <E extends OpenableEntity & TopiaEntity> E getOpen(Class<E> klass); + + @Write + void updateOpenState(String topiaId, boolean openState); + + int getOpenablePosition(String containerId, String childId); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/TripService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/TripService.java new file mode 100644 index 0000000..2277b58 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/TripService.java @@ -0,0 +1,36 @@ +package fr.ird.observe.services.data; + +import fr.ird.observe.entities.Trip; +import fr.ird.observe.entities.referentiel.Ocean; +import fr.ird.observe.entities.referentiel.Program; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; +import fr.ird.observe.tripMap.TripMapPoint; + +import java.util.List; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface TripService extends ObserveService { + + DataSelectionModel loadDataSelectionModel(); + + List<Program> getPossibleProgramsForTrip(String tripId); + + Trip getTrip(String tripId); + + Ocean getTripOcean(String tripId); + + List<TripMapPoint> loadTripMapActivityPoints(String tripId); + + @Write + void moveTripToProgram(String tripId, String programId); + + @Write + void deleteTrip(String tripId); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/ActivityLonglineService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/ActivityLonglineService.java new file mode 100644 index 0000000..fbf9406 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/ActivityLonglineService.java @@ -0,0 +1,31 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.ActivityLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ActivityLonglineService extends ObserveService { + + ActivityLongline getActivityLonglineStub(String activityId); + + List<ActivityLongline> getActivityLonglineStubByTrip(String tripId); + + ActivityLongline loadForEdit(String activityLonglineId); + + ActivityLongline preCreate(String tripLonglineId); + + @Write + String save(String tripLonglineId, ActivityLongline toSave); + + @Write + void delete(String tripLonglineId, String activityLonglineId); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/BaitsCompositionService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/BaitsCompositionService.java new file mode 100644 index 0000000..38fd9c4 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/BaitsCompositionService.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface BaitsCompositionService extends ObserveService { + + SetLongline loadForEdit(String setLonglineId); + + @Write + void save(SetLongline setLongline); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/BranchlinesCompositionService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/BranchlinesCompositionService.java new file mode 100644 index 0000000..1968426 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/BranchlinesCompositionService.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface BranchlinesCompositionService extends ObserveService { + + SetLongline loadForEdit(String setLonglineId); + + @Write + void save(SetLongline setLongline); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/CatchLonglineService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/CatchLonglineService.java new file mode 100644 index 0000000..4c9602b --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/CatchLonglineService.java @@ -0,0 +1,34 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.Branchline; +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.entities.longline.SizeMeasure; +import fr.ird.observe.entities.longline.WeightMeasure; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface CatchLonglineService extends ObserveService { + + Branchline loadBranchlineForEdit(String branchelineId); + + SetLongline loadForEdit(String setLonglineId); + + List<SizeMeasure> getCatchLonglineSizeMeasures(String catchLonglineId); + + List<WeightMeasure> getCatchLonglineWeightMeasures(String catchLonglineId); + + @Write + void save(SetLongline setLongline); + + @Write + Branchline saveBranchline(Branchline toSave); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/EncounterService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/EncounterService.java new file mode 100644 index 0000000..9fdacc4 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/EncounterService.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.ActivityLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface EncounterService extends ObserveService { + + ActivityLongline loadForEdit(String activityLonglineId); + + @Write + void save(ActivityLongline activityLongline); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/FloatlinesCompositionService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/FloatlinesCompositionService.java new file mode 100644 index 0000000..0daec67 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/FloatlinesCompositionService.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface FloatlinesCompositionService extends ObserveService { + + SetLongline loadForEdit(String setLonglineId); + + @Write + void save(SetLongline setLongline); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/GearUseFeaturesLonglineService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/GearUseFeaturesLonglineService.java new file mode 100644 index 0000000..f4aa618 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/GearUseFeaturesLonglineService.java @@ -0,0 +1,27 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.GearUseFeaturesMeasurementLongline; +import fr.ird.observe.entities.longline.TripLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface GearUseFeaturesLonglineService extends ObserveService { + + List<GearUseFeaturesMeasurementLongline> getDefaultGearUseFeaturesMeasurementLongline(String gearId); + + List<GearUseFeaturesMeasurementLongline> loadGearUseFeaturesMeasurementLonglineForEdit(String gearUseFeaturesLonglineId); + + TripLongline loadForEdit(String tripLonglineId); + + @Write + void save(TripLongline tripLongline); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/HooksCompositionService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/HooksCompositionService.java new file mode 100644 index 0000000..4915672 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/HooksCompositionService.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface HooksCompositionService extends ObserveService { + + SetLongline loadForEdit(String setLonglineId); + + @Write + void save(SetLongline setLongline); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/LonglineDetailCompositionService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/LonglineDetailCompositionService.java new file mode 100644 index 0000000..0855f40 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/LonglineDetailCompositionService.java @@ -0,0 +1,23 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.SectionWithTemplate; +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface LonglineDetailCompositionService extends ObserveService { + + SetLongline loadForEdit(String setLonglineId); + + @Write + void save(SetLongline toSave, List<SectionWithTemplate> sections); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/LonglineGlobalCompositionService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/LonglineGlobalCompositionService.java new file mode 100644 index 0000000..fcab4d0 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/LonglineGlobalCompositionService.java @@ -0,0 +1,16 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public interface LonglineGlobalCompositionService extends ObserveService { + + SetLongline loadForEdit(String setLonglineId); + + @Write + String save(SetLongline bean); +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/SensorUsedService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/SensorUsedService.java new file mode 100644 index 0000000..ab53554 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/SensorUsedService.java @@ -0,0 +1,23 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.ActivityLongline; +import fr.ird.observe.entities.longline.SensorUsed; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface SensorUsedService extends ObserveService { + + String getSensorUsedDataFilename(SensorUsed sensorUsed); + + ActivityLongline loadForEdit(String activityLonglineId); + + @Write + void save(ActivityLongline activityLongline); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/SetLonglineService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/SetLonglineService.java new file mode 100644 index 0000000..15e4b93 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/SetLonglineService.java @@ -0,0 +1,32 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.Section; +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface SetLonglineService extends ObserveService { + + SetLongline loadForDisplay(String setLonglineId); + + List<Section> getSections(String setLonglineId); + + SetLongline preCreate(String activityLonglineId); + + SetLongline loadForEdit(String setLonglineId); + + @Write + String save(String activityLonglineId, SetLongline setLongline); + + @Write + void delete(String activityLonglineId, String setLonglineId); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/TdrService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/TdrService.java new file mode 100644 index 0000000..092a5ab --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/TdrService.java @@ -0,0 +1,23 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.SetLongline; +import fr.ird.observe.entities.longline.Tdr; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface TdrService extends ObserveService { + + String getTdrDataFilename(Tdr tdr); + + SetLongline loadForEdit(String setLonglineId); + + @Write + void save(SetLongline setLongline); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/TripLonglineService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/TripLonglineService.java new file mode 100644 index 0000000..ac3a449 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/longline/TripLonglineService.java @@ -0,0 +1,33 @@ +package fr.ird.observe.services.data.longline; + +import fr.ird.observe.entities.longline.TripLongline; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface TripLonglineService extends ObserveService { + + List<TripLongline> getTripLonglineStubByProgram(String programId); + + TripLongline getTripLonglineStub(String tripId); + + TripLongline loadForDisplay(String tripLonglineId); + + TripLongline loadForEdit(String tripLonglineId); + + TripLongline preCreate(String programId); + + @Write + String save(TripLongline toSave); + + @Write + void delete(String tripLonglineId); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/ActivitySeineService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/ActivitySeineService.java new file mode 100644 index 0000000..f6e864f --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/ActivitySeineService.java @@ -0,0 +1,36 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.ActivitySeine; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ActivitySeineService extends ObserveService { + + ActivitySeine getActivitySeineStub(String activitySeineId); + + List<ActivitySeine> getActivitySeineStubByRoute(String routeId); + + ActivitySeine loadForEdit(String activitySeineId); + + ActivitySeine loadForEditObservedSystem(String activitySeineId); + + ActivitySeine preCreate(String tripLonglineId); + + @Write + String save(String routeId, ActivitySeine toSave); + + @Write + ActivitySeine updateObservedSystem(ActivitySeine toUpdate); + + @Write + void delete(String routeId, String activitySeineId); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/FloatingObjectService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/FloatingObjectService.java new file mode 100644 index 0000000..1aebf3f --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/FloatingObjectService.java @@ -0,0 +1,36 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.FloatingObject; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface FloatingObjectService extends ObserveService { + + List<FloatingObject> getFloatinObjectStubByActivitySeine(String activitySeineId); + + FloatingObject getFloatinObjectStub(String floatingObjectId); + + FloatingObject loadForEdit(String floatingObjectId); + + FloatingObject loadForTransmittingBuoyOperation(String floatingObjectId); + + FloatingObject preCreate(String activitySeineId); + + @Write + String save(String activitySeineId, FloatingObject toSave); + + @Write + void saveForTransmittingBuoyOperation(FloatingObject toUpdate); + + @Write + void delete(String activitySeineId, String floatingObjectId); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/GearUseFeaturesSeineService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/GearUseFeaturesSeineService.java new file mode 100644 index 0000000..7d7e86d --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/GearUseFeaturesSeineService.java @@ -0,0 +1,27 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.GearUseFeaturesMeasurementSeine; +import fr.ird.observe.entities.seine.TripSeine; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface GearUseFeaturesSeineService extends ObserveService { + + List<GearUseFeaturesMeasurementSeine> getDefaultGearUseFeaturesMeasurementSeine(String gearId); + + List<GearUseFeaturesMeasurementSeine> loadGearUseFeaturesMeasurementSeineForEdit(String gearUseFeaturesSeineId); + + TripSeine loadForEdit(String tripId); + + @Write + void save(TripSeine parent); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/NonTargetCatchService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/NonTargetCatchService.java new file mode 100644 index 0000000..33c1d86 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/NonTargetCatchService.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.NonTargetLength; +import fr.ird.observe.entities.seine.SetSeine; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public interface NonTargetCatchService extends ObserveService { + + SetSeine loadForEdit(String setId); + + @Write + void save(SetSeine toSave, List<NonTargetLength> nonTargetLengthsToDelete); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/NonTargetSampleService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/NonTargetSampleService.java new file mode 100644 index 0000000..24baf83 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/NonTargetSampleService.java @@ -0,0 +1,34 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.referentiel.Species; +import fr.ird.observe.entities.seine.NonTargetLength; +import fr.ird.observe.entities.seine.NonTargetSample; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; +import java.util.Set; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface NonTargetSampleService extends ObserveService { + + List<Species> getAvailableSpeciesForNonTargetSample(String setSeineId); + + NonTargetSample loadForEdit(String setSeineId); + + boolean canUseNonTargetSample(String setSeineId); + + List<NonTargetLength> getObsoleteNonTargetLengths(String setSeineId, Set<String> speciesIdsUsed); + + @Write + String save(String setSeineId, NonTargetSample nonTargetSampleToSave); + + @Write + void delete(String setSeineId, NonTargetSample nonTargetSampleToDelete); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/ObjectObservedSpeciesService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/ObjectObservedSpeciesService.java new file mode 100644 index 0000000..c21b817 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/ObjectObservedSpeciesService.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.FloatingObject; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ObjectObservedSpeciesService extends ObserveService { + + FloatingObject loadForEdit(String floatingObjectId); + + @Write + void save(FloatingObject floatingObject); + +} \ No newline at end of file diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/ObjectSchoolEstimateService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/ObjectSchoolEstimateService.java new file mode 100644 index 0000000..7824e04 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/ObjectSchoolEstimateService.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.FloatingObject; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ObjectSchoolEstimateService extends ObserveService { + + FloatingObject loadForEdit(String floatingObjectId); + + @Write + void save(FloatingObject floatingObject); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/RouteService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/RouteService.java new file mode 100644 index 0000000..90428df --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/RouteService.java @@ -0,0 +1,31 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.Route; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface RouteService extends ObserveService { + + List<Route> getRouteStubByTrip(String tripSeineId); + + Route getRouteStub(String routeId); + + Route loadForEdit(String routeId); + + Route preCreate(String tripSeineId); + + @Write + String save(String tripSeineId, Route toSave); + + @Write + void delete(String tripSeineId, String routeId); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/SchoolEstimateService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/SchoolEstimateService.java new file mode 100644 index 0000000..30a5549 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/SchoolEstimateService.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.SetSeine; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +/** + * Created on 4/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface SchoolEstimateService extends ObserveService { + + SetSeine loadForEdit(String setSeineId); + + @Write + void save(SetSeine parent); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/SetSeineService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/SetSeineService.java new file mode 100644 index 0000000..59e5e75 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/SetSeineService.java @@ -0,0 +1,30 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.SetSeine; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.Date; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface SetSeineService extends ObserveService { + + SetSeine loadSet(String setSeineId); + + Date getRouteDate(String routeId); + + SetSeine loadForEdit(String setSeineId); + + SetSeine preCreate(String routeId, String activitySeineId); + + @Write + String save(String activitySeineId, SetSeine toSave); + + @Write + void delete(String activitySeineId, String setSeineId); +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/TargetCatchService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/TargetCatchService.java new file mode 100644 index 0000000..53be1cb --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/TargetCatchService.java @@ -0,0 +1,28 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.SetSeine; +import fr.ird.observe.entities.seine.TargetLength; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 5/2/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface TargetCatchService extends ObserveService { + + SetSeine loadForEdit(String setSeineId); + + SetSeine loadForEditDiscarded(String setSeineId); + + @Write + void save(SetSeine setSeinetoSave, List<TargetLength> targetLengthsToDelete); + + @Write + void saveForDiscarded(SetSeine setSeinetoSave, List<TargetLength> targetLengthsToDelete); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/TargetSampleService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/TargetSampleService.java new file mode 100644 index 0000000..0c3153a --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/TargetSampleService.java @@ -0,0 +1,34 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.referentiel.Species; +import fr.ird.observe.entities.seine.TargetLength; +import fr.ird.observe.entities.seine.TargetSample; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; +import java.util.Set; + +/** + * Created on 4/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface TargetSampleService extends ObserveService { + + List<Species> getAvailableSpeciesForTargetSample(String setSeineId, boolean discarded); + + List<TargetLength> getObsoleteTargetLengths(String setSeineId, Set<String> speciesIdsUsed, boolean discarded); + + TargetSample loadForEdit(String setSeineId, boolean discarded); + + boolean canUseTargetSample(String setSeineId, boolean discarded); + + @Write + String save(String setSeineId, TargetSample toSave); + + @Write + void delete(String setSeineId, TargetSample bean); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/TripSeineService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/TripSeineService.java new file mode 100644 index 0000000..679b2d5 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/data/seine/TripSeineService.java @@ -0,0 +1,33 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.TripSeine; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface TripSeineService extends ObserveService { + + List<TripSeine> getTripSeineStubByProgram(String programId); + + TripSeine getTripSeineStub(String tripSeineId); + + TripSeine loadForDisplay(String tripSeineId); + + TripSeine loadForEdit(String tripSeineId); + + TripSeine preCreate(String programId); + + @Write + String save(TripSeine toSave); + + @Write + void delete(String idToDelete); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/ComputeDataService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/ComputeDataService.java new file mode 100644 index 0000000..898f8c3 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/ComputeDataService.java @@ -0,0 +1,18 @@ +package fr.ird.observe.services.operation; + +import fr.ird.observe.SendMessageAble; +import fr.ird.observe.services.ObserveService; + +import java.util.Set; + +/** + * Created on 5/3/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ComputeDataService extends ObserveService { + + void consolidateTrips(SendMessageAble messager, Set<String> tripIds); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/GpsImportService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/GpsImportService.java new file mode 100644 index 0000000..ede6547 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/GpsImportService.java @@ -0,0 +1,27 @@ +package fr.ird.observe.services.operation; + +import fr.ird.observe.SendMessageAble; +import fr.ird.observe.entities.seine.ActivitySeine; +import fr.ird.observe.entities.seine.TripSeine; +import fr.ird.observe.gps.GPSPoint; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; + +import java.util.Map; + +/** + * Created on 5/3/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface GpsImportService extends ObserveService { + + TripSeine getOpenTrip(); + + Map<ActivitySeine, GPSPoint> getActivitiesForOpenRoute(String openTripSeineId); + + @Write + void applyPoints(Map<ActivitySeine, GPSPoint> data, int[] selectedIndex, SendMessageAble messanger); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/ObsoleteReferenceToReplace.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/ObsoleteReferenceToReplace.java new file mode 100644 index 0000000..08234a6 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/ObsoleteReferenceToReplace.java @@ -0,0 +1,111 @@ +package fr.ird.observe.services.operation; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.util.TopiaEntityRef; + +import java.util.List; + +/** + * Created on 5/3/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class ObsoleteReferenceToReplace { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObsoleteReferenceToReplace.class); + + /** l'id de l'entité à remplacer */ + String obsoleteId; + + /** l'id de l'entité de remplacement */ + String safeId; + + /** la liste des références à traiter */ + TopiaEntityRef[] refs; + + public String getSafeId() { + return safeId; + } + + public TopiaEntityRef[] getRefs() { + return refs; + } + + public ObsoleteReferenceToReplace(String obsoleteId, String safeId, List<TopiaEntityRef> refs) { + this.obsoleteId = obsoleteId; + this.refs = refs.toArray(new TopiaEntityRef[refs.size()]); + this.safeId = safeId; + } + + public String getObsoleteId() { + return obsoleteId; + } + +// public void doAction(TopiaContext tx) throws TopiaException { +// +// if (log.isInfoEnabled()) { +// log.info("load obsolete object " + obsoleteId); +// } +// +// if (log.isInfoEnabled()) { +// log.info("load safe object " + safeId); +// } +// +// TopiaEntity safeRef = tx.findByTopiaId(safeId); +// +// // on remplace les references +// for (TopiaEntityRef ref : refs) { +// TopiaEntity invoker = ref.getInvoker(); +// +// if (invoker == null) { +// throw new NullPointerException( +// "can not have a null invoker in " + ref); +// } +// +// if (log.isInfoEnabled()) { +// log.info("load invoker object " + invoker.getTopiaId()); +// } +// +// invoker = tx.findByTopiaId(invoker.getTopiaId()); +// +// // switch entity +// +// String path = ref.getInvokerProperty(); +// +// JXPathContext jxcontext = JXPathContext.newContext(invoker); +// +// TopiaEntity oldValue = (TopiaEntity) jxcontext.getValue(path); +// +// if (log.isDebugEnabled()) { +// log.debug("property to switch " + path + " old : " + +// oldValue); +// } +// +// if (log.isInfoEnabled()) { +// log.info("change path : " + path); +// log.info("old value : " + oldValue.getTopiaId()); +// } +// +// jxcontext.setValue(path, safeRef); +// +// TopiaEntity newValue = (TopiaEntity) jxcontext.getValue(path); +// +// if (log.isInfoEnabled()) { +// log.info("new value : " + newValue.getTopiaId()); +// } +// if (log.isDebugEnabled()) { +// log.debug("property to switch " + path + " new : " + +// safeRef); +// log.debug("property to switch " + path + " new Check : " + +// newValue); +// } +// TopiaDAO<TopiaEntity> dao = getDAO(tx, invoker); +// +// dao.update(invoker); +// } +// } + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/SynchronizeService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/SynchronizeService.java new file mode 100644 index 0000000..a2e3bcf --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/SynchronizeService.java @@ -0,0 +1,38 @@ +package fr.ird.observe.services.operation; + +import fr.ird.observe.SendMessageAble; +import fr.ird.observe.db.DataSource; +import fr.ird.observe.db.DataSourceException; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.util.DiffState; +import org.nuiton.topia.persistence.util.TopiaEntityRef; + +import java.util.List; +import java.util.SortedMap; + +/** + * Pour effectuer la synchronisation des référentiels. + * + * Le service doit être instancié par le service qui veut être mis à jour. Le service qui contient le référentiel à jour + * doit être passé en paramètre. + * + * Created on 5/3/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface SynchronizeService extends ObserveService { + + DiffState.DiffStateMap buildReferentielDifferentiel(final DataSource centralDataSource, final SendMessageAble messanger); + + SortedMap<TopiaEntity, List<TopiaEntityRef>> detectObsoleteEntities(DiffState.DiffStateMap diff); + + @Write + void saveReferentiel(DataSource centralDataSource, + DiffState.DiffStateMap diff, + List<ObsoleteReferenceToReplace> replaceActions, + SendMessageAble messanger) throws DataSourceException; + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/ValidationService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/ValidationService.java new file mode 100644 index 0000000..ff3a0ce --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/operation/ValidationService.java @@ -0,0 +1,18 @@ +package fr.ird.observe.services.operation; + +import fr.ird.observe.SendMessageAble; +import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.data.DataSelectionModel; +import fr.ird.observe.validation.ValidationMessageDetector; + +/** + * Created on 5/3/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ValidationService extends ObserveService { + + void validate(SendMessageAble messager, ValidationMessageDetector detector, DataSelectionModel dataModel); + +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/referential/AbstractReferentialCache.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/referential/AbstractReferentialCache.java new file mode 100644 index 0000000..62a6af3 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/referential/AbstractReferentialCache.java @@ -0,0 +1,143 @@ +package fr.ird.observe.services.referential; + +import com.google.common.base.Preconditions; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import fr.ird.observe.ObserveTechnicalException; +import fr.ird.observe.entities.referentiel.ReferenceEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ExecutionException; + +/** + * Pour gérer un cache de référentiel. + * + * Pour obtenir une liste d'un référentiel, on passe toujours dans cette classe qui gère les modifications de + * référentiels. + * + * FIXME Il faudrait que avoir une méthode sur ReferentialService qui donne la date de dernière modification d'une liste + * FIXME pour ensuite mettre à jour le cache si besoin (mais pour cela il faut ajouter une colonne sur tous les référentiels) + * + * Created on 5/5/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public abstract class AbstractReferentialCache { + + /** Logger. */ + private static final Log log = LogFactory.getLog(AbstractReferentialCache.class); + + protected final LoadingCache<Class<? extends ReferenceEntity>, ReferentialList<? extends ReferenceEntity>> cache; + + protected abstract ReferentialService getReferentialService(); + + public AbstractReferentialCache() { + + this.cache = CacheBuilder.newBuilder().build(new CacheLoader<Class<? extends ReferenceEntity>, ReferentialList<? extends ReferenceEntity>>() { + + @SuppressWarnings("unchecked") + @Override + public ReferentialList<? extends ReferenceEntity> load(Class<? extends ReferenceEntity> key) throws Exception { + + Preconditions.checkNotNull(key, "key can't be null"); + + ReferentialService service = getReferentialService(); + List<? extends ReferenceEntity> list = service.getList(key); + + if (log.isInfoEnabled()) { + log.info("Adding referential list " + key.getName() + " in cache"); + } + + ReferentialList<? extends ReferenceEntity> referentialList = new ReferentialList(key, list); + return referentialList; + + } + }); + + } + + public <R extends ReferenceEntity> boolean isReferentialListUpToDate(Class<R> referentialType, Date timeStamp) { + + ReferentialList<R> referentialList = getReferentialList(referentialType); + Date referentialListTimeStamp = referentialList.getTimeStamp(); + boolean uptodate = timeStamp.after(referentialListTimeStamp); + return uptodate; + + } + + @SuppressWarnings("unchecked") + public <R extends ReferenceEntity> ReferentialList<R> getReferentialList(Class<R> referentialType) { + + try { + + ReferentialList<R> result = (ReferentialList<R>) cache.get(referentialType); + return result; + + } catch (ExecutionException e) { + throw new ObserveTechnicalException("Could not get referential list: " + referentialType, e); + } + + } + + public void clearEntry(Class<? extends ReferenceEntity> referentialType) { + + ReferentialList<? extends ReferenceEntity> referentialList = getReferentialList(referentialType); + if (log.isInfoEnabled()) { + log.info("Removing from cache: " + referentialList); + } + cache.invalidate(referentialType); + + } + + public void clear() { + + Collection<ReferentialList<? extends ReferenceEntity>> referentialLists = cache.asMap().values(); + for (ReferentialList<? extends ReferenceEntity> referentialList : referentialLists) { + if (log.isInfoEnabled()) { + log.info("Removing from cache: " + referentialList); + } + } + cache.invalidateAll(); + + } + + public static class ReferentialList<R extends ReferenceEntity> { + + private final Date timeStamp; + + private final List<R> data; + + private final Class<R> entityType; + + ReferentialList(Class<R> entityType, List<R> data) { + this.entityType = entityType; + this.timeStamp = new Date(); + this.data = data; + } + + public Date getTimeStamp() { + return timeStamp; + } + + public List<R> getData() { + return data; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) + .append("entityType", entityType.getName()) + .append("timeStamp", timeStamp) + .append("size", data.size()) + .toString(); + } + } +} diff --git a/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/referential/ReferentialService.java b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/referential/ReferentialService.java new file mode 100644 index 0000000..3fbedc5 --- /dev/null +++ b/observe-services-api/src/main/fromRefactor/fr/ird/observe/services/referential/ReferentialService.java @@ -0,0 +1,70 @@ +package fr.ird.observe.services.referential; + +import fr.ird.observe.ObserveTechnicalException; +import fr.ird.observe.entities.referentiel.LengthWeightParameter; +import fr.ird.observe.entities.referentiel.Ocean; +import fr.ird.observe.entities.referentiel.Program; +import fr.ird.observe.entities.referentiel.ReferenceEntity; +import fr.ird.observe.entities.referentiel.Sex; +import fr.ird.observe.entities.referentiel.Species; +import fr.ird.observe.entities.referentiel.seine.WeightCategory; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.operation.ObsoleteReferenceToReplace; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Set; + +/** + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface ReferentialService extends ObserveService { + + List<Program> getAllProgramStub(); + + int getProgramPosition(String programId); + + Program getProgramStub(String programId); + + <E extends ReferenceEntity> List<E> loadListForEdit(Class<E> entityType); + + <E extends ReferenceEntity> List<E> loadAndDecorateList(Class<E> entityType); + + <E extends ReferenceEntity> E loadAndDecorate(Class<E> entityType, String topiaId); + + List<Species> loadDecoratedSpecies(String speciesListCode); + + List<WeightCategory> loadDecoratedWeightCategory(); + + void loadDecoratedWeightCategory(WeightCategory weightCategory); + + Set<String> getSpeciesListSpeciesIds(String speciesListId); + + LengthWeightParameter findLengthWeightParameter(Species species, Ocean ocean, Sex sex, Date date) throws ObserveTechnicalException; + + Collection<? extends TopiaEntity> loadSimpleEntities(Collection<String> entityIds); + + @Write + void copySimpleEntities(Collection<? extends TopiaEntity> entities); + + <R extends ReferenceEntity> R preCreate(Class<R> entityType); + + @Write + <R extends ReferenceEntity> String save(R toSave); + + @Write + <R extends ReferenceEntity> void delete(Class<R> entityType, String referentialId); + + @Write + void deleteEntities(Collection<String> entityIds); + + @Write + void replaceObsoleteReference(ObsoleteReferenceToReplace action); + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveService.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveService.java new file mode 100644 index 0000000..8e9f6b2 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveService.java @@ -0,0 +1,13 @@ +package fr.ird.observe.services; + +/** + * Created on 16/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 7.0 + */ +public interface ObserveService { + + void setServiceContext(ObserveServiceContext serviceContext); + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java new file mode 100644 index 0000000..31c201b --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java @@ -0,0 +1,10 @@ +package fr.ird.observe.services; + +/** + * Created on 16/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface ObserveServiceContext { + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java new file mode 100644 index 0000000..992b0ad --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java @@ -0,0 +1,78 @@ +package fr.ird.observe.services; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.ServiceLoader; +import java.util.Set; + +/** + * Created on 16/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveServiceFactory { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveServiceFactory.class); + + protected final ImmutableSet<ObserveServiceFactoryProvider> providers; + + public ObserveServiceFactory() { + if (log.isInfoEnabled()) { + log.info("Init new ServiceFactory."); + } + ImmutableSet.Builder<ObserveServiceFactoryProvider> builder = new ImmutableSet.Builder<>(); + ServiceLoader<ObserveServiceFactoryProvider> load = ServiceLoader.load(ObserveServiceFactoryProvider.class); + for (ObserveServiceFactoryProvider provider : load) { + + if (log.isInfoEnabled()) { + log.info("Found service factory provider: " + provider); + } + builder.add(provider); + } + providers = builder.build(); + } + + public <S extends ObserveService> S newService(ObserveServiceContext serviceContext, Class<S> serviceType) { + + Preconditions.checkNotNull(serviceContext, "serviceContext can't be null."); + Preconditions.checkNotNull(serviceType, "serviceType can't be null."); + + ObserveServiceFactoryProvider provider = getProvider(serviceContext, serviceType); + + if (log.isDebugEnabled()) { + log.debug("Using provider: " + provider); + } + + S service = provider.newService(serviceContext, serviceType); + if (log.isInfoEnabled()) { + log.info("New service created: " + service + " for serviceContext: " + serviceContext); + } + return service; + + } + + protected Set<ObserveServiceFactoryProvider> getProviders() { + return providers; + + } + + protected <S extends ObserveService> ObserveServiceFactoryProvider getProvider(ObserveServiceContext serviceContext, Class<S> serviceType) { + + ObserveServiceFactoryProvider result = null; + for (ObserveServiceFactoryProvider provider : getProviders()) { + if (provider.accept(serviceContext, serviceType)) { + result = provider; + break; + } + } + + Preconditions.checkState(result != null, String.format("No provider found for serviceContext: %s and serviceType: %s", serviceContext, serviceType.getName())); + return result; + + } + +} \ No newline at end of file diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactoryProvider.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactoryProvider.java new file mode 100644 index 0000000..ad5db62 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactoryProvider.java @@ -0,0 +1,14 @@ +package fr.ird.observe.services; + +/** + * Created on 5/4/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface ObserveServiceFactoryProvider { + + <S extends ObserveService> boolean accept(ObserveServiceContext serviceContext, Class<S> serviceType); + + <S extends ObserveService> S newService(ObserveServiceContext serviceContext, Class<S> serviceType); + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialService.java new file mode 100644 index 0000000..045b4d3 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialService.java @@ -0,0 +1,36 @@ +package fr.ird.observe.services.service; + +import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.model.referential.ReferentialFormModel; +import fr.ird.observe.services.model.referential.ReferentialLabelSetModel; +import fr.ird.observe.services.model.referential.ReferentialModel; +import fr.ird.observe.services.spi.Write; + +import java.util.Collection; + +/** + * Created on 16/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 7.0 + */ +public interface ReferentialService extends ObserveService { + + <R extends ReferentialModel> ReferentialLabelSetModel getReferentialLabelSet(Class<R> type); + + <R extends ReferentialModel> ReferentialFormModel<R> loadToRead(Class<R> type, String id); + + <R extends ReferentialModel> ReferentialFormModel<R> loadToEdit(Class<R> type, String id); + + <R extends ReferentialModel> ReferentialFormModel<R> preCreate(Class<R> type); + + @Write + <R extends ReferentialModel> String save(ReferentialFormModel<R> form); + + @Write + <R extends ReferentialModel> void delete(Class<R> type, String id); + + @Write + <R extends ReferentialModel> void delete(Class<R> type, Collection<String> ids); + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/spi/NoDataAccess.java b/observe-services-api/src/main/java/fr/ird/observe/services/spi/NoDataAccess.java new file mode 100644 index 0000000..bf480d8 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/spi/NoDataAccess.java @@ -0,0 +1,19 @@ +package fr.ird.observe.services.spi; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Place this on every method that do not need a data access. + * + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface NoDataAccess { + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/spi/Write.java b/observe-services-api/src/main/java/fr/ird/observe/services/spi/Write.java new file mode 100644 index 0000000..ae6466a --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/spi/Write.java @@ -0,0 +1,19 @@ +package fr.ird.observe.services.spi; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Place this on every method that need to write data. + * + * Created on 4/25/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Write { + +} diff --git a/observe-services-api/src/test/java/fr/ird/observe/services/FakeObserveServiceContext.java b/observe-services-api/src/test/java/fr/ird/observe/services/FakeObserveServiceContext.java new file mode 100644 index 0000000..b26f3a6 --- /dev/null +++ b/observe-services-api/src/test/java/fr/ird/observe/services/FakeObserveServiceContext.java @@ -0,0 +1,10 @@ +package fr.ird.observe.services; + +/** + * Created on 16/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class FakeObserveServiceContext implements ObserveServiceContext { + +} diff --git a/observe-services-api/src/test/java/fr/ird/observe/services/FakeObserveServiceFactoryProvider.java b/observe-services-api/src/test/java/fr/ird/observe/services/FakeObserveServiceFactoryProvider.java new file mode 100644 index 0000000..4a4b454 --- /dev/null +++ b/observe-services-api/src/test/java/fr/ird/observe/services/FakeObserveServiceFactoryProvider.java @@ -0,0 +1,19 @@ +package fr.ird.observe.services; + +/** + * Created on 16/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class FakeObserveServiceFactoryProvider implements ObserveServiceFactoryProvider { + + @Override + public <S extends ObserveService> boolean accept(ObserveServiceContext serviceContext, Class<S> serviceType) { + return serviceContext != null && serviceType != null; + } + + @Override + public <S extends ObserveService> S newService(ObserveServiceContext serviceContext, Class<S> serviceType) { + return null; + } +} diff --git a/observe-services-api/src/test/java/fr/ird/observe/services/ObserveServiceFactoryTest.java b/observe-services-api/src/test/java/fr/ird/observe/services/ObserveServiceFactoryTest.java new file mode 100644 index 0000000..f0829a9 --- /dev/null +++ b/observe-services-api/src/test/java/fr/ird/observe/services/ObserveServiceFactoryTest.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services; + +import fr.ird.observe.services.service.ReferentialService; +import org.junit.Test; + +/** + * Created on 16/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveServiceFactoryTest { + + @Test + public void testGetService() { + + ObserveServiceFactory factory = new ObserveServiceFactory(); + factory.newService(new FakeObserveServiceContext(), ReferentialService.class); + + } +} \ No newline at end of file diff --git a/observe-services-api/src/test/resources/META-INF/services/fr.ird.observe.services.ObserveServiceFactoryProvider b/observe-services-api/src/test/resources/META-INF/services/fr.ird.observe.services.ObserveServiceFactoryProvider new file mode 100644 index 0000000..f61779c --- /dev/null +++ b/observe-services-api/src/test/resources/META-INF/services/fr.ird.observe.services.ObserveServiceFactoryProvider @@ -0,0 +1 @@ +fr.ird.observe.services.FakeObserveServiceFactoryProvider \ No newline at end of file diff --git a/observe-services-api/src/test/resources/log4j.properties b/observe-services-api/src/test/resources/log4j.properties new file mode 100644 index 0000000..0f21768 --- /dev/null +++ b/observe-services-api/src/test/resources/log4j.properties @@ -0,0 +1,32 @@ +### +# #%L +# ObServe :: Swing +# %% +# Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit +# %% +# 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% +### + +# Global logging configuration +log4j.rootLogger=ERROR, stdout +#log4j.rootLogger=ERROR, stdout +# Console output... +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%c:%L) %M - %m%n +#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n + +log4j.logger.fr.ird.observe=INFO diff --git a/pom.xml b/pom.xml index b5e70b4..f123ce3 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>codelutinpom</artifactId> - <version>2.4.1</version> + <version>3</version> </parent> <groupId>fr.ird.observe</groupId> @@ -81,9 +81,12 @@ <modules> <module>observe-services-model</module> + <module>observe-services-api</module> <module>observe-entities</module> <module>observe-business</module> <module>observe-validation</module> + <!--module>observe-services-topia</module--> + <!--module>observe-services-rest</module--> <module>observe-swing</module> </modules> <!--scm> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.