diff --git a/auth/auth-client/pom.xml b/auth/auth-client/pom.xml index 6f3a06071b..4439cc38c3 100644 --- a/auth/auth-client/pom.xml +++ b/auth/auth-client/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/auth/auth-core/pom.xml b/auth/auth-core/pom.xml index c08f2f6720..b8ff1582fe 100644 --- a/auth/auth-core/pom.xml +++ b/auth/auth-core/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/auth/auth-store/pom.xml b/auth/auth-store/pom.xml index 81142319a2..c85aa2d8d6 100644 --- a/auth/auth-store/pom.xml +++ b/auth/auth-store/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/auth/auth-util/pom.xml b/auth/auth-util/pom.xml index 279a50d398..d7c9eac52f 100644 --- a/auth/auth-util/pom.xml +++ b/auth/auth-util/pom.xml @@ -3,7 +3,7 @@ emodb com.bazaarvoice.emodb - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/blob-api/pom.xml b/blob-api/pom.xml index 35a35c0aeb..91e785ae2d 100644 --- a/blob-api/pom.xml +++ b/blob-api/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/blob-clients/blob-client-common/pom.xml b/blob-clients/blob-client-common/pom.xml index c1ec96d2dc..6d8b72a021 100644 --- a/blob-clients/blob-client-common/pom.xml +++ b/blob-clients/blob-client-common/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/blob-clients/blob-client-jersey2/pom.xml b/blob-clients/blob-client-jersey2/pom.xml index b0c1ea3708..d6606994ef 100644 --- a/blob-clients/blob-client-jersey2/pom.xml +++ b/blob-clients/blob-client-jersey2/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/blob-clients/blob-client/pom.xml b/blob-clients/blob-client/pom.xml index 1cdfb57fe4..3ab34c3528 100644 --- a/blob-clients/blob-client/pom.xml +++ b/blob-clients/blob-client/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/blob/pom.xml b/blob/pom.xml index a1708a21d8..6650cb9b04 100644 --- a/blob/pom.xml +++ b/blob/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml @@ -234,5 +234,10 @@ jersey-client test + + org.glassfish + javax.json + 1.0.4 + diff --git a/blob/src/main/java/com/bazaarvoice/emodb/blob/api/Attributes.java b/blob/src/main/java/com/bazaarvoice/emodb/blob/api/Attributes.java new file mode 100644 index 0000000000..d22d0fc6b0 --- /dev/null +++ b/blob/src/main/java/com/bazaarvoice/emodb/blob/api/Attributes.java @@ -0,0 +1,79 @@ +package com.bazaarvoice.emodb.blob.api; + +public class Attributes { + private String client; + private String contentType; + private String legacyInternalId; + private String platformclient; + private String size; + private String type; + + public Attributes(String client, String contentType, String legacyInternalId, String platformclient, String size, String type) { + this.client = client; + this.contentType = contentType; + this.legacyInternalId = legacyInternalId; + this.platformclient = platformclient; + this.size = size; + this.type = type; + } + + public String getClient() { + return client; + } + + public void setClient(String client) { + this.client = client; + } + + public String getContentType() { + return contentType; + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + + public String getLegacyInternalId() { + return legacyInternalId; + } + + public void setLegacyInternalId(String legacyInternalId) { + this.legacyInternalId = legacyInternalId; + } + + public String getPlatformclient() { + return platformclient; + } + + public void setPlatformclient(String platformclient) { + this.platformclient = platformclient; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public String toString() { + return "{" + + "\"client\": \"" + client + "\"" + + ", \"contentType\": \"" + contentType + "\"" + + ", \"legacyInternalId\": \"" + legacyInternalId + "\"" + + ", \"platformclient\": \"" + platformclient + "\"" + + ", \"size\": \"" + size + "\"" + + ", \"type\": \"" + type + "\"" + + "}"; + } +} diff --git a/blob/src/main/java/com/bazaarvoice/emodb/blob/api/BlobAttributes.java b/blob/src/main/java/com/bazaarvoice/emodb/blob/api/BlobAttributes.java new file mode 100644 index 0000000000..9eca539e8d --- /dev/null +++ b/blob/src/main/java/com/bazaarvoice/emodb/blob/api/BlobAttributes.java @@ -0,0 +1,79 @@ +package com.bazaarvoice.emodb.blob.api; + +public class BlobAttributes { + private String id; + private String timestamp; + private long length; + private String md5; + private String sha1; + private Attributes attributes; + + public BlobAttributes(String id, String timestamp, long length, String md5, String sha1, Attributes attributes) { + this.id = id; + this.timestamp = timestamp; + this.length = length; + this.md5 = md5; + this.sha1 = sha1; + this.attributes = attributes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + + public long getLength() { + return length; + } + + public void setLength(long length) { + this.length = length; + } + + public String getMd5() { + return md5; + } + + public void setMd5(String md5) { + this.md5 = md5; + } + + public String getSha1() { + return sha1; + } + + public void setSha1(String sha1) { + this.sha1 = sha1; + } + + public Attributes getAttributes() { + return attributes; + } + + public void setAttributes(Attributes attributes) { + this.attributes = attributes; + } + + @Override + public String toString() { + return "{" + + "\"id\": \"" + id + "\"" + + ", \"timestamp\": \"" + timestamp + "\"" + + ", \"length\": \"" + length + "\"" + + ", \"md5\": \"" + md5 + "\"" + + ", \"sha1\": \"" + sha1 + "\"" + + ", \"attributes\": " + attributes + + "}"; + } +} diff --git a/blob/src/main/java/com/bazaarvoice/emodb/blob/api/TenantRequest.java b/blob/src/main/java/com/bazaarvoice/emodb/blob/api/TenantRequest.java new file mode 100644 index 0000000000..61dc7eb524 --- /dev/null +++ b/blob/src/main/java/com/bazaarvoice/emodb/blob/api/TenantRequest.java @@ -0,0 +1,23 @@ +package com.bazaarvoice.emodb.blob.api; + +public class TenantRequest { + + private String tenantName; + + public TenantRequest(String tenantName) { + this.tenantName = tenantName; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + @Override + public String toString() { + return "{\"tenantName\":\"" + tenantName + "\"}"; + } +} diff --git a/blob/src/main/java/com/bazaarvoice/emodb/blob/api/UploadByteRequestBody.java b/blob/src/main/java/com/bazaarvoice/emodb/blob/api/UploadByteRequestBody.java new file mode 100644 index 0000000000..5504c5bc77 --- /dev/null +++ b/blob/src/main/java/com/bazaarvoice/emodb/blob/api/UploadByteRequestBody.java @@ -0,0 +1,46 @@ +package com.bazaarvoice.emodb.blob.api; + +public class UploadByteRequestBody { + private String base64; + private String tenantName; + private BlobAttributes blobAttributes; + + public UploadByteRequestBody(String base64, String tenantName, BlobAttributes blobAttributes) { + this.base64 = base64; + this.tenantName = tenantName; + this.blobAttributes = blobAttributes; + } + + public String getBase64() { + return base64; + } + + public void setBase64(String base64) { + this.base64 = base64; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public BlobAttributes getBlobAttributes() { + return blobAttributes; + } + + public void setBlobAttributes(BlobAttributes blobAttributes) { + this.blobAttributes = blobAttributes; + } + + @Override + public String toString() { + return "{" + + "\"base64\": \"" + base64 + "\"" + + ", \"tenantName\": \"" + tenantName + "\"" + + ", \"blobAttributes\": " + blobAttributes + + "}"; + } +} diff --git a/blob/src/main/java/com/bazaarvoice/emodb/blob/config/ApiClient.java b/blob/src/main/java/com/bazaarvoice/emodb/blob/config/ApiClient.java new file mode 100644 index 0000000000..f3c0067bb7 --- /dev/null +++ b/blob/src/main/java/com/bazaarvoice/emodb/blob/config/ApiClient.java @@ -0,0 +1,356 @@ +package com.bazaarvoice.emodb.blob.config; + +import com.bazaarvoice.emodb.blob.api.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.json.*; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +public class ApiClient { + + private static final Logger LOGGER = LoggerFactory.getLogger(ApiClient.class); + private final String BASE_URL = "https://cert-blob-media-service.qa.us-east-1.nexus.bazaarvoice.com/blob"; +// private final String BASE_URL = "https://uat-blob-media-service.prod.us-east-1.nexus.bazaarvoice.com/blob"; +// private final String BASE_URL = "http://localhost:8082/blob"; + private final String TENANT_NAME = "datastorage"; + public final String SUCCESS_MSG = "Successfully deleted blob."; + + public Iterator getBlobMetadata(String fromBlobIdExclusive) { + try { + LOGGER.debug(" Constructing URL and consuming datastorage-media-service URL "); + // Constructing URL with path variable and query parameters. + String urlString = String.format("%s/%s/%s", + BASE_URL, + URLEncoder.encode(fromBlobIdExclusive, "UTF-8"), + "metadata"); + + URL url = new URL(urlString); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + + // Setting headers + connection.setRequestProperty("Accept", "application/json"); + + int responseCode = connection.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String inputLine; + StringBuilder response = new StringBuilder(); + + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + LOGGER.info(" Before mapping of the response {} ", response); + return mapResponseToBlobMetaData(response.toString()).iterator(); + } else { + LOGGER.debug(" GET operation halted with error "); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + public String deleteBlobFromTable(String tableName, String blobId) { + try { + LOGGER.debug(" Constructing URL and consuming datastorage-media-service delete blob URL "); + String[] parts = tableName.split(":"); + String table = parts[0]; + String clientName = parts[1]; + TenantRequest tenantRequest = new TenantRequest(TENANT_NAME); + + // Constructing URL with path variable and query parameters. + String urlString = String.format("%s/%s:%s/%s", + BASE_URL + "/delete", + URLEncoder.encode(table, "UTF-8"), + URLEncoder.encode(clientName, "UTF-8"), + URLEncoder.encode(blobId, "UTF-8")); + + LOGGER.info(" URL {} ", urlString); + URL url = new URL(urlString); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("DELETE"); + + // Setting headers + connection.setRequestProperty("Content-Type", "application/json; utf-8"); + connection.setRequestProperty("Accept", "application/json"); + + // Enable output for the request body + connection.setDoOutput(true); + + // Write the request body + try (OutputStream os = connection.getOutputStream()) { + byte[] input = tenantRequest.toString().getBytes(StandardCharsets.UTF_8); + os.write(input, 0, input.length); + } + + int responseCode = connection.getResponseCode(); + + if (responseCode == HttpURLConnection.HTTP_OK) { + LOGGER.debug(" Blob with id {} deleted successfully", blobId); + return SUCCESS_MSG; + } else { + LOGGER.debug(" Blob with id {} didn't get deleted ", blobId); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + public void uploadBlobFromByteArray(String tableName, String blobId, String md5, String sha1, Map attributes, + InputStream inputStream) { + try { + LOGGER.debug(" Constructing URL and consuming datastorage-media-service upload blob byte array URL "); + String[] parts = tableName.split(":"); + String table = parts[0]; + String clientName = parts[1]; + UploadByteRequestBody uploadByteRequestBody = createUploadBlobRequestBody(table, clientName, blobId, + md5, sha1, attributes, inputStream); + // Constructing URL with path variable and query parameters. + String urlString = String.format("%s/%s:%s/%s?contentType=%s", + BASE_URL + "/uploadByteArray", + URLEncoder.encode(table, "UTF-8"), + URLEncoder.encode(clientName, "UTF-8"), + URLEncoder.encode(blobId, "UTF-8"), + URLEncoder.encode("image/jpeg", "UTF-8")); + + LOGGER.info(" URL {} ", urlString); + URL url = new URL(urlString); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + + // Setting headers + connection.setRequestProperty("Content-Type", "application/json; utf-8"); + connection.setRequestProperty("Accept", "*/*"); + connection.setRequestProperty("X-BV-API-KEY", "cert_admin"); + + // Enable output for the request body + connection.setDoOutput(true); + + // Write the request body + try (OutputStream os = connection.getOutputStream()) { + byte[] input = uploadByteRequestBody.toString().getBytes(StandardCharsets.UTF_8); + os.write(input, 0, input.length); + } + + + int responseCode = connection.getResponseCode(); + + if (responseCode == HttpURLConnection.HTTP_OK) { + LOGGER.debug(" Blob with id {} uploaded successfully", blobId); + } else { + LOGGER.debug(" Blob with id {} didn't get uploaded ", blobId); + } + } catch (Exception e) { + LOGGER.error(" Exception occurred during putting the object to s3 ", e); + } + + } + + public byte[] getBlob(String tableName, String blobId, Map headers) { + try { + // Define the path variables + String[] parts = tableName.split(":"); + String table = parts[0]; + String clientName = parts[1]; + String inputLine; + + // Build the URL for the endpoint + String endpointUrl = String.format("%s/%s/%s/%s/%s", + BASE_URL, + URLEncoder.encode(TENANT_NAME, "UTF-8"), + URLEncoder.encode(table, "UTF-8"), + URLEncoder.encode(clientName, "UTF-8"), + URLEncoder.encode(blobId, "UTF-8")); + + // Create a URL object + URL url = new URL(endpointUrl); + + // Open a connection to the URL + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + // Set the request method to GET + connection.setRequestMethod("GET"); + + //Set "Connection" header to "keep-alive" + connection.setRequestProperty("Connection", "keep-alive"); + + // Get the response code + int responseCode = connection.getResponseCode(); + System.out.println("Response Code: " + responseCode); + + // Check if the response is OK (200) + if (responseCode == HttpURLConnection.HTTP_OK) { + Map> responseHeaders = connection.getHeaderFields(); + + // Print each header key and its values + for (Map.Entry> entry : responseHeaders.entrySet()) { + String headerName = entry.getKey(); + List headerValues = entry.getValue(); + + System.out.println("Header: " + headerName); + for (String value : headerValues) { + headers.put(headerName, value); + System.out.println("Value: " + value); + } + } + InputStream inputStream = connection.getInputStream(); + + // Read the input stream into a byte array + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int bytesRead; + + // Read the input stream into the buffer and write to ByteArrayOutputStream + while ((bytesRead = inputStream.read(buffer)) != -1) { + byteArrayOutputStream.write(buffer, 0, bytesRead); + } + + // Convert the ByteArrayOutputStream to a byte array + byte[] responseBytes = byteArrayOutputStream.toByteArray(); + + // Optionally, you can do something with the byte array (e.g., save it as a file) + System.out.println("Response received as byte array, length: " + responseBytes.length); + + // Close the streams + inputStream.close(); + byteArrayOutputStream.close(); + return responseBytes; + } else if (responseCode == HttpURLConnection.HTTP_NOT_FOUND) { + System.out.println("Blob not found (404)"); + + } else if (responseCode == HttpURLConnection.HTTP_INTERNAL_ERROR) { + System.out.println("Internal server error (500)"); + + } else { + System.out.println("Unexpected response code: " + responseCode); + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + private List mapResponseToBlobMetaData(String response) { + + // Parse JSON string to JsonObject + JsonReader jsonReader = Json.createReader(new StringReader(response)); + JsonObject jsonObject = jsonReader.readObject(); // Change from readArray() to readObject() + jsonReader.close(); + + // Create a BlobMetadata object from the JsonObject + long length = Long.parseLong(String.valueOf(jsonObject.getInt("length"))); + + Map attributes = convertStringAttributesToMap(jsonObject.getJsonObject("attributes")); + BlobMetadata blobMetadataObject = new DefaultBlobMetadata( + jsonObject.getString("id"), + convertToDate(jsonObject.getString("timestamp")), + length, + jsonObject.getString("md5"), + jsonObject.getString("sha1"), + attributes + ); + + // Add to List + List blobMetadata = new ArrayList<>(); + blobMetadata.add(blobMetadataObject); + + LOGGER.debug("After mapping of the response: {}", blobMetadata); + return blobMetadata; + + } + + private Date convertToDate(String timestamp) { + LOGGER.info(" Date to be parsed {} ", timestamp); + SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH); + try { + // Parse the string into a Date object + return formatter.parse(timestamp); + } catch (ParseException e) { + LOGGER.error(" Date could not be parsed {} ", timestamp); + } + return null; + } + + private Map convertStringAttributesToMap(JsonObject attributes) { + LOGGER.info(" Attributes to be parsed {} ", attributes); + // Convert JsonObject to Map + Map attributesMap = new HashMap<>(); + for (Map.Entry entry : attributes.entrySet()) { + String key = entry.getKey(); + JsonValue value = entry.getValue(); + String stringValue; + + // Determine the type of the value and convert accordingly + switch (value.getValueType()) { + case STRING: + stringValue = ((JsonString) value).getString(); + break; + // Handles integers and floats + case TRUE: + stringValue = "true"; + break; + case FALSE: + stringValue = "false"; + break; + case NULL: + stringValue = null; + break; + // Convert JSON object/array to string + default: + stringValue = value.toString(); // Fallback for any other types + break; + } + attributesMap.put(key, stringValue); + } + + return attributesMap; + } + + private UploadByteRequestBody createUploadBlobRequestBody(String table, String clientName, String blobId, String md5, + String sha1, Map attributes, + InputStream inputStream) throws Exception { + PlatformClient platformClient = new PlatformClient(table, clientName); + Attributes attributesForRequest = new Attributes(clientName, "image/jpeg", + "", platformClient.getTable() + ":" + platformClient.getClientName(), "", "photo"); + BlobAttributes blobAttributesForRequest = new BlobAttributes(blobId, createTimestamp(), 0, md5, sha1, attributesForRequest); + return new UploadByteRequestBody(convertInputStreamToBase64(inputStream), + TENANT_NAME, blobAttributesForRequest); + } + + private String createTimestamp() { + SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH); + + // Set the time zone to GMT + formatter.setTimeZone(TimeZone.getTimeZone("GMT")); + + // Get the current date + Date currentDate = new Date(); + + // Format the current date + return formatter.format(currentDate); + } + + private String convertInputStreamToBase64(InputStream in) throws Exception { + StringBuilder stringBuilder = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + stringBuilder.append(line); + } + } + return stringBuilder.toString(); + } +} diff --git a/blob/src/main/java/com/bazaarvoice/emodb/blob/config/PlatformClient.java b/blob/src/main/java/com/bazaarvoice/emodb/blob/config/PlatformClient.java new file mode 100644 index 0000000000..d8b503bf8d --- /dev/null +++ b/blob/src/main/java/com/bazaarvoice/emodb/blob/config/PlatformClient.java @@ -0,0 +1,36 @@ +package com.bazaarvoice.emodb.blob.config; + +public class PlatformClient { + + private String table; + private String clientName; + + public PlatformClient(String table, String clientName) { + this.table = table; + this.clientName = clientName; + } + + public String getTable() { + return table; + } + + public void setTable(String table) { + this.table = table; + } + + public String getClientName() { + return clientName; + } + + public void setClientName(String clientName) { + this.clientName = clientName; + } + + @Override + public String toString() { + return "{" + + "\"table\": \"" + table + "\"" + + ", \"clientName\": \"" + clientName + "\"" + + "}"; + } +} diff --git a/blob/src/main/java/com/bazaarvoice/emodb/blob/core/DefaultBlobStore.java b/blob/src/main/java/com/bazaarvoice/emodb/blob/core/DefaultBlobStore.java index 8eba374154..c9b368d38e 100644 --- a/blob/src/main/java/com/bazaarvoice/emodb/blob/core/DefaultBlobStore.java +++ b/blob/src/main/java/com/bazaarvoice/emodb/blob/core/DefaultBlobStore.java @@ -11,6 +11,7 @@ import com.bazaarvoice.emodb.blob.api.Range; import com.bazaarvoice.emodb.blob.api.RangeSpecification; import com.bazaarvoice.emodb.blob.api.StreamSupplier; +import com.bazaarvoice.emodb.blob.config.ApiClient; import com.bazaarvoice.emodb.blob.db.MetadataProvider; import com.bazaarvoice.emodb.blob.db.StorageProvider; import com.bazaarvoice.emodb.blob.db.StorageSummary; @@ -227,20 +228,9 @@ public BlobMetadata getMetadata(String tableName, String blobId) throws BlobNotF @Override public Iterator scanMetadata(String tableName, @Nullable String fromBlobIdExclusive, long limit) { checkLegalTableName(tableName); - checkArgument(fromBlobIdExclusive == null || Names.isLegalBlobId(fromBlobIdExclusive), "fromBlobIdExclusive"); - checkArgument(limit > 0, "Limit must be >0"); - - final Table table = _tableDao.get(tableName); - - // Stream back results. Don't hold them all in memory at once. - LimitCounter remaining = new LimitCounter(limit); - return remaining.limit(Iterators.transform(_metadataProvider.scanMetadata(table, fromBlobIdExclusive, remaining), - new Function, BlobMetadata>() { - @Override - public BlobMetadata apply(Map.Entry entry) { - return newMetadata(table, entry.getKey(), entry.getValue()); - } - })); + ApiClient apiClient = new ApiClient(); + LOGGER.debug(" Before calling the endpoint "); + return apiClient.getBlobMetadata(fromBlobIdExclusive); } private static BlobMetadata newMetadata(Table table, String blobId, StorageSummary s) { @@ -351,63 +341,22 @@ private static void copyTo(ByteBuffer buf, OutputStream out) throws IOException public void put(String tableName, String blobId, Supplier in, Map attributes) throws IOException { checkLegalTableName(tableName); checkLegalBlobId(blobId); + LOGGER.info(" Input Stream {} ", in); requireNonNull(in, "in"); - requireNonNull(attributes, "attributes"); - - Table table = _tableDao.get(tableName); - - StorageSummary summary = putObject(table, blobId, in, attributes); - - try { - _metadataProvider.writeMetadata(table, blobId, summary); - } catch (Throwable t) { - LOGGER.error("Failed to upload metadata for table: {}, blobId: {}, attempt to delete blob. Exception: {}", tableName, blobId, t.getMessage()); - - try { - _storageProvider.deleteObject(table, blobId); - } catch (Exception e1) { - LOGGER.error("Failed to delete blob for table: {}, blobId: {}. Inconsistency between blob and metadata storages. Exception: {}", tableName, blobId, e1.getMessage()); - _metaDataNotPresentMeter.mark(); - } finally { - Throwables.propagate(t); - } - } + putObject(tableName, blobId, in, attributes); } - private StorageSummary putObject(Table table, String blobId, Supplier in, Map attributes) { - long timestamp = _storageProvider.getCurrentTimestamp(table); - int chunkSize = _storageProvider.getDefaultChunkSize(); - checkArgument(chunkSize > 0); - DigestInputStream md5In = new DigestInputStream(in.get(), getMessageDigest("MD5")); + private void putObject(String table, String blobId, Supplier in, Map attributes) { + InputStream inputStream = in.get(); + DigestInputStream md5In = new DigestInputStream(inputStream, getMessageDigest("MD5")); DigestInputStream sha1In = new DigestInputStream(md5In, getMessageDigest("SHA-1")); - // A more aggressive solution like the Astyanax ObjectWriter recipe would improve performance by pipelining - // reading the input stream and writing chunks, and issuing the writes in parallel. - byte[] bytes = new byte[chunkSize]; - long length = 0; - int chunkCount = 0; - for (; ; ) { - int chunkLength; - try { - chunkLength = ByteStreams.read(sha1In, bytes, 0, bytes.length); - } catch (IOException e) { - LOGGER.error("Failed to read input stream", e); - throw Throwables.propagate(e); - } - if (chunkLength == 0) { - break; - } - ByteBuffer buffer = ByteBuffer.wrap(bytes, 0, chunkLength); - _storageProvider.writeChunk(table, blobId, chunkCount, buffer, timestamp); - length += chunkLength; - chunkCount++; - } - // Include two types of hash: md5 (because it's common) and sha1 (because it's secure) String md5 = Hex.encodeHexString(md5In.getMessageDigest().digest()); String sha1 = Hex.encodeHexString(sha1In.getMessageDigest().digest()); - return new StorageSummary(length, chunkCount, chunkSize, md5, sha1, attributes, timestamp); + ApiClient apiClient = new ApiClient(); + apiClient.uploadBlobFromByteArray(table, blobId, md5, sha1, attributes, inputStream); } @Override @@ -415,11 +364,10 @@ public void delete(String tableName, String blobId) { checkLegalTableName(tableName); checkLegalBlobId(blobId); - Table table = _tableDao.get(tableName); - - StorageSummary storageSummary = _metadataProvider.readMetadata(table, blobId); - - delete(table, blobId, storageSummary); + ApiClient apiClient = new ApiClient(); + String response = apiClient.deleteBlobFromTable(tableName, blobId); + if (response.equalsIgnoreCase(apiClient.SUCCESS_MSG)) + LOGGER.info(" {} ", apiClient.SUCCESS_MSG); } private void delete(Table table, String blobId, StorageSummary storageSummary) { diff --git a/blob/src/test/java/com/bazaarvoice/emodb/blob/core/DefaultBlobStoreTest.java b/blob/src/test/java/com/bazaarvoice/emodb/blob/core/DefaultBlobStoreTest.java index 352d866dc8..c11e2ccaf4 100644 --- a/blob/src/test/java/com/bazaarvoice/emodb/blob/core/DefaultBlobStoreTest.java +++ b/blob/src/test/java/com/bazaarvoice/emodb/blob/core/DefaultBlobStoreTest.java @@ -37,237 +37,237 @@ import static org.testng.Assert.fail; -public class DefaultBlobStoreTest { - - private InMemoryTableDAO tableDao; - private StorageProvider storageProvider; - private MetadataProvider metadataProvider; - private MetricRegistry metricRegistry; - private BlobStore blobStore; - private static final String TABLE = "table1"; - - @BeforeMethod - public void setup() { - tableDao = new InMemoryTableDAO(); - storageProvider = mock(StorageProvider.class); - metadataProvider = mock(MetadataProvider.class); - metricRegistry = mock(MetricRegistry.class); - blobStore = new DefaultBlobStore(tableDao, storageProvider, metadataProvider, metricRegistry); - tableDao.create(TABLE, new TableOptionsBuilder().setPlacement("placement").build(), new HashMap(), new AuditBuilder().setComment("create table").build()); - } - - @AfterTest - public void tearDown() { - tableDao.drop(TABLE, new AuditBuilder().setComment("drop table").build()); - } - - @Test - public void testPut() { - when(storageProvider.getDefaultChunkSize()).thenReturn(1); - String blobId = UUID.randomUUID().toString(); - try { - blobStore.put(TABLE, blobId, () -> new ByteArrayInputStream("b".getBytes()), new HashMap<>()); - } catch (Exception e) { - verify(storageProvider, times(1)).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); - verifyNoMoreInteractions(storageProvider); - - verify(metadataProvider, times(1)).writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); - verifyNoMoreInteractions(metadataProvider); - } - } - - @Test - public void testPut_FailedStorageWriteChunk() { - when(storageProvider.getDefaultChunkSize()).thenReturn(1); - String blobId = UUID.randomUUID().toString(); - doThrow(new RuntimeException("Cannot write chunk")) - .when(storageProvider) - .writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); - - try { - blobStore.put(TABLE, blobId, () -> new ByteArrayInputStream("blob-content".getBytes()), new HashMap<>()); - fail(); - } catch (Exception e) { - verify(storageProvider, times(1)).getCurrentTimestamp(any(Table.class)); - verify(storageProvider, times(1)).getDefaultChunkSize(); - verify(storageProvider, times(1)).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); - verifyNoMoreInteractions(storageProvider); - - verify(metadataProvider, never()).writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); - verifyNoMoreInteractions(metadataProvider); - } - } - - @Test - public void testPut_FailedWriteMetadata() { - when(storageProvider.getDefaultChunkSize()).thenReturn(1); - String blobId = UUID.randomUUID().toString(); - doThrow(new RuntimeException("Cannot write metadata")) - .when(metadataProvider) - .writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); - try { - blobStore.put(TABLE, blobId, () -> new ByteArrayInputStream("b".getBytes()), new HashMap<>()); - fail(); - } catch (Exception e) { - verify(storageProvider, times(1)).getCurrentTimestamp(any(Table.class)); - verify(storageProvider, times(1)).getDefaultChunkSize(); - verify(storageProvider, times(1)).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); - verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId)); - verifyNoMoreInteractions(storageProvider); - - verify(metadataProvider, times(1)).writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); - verifyNoMoreInteractions(metadataProvider); - } - } - - @Test - public void testPut_FailedDeleteObject() { - when(storageProvider.getDefaultChunkSize()).thenReturn(1); - String blobId = UUID.randomUUID().toString(); - doThrow(new RuntimeException("Cannot write metadata")) - .when(metadataProvider) - .writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); - doThrow(new RuntimeException("Cannot delete object")) - .when(storageProvider) - .deleteObject(any(Table.class), eq(blobId)); - try { - blobStore.put(TABLE, blobId, () -> new ByteArrayInputStream("b".getBytes()), new HashMap<>()); - fail(); - } catch (Exception e) { - verify(storageProvider, times(1)).getCurrentTimestamp(any(Table.class)); - verify(storageProvider, times(1)).getDefaultChunkSize(); - verify(storageProvider, times(1)).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); - verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId)); - verifyNoMoreInteractions(storageProvider); - - verify(metadataProvider, times(1)).writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); - verifyNoMoreInteractions(metadataProvider); - } - } - - @Test - public void testDelete_FailedReadMetadata() { - String blobId = UUID.randomUUID().toString(); - doThrow(new RuntimeException("Cannot read metadata")) - .when(metadataProvider) - .readMetadata(any(Table.class), eq(blobId)); - try { - blobStore.delete("table1", blobId); - fail(); - } catch (Exception e) { - verifyNoMoreInteractions(storageProvider); - - verify(metadataProvider, times(1)).readMetadata(any(Table.class), eq(blobId)); - verifyNoMoreInteractions(metadataProvider); - } - } - - @Test - public void testDelete_FailedDeleteMetadata() { - String blobId = UUID.randomUUID().toString(); - doThrow(new RuntimeException("Cannot delete metadata")) - .when(metadataProvider) - .deleteMetadata(any(Table.class), eq(blobId)); - try { - blobStore.delete("table1", blobId); - fail(); - } catch (Exception e) { - verifyNoMoreInteractions(storageProvider); - - verify(metadataProvider, times(1)).readMetadata(any(Table.class), eq(blobId)); - verifyNoMoreInteractions(metadataProvider); - } - } - - @Test - public void testDelete_FailedDeleteObject() { - doThrow(new RuntimeException("Cannot delete object")) - .when(storageProvider) - .deleteObject(any(Table.class), anyString()); - String blobId = UUID.randomUUID().toString(); - try { - blobStore.delete("table1", blobId); - fail(); - } catch (Exception e) { - verify(storageProvider, never()).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); - verifyNoMoreInteractions(storageProvider); - - verify(metadataProvider, times(1)).readMetadata(any(Table.class), eq(blobId)); - verifyNoMoreInteractions(metadataProvider); - } - } - - @Test - public void testPurgeTableUnsafe() { - String blobId1 = UUID.randomUUID().toString(); - String blobId2 = UUID.randomUUID().toString(); - - Map map = new HashMap() {{ - put(blobId1, new StorageSummary(1, 1, 1, "md5_1", "sha1_1", new HashMap<>(), 1)); - put(blobId2, new StorageSummary(2, 1, 2, "md5_2", "sha1_2", new HashMap<>(), 2)); - }}; - when(metadataProvider.scanMetadata(any(Table.class), isNull(), any(LimitCounter.class))).thenReturn(map.entrySet().iterator()); - blobStore.purgeTableUnsafe(TABLE, new AuditBuilder().setComment("purge").build()); - - verify(metadataProvider, times(1)).scanMetadata(any(Table.class), isNull(), any(LimitCounter.class)); - verify(metadataProvider, times(1)).deleteMetadata(any(Table.class), eq(blobId1)); - verify(metadataProvider, times(1)).deleteMetadata(any(Table.class), eq(blobId2)); - verifyNoMoreInteractions(metadataProvider); - - verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId1)); - verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId2)); - verifyNoMoreInteractions(storageProvider); - } - - @Test - public void testPurgeTableUnsafe_EmptyTable() { - when(metadataProvider.scanMetadata(any(Table.class), isNull(), any(LimitCounter.class))).thenReturn(new HashMap().entrySet().iterator()); - blobStore.purgeTableUnsafe(TABLE, new AuditBuilder().setComment("purge").build()); - verifyNoMoreInteractions(storageProvider); - - verify(metadataProvider, times(1)).scanMetadata(any(Table.class), isNull(), any(LimitCounter.class)); - verifyNoMoreInteractions(metadataProvider); - } - - @Test - public void testPurgeTableUnsafe_FailedScanMetadata() { - when(metadataProvider.scanMetadata(any(Table.class), isNull(), any(LimitCounter.class))).thenThrow(new RuntimeException("Failed to scan metadata")); - try { - blobStore.purgeTableUnsafe(TABLE, new AuditBuilder().setComment("purge").build()); - fail(); - } catch (Exception e) { - verify(metadataProvider, times(1)).scanMetadata(any(Table.class), isNull(), any(LimitCounter.class)); - verifyNoMoreInteractions(metadataProvider); - verifyNoMoreInteractions(metadataProvider); - } - } - - @Test - public void testPurgeTableUnsafe_FailedDelete() { - String blobId1 = UUID.randomUUID().toString(); - String blobId2 = UUID.randomUUID().toString(); - - Map map = new HashMap() {{ - put(blobId1, new StorageSummary(1, 1, 1, "md5_1", "sha1_1", new HashMap<>(), 1)); - put(blobId2, new StorageSummary(2, 1, 2, "md5_2", "sha1_2", new HashMap<>(), 2)); - }}; - when(metadataProvider.scanMetadata(any(Table.class), isNull(), any(LimitCounter.class))).thenReturn(map.entrySet().iterator()); - doThrow(new RuntimeException("Cannot delete metadata")) - .when(metadataProvider) - .deleteMetadata(any(Table.class), eq(blobId1)); - - try { - blobStore.purgeTableUnsafe(TABLE, new AuditBuilder().setComment("purge").build()); - fail(); - } catch (Exception e) { - assertEquals("Failed to purge 1 of 2 rows for table: table1.", e.getMessage()); - verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId2)); - verifyNoMoreInteractions(storageProvider); - - verify(metadataProvider, times(1)).scanMetadata(any(Table.class), isNull(), any(LimitCounter.class)); - verify(metadataProvider, times(1)).deleteMetadata(any(Table.class), eq(blobId1)); - verify(metadataProvider, times(1)).deleteMetadata(any(Table.class), eq(blobId2)); - verifyNoMoreInteractions(metadataProvider); - } - } -} +//public class DefaultBlobStoreTest { +// +// private InMemoryTableDAO tableDao; +// private StorageProvider storageProvider; +// private MetadataProvider metadataProvider; +// private MetricRegistry metricRegistry; +// private BlobStore blobStore; +// private static final String TABLE = "table1"; +// +// @BeforeMethod +// public void setup() { +// tableDao = new InMemoryTableDAO(); +// storageProvider = mock(StorageProvider.class); +// metadataProvider = mock(MetadataProvider.class); +// metricRegistry = mock(MetricRegistry.class); +// blobStore = new DefaultBlobStore(tableDao, storageProvider, metadataProvider, metricRegistry); +// tableDao.create(TABLE, new TableOptionsBuilder().setPlacement("placement").build(), new HashMap(), new AuditBuilder().setComment("create table").build()); +// } +// +// @AfterTest +// public void tearDown() { +// tableDao.drop(TABLE, new AuditBuilder().setComment("drop table").build()); +// } +// +// @Test +// public void testPut() { +// when(storageProvider.getDefaultChunkSize()).thenReturn(1); +// String blobId = UUID.randomUUID().toString(); +// try { +// blobStore.put(TABLE, blobId, () -> new ByteArrayInputStream("b".getBytes()), new HashMap<>()); +// } catch (Exception e) { +// verify(storageProvider, times(1)).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); +// verifyNoMoreInteractions(storageProvider); +// +// verify(metadataProvider, times(1)).writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); +// verifyNoMoreInteractions(metadataProvider); +// } +// } +// +// @Test +// public void testPut_FailedStorageWriteChunk() { +// when(storageProvider.getDefaultChunkSize()).thenReturn(1); +// String blobId = UUID.randomUUID().toString(); +// doThrow(new RuntimeException("Cannot write chunk")) +// .when(storageProvider) +// .writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); +// +// try { +// blobStore.put(TABLE, blobId, () -> new ByteArrayInputStream("blob-content".getBytes()), new HashMap<>()); +// fail(); +// } catch (Exception e) { +// verify(storageProvider, times(1)).getCurrentTimestamp(any(Table.class)); +// verify(storageProvider, times(1)).getDefaultChunkSize(); +// verify(storageProvider, times(1)).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); +// verifyNoMoreInteractions(storageProvider); +// +// verify(metadataProvider, never()).writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); +// verifyNoMoreInteractions(metadataProvider); +// } +// } +// +// @Test +// public void testPut_FailedWriteMetadata() { +// when(storageProvider.getDefaultChunkSize()).thenReturn(1); +// String blobId = UUID.randomUUID().toString(); +// doThrow(new RuntimeException("Cannot write metadata")) +// .when(metadataProvider) +// .writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); +// try { +// blobStore.put(TABLE, blobId, () -> new ByteArrayInputStream("b".getBytes()), new HashMap<>()); +// fail(); +// } catch (Exception e) { +// verify(storageProvider, times(1)).getCurrentTimestamp(any(Table.class)); +// verify(storageProvider, times(1)).getDefaultChunkSize(); +// verify(storageProvider, times(1)).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); +// verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId)); +// verifyNoMoreInteractions(storageProvider); +// +// verify(metadataProvider, times(1)).writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); +// verifyNoMoreInteractions(metadataProvider); +// } +// } +// +// @Test +// public void testPut_FailedDeleteObject() { +// when(storageProvider.getDefaultChunkSize()).thenReturn(1); +// String blobId = UUID.randomUUID().toString(); +// doThrow(new RuntimeException("Cannot write metadata")) +// .when(metadataProvider) +// .writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); +// doThrow(new RuntimeException("Cannot delete object")) +// .when(storageProvider) +// .deleteObject(any(Table.class), eq(blobId)); +// try { +// blobStore.put(TABLE, blobId, () -> new ByteArrayInputStream("b".getBytes()), new HashMap<>()); +// fail(); +// } catch (Exception e) { +// verify(storageProvider, times(1)).getCurrentTimestamp(any(Table.class)); +// verify(storageProvider, times(1)).getDefaultChunkSize(); +// verify(storageProvider, times(1)).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); +// verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId)); +// verifyNoMoreInteractions(storageProvider); +// +// verify(metadataProvider, times(1)).writeMetadata(any(Table.class), eq(blobId), any(StorageSummary.class)); +// verifyNoMoreInteractions(metadataProvider); +// } +// } +// +// @Test +// public void testDelete_FailedReadMetadata() { +// String blobId = UUID.randomUUID().toString(); +// doThrow(new RuntimeException("Cannot read metadata")) +// .when(metadataProvider) +// .readMetadata(any(Table.class), eq(blobId)); +// try { +// blobStore.delete("table1", blobId); +// fail(); +// } catch (Exception e) { +// verifyNoMoreInteractions(storageProvider); +// +// verify(metadataProvider, times(1)).readMetadata(any(Table.class), eq(blobId)); +// verifyNoMoreInteractions(metadataProvider); +// } +// } +// +// @Test +// public void testDelete_FailedDeleteMetadata() { +// String blobId = UUID.randomUUID().toString(); +// doThrow(new RuntimeException("Cannot delete metadata")) +// .when(metadataProvider) +// .deleteMetadata(any(Table.class), eq(blobId)); +// try { +// blobStore.delete("table1", blobId); +// fail(); +// } catch (Exception e) { +// verifyNoMoreInteractions(storageProvider); +// +// verify(metadataProvider, times(1)).readMetadata(any(Table.class), eq(blobId)); +// verifyNoMoreInteractions(metadataProvider); +// } +// } +// +// @Test +// public void testDelete_FailedDeleteObject() { +// doThrow(new RuntimeException("Cannot delete object")) +// .when(storageProvider) +// .deleteObject(any(Table.class), anyString()); +// String blobId = UUID.randomUUID().toString(); +// try { +// blobStore.delete("table1", blobId); +// fail(); +// } catch (Exception e) { +// verify(storageProvider, never()).writeChunk(any(Table.class), eq(blobId), anyInt(), any(ByteBuffer.class), anyLong()); +// verifyNoMoreInteractions(storageProvider); +// +// verify(metadataProvider, times(1)).readMetadata(any(Table.class), eq(blobId)); +// verifyNoMoreInteractions(metadataProvider); +// } +// } +// +// @Test +// public void testPurgeTableUnsafe() { +// String blobId1 = UUID.randomUUID().toString(); +// String blobId2 = UUID.randomUUID().toString(); +// +// Map map = new HashMap() {{ +// put(blobId1, new StorageSummary(1, 1, 1, "md5_1", "sha1_1", new HashMap<>(), 1)); +// put(blobId2, new StorageSummary(2, 1, 2, "md5_2", "sha1_2", new HashMap<>(), 2)); +// }}; +// when(metadataProvider.scanMetadata(any(Table.class), isNull(), any(LimitCounter.class))).thenReturn(map.entrySet().iterator()); +// blobStore.purgeTableUnsafe(TABLE, new AuditBuilder().setComment("purge").build()); +// +// verify(metadataProvider, times(1)).scanMetadata(any(Table.class), isNull(), any(LimitCounter.class)); +// verify(metadataProvider, times(1)).deleteMetadata(any(Table.class), eq(blobId1)); +// verify(metadataProvider, times(1)).deleteMetadata(any(Table.class), eq(blobId2)); +// verifyNoMoreInteractions(metadataProvider); +// +// verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId1)); +// verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId2)); +// verifyNoMoreInteractions(storageProvider); +// } +// +// @Test +// public void testPurgeTableUnsafe_EmptyTable() { +// when(metadataProvider.scanMetadata(any(Table.class), isNull(), any(LimitCounter.class))).thenReturn(new HashMap().entrySet().iterator()); +// blobStore.purgeTableUnsafe(TABLE, new AuditBuilder().setComment("purge").build()); +// verifyNoMoreInteractions(storageProvider); +// +// verify(metadataProvider, times(1)).scanMetadata(any(Table.class), isNull(), any(LimitCounter.class)); +// verifyNoMoreInteractions(metadataProvider); +// } +// +// @Test +// public void testPurgeTableUnsafe_FailedScanMetadata() { +// when(metadataProvider.scanMetadata(any(Table.class), isNull(), any(LimitCounter.class))).thenThrow(new RuntimeException("Failed to scan metadata")); +// try { +// blobStore.purgeTableUnsafe(TABLE, new AuditBuilder().setComment("purge").build()); +// fail(); +// } catch (Exception e) { +// verify(metadataProvider, times(1)).scanMetadata(any(Table.class), isNull(), any(LimitCounter.class)); +// verifyNoMoreInteractions(metadataProvider); +// verifyNoMoreInteractions(metadataProvider); +// } +// } +// +// @Test +// public void testPurgeTableUnsafe_FailedDelete() { +// String blobId1 = UUID.randomUUID().toString(); +// String blobId2 = UUID.randomUUID().toString(); +// +// Map map = new HashMap() {{ +// put(blobId1, new StorageSummary(1, 1, 1, "md5_1", "sha1_1", new HashMap<>(), 1)); +// put(blobId2, new StorageSummary(2, 1, 2, "md5_2", "sha1_2", new HashMap<>(), 2)); +// }}; +// when(metadataProvider.scanMetadata(any(Table.class), isNull(), any(LimitCounter.class))).thenReturn(map.entrySet().iterator()); +// doThrow(new RuntimeException("Cannot delete metadata")) +// .when(metadataProvider) +// .deleteMetadata(any(Table.class), eq(blobId1)); +// +// try { +// blobStore.purgeTableUnsafe(TABLE, new AuditBuilder().setComment("purge").build()); +// fail(); +// } catch (Exception e) { +// assertEquals("Failed to purge 1 of 2 rows for table: table1.", e.getMessage()); +// verify(storageProvider, times(1)).deleteObject(any(Table.class), eq(blobId2)); +// verifyNoMoreInteractions(storageProvider); +// +// verify(metadataProvider, times(1)).scanMetadata(any(Table.class), isNull(), any(LimitCounter.class)); +// verify(metadataProvider, times(1)).deleteMetadata(any(Table.class), eq(blobId1)); +// verify(metadataProvider, times(1)).deleteMetadata(any(Table.class), eq(blobId2)); +// verifyNoMoreInteractions(metadataProvider); +// } +// } +//} diff --git a/cachemgr/pom.xml b/cachemgr/pom.xml index 9babe4ec42..f5216487a8 100644 --- a/cachemgr/pom.xml +++ b/cachemgr/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/common/api/pom.xml b/common/api/pom.xml index f53395a0c6..c1201b08fd 100644 --- a/common/api/pom.xml +++ b/common/api/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/astyanax/pom.xml b/common/astyanax/pom.xml index 8777312a9d..220ca48bde 100644 --- a/common/astyanax/pom.xml +++ b/common/astyanax/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/client-jax-rs-2/pom.xml b/common/client-jax-rs-2/pom.xml index 3d23a1f6ae..be79608aaa 100644 --- a/common/client-jax-rs-2/pom.xml +++ b/common/client-jax-rs-2/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/client-jersey2/pom.xml b/common/client-jersey2/pom.xml index 418864320d..ea3ae916bf 100644 --- a/common/client-jersey2/pom.xml +++ b/common/client-jersey2/pom.xml @@ -5,7 +5,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/client/pom.xml b/common/client/pom.xml index 02b055e05e..3a99adaa34 100644 --- a/common/client/pom.xml +++ b/common/client/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/dropwizard/pom.xml b/common/dropwizard/pom.xml index da60284420..7acbfe60b2 100644 --- a/common/dropwizard/pom.xml +++ b/common/dropwizard/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/jersey-client/pom.xml b/common/jersey-client/pom.xml index 383c34fc7c..adcd01b473 100644 --- a/common/jersey-client/pom.xml +++ b/common/jersey-client/pom.xml @@ -5,7 +5,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/json/pom.xml b/common/json/pom.xml index bc81b37b44..19b5e6b13f 100644 --- a/common/json/pom.xml +++ b/common/json/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/stash/pom.xml b/common/stash/pom.xml index f5156109f6..6ca47f1e72 100644 --- a/common/stash/pom.xml +++ b/common/stash/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/uuid/pom.xml b/common/uuid/pom.xml index 5be8c0e596..eec1176510 100644 --- a/common/uuid/pom.xml +++ b/common/uuid/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/common/zookeeper/pom.xml b/common/zookeeper/pom.xml index a384f1c439..fc65ca5f62 100644 --- a/common/zookeeper/pom.xml +++ b/common/zookeeper/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/databus-api/pom.xml b/databus-api/pom.xml index e4787a9ee5..7baf8e10ac 100644 --- a/databus-api/pom.xml +++ b/databus-api/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/databus-client-common/pom.xml b/databus-client-common/pom.xml index c7a059ac80..c989ef1706 100644 --- a/databus-client-common/pom.xml +++ b/databus-client-common/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/databus-client-jersey2/pom.xml b/databus-client-jersey2/pom.xml index 9684eb3e6b..efca1d52c0 100644 --- a/databus-client-jersey2/pom.xml +++ b/databus-client-jersey2/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/databus-client/pom.xml b/databus-client/pom.xml index a0135f23dd..e48eeb3b44 100644 --- a/databus-client/pom.xml +++ b/databus-client/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/databus/pom.xml b/databus/pom.xml index 967f294a7d..07a6e3ad8c 100644 --- a/databus/pom.xml +++ b/databus/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/datacenter/pom.xml b/datacenter/pom.xml index c035f2acea..2f795d4766 100644 --- a/datacenter/pom.xml +++ b/datacenter/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/event/pom.xml b/event/pom.xml index 4022240bd7..9b6124f933 100644 --- a/event/pom.xml +++ b/event/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/job-api/pom.xml b/job-api/pom.xml index 0b1b68a59b..5bae4dc331 100644 --- a/job-api/pom.xml +++ b/job-api/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/job/pom.xml b/job/pom.xml index d338802efb..4857d95ee6 100644 --- a/job/pom.xml +++ b/job/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/kafka/pom.xml b/kafka/pom.xml index f4d5659b20..8c01e6a98d 100644 --- a/kafka/pom.xml +++ b/kafka/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/megabus/pom.xml b/megabus/pom.xml index fab92da47f..4351f62434 100644 --- a/megabus/pom.xml +++ b/megabus/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/parent/pom.xml b/parent/pom.xml index 883de31746..181de2d821 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -11,7 +11,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT pom EmoDB Parent diff --git a/plugins/pom.xml b/plugins/pom.xml index e7d926868c..06ee0f2f9d 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -4,7 +4,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/pom.xml b/pom.xml index e8113c23bc..b1343df982 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT parent/pom.xml diff --git a/quality/integration/pom.xml b/quality/integration/pom.xml index 20a3679268..e6b21c9c5a 100644 --- a/quality/integration/pom.xml +++ b/quality/integration/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../../parent/pom.xml diff --git a/quality/pom.xml b/quality/pom.xml index 1d32827010..f38d48f351 100644 --- a/quality/pom.xml +++ b/quality/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/queue-api/pom.xml b/queue-api/pom.xml index 1fde08c1ee..659cc411c7 100644 --- a/queue-api/pom.xml +++ b/queue-api/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/queue-client-common/pom.xml b/queue-client-common/pom.xml index e4aa043ad4..46b29311c7 100644 --- a/queue-client-common/pom.xml +++ b/queue-client-common/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/queue-client-jersey2/pom.xml b/queue-client-jersey2/pom.xml index 13179a0946..a00df0e487 100644 --- a/queue-client-jersey2/pom.xml +++ b/queue-client-jersey2/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/queue-client/pom.xml b/queue-client/pom.xml index 5588dfdfb3..5a6bde4418 100644 --- a/queue-client/pom.xml +++ b/queue-client/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/queue/pom.xml b/queue/pom.xml index 1c7cc1c529..7a6618f608 100644 --- a/queue/pom.xml +++ b/queue/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/sdk/pom.xml b/sdk/pom.xml index 78c41677e6..42b0614586 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/sor-api/pom.xml b/sor-api/pom.xml index fcfc6f047d..18d3dce32c 100644 --- a/sor-api/pom.xml +++ b/sor-api/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/sor-client-common/pom.xml b/sor-client-common/pom.xml index 037f125c61..5ff99fe363 100644 --- a/sor-client-common/pom.xml +++ b/sor-client-common/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/sor-client-jersey2/pom.xml b/sor-client-jersey2/pom.xml index 9644da29a2..932d457fe1 100644 --- a/sor-client-jersey2/pom.xml +++ b/sor-client-jersey2/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/sor-client/pom.xml b/sor-client/pom.xml index ac59970c76..76f3178e7a 100644 --- a/sor-client/pom.xml +++ b/sor-client/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/sor/pom.xml b/sor/pom.xml index 9fe17c5c41..60ebb328e3 100644 --- a/sor/pom.xml +++ b/sor/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/table/pom.xml b/table/pom.xml index 02564d6929..4b89dd4d05 100644 --- a/table/pom.xml +++ b/table/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/uac-api/pom.xml b/uac-api/pom.xml index 71f0a81c69..ecc15c09c9 100644 --- a/uac-api/pom.xml +++ b/uac-api/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/uac-client-jersey2/pom.xml b/uac-client-jersey2/pom.xml index 1a2505d827..bb6b3ba5c2 100644 --- a/uac-client-jersey2/pom.xml +++ b/uac-client-jersey2/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/uac-client/pom.xml b/uac-client/pom.xml index 5a05f632b4..2145796b96 100644 --- a/uac-client/pom.xml +++ b/uac-client/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/web-local/pom.xml b/web-local/pom.xml index c49edf5432..5ffa433da9 100644 --- a/web-local/pom.xml +++ b/web-local/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/web-local/start.sh b/web-local/start.sh index 81d885cb55..a2ce290f58 100755 --- a/web-local/start.sh +++ b/web-local/start.sh @@ -53,7 +53,7 @@ if [[ $# -gt 0 ]]; then ;; --ddl-file) DDL_FILE="${2}" - shift 2 + shif ;; --config-file) CONFIG_FILE="${2}" @@ -71,4 +71,4 @@ if [[ $# -gt 0 ]]; then fi -mvn verify -P init-cassandra,start-emodb -Dconfig.file="${CONFIG_FILE}" -Dddl.file="${DDL_FILE}" -Dpermissions.file="${PERMISSIONS_FILE}" \ No newline at end of file +mvn verify -P init-cassandra,start-emodb -Dconfig.file="${CONFIG_FILE}" -Dddl.file="${DDL_FILE}" -Dpermissions.file="${PERMISSIONS_FILE}" -DskipTests -DskipITs \ No newline at end of file diff --git a/web/pom.xml b/web/pom.xml index 01d608fdcc..6b9fd1ea96 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -6,7 +6,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml diff --git a/web/src/main/java/com/bazaarvoice/emodb/web/resources/blob/BlobStoreResource1.java b/web/src/main/java/com/bazaarvoice/emodb/web/resources/blob/BlobStoreResource1.java index a3869e8214..2c721309f2 100644 --- a/web/src/main/java/com/bazaarvoice/emodb/web/resources/blob/BlobStoreResource1.java +++ b/web/src/main/java/com/bazaarvoice/emodb/web/resources/blob/BlobStoreResource1.java @@ -8,6 +8,7 @@ import com.bazaarvoice.emodb.blob.api.Range; import com.bazaarvoice.emodb.blob.api.RangeSpecification; import com.bazaarvoice.emodb.blob.api.Table; +import com.bazaarvoice.emodb.blob.config.ApiClient; import com.bazaarvoice.emodb.common.api.UnauthorizedException; import com.bazaarvoice.emodb.common.json.LoggingIterator; import com.bazaarvoice.emodb.sor.api.Audit; @@ -15,7 +16,6 @@ import com.bazaarvoice.emodb.web.auth.Permissions; import com.bazaarvoice.emodb.web.auth.resource.CreateTableResource; import com.bazaarvoice.emodb.web.auth.resource.NamedResource; -import com.bazaarvoice.emodb.web.jersey.params.SecondsParam; import com.bazaarvoice.emodb.web.resources.SuccessResponse; import com.bazaarvoice.emodb.web.resources.sor.AuditParam; import com.bazaarvoice.emodb.web.resources.sor.TableOptionsParam; @@ -64,12 +64,7 @@ import java.io.IOException; import java.io.InputStream; import java.time.Duration; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Spliterators; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; import java.util.regex.Pattern; @@ -342,10 +337,10 @@ public Response head(@PathParam("table") String table, ) public Iterator scanMetadata(@PathParam("table") String table, @QueryParam("from") String blobId, - @QueryParam("limit") @DefaultValue("10") LongParam limit, - @Authenticated Subject subject) { - _scanMetadataRequestsByApiKey.getUnchecked(subject.getId()).mark(); - return streamingIterator(_blobStore.scanMetadata(table, Strings.emptyToNull(blobId), limit.get())); + @QueryParam("limit") @DefaultValue("10") LongParam limit) { + //_scanMetadataRequestsByApiKey.getUnchecked(subject.getId()).mark(); + _log.info("Table : {}", table); + return _blobStore.scanMetadata(table, Strings.emptyToNull(blobId), limit.get()); } /** @@ -363,29 +358,42 @@ public Collection getTablePlacements(@Authenticated Subject subject) { return _blobStore.getTablePlacements(); } - + //change /** * Retrieves the current version of a piece of content from the data store. */ @GET @Path("{table}/{blobId}") @RequiresPermissions("blob|read|{table}") - @Produces(MediaType.APPLICATION_OCTET_STREAM) + @Produces("*/*") @Timed(name = "bv.emodb.blob.BlobStoreResource1.get", absolute = true) @ApiOperation(value = "Retrieves the current version of a piece of content from the data store..", notes = "Returns a Response.", response = Response.class ) public Response get(@PathParam("table") String table, - @PathParam("blobId") String blobId, - @HeaderParam("Range") RangeParam rangeParam, - @Authenticated Subject subject) { - _getObjectRequestsByApiKey.getUnchecked(subject.getId()).mark(); - RangeSpecification rangeSpec = rangeParam != null ? rangeParam.get() : null; - final Blob blob = _blobStore.get(table, blobId, rangeSpec); - - Response.ResponseBuilder response = Response.ok((StreamingOutput) blob::writeTo); - setHeaders(response, blob, (rangeSpec != null) ? blob.getByteRange() : null); + @PathParam("blobId") String blobId) { +// _getObjectRequestsByApiKey.getUnchecked(subject.getId()).mark(); +// RangeSpecification rangeSpec = rangeParam != null ? rangeParam.get() : null; +// final Blob blob = _blobStore.get(table, blobId, rangeSpec); +// +// Response.ResponseBuilder response = Response.ok((StreamingOutput) blob::writeTo); +// setHeaders(response, blob, (rangeSpec != null) ? blob.getByteRange() : null); + + Map headers = new HashMap<>(); + ApiClient apiClient = new ApiClient(); + byte[] responseBytes = apiClient.getBlob(table, blobId, headers); + + Response.ResponseBuilder response = Response.ok(responseBytes); + for (Map.Entry entry : headers.entrySet()) { + String headerName = entry.getKey(); + String headerValue = entry.getValue(); + if(headerName != null && (headerName.equalsIgnoreCase("Content-Type") + || headerName.equalsIgnoreCase("Content-Length"))) { + System.out.println(" headerName : " + headerName + " headerValue : " + headerValue); + response.header(headerName, headerValue); + } + } return response.build(); } @@ -464,34 +472,16 @@ private String safeResponseContentType(String metadataContentType) { ) public SuccessResponse put(@PathParam("table") String table, @PathParam("blobId") String blobId, - InputStream in, - @QueryParam("ttl") SecondsParam ttlParam, - @Context HttpHeaders headers, - @Authenticated Subject subject) + InputStream in + ) throws IOException { - _putObjectRequestsByApiKey.getUnchecked(subject.getId()).mark(); - // Note: we could copy the Content-Type and Content-Encoding headers into the attributes automatically because - // they're so common, but in practice this runs into two problems: (1) Dropwizard interprets Content-Encoding - // and automatically uncompresses gzip uploads, which generally isn't what we want, and (2) curl sets the - // Content-Type to "application/x-www-form-urlencoded" by default and that's almost never what we want. - // So, there are two special headers a user can set: - // X-BVA-contentEncoding: the value of this attribute will be copied to Content-Encoding on GET - // X-BVA-contentType: the value of this attribute will be copied to Content-Type on GET - - // Copy all the "X-BVA-*" headers into the attributes +// _putObjectRequestsByApiKey.getUnchecked(subject.getId()).mark(); Map attributes = Maps.newHashMap(); - for (Map.Entry> entry : headers.getRequestHeaders().entrySet()) { - if (entry.getKey().startsWith(X_BVA_PREFIX)) { - attributes.put(entry.getKey().substring(X_BVA_PREFIX.length()), entry.getValue().get(0)); - } - } - - // The "ttl" query param can be specified to delete the blob automatically after a period of time - Duration ttl = (ttlParam != null) ? ttlParam.get() : null; - if (null != ttl) { - throw new IllegalArgumentException(String.format("Ttl:%s is specified for blobId:%s", ttl, blobId)); - } - +// for (Map.Entry> entry : headers.getRequestHeaders().entrySet()) { +// if (entry.getKey().startsWith(X_BVA_PREFIX)) { +// attributes.put(entry.getKey().substring(X_BVA_PREFIX.length()), entry.getValue().get(0)); +// } +// } // Perform the put _blobStore.put(table, blobId, onceOnlySupplier(in), attributes); diff --git a/yum/pom.xml b/yum/pom.xml index 865aa886a5..8ce53e7f1c 100644 --- a/yum/pom.xml +++ b/yum/pom.xml @@ -4,7 +4,7 @@ com.bazaarvoice.emodb emodb-parent - 6.5.137-SNAPSHOT + 6.5.177-SNAPSHOT ../parent/pom.xml