2121import org .eclipse .edc .aws .s3 .AwsSecretToken ;
2222import org .eclipse .edc .aws .s3 .AwsTemporarySecretToken ;
2323import org .eclipse .edc .aws .s3 .S3ClientRequest ;
24+ import org .eclipse .edc .aws .s3 .SecretToken ;
2425import org .eclipse .edc .aws .s3 .spi .S3BucketSchema ;
2526import org .eclipse .edc .aws .s3 .validation .S3DataAddressCredentialsValidator ;
26- import org .eclipse .edc .connector .controlplane .transfer .spi .types .SecretToken ;
2727import org .eclipse .edc .connector .dataplane .spi .pipeline .DataSink ;
2828import org .eclipse .edc .connector .dataplane .spi .pipeline .DataSinkFactory ;
29+ import org .eclipse .edc .participantcontext .spi .service .ParticipantContextSupplier ;
2930import org .eclipse .edc .spi .EdcException ;
3031import org .eclipse .edc .spi .monitor .Monitor ;
3132import org .eclipse .edc .spi .result .Result ;
3233import org .eclipse .edc .spi .security .Vault ;
3334import org .eclipse .edc .spi .types .domain .DataAddress ;
3435import org .eclipse .edc .spi .types .domain .transfer .DataFlowStartMessage ;
35- import org .eclipse .edc .util .string .StringUtils ;
3636import org .eclipse .edc .validator .spi .DataAddressValidatorRegistry ;
3737import org .eclipse .edc .validator .spi .ValidationResult ;
3838import org .eclipse .edc .validator .spi .Validator ;
3939import org .jetbrains .annotations .NotNull ;
40+ import org .jetbrains .annotations .Nullable ;
4041
4142import java .io .IOException ;
4243import java .util .concurrent .ExecutorService ;
@@ -60,16 +61,19 @@ public class S3DataSinkFactory implements DataSinkFactory {
6061 private final ObjectMapper objectMapper ;
6162 private final int chunkSizeInBytes ;
6263 private final DataAddressValidatorRegistry dataAddressValidator ;
64+ private final ParticipantContextSupplier singleParticipantContextSupplier ;
6365
6466 public S3DataSinkFactory (AwsClientProvider clientProvider , ExecutorService executorService , Monitor monitor , Vault vault ,
65- ObjectMapper objectMapper , int chunkSizeInBytes , DataAddressValidatorRegistry dataAddressValidator ) {
67+ ObjectMapper objectMapper , int chunkSizeInBytes , DataAddressValidatorRegistry dataAddressValidator ,
68+ ParticipantContextSupplier singleParticipantContextSupplier ) {
6669 this .clientProvider = clientProvider ;
6770 this .executorService = executorService ;
6871 this .monitor = monitor ;
6972 this .vault = vault ;
7073 this .objectMapper = objectMapper ;
7174 this .chunkSizeInBytes = chunkSizeInBytes ;
7275 this .dataAddressValidator = dataAddressValidator ;
76+ this .singleParticipantContextSupplier = singleParticipantContextSupplier ;
7377 }
7478
7579 @ Override
@@ -109,10 +113,7 @@ public DataSink createSink(DataFlowStartMessage request) {
109113 private S3ClientRequest createS3ClientRequest (DataAddress address ) {
110114 var endpointOverride = address .getStringProperty (ENDPOINT_OVERRIDE );
111115 var region = address .getStringProperty (REGION );
112- var awsSecretToken = ofNullable (address .getKeyName ())
113- .filter (keyName -> !StringUtils .isNullOrBlank (keyName ))
114- .map (vault ::resolveSecret )
115- .filter (secret -> !StringUtils .isNullOrBlank (secret ))
116+ var awsSecretToken = ofNullable (getSecret (address ))
116117 .map (this ::deserializeSecretToken );
117118
118119 if (awsSecretToken .isPresent ()) {
@@ -125,7 +126,24 @@ private S3ClientRequest createS3ClientRequest(DataAddress address) {
125126 return S3ClientRequest .from (region , endpointOverride );
126127 }
127128 }
128-
129+
130+ private @ Nullable String getSecret (DataAddress dataAddress ) {
131+ var addressSecret = dataAddress .getStringProperty (DataAddress .EDC_DATA_ADDRESS_SECRET );
132+ if (addressSecret != null ) {
133+ return addressSecret ;
134+ }
135+
136+ var keyName = dataAddress .getKeyName ();
137+ if (keyName == null ) {
138+ return null ;
139+ }
140+
141+ var participantContext = singleParticipantContextSupplier .get ()
142+ .orElseThrow (f -> new EdcException ("Failed to obtain participant context for data sink creation" ));
143+
144+ return vault .resolveSecret (participantContext .getParticipantContextId (), keyName );
145+ }
146+
129147 private SecretToken deserializeSecretToken (String secret ) {
130148 try {
131149 var tree = objectMapper .readTree (secret );
0 commit comments