All Downloads are FREE. Search and download functionalities are using the official Maven repository.

service.database.command.ExportDatabase Maven / Gradle / Ivy

Go to download

This is a library providing an API for accessing databases via socket connections

The newest version!
package service.database.command;

import databaseconnector.api.Column;
import databaseconnector.api.DatabaseConnection;
import databaseconnector.api.exception.TableNotExistsException;
import databaseconnector.api.sql.SQLDatabaseConnection;
import service.database.exception.DatabaseRoleNotActivatedException;
import service.database.exception.ZipCreationException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ExportDatabase extends AbstractDatabaseCommand {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        setAccessControlAllowOriginHeader(req, resp);

        try{
            SQLDatabaseConnection databaseConnection = getDatabaseConnection();
            Pattern tablePattern = getTablePattern(req);

            Set tableNames = databaseConnection.read(row -> tablePattern.asPredicate().test(row.getTable().getName()))
                    .map(row -> row.getTable().getName().toLowerCase())
                    .collect(Collectors.toSet());

            resp.setContentType("application/zip");

            ZipOutputStream zipOutputStream = new ZipOutputStream(resp.getOutputStream(), StandardCharsets.UTF_8);
            tableNames.forEach(tableName -> {
                ZipEntry zipEntry = new ZipEntry(String.format("%s.csv", tableName));
                try {
                    zipOutputStream.putNextEntry(zipEntry);
                } catch (IOException e) {
                    throw new ZipCreationException(e);
                }
                PrintWriter writer = new PrintWriter(zipOutputStream, true);

                try {
                    List columnNames = databaseConnection.getColumns(tableName).stream()
                            .map(Column::getName)
                            .collect(Collectors.toList());
                    writer.println(String.join(";", columnNames));
                    databaseConnection.read(row -> row.getTable().getName().equalsIgnoreCase(tableName)).forEach(row -> {
                        List values = columnNames.stream().map(columnName -> {
                            Optional rowColumn = row.getColumns().stream()
                                    .filter(column -> column.getName().equalsIgnoreCase(columnName))
                                    .findAny();
                            if (!rowColumn.isPresent()){
                                return "";
                            }
                            Optional value = row.get(rowColumn.get());
                            if (!value.isPresent()){
                                return "";
                            }
                            return value.get().get();
                        }).collect(Collectors.toList());
                        String valueString = String.join(";", values);
                        writer.println(valueString);
                    });
                } catch (TableNotExistsException e) {
                    throw new ZipCreationException(e);
                }
                writer.flush();
            });
            zipOutputStream.close();
            resp.setStatus(200);
        } catch (DatabaseRoleNotActivatedException exception) {
            displayError(resp, 501, exception.getMessage());
        } catch (ZipCreationException exception) {
            displayError(resp, 500, exception.getMessage());
        }
    }

    public static String getCommand(){
        return "/command/database/export";
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy