From 1aac01ead086a8e96b3f3ce70663ae0f6a82a225 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 25 Aug 2022 17:49:11 +1200 Subject: [PATCH] Extract CsvReader - move DefaultCsvCallback and add module-info --- ebean-api/src/main/java/io/ebean/DB.java | 1 - .../src/main/java/io/ebean/Database.java | 1 - .../java/io/ebean/text/csv/CsvReader.java | 171 ------------------ .../java/io/ebean/text/csv/package-info.java | 4 - ebean-api/src/main/java/module-info.java | 1 - .../server/core/DefaultServer.java | 1 - .../io/ebean/csv/reader}/CsvCallback.java | 2 +- .../csv/reader/CsvReader.java} | 12 +- .../csv/reader}/CsvUtilReader.java | 2 +- .../ebean/csv/reader}/DefaultCsvCallback.java | 2 +- .../csv/reader}/TimeStringParser.java | 2 +- .../src/main/java/module-info.java | 6 + .../csv/reader/CsvReaderTest.java} | 8 +- .../reader}/TestCsvReaderWithCallback.java | 2 +- .../csv/reader}/TimeStringParserTest.java | 2 +- .../xtest/internal/api/TDSpiEbeanServer.java | 1 - .../ebean/xtest/internal/api/TDSpiServer.java | 1 - 17 files changed, 19 insertions(+), 200 deletions(-) delete mode 100644 ebean-api/src/main/java/io/ebean/text/csv/CsvReader.java delete mode 100644 ebean-api/src/main/java/io/ebean/text/csv/package-info.java rename {ebean-api/src/main/java/io/ebean/text/csv => ebean-csv-reader/src/main/java/io/ebean/csv/reader}/CsvCallback.java (98%) rename ebean-csv-reader/src/main/java/io/{ebeaninternal/server/text/csv/TCsvReader.java => ebean/csv/reader/CsvReader.java} (96%) rename ebean-csv-reader/src/main/java/io/{ebeaninternal/server/text/csv => ebean/csv/reader}/CsvUtilReader.java (99%) rename {ebean-api/src/main/java/io/ebean/text/csv => ebean-csv-reader/src/main/java/io/ebean/csv/reader}/DefaultCsvCallback.java (99%) rename ebean-csv-reader/src/main/java/io/{ebeaninternal/server/text/csv => ebean/csv/reader}/TimeStringParser.java (97%) create mode 100644 ebean-csv-reader/src/main/java/module-info.java rename ebean-csv-reader/src/test/java/io/{ebeaninternal/server/text/csv/TestCsvReader.java => ebean/csv/reader/CsvReaderTest.java} (82%) rename ebean-csv-reader/src/test/java/io/{ebeaninternal/server/text/csv => ebean/csv/reader}/TestCsvReaderWithCallback.java (97%) rename ebean-csv-reader/src/test/java/io/{ebeaninternal/server/text/csv => ebean/csv/reader}/TimeStringParserTest.java (94%) diff --git a/ebean-api/src/main/java/io/ebean/DB.java b/ebean-api/src/main/java/io/ebean/DB.java index b9558fd3c..f20bcb740 100644 --- a/ebean-api/src/main/java/io/ebean/DB.java +++ b/ebean-api/src/main/java/io/ebean/DB.java @@ -5,7 +5,6 @@ import io.avaje.lang.Nullable; import io.ebean.annotation.TxIsolation; import io.ebean.cache.ServerCacheManager; import io.ebean.plugin.Property; -import io.ebean.text.csv.CsvReader; import io.ebean.text.json.JsonContext; import javax.persistence.OptimisticLockException; diff --git a/ebean-api/src/main/java/io/ebean/Database.java b/ebean-api/src/main/java/io/ebean/Database.java index 47df2b9fb..6dd0ab3cf 100644 --- a/ebean-api/src/main/java/io/ebean/Database.java +++ b/ebean-api/src/main/java/io/ebean/Database.java @@ -9,7 +9,6 @@ import io.ebean.config.DatabaseConfig; import io.ebean.meta.MetaInfoManager; import io.ebean.plugin.Property; import io.ebean.plugin.SpiServer; -import io.ebean.text.csv.CsvReader; import io.ebean.text.json.JsonContext; import javax.persistence.OptimisticLockException; diff --git a/ebean-api/src/main/java/io/ebean/text/csv/CsvReader.java b/ebean-api/src/main/java/io/ebean/text/csv/CsvReader.java deleted file mode 100644 index b20232fc0..000000000 --- a/ebean-api/src/main/java/io/ebean/text/csv/CsvReader.java +++ /dev/null @@ -1,171 +0,0 @@ -package io.ebean.text.csv; - -import io.ebean.text.StringParser; - -import java.io.Reader; -import java.util.Locale; - -/** - * Reads CSV data turning it into object graphs that you can be saved (inserted) - * or processed yourself. - *

- * This first example doesn't use a {@link CsvCallback} and this means it will - * automatically create a transaction, save the customers and commit the - * transaction when successful. - *

- * - *
{@code
- * try {
- *   File f = new File("src/test/resources/test1.csv");
- *
- *   FileReader reader = new FileReader(f, encoding);
- *
- *   CsvReader csvReader = DB.createCsvReader(Customer.class);
- *
- *   csvReader.setPersistBatchSize(20);
- *
- *   csvReader.addProperty("status");
- *   // ignore the next property
- *   csvReader.addIgnore();
- *   csvReader.addProperty("name");
- *   csvReader.addDateTime("anniversary", "dd-MMM-yyyy");
- *   csvReader.addProperty("billingAddress.line1");
- *   csvReader.addProperty("billingAddress.city");
- *
- *   csvReader.process(reader);
- *
- * } catch (Exception e) {
- *   throw new RuntimeException(e);
- * }
- * }
- * - * @param the entity bean type - */ -public interface CsvReader { - - /** - * Explicitly set the default Locale. - */ - void setDefaultLocale(Locale defaultLocale); - - /** - * Set the default format to use for Time types. - */ - void setDefaultTimeFormat(String defaultTimeFormat); - - /** - * Set the default format to use for Date types. - */ - void setDefaultDateFormat(String defaultDateFormat); - - /** - * Set the default format to use for Timestamp types. - */ - void setDefaultTimestampFormat(String defaultTimestampFormat); - - /** - * Set the batch size for using JDBC statement batching. - *

- * By default this is set to 20 and setting this to 1 will disable the use of - * JDBC statement batching. - *

- */ - void setPersistBatchSize(int persistBatchSize); - - /** - * Set to true if there is a header row that should be ignored. - *

- * If addPropertiesFromHeader is true then all the properties are added using - * the default time,date and timestamp formats. - *

- * If you have a mix of dateTime formats you can not use this method and must - * add the properties yourself. - *

- */ - void setHasHeader(boolean hasHeader, boolean addPropertiesFromHeader); - - /** - * Same as setHasHeader(true,true); - *

- * This will use a header to define all the properties to load using the - * default formats for time, date and datetime types. - *

- */ - void setAddPropertiesFromHeader(); - - /** - * Same as setHasHeader(true, false); - *

- * This indicates that there is a header but that it should be ignored. - *

- */ - void setIgnoreHeader(); - - /** - * Set the frequency with which a INFO message will be logged showing the - * progress of the processing. You might set this to 1000 or 10000 etc. - *

- * If this is not set then no INFO messages will be logged. - *

- */ - void setLogInfoFrequency(int logInfoFrequency); - - /** - * Ignore the next column of data. - */ - void addIgnore(); - - /** - * Define the property which will be loaded from the next column of data. - *

- * This takes into account the data type of the property and handles the - * String to object conversion automatically. - *

- */ - void addProperty(String propertyName); - - /** - * Define the next property and use a custom StringParser to convert the - * string content into the appropriate type for the property. - */ - void addProperty(String propertyName, StringParser parser); - - /** - * Add a property with a custom Date/Time/Timestamp format using the default - * Locale. This will convert the string into the appropriate java type for the - * given property (Date, Calendar, SQL Date, Time, Timestamp, JODA etc). - */ - void addDateTime(String propertyName, String dateTimeFormat); - - /** - * Add a property with a custom Date/Time/Timestamp format. This will convert - * the string into the appropriate java type for the given property (Date, - * Calendar, SQL Date, Time, Timestamp, JODA etc). - */ - void addDateTime(String propertyName, String dateTimeFormat, Locale locale); - - /** - * Automatically create a transaction if required to process all the CSV - * content from the reader. - *

- * This will check for a current transaction. If there is no current - * transaction then one is started and will commit (or rollback) at the end of - * processing. This will also set the persistBatchSize on the transaction. - *

- */ - void process(Reader reader) throws Exception; - - /** - * Process the CSV content passing the bean to the CsvCallback after each row. - *

- * This provides you with the ability to modify and process the bean. - *

- *

- * When using a CsvCallback the reader WILL NOT create a transaction or save - * the bean(s) for you. If you want to insert the processed beans you must - * create your own transaction and save the bean(s) yourself. - *

- */ - void process(Reader reader, CsvCallback callback) throws Exception; - -} diff --git a/ebean-api/src/main/java/io/ebean/text/csv/package-info.java b/ebean-api/src/main/java/io/ebean/text/csv/package-info.java deleted file mode 100644 index a14c9b1df..000000000 --- a/ebean-api/src/main/java/io/ebean/text/csv/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * CSV processing objects. - */ -package io.ebean.text.csv; diff --git a/ebean-api/src/main/java/module-info.java b/ebean-api/src/main/java/module-info.java index e5128fb5f..a8fb4ea38 100644 --- a/ebean-api/src/main/java/module-info.java +++ b/ebean-api/src/main/java/module-info.java @@ -40,7 +40,6 @@ module io.ebean.api { exports io.ebean.service; exports io.ebean.text; exports io.ebean.text.json; - exports io.ebean.text.csv; exports io.ebean.util; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index e9af6750c..133fadef6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -21,7 +21,6 @@ import io.ebean.plugin.BeanType; import io.ebean.plugin.Plugin; import io.ebean.plugin.Property; import io.ebean.plugin.SpiServer; -import io.ebean.text.csv.CsvReader; import io.ebean.text.json.JsonContext; import io.ebeaninternal.api.*; import io.ebeaninternal.api.SpiQuery.Type; diff --git a/ebean-api/src/main/java/io/ebean/text/csv/CsvCallback.java b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/CsvCallback.java similarity index 98% rename from ebean-api/src/main/java/io/ebean/text/csv/CsvCallback.java rename to ebean-csv-reader/src/main/java/io/ebean/csv/reader/CsvCallback.java index a3a501268..999e0fc75 100644 --- a/ebean-api/src/main/java/io/ebean/text/csv/CsvCallback.java +++ b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/CsvCallback.java @@ -1,4 +1,4 @@ -package io.ebean.text.csv; +package io.ebean.csv.reader; import io.ebean.Database; diff --git a/ebean-csv-reader/src/main/java/io/ebeaninternal/server/text/csv/TCsvReader.java b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/CsvReader.java similarity index 96% rename from ebean-csv-reader/src/main/java/io/ebeaninternal/server/text/csv/TCsvReader.java rename to ebean-csv-reader/src/main/java/io/ebean/csv/reader/CsvReader.java index 9d144067c..1e40db770 100644 --- a/ebean-csv-reader/src/main/java/io/ebeaninternal/server/text/csv/TCsvReader.java +++ b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/CsvReader.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.csv; +package io.ebean.csv.reader; import io.ebean.Database; import io.ebean.bean.EntityBean; @@ -6,9 +6,6 @@ import io.ebean.plugin.BeanType; import io.ebean.plugin.ExpressionPath; import io.ebean.text.StringParser; import io.ebean.text.TextException; -import io.ebean.text.csv.CsvCallback; -import io.ebean.text.csv.CsvReader; -import io.ebean.text.csv.DefaultCsvCallback; import java.io.Reader; import java.sql.Types; @@ -24,7 +21,7 @@ import java.util.Locale; /** * Implementation of the CsvReader */ -public class TCsvReader {//implements CsvReader { +public class CsvReader { private static final TimeStringParser TIME_PARSER = new TimeStringParser(); @@ -52,9 +49,9 @@ public class TCsvReader {//implements CsvReader { private boolean addPropertiesFromHeader; - public TCsvReader(Database server, BeanType descriptor) { + public CsvReader(Database server, Class type) { this.server = server; - this.descriptor = descriptor; + this.descriptor = server.pluginApi().beanType(type); } ////@Override @@ -229,7 +226,6 @@ public class TCsvReader {//implements CsvReader { private void addPropertiesFromHeader(String[] line) { for (String aLine : line) { ExpressionPath elProp = descriptor.expressionPath(aLine); - //ElPropertyValue elProp = descriptor.elGetValue(aLine); if (elProp == null) { throw new TextException("Property [" + aLine + "] not found"); } diff --git a/ebean-csv-reader/src/main/java/io/ebeaninternal/server/text/csv/CsvUtilReader.java b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/CsvUtilReader.java similarity index 99% rename from ebean-csv-reader/src/main/java/io/ebeaninternal/server/text/csv/CsvUtilReader.java rename to ebean-csv-reader/src/main/java/io/ebean/csv/reader/CsvUtilReader.java index 9b7ab4127..999b23908 100644 --- a/ebean-csv-reader/src/main/java/io/ebeaninternal/server/text/csv/CsvUtilReader.java +++ b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/CsvUtilReader.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.csv; +package io.ebean.csv.reader; // Original name: au.com.bytecode.opencsv.CSVReader // rbygrave: Made some Java Generics tweaks to remove warnings diff --git a/ebean-api/src/main/java/io/ebean/text/csv/DefaultCsvCallback.java b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/DefaultCsvCallback.java similarity index 99% rename from ebean-api/src/main/java/io/ebean/text/csv/DefaultCsvCallback.java rename to ebean-csv-reader/src/main/java/io/ebean/csv/reader/DefaultCsvCallback.java index 57ec73388..5bbba8dfd 100644 --- a/ebean-api/src/main/java/io/ebean/text/csv/DefaultCsvCallback.java +++ b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/DefaultCsvCallback.java @@ -1,4 +1,4 @@ -package io.ebean.text.csv; +package io.ebean.csv.reader; import io.ebean.Database; import io.ebean.EbeanVersion; diff --git a/ebean-csv-reader/src/main/java/io/ebeaninternal/server/text/csv/TimeStringParser.java b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/TimeStringParser.java similarity index 97% rename from ebean-csv-reader/src/main/java/io/ebeaninternal/server/text/csv/TimeStringParser.java rename to ebean-csv-reader/src/main/java/io/ebean/csv/reader/TimeStringParser.java index 9cdef79de..ed2dc7964 100644 --- a/ebean-csv-reader/src/main/java/io/ebeaninternal/server/text/csv/TimeStringParser.java +++ b/ebean-csv-reader/src/main/java/io/ebean/csv/reader/TimeStringParser.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.csv; +package io.ebean.csv.reader; import io.ebean.text.StringParser; diff --git a/ebean-csv-reader/src/main/java/module-info.java b/ebean-csv-reader/src/main/java/module-info.java new file mode 100644 index 000000000..51ea42195 --- /dev/null +++ b/ebean-csv-reader/src/main/java/module-info.java @@ -0,0 +1,6 @@ +module io.ebean.csv.reader { + + requires io.ebean.api; + + exports io.ebean.csv.reader; +} diff --git a/ebean-csv-reader/src/test/java/io/ebeaninternal/server/text/csv/TestCsvReader.java b/ebean-csv-reader/src/test/java/io/ebean/csv/reader/CsvReaderTest.java similarity index 82% rename from ebean-csv-reader/src/test/java/io/ebeaninternal/server/text/csv/TestCsvReader.java rename to ebean-csv-reader/src/test/java/io/ebean/csv/reader/CsvReaderTest.java index bf9fb44ad..642f453c0 100644 --- a/ebean-csv-reader/src/test/java/io/ebeaninternal/server/text/csv/TestCsvReader.java +++ b/ebean-csv-reader/src/test/java/io/ebean/csv/reader/CsvReaderTest.java @@ -1,8 +1,7 @@ -package io.ebeaninternal.server.text.csv; +package io.ebean.csv.reader; import io.ebean.DB; import io.ebean.Database; -import io.ebean.plugin.BeanType; import io.ebean.util.IOUtils; import org.example.Country; import org.example.Customer; @@ -12,7 +11,7 @@ import java.io.Reader; import java.net.URL; import java.util.Locale; -class TestCsvReader { +class CsvReaderTest { @Test void test() throws Exception { @@ -29,8 +28,7 @@ class TestCsvReader { try (Reader reader = IOUtils.newReader(resource.openStream())) { Database database = DB.getDefault(); - BeanType type = database.pluginApi().beanType(Customer.class); - TCsvReader csvReader = new TCsvReader<>(database, type); + CsvReader csvReader = new CsvReader<>(database, Customer.class); //CsvReader csvReader = DB.getDefault().createCsvReader(Customer.class); csvReader.setPersistBatchSize(2); diff --git a/ebean-csv-reader/src/test/java/io/ebeaninternal/server/text/csv/TestCsvReaderWithCallback.java b/ebean-csv-reader/src/test/java/io/ebean/csv/reader/TestCsvReaderWithCallback.java similarity index 97% rename from ebean-csv-reader/src/test/java/io/ebeaninternal/server/text/csv/TestCsvReaderWithCallback.java rename to ebean-csv-reader/src/test/java/io/ebean/csv/reader/TestCsvReaderWithCallback.java index 77c9e4119..6066a62e3 100644 --- a/ebean-csv-reader/src/test/java/io/ebeaninternal/server/text/csv/TestCsvReaderWithCallback.java +++ b/ebean-csv-reader/src/test/java/io/ebean/csv/reader/TestCsvReaderWithCallback.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.csv; +package io.ebean.csv.reader; import org.junit.jupiter.api.Test; diff --git a/ebean-csv-reader/src/test/java/io/ebeaninternal/server/text/csv/TimeStringParserTest.java b/ebean-csv-reader/src/test/java/io/ebean/csv/reader/TimeStringParserTest.java similarity index 94% rename from ebean-csv-reader/src/test/java/io/ebeaninternal/server/text/csv/TimeStringParserTest.java rename to ebean-csv-reader/src/test/java/io/ebean/csv/reader/TimeStringParserTest.java index 550ba8034..bff00c0b4 100644 --- a/ebean-csv-reader/src/test/java/io/ebeaninternal/server/text/csv/TimeStringParserTest.java +++ b/ebean-csv-reader/src/test/java/io/ebean/csv/reader/TimeStringParserTest.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.csv; +package io.ebean.csv.reader; import org.junit.jupiter.api.Test; diff --git a/ebean-test/src/test/java/io/ebean/xtest/internal/api/TDSpiEbeanServer.java b/ebean-test/src/test/java/io/ebean/xtest/internal/api/TDSpiEbeanServer.java index d4b1eaecf..124b04a9d 100644 --- a/ebean-test/src/test/java/io/ebean/xtest/internal/api/TDSpiEbeanServer.java +++ b/ebean-test/src/test/java/io/ebean/xtest/internal/api/TDSpiEbeanServer.java @@ -15,7 +15,6 @@ import io.ebean.meta.MetaInfoManager; import io.ebean.meta.MetricVisitor; import io.ebean.plugin.Property; import io.ebean.plugin.SpiServer; -import io.ebean.text.csv.CsvReader; import io.ebean.text.json.JsonContext; import io.ebeaninternal.api.*; import io.ebeaninternal.api.SpiQuery.Type; diff --git a/ebean-test/src/test/java/io/ebean/xtest/internal/api/TDSpiServer.java b/ebean-test/src/test/java/io/ebean/xtest/internal/api/TDSpiServer.java index a69f25bd7..3fa7f84b8 100644 --- a/ebean-test/src/test/java/io/ebean/xtest/internal/api/TDSpiServer.java +++ b/ebean-test/src/test/java/io/ebean/xtest/internal/api/TDSpiServer.java @@ -13,7 +13,6 @@ import io.ebean.meta.MetaInfoManager; import io.ebean.plugin.BeanType; import io.ebean.plugin.Property; import io.ebean.plugin.SpiServer; -import io.ebean.text.csv.CsvReader; import io.ebean.text.json.JsonContext; import javax.annotation.Nullable;