Arquitetura de design para uma ferramenta
Eu tenho um requisito de uma ferramenta que iria capturar dados e, em seguida, salvá-lo em um arquivo excel e gerar sql's para a execução do banco de dados.
Para abordar o mesmo, comecei a projetar e desenvolver um framework que leria o arquivo xml e renderizar a tela de swing para captura de dados e salvá-lo no excel. Agora, cheguei a um estágio em que consegui dados no excel. Agora, eu não sou capaz de decidir a abordagem ainda mais. Tenho uma abordagem em mente para obter os dados da planilha do Excel e criar os sql, mas não confio na abordagem.
A abordagem em que estou pensando é desenvolver mais xml’s (um para cada Esquema em db) que conteria a réplica da estrutura da tabela de banco de dados necessária. No xml da GUI, eu forneceria uma nova tag chamada "databaseMapping" contendo SCHEMA_NAME; TABLE_NAME; COLUMN_NAME. Quando um usuário solicita a geração de sqls para um arquivo específico, eu leio o xml de tela relacionado a esse excel e descubro os mapeamentos do banco de dados e, em seguida, construo os sql’s. Mas estou vendo desafios nessa abordagem:
1) Em um excel, as colunas corresponderiam a mais de uma tabela e poderiam ter colunas espalhadas por diferentes folhas e, portanto, a leitura e a construção do sql seriam uma atividade de consumo de recursos.
2) Ler o Excel em si é tão lento (usando POI), então o desempenho do aplicativo irá diminuir conforme o Excel cresce. Eu acredito que o POI não suporta copiar colunas inteiras de folhas diferentes e construir uma nova pasta de trabalho ou folha? Se isso puder ser feito, ainda assim será administrável. Lendo cada linha e, em seguida, cada célula para construir a nova folha de trabalho temporária na estrutura da tabela db, de modo a gerar sql, não parece muito certo para mim.
XML da GUI
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DataDetails>
<Page pageId="1">
<Column columnName="Branch ID">
<dataType>String</dataType>
<maxLength>3</maxLength>
<isMandatory>true</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Branch Name">
<dataType>String</dataType>
<maxLength>10</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Branch Type">
<dataType>String</dataType>
<maxLength>15</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Location">
<dataType>String</dataType>
<maxLength>3</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Pincode">
<dataType>String</dataType>
<maxLength>3</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
</Page>
<Page pageId="2">
<Column columnName="Business Line">
<dataType>String</dataType>
<maxLength>3</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Branch Currency">
<dataType>Date</dataType>
<maxLength></maxLength>
<isMandatory>false</isMandatory>
<isUnique></isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Action">
<dataType>String</dataType>
<maxLength>10</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices>ComboBoxTest_Single.xlsx - ACTION;ACTION </limitedChoices>
<headerName>CODE_SUB_ID</headerName>
<databaseMapping></databaseMapping>
</Column>
</Page>
</DataDetails>
DB XML (proposta)
<?xml version="1.0" encoding="UTF-8"?>
<table name="tablename">
<column name="column1">
<dataType>varchar</dataType>
<length>20</length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
<isPrimaryKey>Y</isPrimaryKey>
</column>
<column name="column2">
<dataType>timestamp</dataType>
<length></length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column3">
<dataType>varchar</dataType>
<length>20</length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column4">
<dataType>decimal</dataType>
<lengthIntegerPart>24</lengthIntegerPart>
<lengthFractionalPart>6</lengthFractionalPart>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column5">
<dataType>integer</dataType>
<length>1</length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column6">
<dataType>varchar2</dataType>
<length>30</length>
<nullAllowed>N</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column7">
<dataType>date</dataType>
<length></length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column8">
<dataType>decimal</dataType>
<lengthIntegerPart>24</lengthIntegerPart>
<lengthFractionalPart>6</lengthFractionalPart>
<nullAllowed>N</nullAllowed>
<defaultValue></defaultValue>
</column>
</table>
Obrigado !!