From 569652bb56985f2a35d37842505593e95df360a8 Mon Sep 17 00:00:00 2001 From: xcesco Date: Mon, 26 Jul 2021 13:26:59 +0200 Subject: [PATCH] @closes #104 Query with custom bean as result does not manage custom type fields --- .../err3/BindPersonCirtyErr3DataSource.java | 16 +- .../test/java/sqlite/git104/AbstractBean.java | 25 + .../test/java/sqlite/git104/AbstractDao.java | 21 + .../java/sqlite/git104/AppDataSource.java | 8 + .../java/sqlite/git104/BindAppDaoFactory.java | 23 + .../java/sqlite/git104/BindAppDataSource.java | 475 ++++++++++++++++++ .../src/test/java/sqlite/git104/Document.java | 41 ++ .../test/java/sqlite/git104/DocumentDao.java | 14 + .../java/sqlite/git104/DocumentDaoImpl.java | 126 +++++ .../test/java/sqlite/git104/DocumentInfo.java | 24 + .../sqlite/git104/DocumentInfoBindMap.java | 256 ++++++++++ .../java/sqlite/git104/DocumentTable.java | 159 ++++++ .../src/test/java/sqlite/git104/FileInfo.java | 28 ++ .../java/sqlite/git104/FileInfoBindMap.java | 304 +++++++++++ .../processor/sqlite/BindCursorBuilder.java | 6 +- .../processor/sqlite/SelectBeanHelper.java | 2 +- .../sqlite/SelectBeanListHelper.java | 2 +- .../sqlite/SelectBeanListenerHelper.java | 2 +- .../sqlite/SelectPaginatedResultHelper.java | 2 +- .../AbstractGeneratedSQLTransform.java | 5 +- .../transform/ByteArraySQLTransform.java | 3 +- .../sqlite/transform/EnumSQLTransform.java | 3 +- .../sqlite/transform/SQLTransform.java | 4 +- .../sqlite/transform/SQLTransformer.java | 6 +- .../sqlite/transform/UtilSQLTransform.java | 3 +- .../transform/WrappedSQLTransformation.java | 3 +- .../transform/lang/StringSQLTransform.java | 3 +- .../math/BigDecimalSQLTransform.java | 3 +- .../math/BigIntegerSQLTransform.java | 3 +- .../transform/util/CurrencySQLTransform.java | 3 +- .../java/sqlite/SQLiteCompileTestSuite.java | 2 + .../test/java/sqlite/git104/AbstractBean.java | 25 + .../test/java/sqlite/git104/AbstractDao.java | 21 + .../java/sqlite/git104/AppDataSource.java | 8 + .../src/test/java/sqlite/git104/Document.java | 41 ++ .../test/java/sqlite/git104/DocumentDao.java | 14 + .../test/java/sqlite/git104/DocumentInfo.java | 24 + .../src/test/java/sqlite/git104/FileInfo.java | 28 ++ .../test/java/sqlite/git104/TestGit104.java | 53 ++ 39 files changed, 1761 insertions(+), 28 deletions(-) create mode 100644 kripton-android-library/src/test/java/sqlite/git104/AbstractBean.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/AbstractDao.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/AppDataSource.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/BindAppDaoFactory.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/BindAppDataSource.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/Document.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/DocumentDao.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/DocumentDaoImpl.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/DocumentInfo.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/DocumentInfoBindMap.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/DocumentTable.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/FileInfo.java create mode 100644 kripton-android-library/src/test/java/sqlite/git104/FileInfoBindMap.java create mode 100644 kripton-processor/src/test/java/sqlite/git104/AbstractBean.java create mode 100644 kripton-processor/src/test/java/sqlite/git104/AbstractDao.java create mode 100644 kripton-processor/src/test/java/sqlite/git104/AppDataSource.java create mode 100644 kripton-processor/src/test/java/sqlite/git104/Document.java create mode 100644 kripton-processor/src/test/java/sqlite/git104/DocumentDao.java create mode 100644 kripton-processor/src/test/java/sqlite/git104/DocumentInfo.java create mode 100644 kripton-processor/src/test/java/sqlite/git104/FileInfo.java create mode 100644 kripton-processor/src/test/java/sqlite/git104/TestGit104.java diff --git a/kripton-android-library/src/test/java/sqlite/feature/many2many/err3/BindPersonCirtyErr3DataSource.java b/kripton-android-library/src/test/java/sqlite/feature/many2many/err3/BindPersonCirtyErr3DataSource.java index ce02fa9e5..3e332fbed 100644 --- a/kripton-android-library/src/test/java/sqlite/feature/many2many/err3/BindPersonCirtyErr3DataSource.java +++ b/kripton-android-library/src/test/java/sqlite/feature/many2many/err3/BindPersonCirtyErr3DataSource.java @@ -330,16 +330,16 @@ protected void onCreate(SupportSQLiteDatabase database) { // log section create END // log section create BEGIN if (this.logEnabled) { - Logger.info("DDL: %s",CityTable.CREATE_TABLE_SQL); + Logger.info("DDL: %s",PersonTable.CREATE_TABLE_SQL); } // log section create END - database.execSQL(CityTable.CREATE_TABLE_SQL); + database.execSQL(PersonTable.CREATE_TABLE_SQL); // log section create BEGIN if (this.logEnabled) { - Logger.info("DDL: %s",PersonTable.CREATE_TABLE_SQL); + Logger.info("DDL: %s",CityTable.CREATE_TABLE_SQL); } // log section create END - database.execSQL(PersonTable.CREATE_TABLE_SQL); + database.execSQL(CityTable.CREATE_TABLE_SQL); // log section create BEGIN if (this.logEnabled) { Logger.info("DDL: %s",PersonCityErr3Table.CREATE_TABLE_SQL); @@ -387,16 +387,16 @@ protected void onUpgrade(SupportSQLiteDatabase database, int previousVersion, // generate tables // log section BEGIN if (this.logEnabled) { - Logger.info("DDL: %s",CityTable.CREATE_TABLE_SQL); + Logger.info("DDL: %s",PersonTable.CREATE_TABLE_SQL); } // log section END - database.execSQL(CityTable.CREATE_TABLE_SQL); + database.execSQL(PersonTable.CREATE_TABLE_SQL); // log section BEGIN if (this.logEnabled) { - Logger.info("DDL: %s",PersonTable.CREATE_TABLE_SQL); + Logger.info("DDL: %s",CityTable.CREATE_TABLE_SQL); } // log section END - database.execSQL(PersonTable.CREATE_TABLE_SQL); + database.execSQL(CityTable.CREATE_TABLE_SQL); // log section BEGIN if (this.logEnabled) { Logger.info("DDL: %s",PersonCityErr3Table.CREATE_TABLE_SQL); diff --git a/kripton-android-library/src/test/java/sqlite/git104/AbstractBean.java b/kripton-android-library/src/test/java/sqlite/git104/AbstractBean.java new file mode 100644 index 000000000..ab4d0ebd8 --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/AbstractBean.java @@ -0,0 +1,25 @@ +package sqlite.git104; + +import java.time.ZonedDateTime; + +import com.abubusoft.kripton.android.annotation.BindSqlColumn; + +public abstract class AbstractBean { + protected final long id; + + @BindSqlColumn(nullable = false) + protected ZonedDateTime updateTime; + + public AbstractBean(long id, ZonedDateTime updateTime) { + this.id = id; + this.updateTime = updateTime; + } + + public long getId() { + return id; + } + + public ZonedDateTime getUpdateTime() { + return updateTime; + } +} \ No newline at end of file diff --git a/kripton-android-library/src/test/java/sqlite/git104/AbstractDao.java b/kripton-android-library/src/test/java/sqlite/git104/AbstractDao.java new file mode 100644 index 000000000..fe581e66c --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/AbstractDao.java @@ -0,0 +1,21 @@ +package sqlite.git104; + +import java.util.List; + +import com.abubusoft.kripton.android.annotation.BindSqlDelete; +import com.abubusoft.kripton.android.annotation.BindSqlInsert; +import com.abubusoft.kripton.android.annotation.BindSqlSelect; + +public interface AbstractDao { +// @BindSqlSelect(where = "id=:id") +// E selectById(long id); +// +// @BindSqlSelect +// List selectAll(); +// +// @BindSqlInsert +// long insert(E bean); +// +// @BindSqlDelete(where = "id=:id") +// void deleteById(long id); +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/AppDataSource.java b/kripton-android-library/src/test/java/sqlite/git104/AppDataSource.java new file mode 100644 index 000000000..4470893e7 --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/AppDataSource.java @@ -0,0 +1,8 @@ +package sqlite.git104; + +import com.abubusoft.kripton.android.annotation.BindDataSource; + +@BindDataSource(daoSet = { DocumentDao.class, }, fileName = "fasa.db", version = 3, schema = true) +public interface AppDataSource { + +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/BindAppDaoFactory.java b/kripton-android-library/src/test/java/sqlite/git104/BindAppDaoFactory.java new file mode 100644 index 000000000..02c9657a8 --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/BindAppDaoFactory.java @@ -0,0 +1,23 @@ +package sqlite.git104; + +import com.abubusoft.kripton.android.sqlite.BindDaoFactory; + +/** + *

+ * Represents dao factory interface for AppDataSource. + * This class expose database interface through Dao attribute. + *

