Skip to content

Commit 0cf1b83

Browse files
authored
Merge branch 'main' into fix/oauth2-rotate-ztis-certificates-in-place
2 parents 8f4d6a1 + d96432d commit 0cf1b83

26 files changed

Lines changed: 318 additions & 74 deletions

File tree

.github/workflows/deploy-snapshot.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,16 @@ jobs:
3737
DEPLOYMENT_USER: ${{ secrets.ARTIFACTORY_COMMON_USER }}
3838
DEPLOYMENT_PASS: ${{ secrets.ARTIFACTORY_COMMON_PASSWORD }}
3939

40+
- name: 'Slack Notification'
41+
if: failure()
42+
uses: slackapi/slack-github-action@v3.0.1
43+
with:
44+
webhook: ${{ secrets.SLACK_WEBHOOK }}
45+
webhook-type: incoming-webhook
46+
payload: |
47+
blocks:
48+
- type: "section"
49+
text:
50+
type: "mrkdwn"
51+
text: "⚠️ Deploy Snapshot to SAP Common Artifactory failed! 😬 Please inspect & fix by clicking <https://github.com/SAP/ai-sdk-java/actions/runs/${{ github.run_id }}|here>. Authentication problems can be fixed by updating the `ARTIFACTORY_COMMON_PASSWORD`: Go to <https://common.repositories.cloud.sap/|Artifactory>, login with user `asa1_fin_cloud_oper`, Edit Profile and Generate an Identity Token. "
52+

datamodel/odata-client/src/main/java/com/sap/cloud/sdk/datamodel/odata/client/expression/ODataResourcePath.java

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.sap.cloud.sdk.datamodel.odata.client.expression;
22

33
import java.util.ArrayList;
4-
import java.util.Collections;
54
import java.util.List;
65
import java.util.stream.Collectors;
76

87
import javax.annotation.Nonnull;
98
import javax.annotation.Nullable;
109

10+
import com.google.common.annotations.Beta;
1111
import com.sap.cloud.sdk.datamodel.odata.client.request.AbstractODataParameters;
1212
import com.sap.cloud.sdk.datamodel.odata.client.request.UriEncodingStrategy;
1313

@@ -36,20 +36,7 @@ public final class ODataResourcePath
3636
*/
3737
@Getter( AccessLevel.PUBLIC )
3838
@Nonnull
39-
private final List<Tuple2<String, AbstractODataParameters>> segments;
40-
41-
/**
42-
* Default constructor to create an empty resource path.
43-
*/
44-
public ODataResourcePath()
45-
{
46-
this(Collections.emptyList());
47-
}
48-
49-
private ODataResourcePath( @Nonnull final List<Tuple2<String, AbstractODataParameters>> segments )
50-
{
51-
this.segments = List.copyOf(segments);
52-
}
39+
private final List<Tuple2<String, AbstractODataParameters>> segments = new ArrayList<>();
5340

5441
/**
5542
* Convenience method for {@code new ODataResourcePath().addSegment(segment)}. It creates a new resource path for
@@ -111,9 +98,8 @@ public ODataResourcePath addSegment( @Nonnull final String segment )
11198
ODataResourcePath
11299
addSegment( @Nonnull final String segment, @Nullable final AbstractODataParameters parameters )
113100
{
114-
final var newSegments = new ArrayList<>(segments);
115-
newSegments.add(Tuple.of(segment, parameters));
116-
return new ODataResourcePath(newSegments);
101+
segments.add(Tuple.of(segment, parameters));
102+
return this;
117103
}
118104

119105
/**
@@ -143,9 +129,8 @@ public ODataResourcePath addParameterToLastSegment( @Nonnull final AbstractOData
143129
lastSegment._2());
144130
throw new IllegalStateException(msg);
145131
}
146-
final var newSegments = new ArrayList<>(segments);
147-
newSegments.set(newSegments.size() - 1, lastSegment.update2(parameters));
148-
return new ODataResourcePath(newSegments);
132+
segments.set(segments.size() - 1, lastSegment.update2(parameters));
133+
return this;
149134
}
150135

151136
/**
@@ -196,4 +181,22 @@ public String toString()
196181
.map(t -> t._1() + t._2())
197182
.collect(Collectors.joining("/"));
198183
}
184+
185+
/**
186+
* Creates a defensive copy of this resource path.
187+
*
188+
* @return A new {@link ODataResourcePath} with the same segments as this path.
189+
* @since 5.28.0
190+
*/
191+
@Beta
192+
@Nonnull
193+
public ODataResourcePath copy()
194+
{
195+
final var copy = new ODataResourcePath();
196+
for( final var segment : segments ) {
197+
copy.addSegment(segment._1(), segment._2());
198+
}
199+
return copy;
200+
}
201+
199202
}

