Tony CHEMIT pushed to branch develop-9 at ultreiaio / ird-observe Commits: c8b22b1c by Tony Chemit at 2021-01-20T21:14:49+01:00 Problème de digit TargetLength.weight à 1 au lieu de 3 - Closes #1762 (cherry picked from commit c02970456dbc508257a0be85d6e2c13d237fbb0c) - - - - - d69e829d by Tony Chemit at 2021-01-20T21:15:01+01:00 Dysfonctionnement de l'arbre - Closes #1763 - - - - - acf42c76 by Tony Chemit at 2021-01-20T21:15:07+01:00 Introduce a way to extract schema or table from generated schema (help to create new safe migration for v9) - - - - - 16 changed files: - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationCapability.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationInitializer.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationTreeNodeProvider.java - client/datasource/editor/common/src/main/java/fr/ird/observe/client/datasource/editor/common/CommonRootNavigationTreeNodeProvider.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/LlRootNavigationTreeNodeProvider.java - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/PsRootNavigationTreeNodeProvider.java - models/persistence/src/main/java/fr/ird/observe/entities/data/TripAwareTopiaDao.java - models/persistence/src/main/java/fr/ird/observe/entities/data/ll/common/TripTopiaDao.java - models/persistence/src/main/java/fr/ird/observe/entities/data/ps/common/TripTopiaDao.java - models/persistence/src/main/models/Observe-20-data-ps-observation.model - services/local-impl/src/main/java/fr/ird/observe/services/local/service/data/NavigationServiceLocalSupport.java - services/local-impl/src/main/java/fr/ird/observe/services/local/service/data/TripServiceLocalSupport.java - toolkit/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/toolbox/ExecuteRunnerMojo.java - + toolkit/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/toolbox/persistence/ExtractSchema.java - + toolkit/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/toolbox/persistence/ExtractTable.java - toolkit/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/toolbox/persistence/GenerateEmptyDatabases.java Changes: ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationCapability.java ===================================== @@ -75,8 +75,8 @@ public class RootNavigationCapability implements ReferenceContainerCapability<Ro NavigationTreeConfig config = initializer.getConfig(); NavigationResult navigationResult = initializer.getNavigationResult(); List<ProgramReference> programs = initializer.getPrograms(); - List<? extends RootNavigationTreeNodeProvider> rootNodeProviders = initializer.getRootNodeProviders(); - List<? extends RootNavigationTreeNodeProvider> providers = rootNodeProviders.stream().filter(p -> config.isShowModule(p.getModule())).collect(Collectors.toList()); + List<? extends RootNavigationTreeNodeProvider<?>> rootNodeProviders = initializer.getRootNodeProviders(); + List<? extends RootNavigationTreeNodeProvider<?>> providers = rootNodeProviders.stream().filter(p -> config.isShowModule(p.getModule())).collect(Collectors.toList()); providers.forEach(p -> p.initRootDataNode(config, navigationResult, programs, rootNode)); if (config.isLoadReferential()) { providers.forEach(p -> p.initRootReferentialNode(rootNode, navigationResult)); @@ -98,13 +98,13 @@ public class RootNavigationCapability implements ReferenceContainerCapability<Ro return 0; } - public RootNavigationTreeNodeProvider getProvider(ProgramReference referenceType) { + public RootNavigationTreeNodeProvider<?> getProvider(ProgramReference referenceType) { return getNode().getInitializer().getRootNodeProvider(referenceType); } public NavigationNode newChildNode(ProgramReference reference) { RootNavigationNode node = getNode(); - RootNavigationTreeNodeProvider provider = getProvider(reference); + RootNavigationTreeNodeProvider<?> provider = getProvider(reference); return provider.newChildNode(node, reference, 0); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationInitializer.java ===================================== @@ -42,7 +42,7 @@ import java.util.Objects; * @since 8.0.1 */ public class RootNavigationInitializer extends NavigationInitializer<RootNavigationContext> { - private final SingletonSupplier<List<? extends RootNavigationTreeNodeProvider>> rootNodeProviders; + private final SingletonSupplier<List<? extends RootNavigationTreeNodeProvider<?>>> rootNodeProviders; private final SingletonSupplier<Boolean> canLoadChildrenOnOpen; private final NavigationTreeConfig config; private final NavigationResult navigationResult; @@ -73,7 +73,7 @@ public class RootNavigationInitializer extends NavigationInitializer<RootNavigat protected void reload(NavigationContext<RootNavigationContext> context) { } - public final List<? extends RootNavigationTreeNodeProvider> getRootNodeProviders() { + public final List<? extends RootNavigationTreeNodeProvider<?>> getRootNodeProviders() { return rootNodeProviders.get(); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationTreeNodeProvider.java ===================================== @@ -30,11 +30,10 @@ import fr.ird.observe.client.datasource.editor.api.content.referential.Referenti import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.dto.reference.DataDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; -import fr.ird.observe.dto.referential.common.GearType; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.services.service.data.NavigationResult; -import fr.ird.observe.spi.module.BusinessModule; import fr.ird.observe.spi.module.BusinessProject; +import fr.ird.observe.spi.module.ObserveBusinessModule; import java.util.Comparator; import java.util.LinkedList; @@ -49,19 +48,17 @@ import java.util.stream.Collectors; * @author Tony Chemit - dev@tchemit.fr * @since 8.0 */ -public abstract class RootNavigationTreeNodeProvider { - public static List<RootNavigationTreeNodeProvider> PROVIDERS; - private final BusinessModule module; - //FIXME Add this in BusinessModule - private final GearType gearType; +public abstract class RootNavigationTreeNodeProvider<B extends fr.ird.observe.spi.module.BusinessModule & ObserveBusinessModule> { + public static List<RootNavigationTreeNodeProvider<?>> PROVIDERS; + private final B module; private final int priority; private final ImmutableList<Class<? extends NavigationNode>> acceptedNodeTypes; private final Class<? extends DataDtoReference> acceptedType; - public static synchronized List<RootNavigationTreeNodeProvider> getProviders() { + public static synchronized List<RootNavigationTreeNodeProvider<?>> getProviders() { if (PROVIDERS == null) { PROVIDERS = new LinkedList<>(); - for (RootNavigationTreeNodeProvider o : ServiceLoader.load(RootNavigationTreeNodeProvider.class)) { + for (RootNavigationTreeNodeProvider<?> o : ServiceLoader.load(RootNavigationTreeNodeProvider.class)) { PROVIDERS.add(o); } PROVIDERS.sort(Comparator.comparing(RootNavigationTreeNodeProvider::priority)); @@ -69,9 +66,8 @@ public abstract class RootNavigationTreeNodeProvider { return PROVIDERS; } - protected RootNavigationTreeNodeProvider(BusinessProject project, BusinessModule module, GearType gearType, ImmutableList<Class<? extends NavigationNode>> acceptedNodeTypes, Class<? extends DataDtoReference> acceptedType) { + protected RootNavigationTreeNodeProvider(BusinessProject project, B module, ImmutableList<Class<? extends NavigationNode>> acceptedNodeTypes, Class<? extends DataDtoReference> acceptedType) { this.module = Objects.requireNonNull(module); - this.gearType = gearType; this.acceptedNodeTypes = acceptedNodeTypes; this.acceptedType = acceptedType; this.priority = Objects.requireNonNull(project).getModulePriority(module); @@ -124,7 +120,7 @@ public abstract class RootNavigationTreeNodeProvider { return priority; } - public BusinessModule getModule() { + public B getModule() { return module; } @@ -140,7 +136,7 @@ public abstract class RootNavigationTreeNodeProvider { } public boolean accept(ProgramReference childrenReference) { - return gearType != null && Objects.equals(gearType, childrenReference.getGearType()); + return module.accept(childrenReference); } public ContentListUINavigationNode newChildNode(RootNavigationNode node, ProgramReference reference, int tripCount) { ===================================== client/datasource/editor/common/src/main/java/fr/ird/observe/client/datasource/editor/common/CommonRootNavigationTreeNodeProvider.java ===================================== @@ -26,21 +26,18 @@ import com.google.auto.service.AutoService; import com.google.common.collect.ImmutableList; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationTreeNodeProvider; import fr.ird.observe.spi.module.ObserveBusinessProject; +import fr.ird.observe.spi.module.common.BusinessModule; /** * @author Tony Chemit - dev@tchemit.fr * @since 8.0 */ @AutoService(RootNavigationTreeNodeProvider.class) -public class CommonRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProvider { +public class CommonRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProvider<BusinessModule> { public CommonRootNavigationTreeNodeProvider() { - super(ObserveBusinessProject.get(), ObserveBusinessProject.get().getCommonBusinessModule(), null, + super(ObserveBusinessProject.get(), ObserveBusinessProject.get().getCommonBusinessModule(), ImmutableList.of(fr.ird.observe.client.datasource.editor.common.referential.common.ReferentialHomeUINavigationNode.class), null); } -// @Override -// public void initRootDataNode(NavigationTreeConfig config, NavigationResult navigationResult, List<ProgramReference> programs, RootNavigationNode rootNode) { -// } - } ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/LlRootNavigationTreeNodeProvider.java ===================================== @@ -28,19 +28,19 @@ import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavi import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationTreeNodeProvider; import fr.ird.observe.client.datasource.editor.ll.data.common.TripListUINavigationNode; import fr.ird.observe.dto.data.ll.common.TripReference; -import fr.ird.observe.dto.referential.common.GearType; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.spi.module.ObserveBusinessProject; +import fr.ird.observe.spi.module.ll.BusinessModule; /** * @author Tony Chemit - dev@tchemit.fr * @since 8.0 */ @AutoService(RootNavigationTreeNodeProvider.class) -public class LlRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProvider { +public class LlRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProvider<BusinessModule> { public LlRootNavigationTreeNodeProvider() { - super(ObserveBusinessProject.get(), ObserveBusinessProject.get().getLlBusinessModule(), GearType.longline, + super(ObserveBusinessProject.get(), ObserveBusinessProject.get().getLlBusinessModule(), ImmutableList.of(TripListUINavigationNode.class, fr.ird.observe.client.datasource.editor.ll.referential.common.ReferentialHomeUINavigationNode.class, fr.ird.observe.client.datasource.editor.ll.referential.landing.ReferentialHomeUINavigationNode.class, ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/PsRootNavigationTreeNodeProvider.java ===================================== @@ -28,19 +28,19 @@ import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavi import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationTreeNodeProvider; import fr.ird.observe.client.datasource.editor.ps.data.common.TripListUINavigationNode; import fr.ird.observe.dto.data.ll.common.TripReference; -import fr.ird.observe.dto.referential.common.GearType; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.spi.module.ObserveBusinessProject; +import fr.ird.observe.spi.module.ps.BusinessModule; /** * @author Tony Chemit - dev@tchemit.fr * @since 8.0 */ @AutoService(RootNavigationTreeNodeProvider.class) -public class PsRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProvider { +public class PsRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProvider<BusinessModule> { public PsRootNavigationTreeNodeProvider() { - super(ObserveBusinessProject.get(), ObserveBusinessProject.get().getPsBusinessModule(), GearType.seine, + super(ObserveBusinessProject.get(), ObserveBusinessProject.get().getPsBusinessModule(), ImmutableList.of(TripListUINavigationNode.class, fr.ird.observe.client.datasource.editor.ps.referential.common.ReferentialHomeUINavigationNode.class, fr.ird.observe.client.datasource.editor.ps.referential.observation.ReferentialHomeUINavigationNode.class), @@ -49,6 +49,6 @@ public class PsRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProv @Override public TripListUINavigationNode newChildNode(RootNavigationNode node, ProgramReference reference, int tripCount) { - return TripListUINavigationNode.create(reference, (int) tripCount); + return TripListUINavigationNode.create(reference, tripCount); } } ===================================== models/persistence/src/main/java/fr/ird/observe/entities/data/TripAwareTopiaDao.java ===================================== @@ -62,7 +62,7 @@ public interface TripAwareTopiaDao<D extends DataDto & fr.ird.observe.dto.data.T List<E> getMatchingTripsVesselWithinDateRange(String id, String vesselId, Date startDate, Date endDate); - List<R> getChildren(ReferentialLocale referentialLocale, ImmutableMap<String, ProgramReference> programById, ImmutableMap<String, PersonReference> personById, ImmutableMap<String, VesselReference> vesselById); + List<R> getChildren(ReferentialLocale referentialLocale, String programId, ImmutableMap<String, ProgramReference> programById, ImmutableMap<String, PersonReference> personById, ImmutableMap<String, VesselReference> vesselById); default void fillTripCountByProgramId(Map<String, Integer> map) { TopiaEntityEnum entityEnum = ((AbstractObserveTopiaDao<?>) this).getTopiaEntityEnum(); @@ -72,7 +72,7 @@ public interface TripAwareTopiaDao<D extends DataDto & fr.ird.observe.dto.data.T default List<E> getChildren(Program parent, Date lastUpdate) { if (lastUpdate == null) { - return forProperties(TripAware.PROPERTY_PROGRAM, parent).findAll(); + return forEquals(TripAware.PROPERTY_PROGRAM, parent).findAll(); } return forLastUpdateDateGreaterThan(lastUpdate).addEquals(TripAware.PROPERTY_PROGRAM, parent).findAll(); } ===================================== models/persistence/src/main/java/fr/ird/observe/entities/data/ll/common/TripTopiaDao.java ===================================== @@ -55,7 +55,7 @@ import java.util.stream.Collectors; public class TripTopiaDao extends AbstractTripTopiaDao<Trip> implements TripAwareTopiaDao<TripDto, TripReference, Trip> { - public static final String GET_TRIP_REFERENCES = "SELECT" + + public static final String GET_ALL_TRIP_REFERENCES = "SELECT" + " t.program," + " t.topiaId," + " t.startDate," + @@ -66,6 +66,19 @@ public class TripTopiaDao extends AbstractTripTopiaDao<Trip> implements TripAwar " t.observationsAvailability," + " t.logbookAvailability" + " FROM %s.%s t;"; + public static final String GET_TRIP_REFERENCES = "SELECT" + + " t.program," + + " t.topiaId," + + " t.startDate," + + " t.endDate," + + " t.tripType," + + " t.observer," + + " t.vessel," + + " t.observationsAvailability," + + " t.logbookAvailability" + + " FROM %s.%s t" + + " WHERE t.program = '%s';"; + private static class TripMapActivityObsPointQuery extends TopiaSqlQuery<List<TripMapPoint>> { @@ -269,7 +282,7 @@ public class TripTopiaDao extends AbstractTripTopiaDao<Trip> implements TripAwar } @Override - public List<TripReference> getChildren(ReferentialLocale referentialLocale, ImmutableMap<String, ProgramReference> programById, ImmutableMap<String, PersonReference> personById, ImmutableMap<String, VesselReference> vesselById) { + public List<TripReference> getChildren(ReferentialLocale referentialLocale, String programId, ImmutableMap<String, ProgramReference> programById, ImmutableMap<String, PersonReference> personById, ImmutableMap<String, VesselReference> vesselById) { String dbTableName = getTopiaEntityEnum().dbTableName(); Map<String, Integer> observationActivityCount = new TreeMap<>(); @@ -281,12 +294,16 @@ public class TripTopiaDao extends AbstractTripTopiaDao<Trip> implements TripAwar Map<String, Integer> landingCount = new TreeMap<>(); fillCount(getCountSql(ObserveEntityEnum.ll_landing_Landing, dbTableName), landingCount); - String sql = String.format(GET_TRIP_REFERENCES, getTopiaEntityEnum().dbSchemaName(), dbTableName); - + String sql; + if (programId == null) { + sql = String.format(GET_ALL_TRIP_REFERENCES, getTopiaEntityEnum().dbSchemaName(), dbTableName); + } else { + sql = String.format(GET_TRIP_REFERENCES, getTopiaEntityEnum().dbSchemaName(), dbTableName, programId); + } TopiaSqlQuery<TripReference> query = TopiaSqlQuery.wrap(sql, resultSet -> { TripDto dto = new TripDto(); - String programId = resultSet.getString(1); - dto.setProgram(programById.get(programId)); + String thisProgramId = resultSet.getString(1); + dto.setProgram(programById.get(thisProgramId)); String id = resultSet.getString(2); dto.setId(id); dto.setStartDate(resultSet.getDate(3)); ===================================== models/persistence/src/main/java/fr/ird/observe/entities/data/ps/common/TripTopiaDao.java ===================================== @@ -59,7 +59,7 @@ import java.util.stream.Collectors; */ public class TripTopiaDao extends AbstractTripTopiaDao<Trip> implements TripAwareTopiaDao<TripDto, TripReference, Trip> { - public static final String GET_TRIP_REFERENCES = "SELECT" + + public static final String GET_ALL_TRIP_REFERENCES = "SELECT" + " t.program," + " t.topiaId," + " t.startDate," + @@ -68,6 +68,16 @@ public class TripTopiaDao extends AbstractTripTopiaDao<Trip> implements TripAwar " t.vessel" + " FROM %s.%s t;"; + public static final String GET_TRIP_REFERENCES = "SELECT" + + " t.program," + + " t.topiaId," + + " t.startDate," + + " t.endDate," + + " t.observer," + + " t.vessel" + + " FROM %s.%s t" + + " WHERE t.program = '%s';"; + private static class TripMapActivityObservationPointQuery extends TopiaSqlQuery<TripMapPoint> { private static final String SQL = "SELECT" + @@ -169,14 +179,20 @@ public class TripTopiaDao extends AbstractTripTopiaDao<Trip> implements TripAwar } @Override - public List<TripReference> getChildren(ReferentialLocale referentialLocale, ImmutableMap<String, ProgramReference> programById, ImmutableMap<String, PersonReference> personById, ImmutableMap<String, VesselReference> vesselById) { + public List<TripReference> getChildren(ReferentialLocale referentialLocale, String programId, ImmutableMap<String, ProgramReference> programById, ImmutableMap<String, PersonReference> personById, ImmutableMap<String, VesselReference> vesselById) { String dbTableName = getTopiaEntityEnum().dbTableName(); - String sql = String.format(GET_TRIP_REFERENCES, getTopiaEntityEnum().dbSchemaName(), dbTableName); + + String sql; + if (programId == null) { + sql = String.format(GET_ALL_TRIP_REFERENCES, getTopiaEntityEnum().dbSchemaName(), dbTableName); + } else { + sql = String.format(GET_TRIP_REFERENCES, getTopiaEntityEnum().dbSchemaName(), dbTableName, programId); + } Map<String, Integer> observationRouteCount = new TreeMap<>(); fillCount(getCountSql(ObserveEntityEnum.ps_observation_Route, dbTableName), observationRouteCount); TopiaSqlQuery<TripReference> query = TopiaSqlQuery.wrap(sql, resultSet -> { - String programId = resultSet.getString(1); + String thisProgramId = resultSet.getString(1); String id = resultSet.getString(2); Integer routeCount = observationRouteCount.getOrDefault(id, 0); @@ -186,7 +202,7 @@ public class TripTopiaDao extends AbstractTripTopiaDao<Trip> implements TripAwar return routeCount; } }; - dto.setProgram(programById.get(programId)); + dto.setProgram(programById.get(thisProgramId)); dto.setId(id); dto.setStartDate(resultSet.getDate(3)); dto.setEndDate(resultSet.getDate(4)); ===================================== models/persistence/src/main/models/Observe-20-data-ps-observation.model ===================================== @@ -189,7 +189,7 @@ data.ps.observation.TargetLength > data.DataEntity >> data.ps.observation.Length length + {*:1} Float | sqlType=numeric digits=1 isLengthComputed + {*:1} boolean count + {*:1} Integer -weight + {*:1} Float | sqlType=numeric digits=1 +weight + {*:1} Float | sqlType=numeric digits=3 isWeightComputed + {*:1} boolean acquisitionMode + {*:1} int tagNumber + {*:1} String ===================================== services/local-impl/src/main/java/fr/ird/observe/services/local/service/data/NavigationServiceLocalSupport.java ===================================== @@ -113,12 +113,12 @@ class NavigationServiceLocalSupport extends ObserveServiceLocal implements Navig ArrayListMultimap<String, fr.ird.observe.dto.data.ll.common.TripReference> tripLlByProgram = ArrayListMultimap.create(); if (canReadData) { if (loadPs) { - List<fr.ird.observe.dto.data.ps.common.TripReference> trips = fr.ird.observe.entities.data.ps.common.Trip.SPI.getDao(getTopiaPersistenceContext()).getChildren(referentialLocale, programById, personById, vesselById); + List<fr.ird.observe.dto.data.ps.common.TripReference> trips = fr.ird.observe.entities.data.ps.common.Trip.SPI.getDao(getTopiaPersistenceContext()).getChildren(referentialLocale, null, programById, personById, vesselById); trips.forEach(t -> tripPsByProgram.put(t.getProgram().getId(), t)); } if (loadLl) { - List<fr.ird.observe.dto.data.ll.common.TripReference> tripLl = fr.ird.observe.entities.data.ll.common.Trip.SPI.getDao(getTopiaPersistenceContext()).getChildren(referentialLocale, programById, personById, vesselById); + List<fr.ird.observe.dto.data.ll.common.TripReference> tripLl = fr.ird.observe.entities.data.ll.common.Trip.SPI.getDao(getTopiaPersistenceContext()).getChildren(referentialLocale, null, programById, personById, vesselById); tripLl.forEach(t -> tripLlByProgram.put(t.getProgram().getId(), t)); } } ===================================== services/local-impl/src/main/java/fr/ird/observe/services/local/service/data/TripServiceLocalSupport.java ===================================== @@ -182,8 +182,7 @@ public abstract class TripServiceLocalSupport<D extends OpenableDto & fr.ird.obs ImmutableSet<VesselReference> vessels = Vessel.toReferenceSet(referentialLocale, getTopiaPersistenceContext(), null).toSet(); ImmutableMap<String, VesselReference> vesselById = Maps.uniqueIndex(vessels, VesselReference::getId); - - List<R> references = spi.getDao(getTopiaPersistenceContext()).getChildren(referentialLocale, programById, personById, vesselById); + List<R> references = spi.getDao(getTopiaPersistenceContext()).getChildren(referentialLocale, parentId, programById, personById, vesselById); return DataDtoReferenceSet.of(spi.toReferenceType(), references, now()); } ===================================== toolkit/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/toolbox/ExecuteRunnerMojo.java ===================================== @@ -33,6 +33,7 @@ import java.io.File; import java.net.URLClassLoader; import java.nio.file.Path; import java.util.List; +import java.util.Map; /** * To execute the given @@ -76,11 +77,15 @@ public class ExecuteRunnerMojo extends ToolboxMojoSupport { @Parameter(defaultValue = "${project.build.directory}/generated-sources/java", required = true) private File targetRoot; + @Parameter + private Map<String, String> extraProperties; + public static abstract class MojoRunnable implements Runnable { protected I18nKeySet getterFile; protected Log log; private boolean force; + private Map<String, String> extraProperties; public I18nKeySet getGetterFile() { return getterFile; @@ -105,6 +110,14 @@ public class ExecuteRunnerMojo extends ToolboxMojoSupport { public void setForce(boolean force) { this.force = force; } + + public Map<String, String> getExtraProperties() { + return extraProperties; + } + + public void setExtraProperties(Map<String, String> extraProperties) { + this.extraProperties = extraProperties; + } } @Override @@ -136,6 +149,7 @@ public class ExecuteRunnerMojo extends ToolboxMojoSupport { MojoRunnable o = (MojoRunnable) urlClassLoader.loadClass(runnerType).getConstructor().newInstance(); o.setGetterFile(getterFile); + o.setExtraProperties(extraProperties); o.setLog(getLog()); o.run(); } ===================================== toolkit/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/toolbox/persistence/ExtractSchema.java ===================================== @@ -0,0 +1,108 @@ +package fr.ird.observe.maven.plugins.toolbox.persistence; + +/*- + * #%L + * ObServe Toolkit :: Maven plugin + * %% + * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.maven.plugins.toolbox.ExecuteRunnerMojo; +import org.nuiton.topia.persistence.script.TopiaSqlScript; +import org.nuiton.topia.service.migration.resources.MigrationVersionResourceProvider; +import org.nuiton.version.Version; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.LinkedList; +import java.util.List; + +/** + * To extract a single schema DDL into a specific sql file. + * <p> + * Created on 20/01/2021. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 8.0.5 + */ +public class ExtractSchema extends ExecuteRunnerMojo.MojoRunnable { + + @Override + public void run() { + + Path targetDirectory = new File(System.getProperty("compile.target.directory")).toPath(); + Path sourceDirectory = new File(System.getProperty("compile.source.directory")).toPath(); + + String schemaName = getExtraProperties().get("schemaName"); + + Version modelVersion = MigrationVersionResourceProvider.get().getLastVersion(); + + Path dbRootPath = sourceDirectory.getParent().resolve("resources").resolve("db").resolve("migration").resolve(modelVersion.getVersion()); + Path targetDbRootPath = targetDirectory.resolve("db").resolve("migration").resolve(modelVersion.getVersion()); + try { + processScript(true, dbRootPath.resolve("observe_full-schema-H2.sql"), targetDbRootPath, schemaName); + processScript(false, dbRootPath.resolve("observe_full-schema-PG.sql"), targetDbRootPath, schemaName); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + protected void processScript(boolean h2, Path incomingFullSchema, Path targetDbRootPath, String schemaName) throws IOException { + Path pathFullSchema = incomingFullSchema.getParent().resolve(incomingFullSchema.toFile().getName().replace("-schema-", "-schema-" + schemaName+"-")); + log.info(String.format("Generating schema %s schema [%s] (from %s).", schemaName, pathFullSchema.toFile().getName(), incomingFullSchema)); + TopiaSqlScript script = TopiaSqlScript.of(incomingFullSchema); + Path pathCreateSchema = pathFullSchema.getParent().resolve(pathFullSchema.toFile().getName().replace("full", "create")); + Path pathFinalizeSchema = pathFullSchema.getParent().resolve(pathFullSchema.toFile().getName().replace("full", "finalize")); + List<String> createSchemaStatements = new LinkedList<>(); + List<String> finalizeSchemaStatements = new LinkedList<>(); + script.getLocation().forEach(statement -> { + String trim = statement.toLowerCase().trim(); + if (trim.startsWith("create schema " + schemaName) || trim.startsWith("create table " + schemaName)) { + if (!h2) { + statement = statement.replace("data blob", "data OID"); + } + createSchemaStatements.add(statement); + } else { + if (trim.startsWith("alter table " + schemaName) || trim.startsWith("create index idx_" + schemaName)) { + finalizeSchemaStatements.add(statement); + } + } + }); + + int createStatementCount = createSchemaStatements.size(); + int finalizeStatementCount = finalizeSchemaStatements.size(); + + log.info(String.format("Generated create schema (%d statements) at %s.", createStatementCount, pathCreateSchema)); + Files.write(pathCreateSchema, createSchemaStatements); + copyToTarget(pathCreateSchema, targetDbRootPath); + + log.info(String.format("Generated finalize schema (%d statements) at %s.", finalizeStatementCount, pathFinalizeSchema)); + Files.write(pathFinalizeSchema, finalizeSchemaStatements); + copyToTarget(pathFinalizeSchema, targetDbRootPath); + } + + private void copyToTarget(Path source, Path targetDbRootPath) throws IOException { + Path target = targetDbRootPath.resolve(source.toFile().getName()); + Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); + getLog().debug(String.format("Copy from %s → %s", source.toFile().getName(), target)); + } + +} ===================================== toolkit/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/toolbox/persistence/ExtractTable.java ===================================== @@ -0,0 +1,116 @@ +package fr.ird.observe.maven.plugins.toolbox.persistence; + +/*- + * #%L + * ObServe Toolkit :: Maven plugin + * %% + * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.entities.ObserveTopiaApplicationContextSupport; +import fr.ird.observe.entities.ObserveTopiaConfiguration; +import fr.ird.observe.entities.ObserveTopiaConfigurationFactory; +import fr.ird.observe.maven.plugins.toolbox.ExecuteRunnerMojo; +import fr.ird.observe.services.configuration.topia.ObserveDataSourceConfigurationTopiaH2; +import org.nuiton.topia.persistence.script.TopiaSqlScript; +import org.nuiton.topia.service.migration.resources.MigrationVersionResourceProvider; +import org.nuiton.version.Version; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.LinkedList; +import java.util.List; +import java.util.function.BiFunction; + +/** + * to extract a single table DDL into a specific sql file. + * Created on 20/01/2021. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 8.0.5 + */ +public class ExtractTable extends ExecuteRunnerMojo.MojoRunnable { + + @Override + public void run() { + + Path targetDirectory = new File(System.getProperty("compile.target.directory")).toPath(); + Path sourceDirectory = new File(System.getProperty("compile.source.directory")).toPath(); + + String schemaName = getExtraProperties().get("schemaName"); + String tableName = getExtraProperties().get("tableName"); + + Version modelVersion = MigrationVersionResourceProvider.get().getLastVersion(); + + Path dbRootPath = sourceDirectory.getParent().resolve("resources").resolve("db").resolve("migration").resolve(modelVersion.getVersion()); + Path targetDbRootPath = targetDirectory.resolve("db").resolve("migration").resolve(modelVersion.getVersion()); + try { + processScript(true, dbRootPath.resolve("observe_full-schema-H2.sql"), targetDbRootPath, schemaName, tableName); + processScript(false, dbRootPath.resolve("observe_full-schema-PG.sql"), targetDbRootPath, schemaName, tableName); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + protected void processScript(boolean h2, Path incomingFullSchema, Path targetDbRootPath, String schemaName, String tableName) throws IOException { + String suffix = schemaName + "." + tableName; + Path pathFullSchema = incomingFullSchema.getParent().resolve(incomingFullSchema.toFile().getName().replace("-schema-", "-table-" + suffix+"-")); + log.info(String.format("Generating table %s.%s schema [%s] (from %s).", schemaName, tableName, pathFullSchema.toFile().getName(), incomingFullSchema)); + TopiaSqlScript script = TopiaSqlScript.of(incomingFullSchema); + Path pathCreateSchema = pathFullSchema.getParent().resolve(pathFullSchema.toFile().getName().replace("full", "create")); + Path pathFinalizeSchema = pathFullSchema.getParent().resolve(pathFullSchema.toFile().getName().replace("full", "finalize")); + List<String> createSchemaStatements = new LinkedList<>(); + List<String> finalizeSchemaStatements = new LinkedList<>(); + + String suffix2 = schemaName + "_" + tableName; + script.getLocation().forEach(statement -> { + String trim = statement.toLowerCase().trim(); + if (trim.startsWith("create table " + suffix)) { + if (!h2) { + statement = statement.replace("data blob", "data OID"); + } + createSchemaStatements.add(statement); + } else { + if (trim.startsWith("alter table " + suffix) || trim.startsWith("create index idx_" + suffix2)) { + finalizeSchemaStatements.add(statement); + } + } + }); + + int createStatementCount = createSchemaStatements.size(); + int finalizeStatementCount = finalizeSchemaStatements.size(); + + log.info(String.format("Generated create table (%d statements) at %s.", createStatementCount, pathCreateSchema)); + Files.write(pathCreateSchema, createSchemaStatements); + copyToTarget(pathCreateSchema, targetDbRootPath); + + log.info(String.format("Generated finalize table (%d statements) at %s.", finalizeStatementCount, pathFinalizeSchema)); + Files.write(pathFinalizeSchema, finalizeSchemaStatements); + copyToTarget(pathFinalizeSchema, targetDbRootPath); + } + + private void copyToTarget(Path source, Path targetDbRootPath) throws IOException { + Path target = targetDbRootPath.resolve(source.toFile().getName()); + Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); + getLog().debug(String.format("Copy from %s → %s", source.toFile().getName(), target)); + } +} ===================================== toolkit/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/toolbox/persistence/GenerateEmptyDatabases.java ===================================== @@ -115,11 +115,11 @@ public class GenerateEmptyDatabases extends ExecuteRunnerMojo.MojoRunnable { log.info(String.format("Generated full schema (%d statements) at %s.", fullStatementCount, pathFullSchema)); copyToTarget(pathFullSchema, targetDbRootPath); - log.info(String.format("Generated create schema (%d statements) at %s.", createStatementCount, pathFullSchema)); + log.info(String.format("Generated create schema (%d statements) at %s.", createStatementCount, pathCreateSchema)); Files.write(pathCreateSchema, createSchemaStatements); copyToTarget(pathCreateSchema, targetDbRootPath); - log.info(String.format("Generated finalize schema (%d statements) at %s.", finalizeStatementCount, pathFullSchema)); + log.info(String.format("Generated finalize schema (%d statements) at %s.", finalizeStatementCount, pathFinalizeSchema)); Files.write(pathFinalizeSchema, finalizeSchemaStatements); copyToTarget(pathFinalizeSchema, targetDbRootPath); } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/70b7c1856f1012e9866dad389... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/70b7c1856f1012e9866dad389... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT