11package com .sap .cds .sdm .handler ;
22
33import static com .sap .cds .sdm .constants .SDMConstants .NAMED_USER_FLOW ;
4+ import static com .sap .cloud .sdk .cloudplatform .connectivity .OnBehalfOf .TECHNICAL_USER_CURRENT_TENANT ;
45import static java .util .Objects .requireNonNull ;
56
67import com .sap .cds .sdm .constants .SDMConstants ;
78import com .sap .cds .sdm .model .SDMCredentials ;
9+ import com .sap .cds .sdm .service .SDMPropertySupplier ;
10+ import com .sap .cds .sdm .service .SDMUser ;
811import com .sap .cds .services .environment .CdsProperties ;
912import com .sap .cloud .environment .servicebinding .api .DefaultServiceBindingAccessor ;
1013import com .sap .cloud .environment .servicebinding .api .ServiceBinding ;
11- import com .sap .cloud .sdk .cloudplatform .connectivity .DefaultHttpClientFactory ;
12- import com .sap .cloud .sdk .cloudplatform .connectivity .DefaultHttpDestination ;
13- import com .sap .cloud .sdk .cloudplatform .connectivity .OAuth2DestinationBuilder ;
14- import com .sap .cloud .sdk .cloudplatform .connectivity .OnBehalfOf ;
14+ import com .sap .cloud .environment .servicebinding .api .ServiceIdentifier ;
15+ import com .sap .cloud .sdk .cloudplatform .connectivity .*;
1516import com .sap .cloud .security .config .ClientCredentials ;
1617import java .nio .charset .StandardCharsets ;
1718import java .time .Duration ;
1819import java .util .List ;
1920import java .util .Map ;
21+ import java .util .Optional ;
2022import org .apache .http .client .HttpClient ;
23+ import org .slf4j .Logger ;
24+ import org .slf4j .LoggerFactory ;
2125
2226public class TokenHandler {
2327 private static final String SDM_TOKEN_ENDPOINT = "url" ;
@@ -29,13 +33,20 @@ public class TokenHandler {
2933
3034 private TokenHandler () {}
3135
36+ private static final Logger logger = LoggerFactory .getLogger (TokenHandler .class );
37+
3238 public static TokenHandler getTokenHandlerInstance () {
3339 if (instance == null ) {
3440 instance = new TokenHandler ();
3541 }
3642 return instance ;
3743 }
3844
45+ static {
46+ OAuth2ServiceBindingDestinationLoader .registerPropertySupplier (
47+ ServiceIdentifier .of ("sdm" ), SDMPropertySupplier ::new );
48+ }
49+
3950 public byte [] toBytes (String str ) {
4051 return requireNonNull (str ).getBytes (StandardCharsets .UTF_8 );
4152 }
@@ -127,4 +138,48 @@ public HttpClient getHttpClient(
127138
128139 return builder .build ().createHttpClient (destination );
129140 }
141+
142+ public HttpClient getHttpClientForAuthoritiesFlow (
143+ CdsProperties .ConnectionPool connectionPoolConfig , String user ) {
144+
145+ Optional <HttpDestination > destinations = getHttpDestination (user );
146+ if (destinations .isPresent ()) {
147+ DefaultHttpClientFactory .DefaultHttpClientFactoryBuilder builder =
148+ DefaultHttpClientFactory .builder ();
149+
150+ if (connectionPoolConfig == null ) {
151+ Duration timeout = Duration .ofSeconds (SDMConstants .CONNECTION_TIMEOUT );
152+ builder .timeoutMilliseconds ((int ) timeout .toMillis ());
153+ builder .maxConnectionsPerRoute (SDMConstants .MAX_CONNECTIONS );
154+ builder .maxConnectionsTotal (SDMConstants .MAX_CONNECTIONS );
155+ } else {
156+ builder .timeoutMilliseconds ((int ) connectionPoolConfig .getTimeout ().toMillis ());
157+ builder .maxConnectionsPerRoute (connectionPoolConfig .getMaxConnectionsPerRoute ());
158+ builder .maxConnectionsTotal (connectionPoolConfig .getMaxConnections ());
159+ }
160+
161+ return builder .build ().createHttpClient (destinations .get ());
162+ }
163+ return null ;
164+ }
165+
166+ private Optional <HttpDestination > getHttpDestination (String userName ) {
167+ HttpDestination httpDestination ;
168+ try {
169+ httpDestination =
170+ ServiceBindingDestinationLoader .defaultLoaderChain ()
171+ .getDestination (getSDMDestinationOptions (userName ));
172+ } catch (Exception exception ) {
173+ logger .error ("Error with fetching httpdestination " + exception .getCause ());
174+ httpDestination = null ;
175+ }
176+ return Optional .ofNullable (httpDestination );
177+ }
178+
179+ public static ServiceBindingDestinationOptions getSDMDestinationOptions (String userName ) {
180+ return ServiceBindingDestinationOptions .forService (ServiceIdentifier .of ("sdm" ))
181+ .onBehalfOf (TECHNICAL_USER_CURRENT_TENANT )
182+ .withOption (SDMUser .of (userName ))
183+ .build ();
184+ }
130185}
0 commit comments