datamodel/odata-client/src/main/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestCount.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public ODataRequestCount(
5454
@Nullable final String encodedQuery,
5555
@Nonnull final ODataProtocol protocol )
5656
{
57-
super(servicePath, resourcePath.addSegment("$count"), encodedQuery, protocol);
57+
super(servicePath, resourcePath.copy().addSegment("$count"), encodedQuery, protocol);
5858
}
5959

6060
/**
@@ -74,7 +74,7 @@ public ODataRequestCount(
7474
{
7575
this(
7676
servicePath,
77-
resourcePath.addSegment(query.getEntityOrPropertyName()),
77+
resourcePath.copy().addSegment(query.getEntityOrPropertyName()),
7878
query.getEncodedQueryString(),
7979
query.getProtocol());
8080
}

datamodel/odata-client/src/main/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestFunction.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ public ODataRequestFunction(
128128
@Nonnull final ODataResourcePath functionPath,
129129
@Nonnull final StructuredQuery structQuery )
130130
{
131-
super(servicePath, functionPath.addSegment(structQuery.getEntityOrPropertyName()), structQuery.getProtocol());
131+
super(
132+
servicePath,
133+
functionPath.copy().addSegment(structQuery.getEntityOrPropertyName()),
134+
structQuery.getProtocol());
132135
this.query = structQuery.getEncodedQueryString();
133136
}
134137

@@ -171,7 +174,7 @@ private static ODataResourcePath appendResourcePathWithParameters(
171174
if( protocol.isEqualTo(ODataProtocol.V2) ) {
172175
return path;
173176
}
174-
return path.addParameterToLastSegment(parameters);
177+
return path.copy().addParameterToLastSegment(parameters);
175178
}
176179

177180
@Nullable

datamodel/odata-client/src/main/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestRead.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public ODataRequestRead(
101101
{
102102
this(
103103
servicePath,
104-
entityPath.addSegment(query.getEntityOrPropertyName()),
104+
entityPath.copy().addSegment(query.getEntityOrPropertyName()),
105105
query.getEncodedQueryString(),
106106
query.getProtocol());
107107
}

datamodel/odata-client/src/main/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestReadByKey.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public ODataRequestReadByKey(
9696
{
9797
this(
9898
servicePath,
99-
entityPath.addParameterToLastSegment(entityKey),
99+
entityPath.copy().addParameterToLastSegment(entityKey),
100100
query.getEncodedQueryString(),
101101
query.getProtocol());
102102
}

datamodel/odata-v4/odata-v4-core/src/main/java/com/sap/cloud/sdk/datamodel/odatav4/core/ServiceWithNavigableEntitiesImpl.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public <NavigationT extends VdmEntity<NavigationT>> NavigableEntityCollection<Na
6767
{
6868
return new EntityCollection<>(
6969
servicePath,
70-
entityPath.addSegment(property.getFieldName()),
70+
entityPath.copy().addSegment(property.getFieldName()),
7171
property.getItemType());
7272
}
7373

@@ -78,7 +78,7 @@ public <NavigationT extends VdmEntity<NavigationT>> NavigableEntitySingle<Naviga
7878
{
7979
return new EntitySingle<>(
8080
servicePath,
81-
entityPath.addSegment(property.getFieldName()),
81+
entityPath.copy().addSegment(property.getFieldName()),
8282
Option.none(),
8383
property.getItemType());
8484
}
@@ -106,7 +106,7 @@ public <ResultT extends VdmEntity<ResultT>> NavigableEntitySingle<ResultT> withF
106106
{
107107
return new EntitySingle<>(
108108
servicePath,
109-
entityPath.addSegment(function.getQualifiedName(), function.getParameters()),
109+
entityPath.copy().addSegment(function.getQualifiedName(), function.getParameters()),
110110
Option.none(),
111111
function.getReturnType());
112112
}
@@ -118,7 +118,7 @@ public <ResultT extends VdmEntity<ResultT>> NavigableEntityCollection<ResultT> w
118118
{
119119
return new EntityCollection<>(
120120
servicePath,
121-
entityPath.addSegment(function.getQualifiedName(), function.getParameters()),
121+
entityPath.copy().addSegment(function.getQualifiedName(), function.getParameters()),
122122
function.getReturnType());
123123
}
124124

@@ -127,7 +127,7 @@ public <ResultT extends VdmEntity<ResultT>> NavigableEntityCollection<ResultT> w
127127
public <ResultT> SingleValueActionRequestBuilder<ResultT> applyAction(
128128
@Nonnull final BoundAction.SingleToSingle<EntityT, ResultT> action )
129129
{
130-
final ODataResourcePath actionPath = entityPath.addSegment(action.getQualifiedName());
130+
final ODataResourcePath actionPath = entityPath.copy().addSegment(action.getQualifiedName());
131131
final SingleValueActionRequestBuilder<ResultT> requestBuilder =
132132
new SingleValueActionRequestBuilder<>(
133133
servicePath,
@@ -148,7 +148,7 @@ public <ResultT> SingleValueActionRequestBuilder<ResultT> applyAction(
148148
public <ResultT> CollectionValueActionRequestBuilder<ResultT> applyAction(
149149
@Nonnull final BoundAction.SingleToCollection<EntityT, ResultT> action )
150150
{
151-
final ODataResourcePath actionPath = entityPath.addSegment(action.getQualifiedName());
151+
final ODataResourcePath actionPath = entityPath.copy().addSegment(action.getQualifiedName());
152152
final CollectionValueActionRequestBuilder<ResultT> requestBuilder =
153153
new CollectionValueActionRequestBuilder<>(
154154
servicePath,
@@ -217,7 +217,7 @@ public CountRequestBuilder<NavigationT> count()
217217
{
218218
return new ServiceWithNavigableEntitiesImpl.EntitySingle<>(
219219
servicePath,
220-
entityPath.addSegment(function.getQualifiedName(), function.getParameters()),
220+
entityPath.copy().addSegment(function.getQualifiedName(), function.getParameters()),
221221
Option.none(),
222222
function.getReturnType());
223223
}
@@ -232,7 +232,7 @@ public CountRequestBuilder<NavigationT> count()
232232
{
233233
return new ServiceWithNavigableEntitiesImpl.EntityCollection<>(
234234
servicePath,
235-
entityPath.addSegment(function.getQualifiedName(), function.getParameters()),
235+
entityPath.copy().addSegment(function.getQualifiedName(), function.getParameters()),
236236
function.getReturnType());
237237
}
238238

@@ -243,7 +243,7 @@ public <EntityT extends VdmEntity<EntityT>, ResultT> CollectionValueActionReques
243243
{
244244
return new CollectionValueActionRequestBuilder<>(
245245
servicePath,
246-
entityPath.addSegment(action.getQualifiedName()),
246+
entityPath.copy().addSegment(action.getQualifiedName()),
247247
action.getParameters(),
248248
action.getReturnType());
249249
}
@@ -255,7 +255,7 @@ public <EntityT extends VdmEntity<EntityT>, ResultT> SingleValueActionRequestBui
255255
{
256256
return new SingleValueActionRequestBuilder<>(
257257
servicePath,
258-
entityPath.addSegment(action.getQualifiedName()),
258+
entityPath.copy().addSegment(action.getQualifiedName()),
259259
action.getParameters(),
260260
action.getReturnType());
261261
}
@@ -288,7 +288,7 @@ EntityT extends VdmEntity<EntityT>, ResultT> CollectionValueFunctionRequestBuild
288288
{
289289
return new SingleValueFunctionRequestBuilder<>(
290290
servicePath,
291-
entityPath.addSegment(function.getQualifiedName(), function.getParameters()),
291+
entityPath.copy().addSegment(function.getQualifiedName(), function.getParameters()),
292292
function.getReturnType());
293293
}
294294

@@ -302,7 +302,7 @@ EntityT extends VdmEntity<EntityT>, ResultT> CollectionValueFunctionRequestBuild
302302
{
303303
return new CollectionValueFunctionRequestBuilder<>(
304304
servicePath,
305-
entityPath.addSegment(function.getQualifiedName(), function.getParameters()),
305+
entityPath.copy().addSegment(function.getQualifiedName(), function.getParameters()),
306306
function.getReturnType());
307307
}
308308
}

datamodel/openapi/openapi-api-apache-sample/src/main/java/com/sap/cloud/sdk/datamodel/openapi/apache/petstore/api/DefaultApi.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,21 @@ public DefaultApi( @Nonnull final ApiClient apiClient )
5353
super(apiClient);
5454
}
5555

56+
/**
57+
* Creates a new API instance with additional default headers.
58+
*
59+
* @param defaultHeaders
60+
* Additional headers to include in all requests
61+
* @return A new API instance with the combined headers
62+
*/
63+
public DefaultApi withDefaultHeaders( @Nonnull final Map<String, String> defaultHeaders )
64+
{
65+
final var api = new DefaultApi(apiClient);
66+
api.defaultHeaders.putAll(this.defaultHeaders);
67+
api.defaultHeaders.putAll(defaultHeaders);
68+
return api;
69+
}
70+
5671
/**
5772
* <p>
5873
* <p>
@@ -85,7 +100,7 @@ public Pet addPet( @Nonnull final PetInput pet )
85100
final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
86101
final List<Pair> localVarQueryParams = new ArrayList<Pair>();
87102
final List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
88-
final Map<String, String> localVarHeaderParams = new HashMap<String, String>();
103+
final Map<String, String> localVarHeaderParams = new HashMap<String, String>(defaultHeaders);
89104
final Map<String, Object> localVarFormParams = new HashMap<String, Object>();
90105

91106
final String[] localVarAccepts = { "application/json" };
@@ -145,7 +160,7 @@ public OpenApiResponse deletePet( @Nonnull final Long id )
145160
final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
146161
final List<Pair> localVarQueryParams = new ArrayList<Pair>();
147162
final List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
148-
final Map<String, String> localVarHeaderParams = new HashMap<String, String>();
163+
final Map<String, String> localVarHeaderParams = new HashMap<String, String>(defaultHeaders);
149164
final Map<String, Object> localVarFormParams = new HashMap<String, Object>();
150165

151166
final String[] localVarAccepts = { "application/json" };
@@ -207,7 +222,7 @@ public Pet findPetById( @Nonnull final Long id )
207222
final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
208223
final List<Pair> localVarQueryParams = new ArrayList<Pair>();
209224
final List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
210-
final Map<String, String> localVarHeaderParams = new HashMap<String, String>();
225+
final Map<String, String> localVarHeaderParams = new HashMap<String, String>(defaultHeaders);
211226
final Map<String, Object> localVarFormParams = new HashMap<String, Object>();
212227

213228
final String[] localVarAccepts = { "application/json", "application/xml", "text/xml", "text/html" };
@@ -264,7 +279,7 @@ public List<Pet> findPets( @Nullable final List<String> tags, @Nullable final In
264279
final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
265280
final List<Pair> localVarQueryParams = new ArrayList<Pair>();
266281
final List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
267-
final Map<String, String> localVarHeaderParams = new HashMap<String, String>();
282+
final Map<String, String> localVarHeaderParams = new HashMap<String, String>(defaultHeaders);
268283
final Map<String, Object> localVarFormParams = new HashMap<String, Object>();
269284

270285
localVarCollectionQueryParams.addAll(ApiClient.parameterToPairs("csv", "tags", tags));

datamodel/openapi/openapi-api-apache-sample/src/main/java/com/sap/cloud/sdk/datamodel/openapi/apache/sodastore/api/OrdersApi.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ public OrdersApi( @Nonnull final ApiClient apiClient )
5050
super(apiClient);
5151
}
5252

53+
/**
54+
* Creates a new API instance with additional default headers.
55+
*
56+
* @param defaultHeaders
57+
* Additional headers to include in all requests
58+
* @return A new API instance with the combined headers
59+
*/
60+
public OrdersApi withDefaultHeaders( @Nonnull final Map<String, String> defaultHeaders )
61+
{
62+
final var api = new OrdersApi(apiClient);
63+
api.defaultHeaders.putAll(this.defaultHeaders);
64+
api.defaultHeaders.putAll(defaultHeaders);
65+
return api;
66+
}
67+
5368
/**
5469
* <p>
5570
* Create a new order
@@ -80,7 +95,7 @@ public Order ordersPost( @Nonnull final Order order )
8095
final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
8196
final List<Pair> localVarQueryParams = new ArrayList<Pair>();
8297
final List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
83-
final Map<String, String> localVarHeaderParams = new HashMap<String, String>();
98+
final Map<String, String> localVarHeaderParams = new HashMap<String, String>(defaultHeaders);
8499
final Map<String, Object> localVarFormParams = new HashMap<String, Object>();
85100

86101
final String[] localVarAccepts = { "application/json" };

0 commit comments

Comments
 (0)