Skip to content

Commit

Permalink
Fix #228 [skip ci]
Browse files Browse the repository at this point in the history
  • Loading branch information
hmiguim committed Jul 8, 2020
1 parent 98a11c7 commit c4779ad
Show file tree
Hide file tree
Showing 10 changed files with 144 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.databasepreservation.common.client.models.structure.ViewerRow;
import com.databasepreservation.common.client.models.structure.ViewerType;
import com.databasepreservation.common.client.tools.ViewerStringUtils;
import com.databasepreservation.common.utils.LobManagerUtils;
import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.Template;

Expand Down Expand Up @@ -64,7 +65,12 @@ public static List<String> getCellValues(ViewerRow row, TableStatus configTable,
if (StringUtils.isNotBlank(applied)) {
values.add(applied);
} else {
values.add(row.getCells().get(solrColumnName).getValue());
final String value = row.getCells().get(solrColumnName).getValue();
if (columnConfig.getType().equals(ViewerType.dbTypes.BINARY)) {
values.add(LobManagerUtils.getDefaultFilename(row.getUuid()));
} else {
values.add(row.getCells().get(solrColumnName).getValue());
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static com.databasepreservation.common.client.ViewerConstants.SOLR_SEARCHES_DATABASE_UUID;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
Expand All @@ -28,10 +29,7 @@
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.databasepreservation.common.client.exceptions.AuthorizationException;
import com.databasepreservation.common.server.controller.UserLoginController;
import com.databasepreservation.common.server.controller.UserLoginHelper;
import com.databasepreservation.common.utils.UserUtility;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.roda.core.data.exceptions.GenericException;
import org.roda.core.data.exceptions.NotFoundException;
Expand Down Expand Up @@ -65,6 +63,7 @@
import com.databasepreservation.common.client.ViewerConstants;
import com.databasepreservation.common.client.common.search.SavedSearch;
import com.databasepreservation.common.client.common.search.SearchInfo;
import com.databasepreservation.common.client.exceptions.AuthorizationException;
import com.databasepreservation.common.client.exceptions.RESTException;
import com.databasepreservation.common.client.exceptions.SavedSearchException;
import com.databasepreservation.common.client.index.FindRequest;
Expand All @@ -76,7 +75,6 @@
import com.databasepreservation.common.client.models.status.collection.CollectionStatus;
import com.databasepreservation.common.client.models.status.collection.LargeObjectConsolidateProperty;
import com.databasepreservation.common.client.models.status.collection.TableStatus;
import com.databasepreservation.common.client.models.status.database.DatabaseStatus;
import com.databasepreservation.common.client.models.status.denormalization.DenormalizeConfiguration;
import com.databasepreservation.common.client.models.structure.ViewerDatabase;
import com.databasepreservation.common.client.models.structure.ViewerDatabaseStatus;
Expand All @@ -86,7 +84,6 @@
import com.databasepreservation.common.client.services.CollectionService;
import com.databasepreservation.common.client.tools.ViewerStringUtils;
import com.databasepreservation.common.exceptions.ViewerException;
import com.databasepreservation.common.server.ConfigurationManager;
import com.databasepreservation.common.server.ViewerConfiguration;
import com.databasepreservation.common.server.ViewerFactory;
import com.databasepreservation.common.server.controller.SIARDController;
Expand All @@ -97,7 +94,8 @@
import com.databasepreservation.common.server.index.utils.JsonTransformer;
import com.databasepreservation.common.server.index.utils.SolrUtils;
import com.databasepreservation.common.utils.ControllerAssistant;
import com.databasepreservation.common.utils.LobPathManager;
import com.databasepreservation.common.utils.LobManagerUtils;
import com.databasepreservation.common.utils.UserUtility;

import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
Expand Down Expand Up @@ -165,9 +163,12 @@ public String createCollection(String databaseUUID) {

LogEntryState state = LogEntryState.SUCCESS;
User user;
// Checks if property ui.plugin.loadOnAccess is enable. If so, let the authenticated user
// creates a collection for that SIARD. If the user is a guest it will throw an AuthorizationException
final boolean loadOnAccess = ViewerFactory.getViewerConfiguration().getViewerConfigurationAsBoolean(false, ViewerConstants.PROPERTY_PLUGIN_LOAD_ON_ACCESS);
// Checks if property ui.plugin.loadOnAccess is enable. If so, let the
// authenticated user
// creates a collection for that SIARD. If the user is a guest it will throw an
// AuthorizationException
final boolean loadOnAccess = ViewerFactory.getViewerConfiguration().getViewerConfigurationAsBoolean(false,
ViewerConstants.PROPERTY_PLUGIN_LOAD_ON_ACCESS);
if (loadOnAccess) {
user = UserUtility.getUser(request);
if (user.isGuest()) {
Expand Down Expand Up @@ -468,8 +469,7 @@ public ViewerRow retrieveRow(String databaseUUID, String collectionUUID, String
public Response exportLOB(@PathParam(ViewerConstants.API_PATH_PARAM_DATABASE_UUID) String databaseUUID,
@PathParam(ViewerConstants.API_PATH_PARAM_COLLECTION_UUID) String collectionUUID,
@PathParam("schema") String schema, @PathParam("table") String table, @PathParam("rowIndex") String rowIndex,
@PathParam("columnIndex") Integer columnIndex,
@QueryParam(ViewerConstants.API_PATH_PARAM_LOB_FILENAME) String filename) {
@PathParam("columnIndex") Integer columnIndex) {

ControllerAssistant controllerAssistant = new ControllerAssistant() {};

Expand Down Expand Up @@ -501,14 +501,13 @@ public Response exportLOB(@PathParam(ViewerConstants.API_PATH_PARAM_DATABASE_UUI
// register action
controllerAssistant.registerAction(user, state, ViewerConstants.CONTROLLER_DATABASE_ID_PARAM, databaseUUID,
ViewerConstants.CONTROLLER_TABLE_ID_PARAM, schema + "." + table, ViewerConstants.CONTROLLER_ROW_ID_PARAM,
rowIndex, ViewerConstants.CONTROLLER_COLUMN_ID_PARAM, columnIndex, ViewerConstants.CONTROLLER_FILENAME_PARAM,
filename);
rowIndex, ViewerConstants.CONTROLLER_COLUMN_ID_PARAM, columnIndex);
}
}

private Response handleConsolidatedLobDownload(String databaseUUID, TableStatus tableConfiguration, int columnIndex,
ViewerRow row, String rowIndex) throws IOException {
final java.nio.file.Path consolidatedPath = LobPathManager.getConsolidatedPath(
final java.nio.file.Path consolidatedPath = LobManagerUtils.getConsolidatedPath(
ViewerFactory.getViewerConfiguration(), databaseUUID, tableConfiguration.getUuid(), columnIndex, rowIndex);
String handlebarsFilename = HandlebarsUtils.applyExportTemplate(row, tableConfiguration, columnIndex);
if (ViewerStringUtils.isBlank(handlebarsFilename)) {
Expand All @@ -518,7 +517,7 @@ private Response handleConsolidatedLobDownload(String databaseUUID, TableStatus
return ApiUtils.okResponse(
new StreamResponse(handlebarsFilename, tableConfiguration.getColumnByIndex(columnIndex).getApplicationType(),
DownloadUtils
.stream(Files.newInputStream(LobPathManager.getConsolidatedPath(ViewerFactory.getViewerConfiguration(),
.stream(Files.newInputStream(LobManagerUtils.getConsolidatedPath(ViewerFactory.getViewerConfiguration(),
databaseUUID, row.getTableId(), columnIndex, rowIndex)))));
}

Expand All @@ -542,21 +541,34 @@ private Response handleExternalLobDownload(TableStatus tableConfiguration, Viewe

private Response handleInternalLobDownload(String databasePath, TableStatus tableConfiguration, ViewerRow row,
int columnIndex) throws IOException, GenericException {
ZipFile zipFile = new ZipFile(databasePath);
final ZipEntry entry = zipFile.getEntry(LobPathManager.getZipFilePath(tableConfiguration, columnIndex, row));
if (entry == null) {
throw new GenericException("Zip archive entry is missing");
}

String handlebarsFilename = HandlebarsUtils.applyExportTemplate(row, tableConfiguration, columnIndex);

if (ViewerStringUtils.isBlank(handlebarsFilename)) {
handlebarsFilename = row.getCells().get(tableConfiguration.getColumnByIndex(columnIndex).getId()).getValue();
handlebarsFilename = ViewerConstants.SIARD_RECORD_PREFIX + row.getUuid()
+ ViewerConstants.SIARD_LOB_FILE_EXTENSION;
}

return ApiUtils.okResponse(
new StreamResponse(handlebarsFilename, tableConfiguration.getColumnByIndex(columnIndex).getApplicationType(),
DownloadUtils.stream(new BufferedInputStream(zipFile.getInputStream(entry)))));
if (LobManagerUtils.isLobEmbedded(tableConfiguration, row, columnIndex)) {
// handle lob as embedded
String lobCellValue = LobManagerUtils.getLobCellValue(tableConfiguration, row, columnIndex);
lobCellValue = lobCellValue.replace(ViewerConstants.SIARD_EMBEDDED_LOB_PREFIX, "");
String decodedString = new String(Base64.decodeBase64(lobCellValue.getBytes()));

return ApiUtils.okResponse(
new StreamResponse(handlebarsFilename, tableConfiguration.getColumnByIndex(columnIndex).getApplicationType(),
DownloadUtils.stream(new BufferedInputStream(new ByteArrayInputStream(decodedString.getBytes())))));
} else {
// handle lob as internal on separated folder
ZipFile zipFile = new ZipFile(databasePath);
final ZipEntry entry = zipFile.getEntry(LobManagerUtils.getZipFilePath(tableConfiguration, columnIndex, row));
if (entry == null) {
throw new GenericException("Zip archive entry is missing");
}

return ApiUtils.okResponse(
new StreamResponse(handlebarsFilename, tableConfiguration.getColumnByIndex(columnIndex).getApplicationType(),
DownloadUtils.stream(new BufferedInputStream(zipFile.getInputStream(entry)))));
}
}

@GET
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.databasepreservation.common.api.v1.utils;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
Expand All @@ -15,6 +17,7 @@
import java.util.stream.Stream;
import java.util.zip.ZipFile;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
Expand All @@ -35,7 +38,7 @@
import com.databasepreservation.common.server.ViewerFactory;
import com.databasepreservation.common.server.index.utils.IterableIndexResult;
import com.databasepreservation.common.utils.FilenameUtils;
import com.databasepreservation.common.utils.LobPathManager;
import com.databasepreservation.common.utils.LobManagerUtils;

/**
* @author Miguel Guimarães <mguimaraes@keep.pt>
Expand Down Expand Up @@ -145,7 +148,7 @@ private void writeToZipFile(ZipFile siardArchive, ZipArchiveOutputStream out, Vi
if (configTable.getColumnByIndex(binaryColumn.getColumnIndex()).isExternalLob()) {
handleWriteExternalLobs(out, binaryColumn, row, cellEntry.getValue());
} else {
handleWriteInternalLobs(out, siardArchive, binaryColumn, row, cellEntry.getValue());
handleWriteInternalLobs(out, siardArchive, binaryColumn, row);
}
}
}
Expand Down Expand Up @@ -185,7 +188,7 @@ private ByteArrayOutputStream writeCSVFile(int nIndex, boolean all) throws IOExc

private void handleWriteConsolidateLobs(ZipArchiveOutputStream out, ColumnStatus binaryColumn, ViewerRow row)
throws IOException {
final Path consolidatedPath = LobPathManager.getConsolidatedPath(ViewerFactory.getViewerConfiguration(),
final Path consolidatedPath = LobManagerUtils.getConsolidatedPath(ViewerFactory.getViewerConfiguration(),
databaseUUID, configTable.getId(), binaryColumn.getColumnIndex(), row.getUuid());

InputStream in = new FileInputStream(consolidatedPath.toFile());
Expand All @@ -195,11 +198,20 @@ private void handleWriteConsolidateLobs(ZipArchiveOutputStream out, ColumnStatus
}

private void handleWriteInternalLobs(ZipArchiveOutputStream out, ZipFile siardArchive, ColumnStatus binaryColumn,
ViewerRow row, ViewerCell cell) throws IOException {
final String templateFilename = FilenameUtils.getTemplateFilename(row, configTable, binaryColumn, cell.getValue());
final InputStream in = siardArchive.getInputStream(
siardArchive.getEntry(LobPathManager.getZipFilePath(configTable, binaryColumn.getColumnIndex(), row)));
addEntryToZip(out, in, templateFilename);
ViewerRow row) throws IOException {
final String templateFilename = FilenameUtils.getTemplateFilename(row, configTable, binaryColumn);

if (LobManagerUtils.isLobEmbedded(configTable, row, binaryColumn.getColumnIndex())) {
String lobCellValue = LobManagerUtils.getLobCellValue(configTable, row, binaryColumn.getColumnIndex());
lobCellValue = lobCellValue.replace(ViewerConstants.SIARD_EMBEDDED_LOB_PREFIX, "");
String decodedString = new String(Base64.decodeBase64(lobCellValue.getBytes()));

addEntryToZip(out, new BufferedInputStream(new ByteArrayInputStream(decodedString.getBytes())), templateFilename);
} else {
final InputStream in = siardArchive.getInputStream(
siardArchive.getEntry(LobManagerUtils.getZipFilePath(configTable, binaryColumn.getColumnIndex(), row)));
addEntryToZip(out, in, templateFilename);
}
}

private void handleWriteExternalLobs(ZipArchiveOutputStream out, ColumnStatus binaryColumn, ViewerRow row,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.databasepreservation.common.api.v1.utils;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
Expand All @@ -12,6 +14,7 @@
import java.util.Map;
import java.util.zip.ZipFile;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
Expand All @@ -30,7 +33,7 @@
import com.databasepreservation.common.client.models.structure.ViewerRow;
import com.databasepreservation.common.server.ViewerFactory;
import com.databasepreservation.common.utils.FilenameUtils;
import com.databasepreservation.common.utils.LobPathManager;
import com.databasepreservation.common.utils.LobManagerUtils;

/**
* @author Miguel Guimarães <mguimaraes@keep.pt>
Expand Down Expand Up @@ -110,7 +113,7 @@ private void writeToZipFile(ZipFile siardArchive, ZipArchiveOutputStream out, Vi
if (configTable.getColumnByIndex(binaryColumn.getColumnIndex()).isExternalLob()) {
handleWriteExternalLobs(out, binaryColumn, row, cellEntry.getValue());
} else {
handleWriteInternalLobs(out, siardArchive, binaryColumn, row, cellEntry.getValue());
handleWriteInternalLobs(out, siardArchive, binaryColumn, row);
}
}
}
Expand All @@ -129,7 +132,7 @@ private ByteArrayOutputStream writeCSVFile() throws IOException {

private void handleWriteConsolidateLobs(ZipArchiveOutputStream out, ColumnStatus binaryColumn, ViewerRow row)
throws IOException {
final Path consolidatedPath = LobPathManager.getConsolidatedPath(ViewerFactory.getViewerConfiguration(),
final Path consolidatedPath = LobManagerUtils.getConsolidatedPath(ViewerFactory.getViewerConfiguration(),
database.getUuid(), configTable.getId(), binaryColumn.getColumnIndex(), row.getUuid());

InputStream in = new FileInputStream(consolidatedPath.toFile());
Expand All @@ -139,11 +142,20 @@ private void handleWriteConsolidateLobs(ZipArchiveOutputStream out, ColumnStatus
}

private void handleWriteInternalLobs(ZipArchiveOutputStream out, ZipFile siardArchive, ColumnStatus binaryColumn,
ViewerRow row, ViewerCell cell) throws IOException {
final String templateFilename = FilenameUtils.getTemplateFilename(row, configTable, binaryColumn, cell.getValue());
final InputStream in = siardArchive.getInputStream(
siardArchive.getEntry(LobPathManager.getZipFilePath(configTable, binaryColumn.getColumnIndex(), row)));
addEntryToZip(out, in, templateFilename);
ViewerRow row) throws IOException {
final String templateFilename = FilenameUtils.getTemplateFilename(row, configTable, binaryColumn);

if (LobManagerUtils.isLobEmbedded(configTable, row, binaryColumn.getColumnIndex())) {
String lobCellValue = LobManagerUtils.getLobCellValue(configTable, row, binaryColumn.getColumnIndex());
lobCellValue = lobCellValue.replace(ViewerConstants.SIARD_EMBEDDED_LOB_PREFIX, "");
String decodedString = new String(Base64.decodeBase64(lobCellValue.getBytes()));

addEntryToZip(out, new BufferedInputStream(new ByteArrayInputStream(decodedString.getBytes())), templateFilename);
} else {
final InputStream in = siardArchive.getInputStream(
siardArchive.getEntry(LobManagerUtils.getZipFilePath(configTable, binaryColumn.getColumnIndex(), row)));
addEntryToZip(out, in, templateFilename);
}
}

private void handleWriteExternalLobs(ZipArchiveOutputStream out, ColumnStatus binaryColumn, ViewerRow row,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,9 @@ public class ViewerConstants {
public static final String SIARD_SCHEMA_PREFIX = "schema";
public static final String SIARD_LOB_FOLDER_PREFIX = "lob";
public static final String SIARD_RECORD_PREFIX = "record";
public static final String SIARD_LOB_OUTSIDE_PREFIX = "external:";
public static final String SIARD_LOB_INSIDE_PREFIX = "internal:";
public static final String SIARD_EMBEDDED_LOB_PREFIX = "base64:";
public static final String SIARD_LOB_FILE_EXTENSION = ".bin";

public static final String DEFAULT_USERNAME = "admin";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -503,8 +503,6 @@ private String getExportURL(String zipFilename, String filename, boolean exportA

Sublist sublist;

GWT.log("exportall:" + exportAll);

if (!exportAll) {
sublist = currentSubList;
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,7 @@ public static String createExportLobUri(String databaseUUID, String schemaName,

return GWT.getHostPageBaseURL() + ViewerConstants.API_SERVLET + ViewerConstants.API_V1_DATABASE_RESOURCE + "/"
+ databaseUUID + "/collection/" + databaseUUID + "/data/" + schemaName + "/" + tableName + "/" + rowIndex + "/"
+ columnIndex + ViewerConstants.API_QUERY_START + ViewerConstants.API_PATH_PARAM_LOB_FILENAME + "="
+ UriQueryUtils.encodeQuery(filename);
+ columnIndex;
}

public static String createExportTableUri(String databaseUUID, String schemaName, String tableName,
Expand Down
Loading

0 comments on commit c4779ad

Please sign in to comment.