Skip to content

Commit e6674e6

Browse files
authored
Merge pull request #465 from SpectraLogic/4_1_x_API
Updating main branch from 4.0 to 4.1 API generation
2 parents 974ef88 + 6d4ce5c commit e6674e6

File tree

28 files changed

+561
-63
lines changed

28 files changed

+561
-63
lines changed

ds3-autogen-c/src/main/resources/templates/header-templates/ds3_h.ftl

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
#include <stdint.h>
1111
#include <string.h>
1212
#include <curl/curl.h>
13+
#include "ds3_bool.h"
1314
#include "ds3_string.h"
1415
#include "ds3_string_multimap.h"
16+
#include "ds3_uint64_string_map.h"
1517

1618
#ifdef __cplusplus
1719
extern "C" {
@@ -53,10 +55,6 @@ typedef struct {
5355

5456
typedef struct _ds3_metadata ds3_metadata;
5557

56-
typedef enum {
57-
False, True
58-
}ds3_bool;
59-
6058
typedef enum {
6159
HTTP_GET,
6260
HTTP_PUT,
@@ -115,6 +113,12 @@ typedef struct {
115113
</#list>
116114
<#-- **************************************** -->
117115

116+
typedef struct {
117+
ds3_metadata* metadata;
118+
ds3_checksum_type *blob_checksum_type;
119+
ds3_uint64_string_map* blob_checksums;
120+
}ds3_head_object_response;
121+
118122
<#-- **************************************** -->
119123
<#-- Generate all Structs -->
120124
<#list getStructs() as structEntry>
@@ -153,6 +157,7 @@ typedef struct _ds3_client {
153157

154158
LIBRARY_API void ds3_request_free(ds3_request* request);
155159
LIBRARY_API void ds3_error_free(ds3_error* error);
160+
LIBRARY_API void ds3_head_object_response_free(ds3_head_object_response* response);
156161
LIBRARY_API void ds3_multipart_upload_part_response_free(ds3_multipart_upload_part_response* response);
157162
LIBRARY_API void ds3_complete_multipart_upload_response_free(ds3_complete_multipart_upload_response* response);
158163
LIBRARY_API void ds3_delete_objects_response_free(ds3_delete_objects_response* response);
@@ -214,7 +219,7 @@ LIBRARY_API ds3_request* ds3_init_head_bucket_request(const char *const bucket_n
214219
LIBRARY_API ds3_error* ds3_head_bucket_request(const ds3_client* client, const ds3_request* request);
215220
<#elseif requestEntry.getName() == "ds3_head_object_request">
216221
LIBRARY_API ds3_request* ds3_init_head_object_request(const char* bucket_name, const char *const object_name);
217-
LIBRARY_API ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_metadata** _metadata);
222+
LIBRARY_API ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_head_object_response** response);
218223
<#else>
219224
<#include "RequestCommentDocumentation.ftl">
220225
<#include "InitRequestPrototype.ftl">

ds3-autogen-c/src/main/resources/templates/request-templates/HeadObjectRequest.ftl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_metadata** _metadata) {
1+
ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_head_object_response** response) {
22
ds3_error* error;
33
ds3_string_multimap* return_headers;
44
ds3_metadata* metadata;
@@ -13,8 +13,11 @@ ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request*
1313
error = _internal_request_dispatcher(client, request, NULL, NULL, NULL, NULL, &return_headers);
1414

1515
if (error == NULL) {
16-
metadata = _init_metadata(return_headers);
17-
*_metadata = metadata;
16+
ds3_head_object_response* response_ptr = g_new0(ds3_head_object_response, 1);
17+
response_ptr->metadata = _init_metadata(return_headers);
18+
response_ptr->blob_checksum_type = get_blob_checksum_type(client->log, return_headers);
19+
response_ptr->blob_checksums = get_blob_checksums(client->log, return_headers);
20+
*response = response_ptr;
1821
ds3_string_multimap_free(return_headers);
1922
}
2023

ds3-autogen-c/src/main/resources/templates/source-templates/ds3_c.ftl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "ds3_connection.h"
1313
#include "ds3_request.h"
1414
#include "ds3_string_multimap_impl.h"
15+
#include "ds3_uint64_string_map.h"
1516
#include "ds3_utils.h"
1617

1718
#ifdef _WIN32

ds3-autogen-c/src/main/resources/templates/source-templates/ds3_requests.ftl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
#include "ds3.h"
99
#include "ds3_net.h"
1010
#include "ds3_request.h"
11+
#include "ds3_response_header_utils.h"
1112
#include "ds3_string_multimap_impl.h"
13+
#include "ds3_uint64_string_map.h"
1214
#include "ds3_utils.h"
1315

1416
#ifdef _WIN32

ds3-autogen-c/src/main/resources/templates/source-templates/free_custom_types.ftl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,23 @@ void ds3_delete_objects_response_free(ds3_delete_objects_response* response) {
3434
g_free(response);
3535
}
3636

37+
void ds3_head_object_response_free(ds3_head_object_response* response) {
38+
if (response == NULL) {
39+
return;
40+
}
41+
if (response->blob_checksum_type != NULL) {
42+
g_free(response->blob_checksum_type);
43+
}
44+
if (response->metadata != NULL) {
45+
ds3_metadata_free(response->metadata);
46+
}
47+
if (response->blob_checksums != NULL) {
48+
ds3_uint64_string_map_free(response->blob_checksums);
49+
}
50+
51+
g_free(response);
52+
}
53+
3754
void ds3_paging_free(ds3_paging* paging) {
3855
g_free(paging);
3956
}

ds3-autogen-c/src/main/resources/templates/source-templates/internal_request_processors.ftl

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static ds3_error* _get_request_xml_nodes(
6969
return NULL;
7070
}
7171

72-
static xmlDocPtr _generate_xml_bulk_objects_list(const ds3_bulk_object_list_response* obj_list, object_list_type list_type, ds3_job_chunk_client_processing_order_guarantee order) {
72+
static xmlDocPtr _generate_xml_bulk_objects_list(const ds3_bulk_object_list_response* obj_list, object_list_type list_type) {
7373
char size_buff[STRING_BUFFER_SIZE];
7474
xmlDocPtr doc;
7575
ds3_bulk_object_response* obj;
@@ -80,17 +80,6 @@ static xmlDocPtr _generate_xml_bulk_objects_list(const ds3_bulk_object_list_resp
8080
doc = xmlNewDoc((xmlChar*)"1.0");
8181
objects_node = xmlNewNode(NULL, (xmlChar*) "Objects");
8282

83-
if (list_type == BULK_GET) {
84-
if (order == DS3_JOB_CHUNK_CLIENT_PROCESSING_ORDER_GUARANTEE_NONE) {
85-
xmlSetProp(objects_node, (xmlChar*) "ChunkClientProcessingOrderGuarantee", (const xmlChar *) "NONE");
86-
} else if (order == DS3_JOB_CHUNK_CLIENT_PROCESSING_ORDER_GUARANTEE_IN_ORDER) {
87-
xmlSetProp(objects_node, (xmlChar*) "ChunkClientProcessingOrderGuarantee", (const xmlChar *) "IN_ORDER");
88-
} else {
89-
return NULL;
90-
}
91-
}
92-
93-
9483
for (obj_index = 0; obj_index < obj_list->num_objects; obj_index++) {
9584
obj = obj_list->objects[obj_index];
9685
memset(size_buff, 0, sizeof(size_buff));
@@ -177,7 +166,7 @@ static ds3_error* _init_request_payload(const ds3_request* _request,
177166
if (request->object_list == NULL || request->object_list->num_objects == 0) {
178167
return ds3_create_error(DS3_ERROR_MISSING_ARGS, "The bulk command requires a list of objects to process");
179168
}
180-
doc = _generate_xml_bulk_objects_list(request->object_list, operation_type, request->chunk_ordering);
169+
doc = _generate_xml_bulk_objects_list(request->object_list, operation_type);
181170
break;
182171

183172
case COMPLETE_MPU:

ds3-autogen-c/src/test/java/com/spectralogic/ds3autogen/c/CCodeGeneratorSpectraS3Requests_Test.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,47 @@ public void testGenerateSpectraS3GetBucketRequestPrototype() throws IOException,
194194
final String expectedOutput = "LIBRARY_API ds3_error* ds3_get_bucket_request(const ds3_client* client, const ds3_request* request, ds3_list_bucket_result_response** response);";
195195
assertEquals(expectedOutput, output);
196196
}
197+
198+
@Test
199+
public void testHeadObjectRequest() throws IOException, ParseException, TemplateModelException {
200+
final String inputSpecFile = "/input/HeadObjectRequest.xml";
201+
final TestFileUtilsImpl fileUtils = new TestFileUtilsImpl();
202+
final Ds3SpecParser parser = new Ds3SpecParserImpl();
203+
final Ds3ApiSpec spec = parser.getSpec(CCodeGenerator_Test.class.getResourceAsStream(inputSpecFile));
204+
205+
final Source source = SourceConverter.toSource(CCodeGenerator.getAllEnums(spec),
206+
CCodeGenerator.getAllStructs(spec, ImmutableSet.of(), ImmutableSet.of(), ImmutableSet.of(), ImmutableSet.of(), ImmutableSet.of()),
207+
CCodeGenerator.getAllRequests(spec, new Ds3DocSpecEmptyImpl()));
208+
final CCodeGenerator codeGenerator = new CCodeGenerator();
209+
codeGenerator.processTemplate(source, "source-templates/ds3_requests.ftl", fileUtils.getOutputStream());
210+
211+
final ByteArrayOutputStream bstream = (ByteArrayOutputStream) fileUtils.getOutputStream();
212+
final String output = new String(bstream.toByteArray());
213+
214+
assertTrue(output.contains("ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_head_object_response** response) {\n" +
215+
" ds3_error* error;\n" +
216+
" ds3_string_multimap* return_headers;\n" +
217+
" ds3_metadata* metadata;\n" +
218+
"\n" +
219+
" int num_slashes = num_chars_in_ds3_str(request->path, '/');\n" +
220+
" if (num_slashes < 2 || ((num_slashes == 2) && ('/' == request->path->value[request->path->size-1]))) {\n" +
221+
" return ds3_create_error(DS3_ERROR_MISSING_ARGS, \"The object name parameter is required.\");\n" +
222+
" } else if (g_ascii_strncasecmp(request->path->value, \"//\", 2) == 0) {\n" +
223+
" return ds3_create_error(DS3_ERROR_MISSING_ARGS, \"The bucket name parameter is required.\");\n" +
224+
" }\n" +
225+
"\n" +
226+
" error = _internal_request_dispatcher(client, request, NULL, NULL, NULL, NULL, &return_headers);\n" +
227+
"\n" +
228+
" if (error == NULL) {\n" +
229+
" ds3_head_object_response* response_ptr = g_new0(ds3_head_object_response, 1);\n" +
230+
" response_ptr->metadata = _init_metadata(return_headers);\n" +
231+
" response_ptr->blob_checksum_type = get_blob_checksum_type(client->log, return_headers);\n" +
232+
" response_ptr->blob_checksums = get_blob_checksums(client->log, return_headers);\n" +
233+
" *response = response_ptr;\n" +
234+
" ds3_string_multimap_free(return_headers);\n" +
235+
" }\n" +
236+
"\n" +
237+
" return error;\n" +
238+
"}"));
239+
}
197240
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<Data>
2+
<Contract>
3+
<RequestHandlers>
4+
<RequestHandler Classification="amazons3" Name="com.spectralogic.s3.server.handler.reqhandler.amazons3.HeadObjectRequestHandler">
5+
<Request BucketRequirement="REQUIRED" HttpVerb="HEAD" IncludeIdInPath="false" ObjectRequirement="REQUIRED">
6+
<OptionalQueryParams/>
7+
<RequiredQueryParams/>
8+
</Request>
9+
<ResponseCodes>
10+
<ResponseCode>
11+
<Code>200</Code>
12+
<ResponseTypes>
13+
<ResponseType Type="null"/>
14+
</ResponseTypes>
15+
</ResponseCode>
16+
<ResponseCode>
17+
<Code>404</Code>
18+
<ResponseTypes>
19+
<ResponseType Type="com.spectralogic.s3.server.domain.HttpErrorResultApiBean"/>
20+
</ResponseTypes>
21+
</ResponseCode>
22+
</ResponseCodes>
23+
<Version>1.CF182CD57551902A475553F26582BC78</Version>
24+
</RequestHandler>
25+
</RequestHandlers>
26+
</Contract>
27+
</Data>

ds3-autogen-go/src/main/java/com/spectralogic/ds3autogen/go/GoCodeGenerator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,7 @@
3232
import com.spectralogic.ds3autogen.go.generators.parser.JobListParserGenerator;
3333
import com.spectralogic.ds3autogen.go.generators.parser.TypeParserModelGenerator;
3434
import com.spectralogic.ds3autogen.go.generators.request.*;
35-
import com.spectralogic.ds3autogen.go.generators.response.BaseResponseGenerator;
36-
import com.spectralogic.ds3autogen.go.generators.response.GetObjectResponseGenerator;
37-
import com.spectralogic.ds3autogen.go.generators.response.NoResponseGenerator;
38-
import com.spectralogic.ds3autogen.go.generators.response.ResponseModelGenerator;
35+
import com.spectralogic.ds3autogen.go.generators.response.*;
3936
import com.spectralogic.ds3autogen.go.generators.type.BaseTypeGenerator;
4037
import com.spectralogic.ds3autogen.go.generators.type.TypeModelGenerator;
4138
import com.spectralogic.ds3autogen.go.models.client.Client;
@@ -215,6 +212,9 @@ static ResponseModelGenerator<?> getResponseGenerator(final Ds3Request ds3Reques
215212
if (isGetObjectAmazonS3Request(ds3Request)) {
216213
return new GetObjectResponseGenerator();
217214
}
215+
if (isHeadObjectRequest(ds3Request)) {
216+
return new HeadObjectResponseGenerator();
217+
}
218218
if (!hasResponsePayload(ds3Request.getDs3ResponseCodes())) {
219219
return new NoResponseGenerator();
220220
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* ******************************************************************************
3+
* Copyright 2014-2018 Spectra Logic Corporation. All Rights Reserved.
4+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use
5+
* this file except in compliance with the License. A copy of the License is located at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* or in the "license" file accompanying this file.
10+
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
11+
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
12+
* specific language governing permissions and limitations under the License.
13+
* ****************************************************************************
14+
*/
15+
16+
package com.spectralogic.ds3autogen.go.generators.response
17+
18+
import com.google.common.collect.ImmutableList
19+
import com.spectralogic.ds3autogen.api.models.apispec.Ds3ResponseCode
20+
import com.spectralogic.ds3autogen.go.models.response.ResponseCode
21+
import com.spectralogic.ds3autogen.go.utils.goIndent
22+
23+
class HeadObjectResponseGenerator : BaseResponseGenerator() {
24+
25+
override fun toResponsePayloadStruct(expectedResponseCodes: ImmutableList<Ds3ResponseCode>?): String {
26+
return "BlobChecksumType ChecksumType\n" +
27+
goIndent(1) + "BlobChecksums map[int64]string"
28+
}
29+
30+
/**
31+
* Converts a Ds3ResponseCode into a ResponseCode model which contains the Go
32+
* code for parsing the specified response.
33+
*/
34+
override fun toResponseCode(ds3ResponseCode: Ds3ResponseCode, responseName: String): ResponseCode {
35+
if (ds3ResponseCode.code == 200) {
36+
val parsingCode = "checksumType, err := getBlobChecksumType(webResponse.Header())\n" +
37+
goIndent(2) + "if err != nil {\n" +
38+
goIndent(3) + "return nil, err\n" +
39+
goIndent(2) + "}\n" +
40+
goIndent(2) + "checksumMap, err := getBlobChecksumMap(webResponse.Header())\n" +
41+
goIndent(2) + "if err != nil {\n" +
42+
goIndent(3) + "return nil, err\n" +
43+
goIndent(2) + "}\n" +
44+
goIndent(2) + "return &$responseName{BlobChecksumType: checksumType, BlobChecksums: checksumMap, Headers: webResponse.Header()}, nil"
45+
return ResponseCode(ds3ResponseCode.code, parsingCode)
46+
}
47+
return toStandardResponseCode(ds3ResponseCode, responseName)
48+
}
49+
}

0 commit comments

Comments
 (0)