Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,62 @@ Tool export query in CSV and XLS / XLSX format
![Java runtime version](https://img.shields.io/badge/run%20on-java%208+-%23113366.svg?style=for-the-badge&logo=openjdk&logoColor=white)
![Java build version](https://img.shields.io/badge/build%20on-java%2011+-%23ED8B00.svg?style=for-the-badge&logo=openjdk&logoColor=white)
![Apache Maven](https://img.shields.io/badge/Apache%20Maven-3.9.0+-C71A36?style=for-the-badge&logo=Apache%20Maven&logoColor=white)

## 1 Quickstart

### 1.1 Create a sample query catalog

```
<query-catalog-config>

<query-catalog id="main-catalog">
<query id="Q001" sql="SELECT * FROM test_export" outputFormat="csv" csvSeparator=";" outputFile="target/catalog_test_001.csv"/>
<query id="Q002" sql="SELECT * FROM test_export" outputFormat="csv" outputFile="target/catalog_test_002.csv"/>
<query id="Q003" sql="SELECT * FROM test_export" outputFormat="html" outputFile="target/catalog_test_003.html" createPath="1"/>
<query id="Q004" sql="SELECT * FROM test_export" outputFormat="xls" outputFile="target/catalog_test_004.xls" xlsResize="1"/>
<query id="Q005" sql="SELECT * FROM test_export" outputFormat="xlsx" outputFile="target/catalog_test_004.xlsx" xlsTemplate="src/test/resources/template/test_template.xlsx" />
</query-catalog>

</query-catalog-config>
```

### 1.2 Load and use the catalog

```
QueryConfigCatalog catalog = QueryConfigCatalog.loadQueryConfigCatalogSafe( "cl://sample/query-catalog-sample.xml" );
try ( Connection conn = ... ) {
catalog.handle( conn , "main-catalog", "Q001");
}
```

## 2 Formats

### 2.1 HTML format

HTML format is handled with core I/O API, no dependency needed.

### 2.2 CSV format

CSV Format needs *OpenCSV* dependency, which is automatically included by default when importing query-export-tool dependency.

If needed it can be added in explicit way :

```
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>${opencsv-version}</version>
</dependency>
```

### 2.3 XLS/XLSX formats

XLS/XLSX Formats needs *Apache POI* dependency, which is *NOT* automatically included by default when importing query-export-tool dependency :

```
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi-version}</version>
</dependency>
```
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

import org.fugerit.java.core.cfg.ConfigRuntimeException;
import org.fugerit.java.core.cfg.xml.CustomListCatalogConfig;
import org.fugerit.java.core.cfg.xml.GenericListCatalogConfig;
import org.fugerit.java.core.function.SafeFunction;
import org.fugerit.java.core.io.helper.HelperIOException;
import org.fugerit.java.core.io.helper.StreamHelper;
import org.fugerit.java.core.lang.helpers.BooleanUtils;
import org.fugerit.java.core.lang.helpers.StringUtils;
import org.fugerit.java.core.util.collection.ListMapStringKey;
Expand All @@ -30,6 +34,29 @@ public QueryConfigCatalog() {
this.getGeneralProps().setProperty( ATT_TYPE , QueryConfig.class.getName() );
}

public static QueryConfigCatalog loadQueryConfigCatalogSafe( String path ) {
return SafeFunction.get( () -> {
QueryConfigCatalog catalog = new QueryConfigCatalog();
try ( InputStream is = StreamHelper.resolveStream( path ) ) {
GenericListCatalogConfig.load( is ,catalog );
}
return catalog;
} );
}

public void handle( Connection conn, String catalogId, String queryId ) throws IOException {
log.info( "handle catalogId : {}, queryId : {}", catalogId, queryId );
ListMapStringKey<QueryConfig> catalog = this.getListMap( catalogId );
if ( catalog == null ) {
throw new IOException( "Catalog not found : "+catalogId );
}
QueryConfig queryConfig = catalog.get( queryId );
if ( queryConfig == null ) {
throw new IOException( "Query not found : "+queryId+" in catalog : "+catalogId );
}
handle(conn, queryConfig);
}

public static void handle( Connection conn, QueryConfig queryConfig ) throws IOException {
HelperIOException.apply( () -> {
QueryExportConfig config = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;

import org.fugerit.java.core.cfg.ConfigRuntimeException;
import org.fugerit.java.core.cfg.xml.GenericListCatalogConfig;
import org.fugerit.java.core.function.SafeFunction;
import org.fugerit.java.core.lang.helpers.ClassHelper;
import org.fugerit.java.query.export.catalog.QueryConfig;
import org.fugerit.java.query.export.catalog.QueryConfigCatalog;
import org.junit.Assert;
Expand All @@ -19,20 +18,24 @@ private boolean testWorkerSingle( QueryConfig queryConfig ) {
return SafeFunction.get( () -> {
logger.info( "test start" );
File outputFile = new File( queryConfig.getOutputFile() );
QueryConfigCatalog.handle(getConnection(), queryConfig);
try ( Connection conn = getConnection() ) {
QueryConfigCatalog.handle( conn, queryConfig);
}
return outputFile.exists();
} );
}

@Test
public void testCatalog() throws IOException {
QueryConfigCatalog catalog = new QueryConfigCatalog();
try ( InputStream is = ClassHelper.loadFromDefaultClassLoader( "sample/query-catalog-sample.xml" ) ) {
GenericListCatalogConfig.load(is, catalog);
catalog.getListMap( "sample-catalog" ).stream().forEach( c -> Assert.assertTrue( this.testWorkerSingle(c) ) );
catalog.getListMap( "fail-catalog" ).stream().forEach(
c -> Assert.assertThrows( ConfigRuntimeException.class, () -> this.testWorkerSingle(c) )
);
public void testCatalog() throws IOException, SQLException {
QueryConfigCatalog catalog = QueryConfigCatalog.loadQueryConfigCatalogSafe( "cl://sample/query-catalog-sample.xml" );
catalog.getListMap( "sample-catalog" ).stream().forEach( c -> Assert.assertTrue( this.testWorkerSingle(c) ) );
catalog.getListMap( "fail-catalog" ).stream().forEach(
c -> Assert.assertThrows( ConfigRuntimeException.class, () -> this.testWorkerSingle(c) ) );
// test specific
try ( Connection conn = getConnection() ) {
catalog.handle( conn , "main-catalog", "Q010");
Assert.assertThrows( IOException.class , () -> catalog.handle(conn, "main-catalog", "not-exists" ) );
Assert.assertThrows( IOException.class , () -> catalog.handle(conn, "not-exists", "not-exists" ) );
}
}

Expand Down
16 changes: 10 additions & 6 deletions src/test/resources/sample/query-catalog-sample.xml
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
<query-catalog-config>

<query-catalog id="sample-catalog">
<query sql="SELECT * FROM test_export" outputFormat="csv" csvSeparator=";" outputFile="target/catalog_test_001.csv"/>
<query sql="SELECT * FROM test_export" outputFormat="csv" outputFile="target/catalog_test_002.csv"/>
<query sql="SELECT * FROM test_export" outputFormat="html" outputFile="target/catalog_test_003.html" createPath="1"/>
<query sql="SELECT * FROM test_export" outputFormat="xls" outputFile="target/catalog_test_004.xls" xlsResize="1"/>
<query sql="SELECT * FROM test_export" outputFormat="xlsx" outputFile="target/catalog_test_004.xlsx" xlsTemplate="src/test/resources/template/test_template.xlsx" />
<query id="Q001" sql="SELECT * FROM test_export" outputFormat="csv" csvSeparator=";" outputFile="target/catalog_test_001.csv"/>
<query id="Q002" sql="SELECT * FROM test_export" outputFormat="csv" outputFile="target/catalog_test_002.csv"/>
<query id="Q003" sql="SELECT * FROM test_export" outputFormat="html" outputFile="target/catalog_test_003.html" createPath="1"/>
<query id="Q004" sql="SELECT * FROM test_export" outputFormat="xls" outputFile="target/catalog_test_004.xls" xlsResize="1"/>
<query id="Q005" sql="SELECT * FROM test_export" outputFormat="xlsx" outputFile="target/catalog_test_004.xlsx" xlsTemplate="src/test/resources/template/test_template.xlsx" />
</query-catalog>

<query-catalog id="fail-catalog">
<query sql="SELECT * FROM test_export" outputFormat="xxx" outputFile="target/catalog_test_fail.xlsx"/>
<query id="QEX1" sql="SELECT * FROM test_export" outputFormat="xxx" outputFile="target/catalog_test_fail.xlsx"/>
</query-catalog>

<query-catalog id="main-catalog">
<query id="Q010" sql="SELECT * FROM test_export" outputFormat="csv" outputFile="target/catalog_test_010.csv"/>
</query-catalog>

</query-catalog-config>