Tony CHEMIT pushed to branch develop-9.0.x at ultreiaio / ird-observe Commits: d8cbd9f9 by Tony Chemit at 2022-10-25T12:47:51+02:00 Persistence (IdFactory) - En insertion de marée par le service web, les nouveaux topiaid générés ont un nouveau format. Est-il voulu et fiable ? - Closes #2459 - - - - - a131dd54 by Tony Chemit at 2022-10-25T12:47:57+02:00 Persistence (IdFactory) - Review his usage in Avdth import - See #2459 - - - - - 11 changed files: - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialog.jcss - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogModel.java - core/api/services/src/main/java/fr/ird/observe/services/service/data/ps/AvdthDataImportConfiguration.java - core/persistence/java/src/main/java/fr/ird/observe/entities/ObserveTopiaApplicationContext.java - core/persistence/resources/src/main/java/fr/ird/observe/persistence/avdth/data/DataReader.java - core/persistence/test/src/test/java/fr/ird/observe/persistence/avdth/data/AvdthDataBuilderTestSupport.java - toolkit/persistence/src/main/java/fr/ird/observe/spi/io/EntityDeserializer.java - toolkit/persistence/src/main/java/fr/ird/observe/spi/io/EntityDeserializerContext.java - toolkit/persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactory.java - toolkit/persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactoryForBulkSupport.java - toolkit/persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactorySupport.java Changes: ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialog.jcss ===================================== @@ -57,7 +57,7 @@ } #idTimestamp { - text:{model.getIdTimestamp()}; + text:{model.getIdTimestamp() + ""}; enabled:false; } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogModel.java ===================================== @@ -289,8 +289,8 @@ public class ImportDialogModel extends AbstractJavaBean { return importFile == null ? "" : removeMsAccessExtension(importFile.getAbsolutePath()); } - public String getIdTimestamp() { - return now.getTime() + ""; + public long getIdTimestamp() { + return now.getTime() ; } public boolean isImportDone() { ===================================== core/api/services/src/main/java/fr/ird/observe/services/service/data/ps/AvdthDataImportConfiguration.java ===================================== @@ -43,7 +43,7 @@ public class AvdthDataImportConfiguration implements JsonAware { /** * Id prefix to use to create new data. */ - private final String idTimestamp; + private final long idTimestamp; /** * Program id where to attach imported trip. */ @@ -83,7 +83,7 @@ public class AvdthDataImportConfiguration implements JsonAware { private final ProgressionModel progressionModel; public AvdthDataImportConfiguration(Date now, - String idTimestamp, + long idTimestamp, String programId, String oceanId, ReferentialLocale referentialLocale, @@ -138,7 +138,7 @@ public class AvdthDataImportConfiguration implements JsonAware { return now; } - public String getIdTimestamp() { + public long getIdTimestamp() { return idTimestamp; } ===================================== core/persistence/java/src/main/java/fr/ird/observe/entities/ObserveTopiaApplicationContext.java ===================================== @@ -36,6 +36,7 @@ import io.ultreia.java4all.util.sql.SqlScript; import org.nuiton.topia.persistence.TagValues; import org.nuiton.topia.persistence.TopiaConfiguration; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaIdFactoryForBulkSupport; import org.nuiton.topia.persistence.internal.AbstractTopiaPersistenceContextConstructorParameter; import org.nuiton.topia.service.sql.blob.TopiaEntitySqlBlobModel; import org.nuiton.topia.service.sql.model.TopiaEntitySqlModel; @@ -96,7 +97,7 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat } @Override - public ObserveIdFactoryForBulk newIdFactoryForBulk(long timestamp) { + public TopiaIdFactoryForBulkSupport newIdFactoryForBulk(long timestamp) { return new ObserveIdFactoryForBulk(timestamp); } ===================================== core/persistence/resources/src/main/java/fr/ird/observe/persistence/avdth/data/DataReader.java ===================================== @@ -27,9 +27,8 @@ import fr.ird.observe.persistence.avdth.coordinate.CoordinateHelper; import fr.ird.observe.persistence.avdth.coordinate.IntToCoordinate; import fr.ird.observe.services.service.data.ps.AvdthDataImportConfiguration; import fr.ird.observe.spi.context.DtoEntityContext; -import io.ultreia.java4all.lang.Strings; import org.apache.commons.lang3.mutable.MutableInt; -import org.nuiton.topia.persistence.TopiaIdFactory; +import org.nuiton.topia.persistence.TopiaIdFactoryForBulkSupport; import java.sql.ResultSet; import java.sql.SQLException; @@ -46,28 +45,19 @@ public abstract class DataReader<E extends DataEntity> { * Configuration of import (with also import context). */ private final ImportEngine context; - /** - * Size of the random part. - */ - private final int randomPartSize; /** * Internal topia Id factory. */ - private final TopiaIdFactory topiaIdFactory; - /** - * Fixed id timestamp. - */ - private final String idTimestamp; + private final TopiaIdFactoryForBulkSupport topiaIdFactory; /** - * Internal counter to simulate id on none persisted entries. + * Internal counter of created entities of this type. */ private int count = 0; public DataReader(ImportEngine context) { this.context = Objects.requireNonNull(context); - this.topiaIdFactory = context.getPersistenceApplicationContext().getTopiaIdFactory(); - this.idTimestamp = context.getConfiguration().getIdTimestamp(); - this.randomPartSize = 8; + long idTimestamp = context.getConfiguration().getIdTimestamp(); + this.topiaIdFactory = context.getPersistenceApplicationContext().newIdFactoryForBulk(idTimestamp); } public ImportEngine context() { @@ -89,12 +79,14 @@ public abstract class DataReader<E extends DataEntity> { } protected final <EE extends DataEntity> EE newEntity(DtoEntityContext<?, ?, EE, ?> spi) { - String id = topiaIdFactory.newTopiaId(spi.toEntityType(), idTimestamp, Strings.leftPad("" + (count++), randomPartSize, '0')); + String id = topiaIdFactory.newTopiaId(spi.toEntityType()); + count++; return spi.newEntity(id); } protected final <EE extends DataEntity> EE newEntity(DtoEntityContext<?, ?, EE, ?> spi, MutableInt count) { - String id = topiaIdFactory.newTopiaId(spi.toEntityType(), idTimestamp, Strings.leftPad("" + count.incrementAndGet(), randomPartSize, '0')); + String id = topiaIdFactory.newTopiaId(spi.toEntityType()); + count.increment(); return spi.newEntity(id); } ===================================== core/persistence/test/src/test/java/fr/ird/observe/persistence/avdth/data/AvdthDataBuilderTestSupport.java ===================================== @@ -130,7 +130,7 @@ public abstract class AvdthDataBuilderTestSupport extends PersistenceTestSupport boolean doInlineImport = doInlineImport(); AvdthDataImportConfiguration configuration = new AvdthDataImportConfiguration( AvdthFixtures.DATE, - "20200601", + 20200601L, "fr.ird.referential.ps.common.Program#1239832686262#0.42751447061198444", getOceanId(), ReferentialLocale.FR, ===================================== toolkit/persistence/src/main/java/fr/ird/observe/spi/io/EntityDeserializer.java ===================================== @@ -24,8 +24,8 @@ package fr.ird.observe.spi.io; import com.google.gson.Gson; import fr.ird.observe.entities.Entity; -import fr.ird.observe.entities.ObserveIdFactoryForBulk; import fr.ird.observe.entities.ToolkitTopiaPersistenceContextSupport; +import org.nuiton.topia.persistence.TopiaIdFactoryForBulkSupport; import java.util.Date; import java.util.List; @@ -42,7 +42,7 @@ public class EntityDeserializer { private final EntityDeserializerContext context; - public EntityDeserializer(ToolkitTopiaPersistenceContextSupport persistenceContext, Supplier<Gson> gson, ObserveIdFactoryForBulk idFactory, Date now) { + public EntityDeserializer(ToolkitTopiaPersistenceContextSupport persistenceContext, Supplier<Gson> gson, TopiaIdFactoryForBulkSupport idFactory, Date now) { this.context = new EntityDeserializerContext(persistenceContext, gson,idFactory, now); } ===================================== toolkit/persistence/src/main/java/fr/ird/observe/spi/io/EntityDeserializerContext.java ===================================== @@ -24,13 +24,13 @@ package fr.ird.observe.spi.io; import com.google.gson.Gson; import fr.ird.observe.entities.Entity; -import fr.ird.observe.entities.ObserveIdFactoryForBulk; import fr.ird.observe.entities.ToolkitTopiaPersistenceContextSupport; import fr.ird.observe.entities.data.DataEntity; import fr.ird.observe.entities.referential.ReferentialEntity; import io.ultreia.java4all.util.json.adapters.DateAdapter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.nuiton.topia.persistence.TopiaIdFactoryForBulkSupport; import org.nuiton.topia.persistence.TopiaNoResultException; import javax.sql.rowset.serial.SerialBlob; @@ -62,7 +62,7 @@ public class EntityDeserializerContext { private static final Logger log = LogManager.getLogger(EntityDeserializerContext.class); private final ToolkitTopiaPersistenceContextSupport persistenceContext; private final Gson gson; - private final ObserveIdFactoryForBulk idFactory; + private final TopiaIdFactoryForBulkSupport idFactory; private final Date now; private final DateAdapter dataAdapter; private final List<Entity> created; @@ -73,7 +73,7 @@ public class EntityDeserializerContext { return id != null && id.startsWith(ID_REFERENCE_PREFIX); } - public EntityDeserializerContext(ToolkitTopiaPersistenceContextSupport persistenceContext, Supplier<Gson> gson, ObserveIdFactoryForBulk idFactory, Date now) { + public EntityDeserializerContext(ToolkitTopiaPersistenceContextSupport persistenceContext, Supplier<Gson> gson, TopiaIdFactoryForBulkSupport idFactory, Date now) { this.persistenceContext = Objects.requireNonNull(persistenceContext); this.gson = Objects.requireNonNull(gson).get(); this.idFactory = idFactory; ===================================== toolkit/persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactory.java ===================================== @@ -175,4 +175,16 @@ public interface TopiaIdFactory extends Serializable { return result; } + /** + * Generates a random decimal (between 0 and 1) used as random part in a id. + * + * @return generate random as a string + */ + default String generateRandom() { + double random = Math.random(); + while (Double.toString(random).contains("E-")) { + random = Math.random(); + } + return random + ""; + } } ===================================== toolkit/persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactoryForBulkSupport.java ===================================== @@ -27,7 +27,7 @@ import java.util.TreeMap; import java.util.concurrent.atomic.AtomicLong; /** - * A special id factory where the timestamp part is fixed and the random part is performed by a sequence (by type). + * A special id factory where the timestamp part is fixed and the random part is performed by a sequence (by type) plus always a random part. * <p> * Created on 09/03/2022. * @@ -37,8 +37,6 @@ import java.util.concurrent.atomic.AtomicLong; public class TopiaIdFactoryForBulkSupport implements TopiaIdFactory { private static final long serialVersionUID = 1L; - private static final String ID_SUFFIX = "000000000000000000%d"; - private static final int SUFFIX_LENGTH = ID_SUFFIX.length() - 1; private final String timestampPart; private final Map<String, AtomicLong> count; @@ -52,13 +50,8 @@ public class TopiaIdFactoryForBulkSupport implements TopiaIdFactory { return newTopiaId(idPrefix, timestampPart, getRandom(idPrefix)); } - private String getRandom(String type) { - String result = String.format(ID_SUFFIX, count.computeIfAbsent(type, s -> new AtomicLong()).incrementAndGet()); - int length = result.length(); - if (length > SUFFIX_LENGTH) { - result = result.substring(length - SUFFIX_LENGTH); - } - return result; + protected String getRandom(String type) { + return count.computeIfAbsent(type, s -> new AtomicLong()).incrementAndGet() + generateRandom().substring(1); } } ===================================== toolkit/persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactorySupport.java ===================================== @@ -34,15 +34,7 @@ public class TopiaIdFactorySupport implements TopiaIdFactory { @Override public String newTopiaIdFromIdPrefix(String idPrefix) { - return newTopiaId(idPrefix, System.currentTimeMillis() + "", getRandom()); - } - - private String getRandom() { - double random = Math.random(); - while (Double.toString(random).contains("E-")) { - random = Math.random(); - } - return random + ""; + return newTopiaId(idPrefix, System.currentTimeMillis() + "", generateRandom()); } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/52bf0b30baf27d69b101846d4... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/52bf0b30baf27d69b101846d4... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)