+ * + * @see AppDataSource + * @see DocumentDao + * @see DocumentDaoImpl + * @see Document + */ +public interface BindAppDaoFactory extends BindDaoFactory { + /** + * Retrieve dao DocumentDao. + * + * @return dao implementation + */ + DocumentDaoImpl getDocumentDao(); +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/BindAppDataSource.java b/kripton-android-library/src/test/java/sqlite/git104/BindAppDataSource.java new file mode 100644 index 000000000..2cdb86f49 --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/BindAppDataSource.java @@ -0,0 +1,475 @@ +package sqlite.git104; + +import androidx.sqlite.db.SupportSQLiteDatabase; +import com.abubusoft.kripton.android.KriptonLibrary; +import com.abubusoft.kripton.android.Logger; +import com.abubusoft.kripton.android.sqlite.AbstractDataSource; +import com.abubusoft.kripton.android.sqlite.DataSourceOptions; +import com.abubusoft.kripton.android.sqlite.SQLContext; +import com.abubusoft.kripton.android.sqlite.SQLContextInSessionImpl; +import com.abubusoft.kripton.android.sqlite.SQLiteTable; +import com.abubusoft.kripton.android.sqlite.SQLiteUpdateTask; +import com.abubusoft.kripton.android.sqlite.SQLiteUpdateTaskHelper; +import com.abubusoft.kripton.android.sqlite.TransactionResult; +import com.abubusoft.kripton.common.Pair; +import com.abubusoft.kripton.exception.KriptonRuntimeException; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + +/** + *

+ * Implementation of the AppDataSource datasource. + * This class expose database interface through Dao attribute. + *

+ * + * @see AppDataSource + * @see BindAppDaoFactory + * @see DocumentDao + * @see DocumentDaoImpl + * @see Document + */ +public class BindAppDataSource extends AbstractDataSource implements BindAppDaoFactory, AppDataSource { + /** + *

datasource singleton

+ */ + static volatile BindAppDataSource instance; + + /** + *

Mutex to manage multithread access to instance

+ */ + private static final Object mutex = new Object(); + + /** + * Unique identifier for Dao DocumentDao + */ + public static final int DOCUMENT_DAO_UID = 0; + + /** + * List of tables compose datasource + */ + static final SQLiteTable[] TABLES = {new DocumentTable()}; + + /** + *

dao instance

+ */ + protected DocumentDaoImpl documentDao = new DocumentDaoImpl(this); + + /** + * Used only in transactions (that can be executed one for time + */ + protected DataSourceSingleThread _daoFactorySingleThread = new DataSourceSingleThread(); + + protected BindAppDataSource(DataSourceOptions options) { + super("fasa.db", 3, options); + } + + @Override + public DocumentDaoImpl getDocumentDao() { + return documentDao; + } + + /** + *

Executes a transaction. This method is thread safe to avoid concurrent problems. The drawback is only one transaction at time can be executed. The database will be open in write mode. This method uses default error listener to intercept errors.

+ * + * @param transaction + * transaction to execute + * @return true if transaction successful finished + */ + public boolean execute(Transaction transaction) { + return execute(transaction, onErrorListener); + } + + /** + *

Executes a transaction. This method is thread safe to avoid concurrent problems. The drawback is only one transaction at time can be executed. The database will be open in write mode.

+ * + * @param transaction + * transaction to execute + * @param onErrorListener + * error listener + * @return true if transaction successful finished + */ + public boolean execute(Transaction transaction, + AbstractDataSource.OnErrorListener onErrorListener) { + // open database in thread safe mode + Pair _status=openDatabaseThreadSafeMode(true); + boolean success=false; + SupportSQLiteDatabase connection=_status.value1; + DataSourceSingleThread currentDaoFactory=_daoFactorySingleThread.bindToThread(); + currentDaoFactory.onSessionOpened(); + try { + connection.beginTransaction(); + if (transaction!=null && TransactionResult.COMMIT == transaction.onExecute(currentDaoFactory)) { + connection.setTransactionSuccessful(); + success=true; + } + } catch(Throwable e) { + Logger.error(e.getMessage()); + e.printStackTrace(); + if (onErrorListener!=null) onErrorListener.onError(e); + } finally { + try { + connection.endTransaction(); + } catch (Throwable e) { + Logger.warn("error closing transaction %s", e.getMessage()); + } + // close database in thread safe mode + closeThreadSafeMode(_status); + if (success) { currentDaoFactory.onSessionClosed(); } else { currentDaoFactory.onSessionClear(); } + } + return success; + } + + /** + *

Executes a transaction in async mode. This method is thread safe to avoid concurrent problems. The drawback is only one transaction at time can be executed. The database will be open in write mode. This method uses default error listener to intercept errors.

+ * + * @param transaction + * transaction to execute + * @param onErrorListener + * listener for errors + * @return true when transaction successful finished + */ + public Future executeAsync(final Transaction transaction, + final AbstractDataSource.OnErrorListener onErrorListener) { + return KriptonLibrary.getExecutorService().submit(new Callable() { + @Override + public Boolean call() throws Exception { + return execute(transaction, onErrorListener); + } + }); + } + + /** + *

Executes a transaction in async mode. This method is thread safe to avoid concurrent problems. The drawback is only one transaction at time can be executed. The database will be open in write mode. This method uses default error listener to intercept errors.

+ * + * @param transaction + * transaction to execute + * @return true when transaction successful finished + */ + public Future executeAsync(final Transaction transaction) { + return KriptonLibrary.getExecutorService().submit(new Callable() { + @Override + public Boolean call() throws Exception { + return execute(transaction, onErrorListener); + } + }); + } + + /** + *

Executes a batch command in async mode. This method is thread safe to avoid concurrent problems. The drawback is only one transaction at time can be executed. The database will be open in write mode. This method uses default error listener to intercept errors.

+ * + * @param commands + * commands to execute + * @param writeMode + * rue if you need to writeable connection + * @return true when transaction successful finished + */ + public Future executeBatchAsync(final Batch commands, final boolean writeMode) { + return KriptonLibrary.getExecutorService().submit(new Callable() { + @Override + public T call() throws Exception { + return executeBatch(commands, writeMode); + } + }); + } + + /** + *

Executes a batch command in async mode. This method is thread safe to avoid concurrent problems. The drawback is only one transaction at time can be executed. The database will be open in write mode. This method uses default error listener to intercept errors.

+ * + * @param commands + * commands to execute + * @return true when transaction successful finished + */ + public Future executeBatchAsync(final Batch commands) { + return KriptonLibrary.getExecutorService().submit(new Callable() { + @Override + public T call() throws Exception { + return executeBatch(commands, false); + } + }); + } + + /** + *

Executes a batch opening a read only connection. This method is thread safe to avoid concurrent problems.

+ * + * @param commands + * batch to execute + */ + public T executeBatch(Batch commands) { + return executeBatch(commands, false); + } + + /** + *

Executes a batch. This method is thread safe to avoid concurrent problems. The drawback is only one transaction at time can be executed. if writeMode is set to false, multiple batch operations is allowed.

+ * + * @param commands + * batch to execute + * @param writeMode + * true to open connection in write mode, false to open connection in read only mode + */ + public T executeBatch(Batch commands, boolean writeMode) { + // open database in thread safe mode + Pair _status=openDatabaseThreadSafeMode(writeMode); + DataSourceSingleThread currentDaoFactory=new DataSourceSingleThread(); + currentDaoFactory.onSessionOpened(); + try { + if (commands!=null) { + return commands.onExecute(currentDaoFactory); + } + } catch(Throwable e) { + Logger.error(e.getMessage()); + e.printStackTrace(); + throw(e); + } finally { + // close database in thread safe mode + closeThreadSafeMode(_status); + currentDaoFactory.onSessionClosed(); + } + return null; + } + + /** + *

Retrieve instance.

+ */ + public static BindAppDataSource getInstance() { + BindAppDataSource result=instance; + if (result==null) { + synchronized(mutex) { + result=instance; + if (result==null) { + DataSourceOptions options=DataSourceOptions.builder() + .inMemory(false) + .log(true) + .build(); + instance=result=new BindAppDataSource(options); + try { + instance.openWritableDatabase(); + instance.close(); + } catch(Throwable e) { + Logger.error(e.getMessage()); + e.printStackTrace(); + } + } + } + } + return result; + } + + /** + * Retrieve data source instance and open it. + * @return opened dataSource instance. + */ + public static BindAppDataSource open() { + BindAppDataSource instance=getInstance(); + instance.openWritableDatabase(); + return instance; + } + + /** + * Retrieve data source instance and open it in read only mode. + * @return opened dataSource instance. + */ + public static BindAppDataSource openReadOnly() { + BindAppDataSource instance=getInstance(); + instance.openReadOnlyDatabase(); + return instance; + } + + /** + * onCreate + */ + @Override + protected void onCreate(SupportSQLiteDatabase database) { + // generate tables + // log section create BEGIN + if (this.logEnabled) { + if (options.inMemory) { + Logger.info("Create database in memory"); + } else { + Logger.info("Create database '%s' version %s",this.name, this.version); + } + } + // log section create END + // log section create BEGIN + if (this.logEnabled) { + Logger.info("DDL: %s",DocumentTable.CREATE_TABLE_SQL); + } + // log section create END + database.execSQL(DocumentTable.CREATE_TABLE_SQL); + if (options.databaseLifecycleHandler != null) { + options.databaseLifecycleHandler.onCreate(database); + } + justCreated=true; + } + + /** + * onUpgrade + */ + @Override + protected void onUpgrade(SupportSQLiteDatabase database, int previousVersion, + int currentVersion) { + // log section BEGIN + if (this.logEnabled) { + Logger.info("Update database '%s' from version %s to version %s",this.name, previousVersion, currentVersion); + } + // log section END + // if we have a list of update task, try to execute them + if (options.updateTasks != null) { + List tasks = buildTaskList(previousVersion, currentVersion); + for (SQLiteUpdateTask task : tasks) { + // log section BEGIN + if (this.logEnabled) { + Logger.info("Begin update database from version %s to %s", previousVersion, previousVersion+1); + } + // log section END + task.execute(database, previousVersion, previousVersion+1); + // log section BEGIN + if (this.logEnabled) { + Logger.info("End update database from version %s to %s", previousVersion, previousVersion+1); + } + // log section END + previousVersion++; + } + } else { + // drop all tables + SQLiteUpdateTaskHelper.dropTablesAndIndices(database); + + // generate tables + // log section BEGIN + if (this.logEnabled) { + Logger.info("DDL: %s",DocumentTable.CREATE_TABLE_SQL); + } + // log section END + database.execSQL(DocumentTable.CREATE_TABLE_SQL); + } + if (options.databaseLifecycleHandler != null) { + options.databaseLifecycleHandler.onUpdate(database, previousVersion, currentVersion, true); + } + } + + /** + * Returns true if database needs foreign keys. + */ + @Override + public boolean hasForeignKeys() { + return false; + } + + public void clearCompiledStatements() { + DocumentDaoImpl.clearCompiledStatements(); + } + + /** + *

Build instance. This method can be used only one time, on the application start.

+ */ + public static BindAppDataSource build(DataSourceOptions options) { + if (options.forceBuild && instance!=null) { + Logger.info("Datasource BindAppDataSource is forced to be (re)builded"); + instance=null; + } + BindAppDataSource result=instance; + if (result==null) { + synchronized(mutex) { + result=instance; + if (result==null) { + instance=result=new BindAppDataSource(options); + try { + instance.openWritableDatabase(); + instance.close(); + // force database DDL run + if (options.populator!=null && instance.justCreated) { + // run populator only a time + instance.justCreated=false; + // run populator + options.populator.execute(); + } + } catch(Throwable e) { + Logger.error(e.getMessage()); + e.printStackTrace(); + } + } else { + throw new KriptonRuntimeException("Datasource BindAppDataSource is already builded"); + } + } + } else { + throw new KriptonRuntimeException("Datasource BindAppDataSource is already builded"); + } + Logger.info("Datasource BindAppDataSource is created"); + return result; + } + + /** + * List of tables compose datasource: + */ + public static SQLiteTable[] getTables() { + return TABLES; + } + + /** + * Rapresents transational operation. + */ + public interface Transaction extends AbstractDataSource.AbstractExecutable { + /** + * Execute transation. Method need to return {@link TransactionResult#COMMIT} to commit results + * or {@link TransactionResult#ROLLBACK} to rollback. + * If exception is thrown, a rollback will be done. + * + * @param daoFactory + * @return + * @throws Throwable + */ + TransactionResult onExecute(BindAppDaoFactory daoFactory); + } + + /** + * Rapresents batch operation. + */ + public interface Batch { + /** + * Execute batch operations. + * + * @param daoFactory + * @throws Throwable + */ + T onExecute(BindAppDaoFactory daoFactory); + } + + class DataSourceSingleThread implements BindAppDaoFactory { + private SQLContextInSessionImpl _context; + + protected DocumentDaoImpl _documentDao; + + DataSourceSingleThread() { + _context=new SQLContextInSessionImpl(BindAppDataSource.this); + } + + /** + * + * retrieve dao DocumentDao + */ + public DocumentDaoImpl getDocumentDao() { + if (_documentDao==null) { + _documentDao=new DocumentDaoImpl(this); + } + return _documentDao; + } + + @Override + public SQLContext getContext() { + return _context; + } + + protected void onSessionOpened() { + } + + protected void onSessionClear() { + } + + protected void onSessionClosed() { + } + + public DataSourceSingleThread bindToThread() { + return this; + } + } +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/Document.java b/kripton-android-library/src/test/java/sqlite/git104/Document.java new file mode 100644 index 000000000..abf95f97d --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/Document.java @@ -0,0 +1,41 @@ +package sqlite.git104; + +import java.time.ZonedDateTime; + +import com.abubusoft.kripton.android.annotation.BindSqlType; + +@BindSqlType(name = "documents") +public class Document extends AbstractBean { + + private final DocumentInfo info; + + public Document(long id, ZonedDateTime updateTime, DocumentInfo info, ZonedDateTime data, String fileName, + String secret) { + super(id, updateTime); + this.info = info; + this.data = data; + this.fileName = fileName; + this.secret = secret; + } + + public String getSecret() { + return secret; + } + + public DocumentInfo getInfo() { + return info; + } + + public ZonedDateTime getData() { + return data; + } + + public String getFileName() { + return fileName; + } + + private final ZonedDateTime data; + private final String fileName; + private final String secret; + +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/DocumentDao.java b/kripton-android-library/src/test/java/sqlite/git104/DocumentDao.java new file mode 100644 index 000000000..cdfec85a6 --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/DocumentDao.java @@ -0,0 +1,14 @@ +package sqlite.git104; + +import java.util.List; + +import com.abubusoft.kripton.android.annotation.BindDao; +import com.abubusoft.kripton.android.annotation.BindSqlSelect; + +@BindDao(Document.class) +public interface DocumentDao extends AbstractDao { + + @BindSqlSelect(jql = "SELECT fileName, secret, info FROM Document WHERE id=:id and fileName is not null") + List selectFilesForAssistito(long id); + +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/DocumentDaoImpl.java b/kripton-android-library/src/test/java/sqlite/git104/DocumentDaoImpl.java new file mode 100644 index 000000000..86d8ac533 --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/DocumentDaoImpl.java @@ -0,0 +1,126 @@ +package sqlite.git104; + +import android.database.Cursor; +import com.abubusoft.kripton.android.Logger; +import com.abubusoft.kripton.android.sqlite.Dao; +import com.abubusoft.kripton.android.sqlite.KriptonContentValues; +import com.abubusoft.kripton.common.StringUtils; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + *

+ * DAO implementation for entity Document, based on interface DocumentDao + *

+ * + * @see Document + * @see DocumentDao + * @see DocumentTable + */ +public class DocumentDaoImpl extends Dao implements DocumentDao { + /** + * SQL definition for method selectFilesForAssistito + */ + private static final String SELECT_FILES_FOR_ASSISTITO_SQL1 = "SELECT file_name, secret, info FROM documents WHERE id=? and file_name is not null"; + + public DocumentDaoImpl(BindAppDaoFactory daoFactory) { + super(daoFactory.getContext()); + } + + /** + *

Select SQL:

+ * + *
SELECT file_name, secret, info FROM documents WHERE id=:id and file_name is not null
+ * + *

Mapped class:

+ * {@link FileInfo} + * + *

Projected columns:

+ *
+ *
file_name
is associated to bean's property fileName
+ *
secret
is associated to bean's property secret
+ *
info
is associated to bean's property info
+ *
+ * + *

Query's parameters:

+ *
+ *
:id
is binded to method's parameter id
+ *
+ * + * @param id + * is binded to :id + * @return collection of bean or empty collection. If result type is List, it will be generated as immutable list. + */ + @Override + public List selectFilesForAssistito(long id) { + // common part generation - BEGIN + KriptonContentValues _contentValues=contentValues(); + // query SQL is statically defined + String _sql=SELECT_FILES_FOR_ASSISTITO_SQL1; + // add where arguments + _contentValues.addWhereArgs(String.valueOf(id)); + String[] _sqlArgs=_contentValues.whereArgsAsArray(); + // log section for select BEGIN + if (_context.isLogEnabled()) { + // manage log + Logger.info(_sql); + + // log for where parameters -- BEGIN + int _whereParamCounter=0; + for (String _whereParamItem: _contentValues.whereArgs()) { + Logger.info("==> param%s: '%s'",(_whereParamCounter++), StringUtils.checkSize(_whereParamItem)); + } + // log for where parameters -- END + } + // log section for select END + try (Cursor _cursor = getDatabase().query(_sql, _sqlArgs)) { + // log section BEGIN + if (_context.isLogEnabled()) { + Logger.info("Rows found: %s",_cursor.getCount()); + } + // log section END + // common part generation - END + // Specialized part - SelectBeanListHelper - BEGIN + + ArrayList resultList=new ArrayList(_cursor.getCount()); + FileInfo resultBean=null; + + // initialize temporary variable for immutable POJO + // immutable object: initialize temporary variables for properties + String __fileName=null; + String __secret=null; + DocumentInfo __info=null; + + if (_cursor.moveToFirst()) { + + int index0=_cursor.getColumnIndex("file_name"); + int index1=_cursor.getColumnIndex("secret"); + int index2=_cursor.getColumnIndex("info"); + + do + { + // reset temporary variable for immutable POJO + // immutable object: initialize temporary variables for properties + __fileName=null; + __secret=null; + __info=null; + if (!_cursor.isNull(index0)) { __fileName=_cursor.getString(index0); } + if (!_cursor.isNull(index1)) { __secret=_cursor.getString(index1); } + if (!_cursor.isNull(index2)) { __info=DocumentTable.parseInfo(_cursor.getBlob(index2)); } + + // define immutable POJO + // immutable object: inizialize object + resultBean=new FileInfo(__fileName,__secret,__info); + resultList.add(resultBean); + } while (_cursor.moveToNext()); + } + + return (resultList==null ? null : Collections.unmodifiableList(resultList)); + } + // Specialized part - SelectBeanListHelper - END + } + + public static void clearCompiledStatements() { + } +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/DocumentInfo.java b/kripton-android-library/src/test/java/sqlite/git104/DocumentInfo.java new file mode 100644 index 000000000..dfa677bea --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/DocumentInfo.java @@ -0,0 +1,24 @@ +package sqlite.git104; + +import com.abubusoft.kripton.annotation.BindType; + +@BindType +public class DocumentInfo { + private final String bucket1; + private final String bucket2; + + public String getBucket1() { + return bucket1; + } + + public String getBucket2() { + return bucket2; + } + + public DocumentInfo(String bucket1, String bucket2) { + super(); + this.bucket1 = bucket1; + this.bucket2 = bucket2; + } + +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/DocumentInfoBindMap.java b/kripton-android-library/src/test/java/sqlite/git104/DocumentInfoBindMap.java new file mode 100644 index 000000000..98b5f5d4f --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/DocumentInfoBindMap.java @@ -0,0 +1,256 @@ +package sqlite.git104; + +import com.abubusoft.kripton.AbstractMapper; +import com.abubusoft.kripton.annotation.BindMap; +import com.abubusoft.kripton.escape.StringEscapeUtils; +import com.abubusoft.kripton.xml.EventType; +import com.abubusoft.kripton.xml.XMLParser; +import com.abubusoft.kripton.xml.XMLSerializer; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; + +/** + * This class is binder map for DocumentInfo + * + * @see DocumentInfo + */ +@BindMap(DocumentInfo.class) +public class DocumentInfoBindMap extends AbstractMapper { + @Override + public int serializeOnJackson(DocumentInfo object, JsonGenerator jacksonSerializer) throws + Exception { + jacksonSerializer.writeStartObject(); + int fieldCount=0; + + // Serialized Field: + + // field bucket1 (mapped with "bucket1") + if (object.getBucket1()!=null) { + fieldCount++; + jacksonSerializer.writeStringField("bucket1", object.getBucket1()); + } + + // field bucket2 (mapped with "bucket2") + if (object.getBucket2()!=null) { + fieldCount++; + jacksonSerializer.writeStringField("bucket2", object.getBucket2()); + } + + jacksonSerializer.writeEndObject(); + return fieldCount; + } + + @Override + public int serializeOnJacksonAsString(DocumentInfo object, JsonGenerator jacksonSerializer) throws + Exception { + jacksonSerializer.writeStartObject(); + int fieldCount=0; + + // Serialized Field: + + // field bucket1 (mapped with "bucket1") + if (object.getBucket1()!=null) { + fieldCount++; + jacksonSerializer.writeStringField("bucket1", object.getBucket1()); + } + + // field bucket2 (mapped with "bucket2") + if (object.getBucket2()!=null) { + fieldCount++; + jacksonSerializer.writeStringField("bucket2", object.getBucket2()); + } + + jacksonSerializer.writeEndObject(); + return fieldCount; + } + + /** + * method for xml serialization + */ + @Override + public void serializeOnXml(DocumentInfo object, XMLSerializer xmlSerializer, + EventType currentEventType) throws Exception { + if (currentEventType == EventType.START_DOCUMENT) { + xmlSerializer.writeStartElement("documentInfo"); + } + + // Persisted fields: + + // field bucket1 (mapped with "bucket1") + if (object.getBucket1()!=null) { + xmlSerializer.writeStartElement("bucket1"); + xmlSerializer.writeCharacters(StringEscapeUtils.escapeXml10(object.getBucket1())); + xmlSerializer.writeEndElement(); + } + + // field bucket2 (mapped with "bucket2") + if (object.getBucket2()!=null) { + xmlSerializer.writeStartElement("bucket2"); + xmlSerializer.writeCharacters(StringEscapeUtils.escapeXml10(object.getBucket2())); + xmlSerializer.writeEndElement(); + } + + if (currentEventType == EventType.START_DOCUMENT) { + xmlSerializer.writeEndElement(); + } + } + + /** + * parse with jackson + */ + @Override + public DocumentInfo parseOnJackson(JsonParser jacksonParser) throws Exception { + // immutable object: initialize temporary variables for properties + String __bucket1=null; + String __bucket2=null; + String fieldName; + if (jacksonParser.currentToken() == null) { + jacksonParser.nextToken(); + } + if (jacksonParser.currentToken() != JsonToken.START_OBJECT) { + jacksonParser.skipChildren(); + // immutable object: inizialize object + DocumentInfo instance=new DocumentInfo(__bucket1,__bucket2); + return instance; + } + while (jacksonParser.nextToken() != JsonToken.END_OBJECT) { + fieldName = jacksonParser.getCurrentName(); + jacksonParser.nextToken(); + + // Parse fields: + switch (fieldName) { + case "bucket1": + // field bucket1 (mapped with "bucket1") + if (jacksonParser.currentToken()!=JsonToken.VALUE_NULL) { + __bucket1=jacksonParser.getText(); + } + break; + case "bucket2": + // field bucket2 (mapped with "bucket2") + if (jacksonParser.currentToken()!=JsonToken.VALUE_NULL) { + __bucket2=jacksonParser.getText(); + } + break; + default: + jacksonParser.skipChildren(); + break;} + } + // immutable object: inizialize object + DocumentInfo instance=new DocumentInfo(__bucket1,__bucket2); + return instance; + } + + /** + * parse with jackson + */ + @Override + public DocumentInfo parseOnJacksonAsString(JsonParser jacksonParser) throws Exception { + // immutable object: initialize temporary variables for properties + String __bucket1=null; + String __bucket2=null; + String fieldName; + if (jacksonParser.getCurrentToken() == null) { + jacksonParser.nextToken(); + } + if (jacksonParser.getCurrentToken() != JsonToken.START_OBJECT) { + jacksonParser.skipChildren(); + // immutable object: inizialize object + DocumentInfo instance=new DocumentInfo(__bucket1,__bucket2); + return instance; + } + while (jacksonParser.nextToken() != JsonToken.END_OBJECT) { + fieldName = jacksonParser.getCurrentName(); + jacksonParser.nextToken(); + + // Parse fields: + switch (fieldName) { + case "bucket1": + // field bucket1 (mapped with "bucket1") + if (jacksonParser.currentToken()!=JsonToken.VALUE_NULL) { + __bucket1=jacksonParser.getText(); + } + break; + case "bucket2": + // field bucket2 (mapped with "bucket2") + if (jacksonParser.currentToken()!=JsonToken.VALUE_NULL) { + __bucket2=jacksonParser.getText(); + } + break; + default: + jacksonParser.skipChildren(); + break;} + } + // immutable object: inizialize object + DocumentInfo instance=new DocumentInfo(__bucket1,__bucket2); + return instance; + } + + /** + * parse xml + */ + @Override + public DocumentInfo parseOnXml(XMLParser xmlParser, EventType currentEventType) throws Exception { + // immutable object: initialize temporary variables for properties + String __bucket1=null; + String __bucket2=null; + EventType eventType = currentEventType; + boolean read=true; + + if (currentEventType == EventType.START_DOCUMENT) { + eventType = xmlParser.next(); + } else { + eventType = xmlParser.getEventType(); + } + String currentTag = xmlParser.getName().toString(); + String elementName = currentTag; + // No attributes found + + //sub-elements + while (xmlParser.hasNext() && elementName!=null) { + if (read) { + eventType = xmlParser.next(); + } else { + eventType = xmlParser.getEventType(); + } + read=true; + switch(eventType) { + case START_TAG: + currentTag = xmlParser.getName().toString(); + switch(currentTag) { + case "bucket1": + // property bucket1 (mapped on "bucket1") + __bucket1=StringEscapeUtils.unescapeXml(xmlParser.getElementText()); + break; + case "bucket2": + // property bucket2 (mapped on "bucket2") + __bucket2=StringEscapeUtils.unescapeXml(xmlParser.getElementText()); + break; + default: + xmlParser.skipChildren(); + break; + } + break; + case END_TAG: + if (elementName.equals(xmlParser.getName())) { + currentTag = elementName; + elementName = null; + } + break; + case CDSECT: + case TEXT: + // no property is binded to VALUE o CDATA break; + default: + break; + } + } + // immutable object: inizialize object + DocumentInfo instance=new DocumentInfo(__bucket1,__bucket2); + return instance; + } + + @Override + public void init() { + // binding maps initialization + } + } diff --git a/kripton-android-library/src/test/java/sqlite/git104/DocumentTable.java b/kripton-android-library/src/test/java/sqlite/git104/DocumentTable.java new file mode 100644 index 000000000..36e5aef1f --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/DocumentTable.java @@ -0,0 +1,159 @@ +package sqlite.git104; + +import com.abubusoft.kripton.BinderUtils; +import com.abubusoft.kripton.KriptonBinder; +import com.abubusoft.kripton.KriptonJsonContext; +import com.abubusoft.kripton.android.sqlite.SQLiteTable; +import com.abubusoft.kripton.common.KriptonByteArrayOutputStream; +import com.abubusoft.kripton.exception.KriptonRuntimeException; +import com.abubusoft.kripton.persistence.JacksonWrapperParser; +import com.abubusoft.kripton.persistence.JacksonWrapperSerializer; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; + +/** + *

+ * Entity Document is associated to table documents + * This class represents table associated to entity. + *

+ * @see Document + */ +public class DocumentTable implements SQLiteTable { + /** + * Costant represents typeName of table documents + */ + public static final String TABLE_NAME = "documents"; + + /** + *

+ * DDL to create table documents + *

+ * + *
CREATE TABLE documents (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, data TEXT, file_name TEXT, info BLOB, secret TEXT, update_time TEXT NOT NULL);
+ */ + public static final String CREATE_TABLE_SQL = "CREATE TABLE documents (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, data TEXT, file_name TEXT, info BLOB, secret TEXT, update_time TEXT NOT NULL);"; + + /** + *

+ * DDL to drop table documents + *

+ * + *
DROP TABLE IF EXISTS documents;
+ */ + public static final String DROP_TABLE_SQL = "DROP TABLE IF EXISTS documents;"; + + /** + * Entity's property id is associated to table column id. This costant represents column name. + * + * @see Document#id + */ + public static final String COLUMN_ID = "id"; + + /** + * Entity's property data is associated to table column data. This costant represents column name. + * + * @see Document#data + */ + public static final String COLUMN_DATA = "data"; + + /** + * Entity's property fileName is associated to table column file_name. This costant represents column name. + * + * @see Document#fileName + */ + public static final String COLUMN_FILE_NAME = "file_name"; + + /** + * Entity's property info is associated to table column info. This costant represents column name. + * + * @see Document#info + */ + public static final String COLUMN_INFO = "info"; + + /** + * Entity's property secret is associated to table column secret. This costant represents column name. + * + * @see Document#secret + */ + public static final String COLUMN_SECRET = "secret"; + + /** + * Entity's property updateTime is associated to table column update_time. This costant represents column name. + * + * @see Document#updateTime + */ + public static final String COLUMN_UPDATE_TIME = "update_time"; + + /** + * binder for type DocumentInfo + */ + private static DocumentInfoBindMap documentInfoBindMap = BinderUtils.mapperFor(DocumentInfo.class); + + /** + * Columns array + */ + private static final String[] COLUMNS = {COLUMN_ID, COLUMN_DATA, COLUMN_FILE_NAME, COLUMN_INFO, COLUMN_SECRET, COLUMN_UPDATE_TIME}; + + /** + * for attribute info serialization + */ + public static byte[] serializeInfo(DocumentInfo value) { + if (value==null) { + return null; + } + KriptonJsonContext context=KriptonBinder.jsonBind(); + try (KriptonByteArrayOutputStream stream=new KriptonByteArrayOutputStream(); JacksonWrapperSerializer wrapper=context.createSerializer(stream)) { + JsonGenerator jacksonSerializer=wrapper.jacksonGenerator; + int fieldCount=0; + if (value!=null) { + fieldCount++; + documentInfoBindMap.serializeOnJackson(value, jacksonSerializer); + } + jacksonSerializer.flush(); + return stream.toByteArray(); + } catch(Exception e) { + e.printStackTrace(); + throw(new KriptonRuntimeException(e.getMessage())); + } + } + + /** + * for attribute info parsing + */ + public static DocumentInfo parseInfo(byte[] input) { + if (input==null) { + return null; + } + KriptonJsonContext context=KriptonBinder.jsonBind(); + try (JacksonWrapperParser wrapper=context.createParser(input)) { + JsonParser jacksonParser=wrapper.jacksonParser; + // START_OBJECT + jacksonParser.nextToken(); + DocumentInfo result=null; + if (jacksonParser.currentToken()==JsonToken.START_OBJECT) { + result=documentInfoBindMap.parseOnJackson(jacksonParser); + } + return result; + } catch(Exception e) { + e.printStackTrace(); + throw(new KriptonRuntimeException(e.getMessage())); + } + } + + /** + * Columns array + */ + @Override + public String[] columns() { + return COLUMNS; + } + + /** + * table name + */ + @Override + public String name() { + return TABLE_NAME; + } +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/FileInfo.java b/kripton-android-library/src/test/java/sqlite/git104/FileInfo.java new file mode 100644 index 000000000..d7195bc6a --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/FileInfo.java @@ -0,0 +1,28 @@ +package sqlite.git104; + +import com.abubusoft.kripton.annotation.BindType; + +@BindType +public class FileInfo { + private final String fileName; + private final String secret; + private final DocumentInfo info; + + public FileInfo(String fileName, String secret, DocumentInfo info) { + this.fileName = fileName; + this.secret = secret; + this.info = info; + } + + public DocumentInfo getInfo() { + return info; + } + + public String getFileName() { + return fileName; + } + + public String getSecret() { + return secret; + } +} diff --git a/kripton-android-library/src/test/java/sqlite/git104/FileInfoBindMap.java b/kripton-android-library/src/test/java/sqlite/git104/FileInfoBindMap.java new file mode 100644 index 000000000..8cee6829d --- /dev/null +++ b/kripton-android-library/src/test/java/sqlite/git104/FileInfoBindMap.java @@ -0,0 +1,304 @@ +package sqlite.git104; + +import com.abubusoft.kripton.AbstractMapper; +import com.abubusoft.kripton.BinderUtils; +import com.abubusoft.kripton.annotation.BindMap; +import com.abubusoft.kripton.escape.StringEscapeUtils; +import com.abubusoft.kripton.xml.EventType; +import com.abubusoft.kripton.xml.XMLParser; +import com.abubusoft.kripton.xml.XMLSerializer; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; + +/** + * This class is binder map for FileInfo + * + * @see FileInfo + */ +@BindMap(FileInfo.class) +public class FileInfoBindMap extends AbstractMapper { + /** + * binder for type DocumentInfo + */ + private DocumentInfoBindMap documentInfoBindMap; + + @Override + public int serializeOnJackson(FileInfo object, JsonGenerator jacksonSerializer) throws Exception { + jacksonSerializer.writeStartObject(); + int fieldCount=0; + + // Serialized Field: + + // field fileName (mapped with "fileName") + if (object.getFileName()!=null) { + fieldCount++; + jacksonSerializer.writeStringField("fileName", object.getFileName()); + } + + // field info (mapped with "info") + if (object.getInfo()!=null) { + fieldCount++; + jacksonSerializer.writeFieldName("info"); + documentInfoBindMap.serializeOnJackson(object.getInfo(), jacksonSerializer); + } + + // field secret (mapped with "secret") + if (object.getSecret()!=null) { + fieldCount++; + jacksonSerializer.writeStringField("secret", object.getSecret()); + } + + jacksonSerializer.writeEndObject(); + return fieldCount; + } + + @Override + public int serializeOnJacksonAsString(FileInfo object, JsonGenerator jacksonSerializer) throws + Exception { + jacksonSerializer.writeStartObject(); + int fieldCount=0; + + // Serialized Field: + + // field fileName (mapped with "fileName") + if (object.getFileName()!=null) { + fieldCount++; + jacksonSerializer.writeStringField("fileName", object.getFileName()); + } + + // field info (mapped with "info") + if (object.getInfo()!=null) { + fieldCount++; + jacksonSerializer.writeFieldName("info"); + if (documentInfoBindMap.serializeOnJacksonAsString(object.getInfo(), jacksonSerializer)==0) { + jacksonSerializer.writeNullField("info"); + } + } + + // field secret (mapped with "secret") + if (object.getSecret()!=null) { + fieldCount++; + jacksonSerializer.writeStringField("secret", object.getSecret()); + } + + jacksonSerializer.writeEndObject(); + return fieldCount; + } + + /** + * method for xml serialization + */ + @Override + public void serializeOnXml(FileInfo object, XMLSerializer xmlSerializer, + EventType currentEventType) throws Exception { + if (currentEventType == EventType.START_DOCUMENT) { + xmlSerializer.writeStartElement("fileInfo"); + } + + // Persisted fields: + + // field fileName (mapped with "fileName") + if (object.getFileName()!=null) { + xmlSerializer.writeStartElement("fileName"); + xmlSerializer.writeCharacters(StringEscapeUtils.escapeXml10(object.getFileName())); + xmlSerializer.writeEndElement(); + } + + // field info (mapped with "info") + if (object.getInfo()!=null) { + xmlSerializer.writeStartElement("info"); + documentInfoBindMap.serializeOnXml(object.getInfo(), xmlSerializer, EventType.START_TAG); + xmlSerializer.writeEndElement(); + } + + // field secret (mapped with "secret") + if (object.getSecret()!=null) { + xmlSerializer.writeStartElement("secret"); + xmlSerializer.writeCharacters(StringEscapeUtils.escapeXml10(object.getSecret())); + xmlSerializer.writeEndElement(); + } + + if (currentEventType == EventType.START_DOCUMENT) { + xmlSerializer.writeEndElement(); + } + } + + /** + * parse with jackson + */ + @Override + public FileInfo parseOnJackson(JsonParser jacksonParser) throws Exception { + // immutable object: initialize temporary variables for properties + String __fileName=null; + String __secret=null; + DocumentInfo __info=null; + String fieldName; + if (jacksonParser.currentToken() == null) { + jacksonParser.nextToken(); + } + if (jacksonParser.currentToken() != JsonToken.START_OBJECT) { + jacksonParser.skipChildren(); + // immutable object: inizialize object + FileInfo instance=new FileInfo(__fileName,__secret,__info); + return instance; + } + while (jacksonParser.nextToken() != JsonToken.END_OBJECT) { + fieldName = jacksonParser.getCurrentName(); + jacksonParser.nextToken(); + + // Parse fields: + switch (fieldName) { + case "fileName": + // field fileName (mapped with "fileName") + if (jacksonParser.currentToken()!=JsonToken.VALUE_NULL) { + __fileName=jacksonParser.getText(); + } + break; + case "info": + // field info (mapped with "info") + if (jacksonParser.currentToken()==JsonToken.START_OBJECT) { + __info=documentInfoBindMap.parseOnJackson(jacksonParser); + } + break; + case "secret": + // field secret (mapped with "secret") + if (jacksonParser.currentToken()!=JsonToken.VALUE_NULL) { + __secret=jacksonParser.getText(); + } + break; + default: + jacksonParser.skipChildren(); + break;} + } + // immutable object: inizialize object + FileInfo instance=new FileInfo(__fileName,__secret,__info); + return instance; + } + + /** + * parse with jackson + */ + @Override + public FileInfo parseOnJacksonAsString(JsonParser jacksonParser) throws Exception { + // immutable object: initialize temporary variables for properties + String __fileName=null; + String __secret=null; + DocumentInfo __info=null; + String fieldName; + if (jacksonParser.getCurrentToken() == null) { + jacksonParser.nextToken(); + } + if (jacksonParser.getCurrentToken() != JsonToken.START_OBJECT) { + jacksonParser.skipChildren(); + // immutable object: inizialize object + FileInfo instance=new FileInfo(__fileName,__secret,__info); + return instance; + } + while (jacksonParser.nextToken() != JsonToken.END_OBJECT) { + fieldName = jacksonParser.getCurrentName(); + jacksonParser.nextToken(); + + // Parse fields: + switch (fieldName) { + case "fileName": + // field fileName (mapped with "fileName") + if (jacksonParser.currentToken()!=JsonToken.VALUE_NULL) { + __fileName=jacksonParser.getText(); + } + break; + case "info": + // field info (mapped with "info") + if (jacksonParser.currentToken()==JsonToken.START_OBJECT || jacksonParser.currentToken()==JsonToken.VALUE_STRING) { + __info=documentInfoBindMap.parseOnJacksonAsString(jacksonParser); + } + break; + case "secret": + // field secret (mapped with "secret") + if (jacksonParser.currentToken()!=JsonToken.VALUE_NULL) { + __secret=jacksonParser.getText(); + } + break; + default: + jacksonParser.skipChildren(); + break;} + } + // immutable object: inizialize object + FileInfo instance=new FileInfo(__fileName,__secret,__info); + return instance; + } + + /** + * parse xml + */ + @Override + public FileInfo parseOnXml(XMLParser xmlParser, EventType currentEventType) throws Exception { + // immutable object: initialize temporary variables for properties + String __fileName=null; + String __secret=null; + DocumentInfo __info=null; + EventType eventType = currentEventType; + boolean read=true; + + if (currentEventType == EventType.START_DOCUMENT) { + eventType = xmlParser.next(); + } else { + eventType = xmlParser.getEventType(); + } + String currentTag = xmlParser.getName().toString(); + String elementName = currentTag; + // No attributes found + + //sub-elements + while (xmlParser.hasNext() && elementName!=null) { + if (read) { + eventType = xmlParser.next(); + } else { + eventType = xmlParser.getEventType(); + } + read=true; + switch(eventType) { + case START_TAG: + currentTag = xmlParser.getName().toString(); + switch(currentTag) { + case "fileName": + // property fileName (mapped on "fileName") + __fileName=StringEscapeUtils.unescapeXml(xmlParser.getElementText()); + break; + case "info": + // property info (mapped on "info") + __info=documentInfoBindMap.parseOnXml(xmlParser, eventType); + break; + case "secret": + // property secret (mapped on "secret") + __secret=StringEscapeUtils.unescapeXml(xmlParser.getElementText()); + break; + default: + xmlParser.skipChildren(); + break; + } + break; + case END_TAG: + if (elementName.equals(xmlParser.getName())) { + currentTag = elementName; + elementName = null; + } + break; + case CDSECT: + case TEXT: + // no property is binded to VALUE o CDATA break; + default: + break; + } + } + // immutable object: inizialize object + FileInfo instance=new FileInfo(__fileName,__secret,__info); + return instance; + } + + @Override + public void init() { + // binding maps initialization + documentInfoBindMap=BinderUtils.mapperFor(DocumentInfo.class); + } + } diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/BindCursorBuilder.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/BindCursorBuilder.java index 34a10abf5..385a52b70 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/BindCursorBuilder.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/BindCursorBuilder.java @@ -34,9 +34,9 @@ import com.abubusoft.kripton.processor.core.ModelProperty; import com.abubusoft.kripton.processor.core.reflect.TypeUtility; import com.abubusoft.kripton.processor.sqlite.core.JavadocUtility; -import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.model.SQLProperty; import com.abubusoft.kripton.processor.sqlite.model.SQLiteDatabaseSchema; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.transform.SQLTransformer; import com.abubusoft.kripton.processor.utils.AnnotationProcessorUtilis; import com.squareup.javapoet.ClassName; @@ -221,7 +221,7 @@ private MethodSpec.Builder generateExecuteMethod(String packageName, SQLiteEntit int i=0; for (ModelProperty item : entity.getCollection()) { methodBuilder.addCode("if (index$L>=0 && !cursor.isNull(index$L)) { ",i,i); - SQLTransformer.cursor2Java(methodBuilder, entityClass, item, "resultBean", "cursor","index"+i+""); + SQLTransformer.cursor2Java(entity, methodBuilder, entityClass, item, "resultBean", "cursor","index"+i+""); methodBuilder.addCode(";"); methodBuilder.addCode("}\n"); @@ -310,7 +310,7 @@ private MethodSpec.Builder generateExecuteListener(String packageName, SQLiteEnt int i=0; for (ModelProperty item : entity.getCollection()) { methodBuilder.addCode("if (index$L>=0 && !cursor.isNull(index$L)) { ",i,i); - SQLTransformer.cursor2Java(methodBuilder, entityClass, item, "resultBean", "cursor","index"+i+""); + SQLTransformer.cursor2Java(entity, methodBuilder, entityClass, item, "resultBean", "cursor","index"+i+""); methodBuilder.addCode(";"); methodBuilder.addCode("}\n"); diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanHelper.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanHelper.java index e6961e84b..37e52fff1 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanHelper.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanHelper.java @@ -102,7 +102,7 @@ public void generateSpecializedPart(SQLiteModelMethod method, TypeSpec.Builder c if (item.isNullable()) { methodBuilder.addCode("if (!_cursor.isNull(index$L)) { ", i); } - SQLTransformer.cursor2Java(methodBuilder, entityClass, item, "resultBean", "_cursor", "index" + i + ""); + SQLTransformer.cursor2Java(method.getParent().getEntity(), methodBuilder, entityClass, item, "resultBean", "_cursor", "index" + i + ""); methodBuilder.addCode(";"); if (item.isNullable()) { methodBuilder.addCode(" }"); diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanListHelper.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanListHelper.java index 245b5e8ab..ef4051106 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanListHelper.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanListHelper.java @@ -122,7 +122,7 @@ public void generateSpecializedPart(SQLiteModelMethod method, TypeSpec.Builder c if (item.isNullable()) { methodBuilder.addCode("if (!_cursor.isNull(index$L)) { ", i); } - SQLTransformer.cursor2Java(methodBuilder, typeName(entity.getElement()), item, "resultBean", "_cursor", + SQLTransformer.cursor2Java(method.getParent().getEntity(), methodBuilder, typeName(entity.getElement()), item, "resultBean", "_cursor", "index" + i + ""); methodBuilder.addCode(";"); if (item.isNullable()) { diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanListenerHelper.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanListenerHelper.java index 4b6f55588..0139b0461 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanListenerHelper.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectBeanListenerHelper.java @@ -134,7 +134,7 @@ public void generateSpecializedPart(SQLiteModelMethod method, TypeSpec.Builder c if (item.isNullable()) { methodBuilder.addCode("if (!_cursor.isNull(index$L)) { ", i); } - SQLTransformer.cursor2Java(methodBuilder, typeName(entity.getElement()), item, "resultBean", "_cursor", + SQLTransformer.cursor2Java(method.getParent().getEntity(), methodBuilder, typeName(entity.getElement()), item, "resultBean", "_cursor", "index" + i + ""); methodBuilder.addCode(";"); if (item.isNullable()) { diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectPaginatedResultHelper.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectPaginatedResultHelper.java index 6397014e2..c7472cdf7 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectPaginatedResultHelper.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/SelectPaginatedResultHelper.java @@ -256,7 +256,7 @@ public void generateSpecializedPart(SQLiteModelMethod method, TypeSpec.Builder c if (item.isNullable()) { methodBuilder.addCode("if (!_cursor.isNull(index$L)) { ", i); } - SQLTransformer.cursor2Java(methodBuilder, typeName(entity.getElement()), item, "resultBean", "_cursor", "index" + i + ""); + SQLTransformer.cursor2Java(method.getParent().getEntity(), methodBuilder, typeName(entity.getElement()), item, "resultBean", "_cursor", "index" + i + ""); methodBuilder.addCode(";"); if (item.isNullable()) { methodBuilder.addCode(" }"); diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/AbstractGeneratedSQLTransform.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/AbstractGeneratedSQLTransform.java index 0c8c62403..afb27ad04 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/AbstractGeneratedSQLTransform.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/AbstractGeneratedSQLTransform.java @@ -22,6 +22,7 @@ import com.abubusoft.kripton.processor.core.ModelProperty; import com.abubusoft.kripton.processor.core.reflect.TypeUtility; import com.abubusoft.kripton.processor.sqlite.model.SQLiteDaoDefinition; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.model.SQLiteModelMethod; import com.squareup.javapoet.MethodSpec.Builder; import com.squareup.javapoet.TypeName; @@ -77,8 +78,8 @@ public void generateReadValueFromCursor(Builder methodBuilder, SQLiteDaoDefiniti * @see com.abubusoft.kripton.processor.sqlite.transform.SQLTransform#generateReadPropertyFromCursor(com.squareup.javapoet.MethodSpec.Builder, com.squareup.javapoet.TypeName, java.lang.String, com.abubusoft.kripton.processor.core.ModelProperty, java.lang.String, java.lang.String) */ @Override - public void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { - methodBuilder.addCode(setter(beanClass, beanName, property, "$T.parse$L($L.getBlob($L))"), TypeUtility.mergeTypeNameWithSuffix(beanClass, "Table"), formatter.convert(property.getName()), cursorName, + public void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { + methodBuilder.addCode(setter(beanClass, beanName, property, "$T.parse$L($L.getBlob($L))"), TypeUtility.mergeTypeNameWithSuffix(TypeUtility.typeName(tableEntity.getElement()), "Table"), formatter.convert(property.getName()), cursorName, indexName); } diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/ByteArraySQLTransform.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/ByteArraySQLTransform.java index bcc2863b8..79db9227b 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/ByteArraySQLTransform.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/ByteArraySQLTransform.java @@ -20,6 +20,7 @@ import com.abubusoft.kripton.android.ColumnAffinityType; import com.abubusoft.kripton.processor.core.ModelProperty; import com.abubusoft.kripton.processor.sqlite.model.SQLiteDaoDefinition; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.squareup.javapoet.MethodSpec.Builder; import com.squareup.javapoet.TypeName; @@ -42,7 +43,7 @@ public ByteArraySQLTransform() { * @see com.abubusoft.kripton.processor.sqlite.transform.SQLTransform#generateReadPropertyFromCursor(com.squareup.javapoet.MethodSpec.Builder, com.squareup.javapoet.TypeName, java.lang.String, com.abubusoft.kripton.processor.core.ModelProperty, java.lang.String, java.lang.String) */ @Override - public void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { + public void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { if (property.hasTypeAdapter()) { methodBuilder.addCode(setter(beanClass, beanName, property, PRE_TYPE_ADAPTER_TO_JAVA+"$L.getBlob($L)"+POST_TYPE_ADAPTER),property.getName(), cursorName, indexName); } else { diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/EnumSQLTransform.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/EnumSQLTransform.java index f594b5291..b7fc3e27d 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/EnumSQLTransform.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/EnumSQLTransform.java @@ -22,6 +22,7 @@ import com.abubusoft.kripton.common.EnumUtils; import com.abubusoft.kripton.processor.core.ModelProperty; import com.abubusoft.kripton.processor.sqlite.model.SQLiteDaoDefinition; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.model.SQLiteModelMethod; import com.squareup.javapoet.MethodSpec.Builder; import com.squareup.javapoet.TypeName; @@ -72,7 +73,7 @@ public void generateWriteParam2ContentValues(Builder methodBuilder, SQLiteModelM * @see com.abubusoft.kripton.processor.sqlite.transform.SQLTransform#generateReadPropertyFromCursor(com.squareup.javapoet.MethodSpec.Builder, com.squareup.javapoet.TypeName, java.lang.String, com.abubusoft.kripton.processor.core.ModelProperty, java.lang.String, java.lang.String) */ @Override - public void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { + public void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { methodBuilder.addCode(setter(beanClass, beanName, property, "$T.valueOf($L.getString($L))"), property.getPropertyType().getTypeName(), cursorName, indexName); } diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/SQLTransform.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/SQLTransform.java index 90cd23f95..f61b5d26f 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/SQLTransform.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/SQLTransform.java @@ -18,6 +18,7 @@ import com.abubusoft.kripton.android.ColumnAffinityType; import com.abubusoft.kripton.processor.core.ModelProperty; import com.abubusoft.kripton.processor.sqlite.model.SQLiteDaoDefinition; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.model.SQLiteModelMethod; import com.squareup.javapoet.MethodSpec.Builder; import com.squareup.javapoet.TypeName; @@ -34,6 +35,7 @@ public interface SQLTransform { /** * Generate code to put into cursor, the bean property value. * + * @param tableEntity entity with table to target * @param methodBuilder the method builder * @param beanClass the bean class * @param beanName the bean name @@ -41,7 +43,7 @@ public interface SQLTransform { * @param cursorName the cursor name * @param indexName the index name */ - void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName); + void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName); /** * Used when you need to use a cursor column as select's result value. diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/SQLTransformer.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/SQLTransformer.java index b2347ee9b..426648e95 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/SQLTransformer.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/SQLTransformer.java @@ -25,6 +25,8 @@ import com.abubusoft.kripton.processor.core.reflect.PropertyUtility; import com.abubusoft.kripton.processor.core.reflect.TypeUtility; import com.abubusoft.kripton.processor.sqlite.model.SQLProperty; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteDaoDefinition; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.model.SQLiteModelMethod; import com.abubusoft.kripton.processor.sqlite.transform.lang.*; import com.abubusoft.kripton.processor.sqlite.transform.math.MathTransformations; @@ -102,7 +104,7 @@ static SQLTransform getSupportedTransformations(TypeName typeName, List utilClazz) { * @see com.abubusoft.kripton.processor.sqlite.transform.SQLTransform#generateReadPropertyFromCursor(com.squareup.javapoet.MethodSpec.Builder, com.squareup.javapoet.TypeName, java.lang.String, com.abubusoft.kripton.processor.core.ModelProperty, java.lang.String, java.lang.String) */ @Override - public void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { + public void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { methodBuilder.addCode(setter(beanClass, beanName, property, "$T.read($L.getString($L))"), utilClazz, cursorName, indexName); } diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/WrappedSQLTransformation.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/WrappedSQLTransformation.java index fde39254f..05778a310 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/WrappedSQLTransformation.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/WrappedSQLTransformation.java @@ -7,6 +7,7 @@ import com.abubusoft.kripton.processor.core.ModelProperty; import com.abubusoft.kripton.processor.sqlite.model.SQLiteDaoDefinition; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.squareup.javapoet.MethodSpec.Builder; import com.squareup.javapoet.TypeName; @@ -38,7 +39,7 @@ protected WrappedSQLTransformation(boolean nullable) { * @see com.abubusoft.kripton.processor.sqlite.transform.SQLTransform#generateReadPropertyFromCursor(com.squareup.javapoet.MethodSpec.Builder, com.squareup.javapoet.TypeName, java.lang.String, com.abubusoft.kripton.processor.core.ModelProperty, java.lang.String, java.lang.String) */ @Override - public void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { + public void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { if (property.hasTypeAdapter()) { methodBuilder.addCode(setter(beanClass, beanName, property, PRE_TYPE_ADAPTER_TO_JAVA+READ_FROM_CURSOR+POST_TYPE_ADAPTER),property.getName(), cursorName, indexName); } else { diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/lang/StringSQLTransform.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/lang/StringSQLTransform.java index 5b2db19df..125e46c16 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/lang/StringSQLTransform.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/lang/StringSQLTransform.java @@ -18,6 +18,7 @@ import com.abubusoft.kripton.android.ColumnAffinityType; import com.abubusoft.kripton.processor.core.ModelProperty; import com.abubusoft.kripton.processor.sqlite.model.SQLiteDaoDefinition; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.transform.TypeAdapterAwareSQLTransform; import com.squareup.javapoet.MethodSpec.Builder; import com.squareup.javapoet.TypeName; @@ -51,7 +52,7 @@ public StringSQLTransform() { * @see com.abubusoft.kripton.processor.sqlite.transform.SQLTransform#generateReadPropertyFromCursor(com.squareup.javapoet.MethodSpec.Builder, com.squareup.javapoet.TypeName, java.lang.String, com.abubusoft.kripton.processor.core.ModelProperty, java.lang.String, java.lang.String) */ @Override - public void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { + public void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { if (property.hasTypeAdapter()) { methodBuilder.addCode(setter(beanClass, beanName, property, PRE_TYPE_ADAPTER_TO_JAVA + READ_FROM_CURSOR + POST_TYPE_ADAPTER), property.getName(), cursorName, indexName); } else { diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/math/BigDecimalSQLTransform.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/math/BigDecimalSQLTransform.java index 52010b9bc..ff6f48bdb 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/math/BigDecimalSQLTransform.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/math/BigDecimalSQLTransform.java @@ -22,6 +22,7 @@ import com.abubusoft.kripton.android.ColumnAffinityType; import com.abubusoft.kripton.processor.core.ModelProperty; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.model.SQLiteModelMethod; import com.abubusoft.kripton.processor.sqlite.transform.AbstractSQLTransform; import com.squareup.javapoet.MethodSpec.Builder; @@ -67,7 +68,7 @@ public void generateWriteProperty2ContentValues(Builder methodBuilder, String be * @see com.abubusoft.kripton.processor.sqlite.transform.SQLTransform#generateReadPropertyFromCursor(com.squareup.javapoet.MethodSpec.Builder, com.squareup.javapoet.TypeName, java.lang.String, com.abubusoft.kripton.processor.core.ModelProperty, java.lang.String, java.lang.String) */ @Override - public void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, + public void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { methodBuilder.addCode(setter(beanClass, beanName, property, "new $T($L.getString($L))"), BigDecimal.class, cursorName, indexName); diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/math/BigIntegerSQLTransform.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/math/BigIntegerSQLTransform.java index 238d6833a..c7a606360 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/math/BigIntegerSQLTransform.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/math/BigIntegerSQLTransform.java @@ -22,6 +22,7 @@ import com.abubusoft.kripton.android.ColumnAffinityType; import com.abubusoft.kripton.processor.core.ModelProperty; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.model.SQLiteModelMethod; import com.abubusoft.kripton.processor.sqlite.transform.AbstractSQLTransform; import com.squareup.javapoet.MethodSpec.Builder; @@ -69,7 +70,7 @@ public void generateWriteProperty2ContentValues(Builder methodBuilder, String be * @see com.abubusoft.kripton.processor.sqlite.transform.SQLTransform#generateReadPropertyFromCursor(com.squareup.javapoet.MethodSpec.Builder, com.squareup.javapoet.TypeName, java.lang.String, com.abubusoft.kripton.processor.core.ModelProperty, java.lang.String, java.lang.String) */ @Override - public void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { + public void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { methodBuilder.addCode(setter(beanClass, beanName, property, "new $T($L.getString($L))"), BigInteger.class, cursorName, indexName); } diff --git a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/util/CurrencySQLTransform.java b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/util/CurrencySQLTransform.java index 1592d76c8..359d5f9eb 100644 --- a/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/util/CurrencySQLTransform.java +++ b/kripton-processor/src/main/java/com/abubusoft/kripton/processor/sqlite/transform/util/CurrencySQLTransform.java @@ -21,6 +21,7 @@ import com.abubusoft.kripton.android.ColumnAffinityType; import com.abubusoft.kripton.common.CurrencyUtils; import com.abubusoft.kripton.processor.core.ModelProperty; +import com.abubusoft.kripton.processor.sqlite.model.SQLiteEntity; import com.abubusoft.kripton.processor.sqlite.model.SQLiteModelMethod; import com.abubusoft.kripton.processor.sqlite.transform.AbstractSQLTransform; import com.squareup.javapoet.MethodSpec.Builder; @@ -39,7 +40,7 @@ public class CurrencySQLTransform extends AbstractSQLTransform { * @see com.abubusoft.kripton.processor.sqlite.transform.SQLTransform#generateReadPropertyFromCursor(com.squareup.javapoet.MethodSpec.Builder, com.squareup.javapoet.TypeName, java.lang.String, com.abubusoft.kripton.processor.core.ModelProperty, java.lang.String, java.lang.String) */ @Override - public void generateReadPropertyFromCursor(Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { + public void generateReadPropertyFromCursor(SQLiteEntity tableEntity, Builder methodBuilder, TypeName beanClass, String beanName, ModelProperty property, String cursorName, String indexName) { methodBuilder.addCode(setter(beanClass, beanName, property, "$T.read($L.getString($L))"), CurrencyUtils.class, cursorName, indexName); } diff --git a/kripton-processor/src/test/java/sqlite/SQLiteCompileTestSuite.java b/kripton-processor/src/test/java/sqlite/SQLiteCompileTestSuite.java index 2c3a5f266..d7f282436 100644 --- a/kripton-processor/src/test/java/sqlite/SQLiteCompileTestSuite.java +++ b/kripton-processor/src/test/java/sqlite/SQLiteCompileTestSuite.java @@ -58,6 +58,7 @@ import sqlite.feature.transaction.TestFeatureTransactionCompile; import sqlite.feature.typeadapter.TestTypeAdapterSuite; import sqlite.feature.typeadapter.kripton180.Test180Suite; +import sqlite.git104.TestGit104; import sqlite.git12.TestGit12; import sqlite.git19.TestGit19Suite; import sqlite.git20.TestGit20Suite; @@ -210,6 +211,7 @@ TestGit21.class, TestGit22.class, TestGit23.class, + TestGit104.class, // kotlin TestKotlinHierarchy.class, diff --git a/kripton-processor/src/test/java/sqlite/git104/AbstractBean.java b/kripton-processor/src/test/java/sqlite/git104/AbstractBean.java new file mode 100644 index 000000000..ab4d0ebd8 --- /dev/null +++ b/kripton-processor/src/test/java/sqlite/git104/AbstractBean.java @@ -0,0 +1,25 @@ +package sqlite.git104; + +import java.time.ZonedDateTime; + +import com.abubusoft.kripton.android.annotation.BindSqlColumn; + +public abstract class AbstractBean { + protected final long id; + + @BindSqlColumn(nullable = false) + protected ZonedDateTime updateTime; + + public AbstractBean(long id, ZonedDateTime updateTime) { + this.id = id; + this.updateTime = updateTime; + } + + public long getId() { + return id; + } + + public ZonedDateTime getUpdateTime() { + return updateTime; + } +} \ No newline at end of file diff --git a/kripton-processor/src/test/java/sqlite/git104/AbstractDao.java b/kripton-processor/src/test/java/sqlite/git104/AbstractDao.java new file mode 100644 index 000000000..fe581e66c --- /dev/null +++ b/kripton-processor/src/test/java/sqlite/git104/AbstractDao.java @@ -0,0 +1,21 @@ +package sqlite.git104; + +import java.util.List; + +import com.abubusoft.kripton.android.annotation.BindSqlDelete; +import com.abubusoft.kripton.android.annotation.BindSqlInsert; +import com.abubusoft.kripton.android.annotation.BindSqlSelect; + +public interface AbstractDao { +// @BindSqlSelect(where = "id=:id") +// E selectById(long id); +// +// @BindSqlSelect +// List selectAll(); +// +// @BindSqlInsert +// long insert(E bean); +// +// @BindSqlDelete(where = "id=:id") +// void deleteById(long id); +} diff --git a/kripton-processor/src/test/java/sqlite/git104/AppDataSource.java b/kripton-processor/src/test/java/sqlite/git104/AppDataSource.java new file mode 100644 index 000000000..4470893e7 --- /dev/null +++ b/kripton-processor/src/test/java/sqlite/git104/AppDataSource.java @@ -0,0 +1,8 @@ +package sqlite.git104; + +import com.abubusoft.kripton.android.annotation.BindDataSource; + +@BindDataSource(daoSet = { DocumentDao.class, }, fileName = "fasa.db", version = 3, schema = true) +public interface AppDataSource { + +} diff --git a/kripton-processor/src/test/java/sqlite/git104/Document.java b/kripton-processor/src/test/java/sqlite/git104/Document.java new file mode 100644 index 000000000..abf95f97d --- /dev/null +++ b/kripton-processor/src/test/java/sqlite/git104/Document.java @@ -0,0 +1,41 @@ +package sqlite.git104; + +import java.time.ZonedDateTime; + +import com.abubusoft.kripton.android.annotation.BindSqlType; + +@BindSqlType(name = "documents") +public class Document extends AbstractBean { + + private final DocumentInfo info; + + public Document(long id, ZonedDateTime updateTime, DocumentInfo info, ZonedDateTime data, String fileName, + String secret) { + super(id, updateTime); + this.info = info; + this.data = data; + this.fileName = fileName; + this.secret = secret; + } + + public String getSecret() { + return secret; + } + + public DocumentInfo getInfo() { + return info; + } + + public ZonedDateTime getData() { + return data; + } + + public String getFileName() { + return fileName; + } + + private final ZonedDateTime data; + private final String fileName; + private final String secret; + +} diff --git a/kripton-processor/src/test/java/sqlite/git104/DocumentDao.java b/kripton-processor/src/test/java/sqlite/git104/DocumentDao.java new file mode 100644 index 000000000..cdfec85a6 --- /dev/null +++ b/kripton-processor/src/test/java/sqlite/git104/DocumentDao.java @@ -0,0 +1,14 @@ +package sqlite.git104; + +import java.util.List; + +import com.abubusoft.kripton.android.annotation.BindDao; +import com.abubusoft.kripton.android.annotation.BindSqlSelect; + +@BindDao(Document.class) +public interface DocumentDao extends AbstractDao { + + @BindSqlSelect(jql = "SELECT fileName, secret, info FROM Document WHERE id=:id and fileName is not null") + List selectFilesForAssistito(long id); + +} diff --git a/kripton-processor/src/test/java/sqlite/git104/DocumentInfo.java b/kripton-processor/src/test/java/sqlite/git104/DocumentInfo.java new file mode 100644 index 000000000..dfa677bea --- /dev/null +++ b/kripton-processor/src/test/java/sqlite/git104/DocumentInfo.java @@ -0,0 +1,24 @@ +package sqlite.git104; + +import com.abubusoft.kripton.annotation.BindType; + +@BindType +public class DocumentInfo { + private final String bucket1; + private final String bucket2; + + public String getBucket1() { + return bucket1; + } + + public String getBucket2() { + return bucket2; + } + + public DocumentInfo(String bucket1, String bucket2) { + super(); + this.bucket1 = bucket1; + this.bucket2 = bucket2; + } + +} diff --git a/kripton-processor/src/test/java/sqlite/git104/FileInfo.java b/kripton-processor/src/test/java/sqlite/git104/FileInfo.java new file mode 100644 index 000000000..d7195bc6a --- /dev/null +++ b/kripton-processor/src/test/java/sqlite/git104/FileInfo.java @@ -0,0 +1,28 @@ +package sqlite.git104; + +import com.abubusoft.kripton.annotation.BindType; + +@BindType +public class FileInfo { + private final String fileName; + private final String secret; + private final DocumentInfo info; + + public FileInfo(String fileName, String secret, DocumentInfo info) { + this.fileName = fileName; + this.secret = secret; + this.info = info; + } + + public DocumentInfo getInfo() { + return info; + } + + public String getFileName() { + return fileName; + } + + public String getSecret() { + return secret; + } +} diff --git a/kripton-processor/src/test/java/sqlite/git104/TestGit104.java b/kripton-processor/src/test/java/sqlite/git104/TestGit104.java new file mode 100644 index 000000000..da6e0cbd6 --- /dev/null +++ b/kripton-processor/src/test/java/sqlite/git104/TestGit104.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright 2015, 2017 Francesco Benincasa (info@abubusoft.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package sqlite.git104; + +import java.io.IOException; + +import org.junit.Test; + +import sqlite.AbstractBindSQLiteProcessorTest; + +/** + * The TestGit104. + * + * @author xcesco + * + * https://github.com/xcesco/kripton/issues/104 + */ +public class TestGit104 extends AbstractBindSQLiteProcessorTest { + + /** + * Test compile. + * + * @throws IOException Signals that an I/O exception has occurred. + * @throws InstantiationException the instantiation exception + * @throws IllegalAccessException the illegal access exception + */ + @Test + public void testCompile() throws IOException, InstantiationException, IllegalAccessException { + //this.expectedException(KriptonProcessorException.class, "Table name 'director' is mapped to entities 'sqlite.git12.Movie' and 'sqlite.git12.Director'"); + buildDataSourceProcessorTest(AbstractBean.class, + AbstractDao.class, + AppDataSource.class, + Document.class, + DocumentDao.class, + DocumentInfo.class, + FileInfo.class + ); + } + +}