View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.internal.impl;
20  
21  import java.util.ArrayList;
22  import java.util.Collection;
23  import java.util.List;
24  
25  import org.eclipse.aether.RepositorySystemSession;
26  import org.eclipse.aether.artifact.Artifact;
27  import org.eclipse.aether.internal.test.util.TestFileUtils;
28  import org.eclipse.aether.metadata.Metadata;
29  import org.eclipse.aether.spi.connector.ArtifactDownload;
30  import org.eclipse.aether.spi.connector.ArtifactUpload;
31  import org.eclipse.aether.spi.connector.MetadataDownload;
32  import org.eclipse.aether.spi.connector.MetadataUpload;
33  import org.eclipse.aether.spi.connector.RepositoryConnector;
34  import org.eclipse.aether.spi.connector.Transfer;
35  import org.eclipse.aether.transfer.ArtifactTransferException;
36  import org.eclipse.aether.transfer.MetadataTransferException;
37  import org.eclipse.aether.transfer.TransferEvent;
38  import org.eclipse.aether.transfer.TransferListener;
39  import org.eclipse.aether.transfer.TransferResource;
40  
41  import static org.junit.jupiter.api.Assertions.*;
42  
43  /**
44   * A repository connector recording all get/put-requests and faking the results.
45   */
46  class RecordingRepositoryConnector implements RepositoryConnector {
47  
48      RepositorySystemSession session;
49  
50      boolean fail;
51  
52      private Artifact[] expectGet;
53  
54      private Artifact[] expectPut;
55  
56      private Metadata[] expectGetMD;
57  
58      private Metadata[] expectPutMD;
59  
60      private List<Artifact> actualGet = new ArrayList<>();
61  
62      private List<Metadata> actualGetMD = new ArrayList<>();
63  
64      private List<Artifact> actualPut = new ArrayList<>();
65  
66      private List<Metadata> actualPutMD = new ArrayList<>();
67  
68      public RecordingRepositoryConnector(
69              RepositorySystemSession session,
70              Artifact[] expectGet,
71              Artifact[] expectPut,
72              Metadata[] expectGetMD,
73              Metadata[] expectPutMD) {
74          this.session = session;
75          this.expectGet = expectGet;
76          this.expectPut = expectPut;
77          this.expectGetMD = expectGetMD;
78          this.expectPutMD = expectPutMD;
79      }
80  
81      public RecordingRepositoryConnector(RepositorySystemSession session) {
82          this.session = session;
83      }
84  
85      public RecordingRepositoryConnector() {}
86  
87      @Override
88      public void get(
89              Collection<? extends ArtifactDownload> artifactDownloads,
90              Collection<? extends MetadataDownload> metadataDownloads) {
91          try {
92              if (artifactDownloads != null) {
93                  for (ArtifactDownload download : artifactDownloads) {
94                      fireInitiated(download);
95                      Artifact artifact = download.getArtifact();
96                      this.actualGet.add(artifact);
97                      if (fail) {
98                          download.setException(new ArtifactTransferException(artifact, null, "forced failure"));
99                      } else {
100                         TestFileUtils.writeString(download.getFile(), artifact.toString());
101                     }
102                     fireDone(download);
103                 }
104             }
105             if (metadataDownloads != null) {
106                 for (MetadataDownload download : metadataDownloads) {
107                     fireInitiated(download);
108                     Metadata metadata = download.getMetadata();
109                     this.actualGetMD.add(metadata);
110                     if (fail) {
111                         download.setException(new MetadataTransferException(metadata, null, "forced failure"));
112                     } else {
113                         TestFileUtils.writeString(download.getFile(), metadata.toString());
114                     }
115                     fireDone(download);
116                 }
117             }
118         } catch (Exception e) {
119             throw new IllegalStateException(e);
120         }
121     }
122 
123     @Override
124     public void put(
125             Collection<? extends ArtifactUpload> artifactUploads,
126             Collection<? extends MetadataUpload> metadataUploads) {
127         try {
128             if (artifactUploads != null) {
129                 for (ArtifactUpload upload : artifactUploads) {
130                     // mimic "real" connector
131                     fireInitiated(upload);
132                     if (upload.getFile() == null) {
133                         upload.setException(new ArtifactTransferException(upload.getArtifact(), null, "no file"));
134                     } else if (fail) {
135                         upload.setException(
136                                 new ArtifactTransferException(upload.getArtifact(), null, "forced failure"));
137                     }
138                     this.actualPut.add(upload.getArtifact());
139                     fireDone(upload);
140                 }
141             }
142             if (metadataUploads != null) {
143                 for (MetadataUpload upload : metadataUploads) {
144                     // mimic "real" connector
145                     fireInitiated(upload);
146                     if (upload.getFile() == null) {
147                         upload.setException(new MetadataTransferException(upload.getMetadata(), null, "no file"));
148                     } else if (fail) {
149                         upload.setException(
150                                 new MetadataTransferException(upload.getMetadata(), null, "forced failure"));
151                     }
152                     this.actualPutMD.add(upload.getMetadata());
153                     fireDone(upload);
154                 }
155             }
156         } catch (Exception e) {
157             throw new IllegalStateException(e);
158         }
159     }
160 
161     private void fireInitiated(Transfer transfer) throws Exception {
162         TransferListener listener = transfer.getListener();
163         if (listener == null) {
164             return;
165         }
166         TransferEvent.Builder event =
167                 new TransferEvent.Builder(session, new TransferResource(null, null, null, null, transfer.getTrace()));
168         event.setType(TransferEvent.EventType.INITIATED);
169         listener.transferInitiated(event.build());
170     }
171 
172     private void fireDone(Transfer transfer) {
173         TransferListener listener = transfer.getListener();
174         if (listener == null) {
175             return;
176         }
177         TransferEvent.Builder event =
178                 new TransferEvent.Builder(session, new TransferResource(null, null, null, null, transfer.getTrace()));
179         event.setException(transfer.getException());
180         if (transfer.getException() != null) {
181             listener.transferFailed(
182                     event.setType(TransferEvent.EventType.FAILED).build());
183         } else {
184             listener.transferSucceeded(
185                     event.setType(TransferEvent.EventType.SUCCEEDED).build());
186         }
187     }
188 
189     @Override
190     public void close() {}
191 
192     public void assertSeenExpected() {
193         assertSeenExpected(actualGet, expectGet);
194         assertSeenExpected(actualGetMD, expectGetMD);
195         assertSeenExpected(actualPut, expectPut);
196         assertSeenExpected(actualPutMD, expectPutMD);
197     }
198 
199     private void assertSeenExpected(List<?> actual, Object[] expected) {
200         if (expected == null) {
201             expected = new Object[0];
202         }
203 
204         assertEquals(expected.length, actual.size(), "different number of expected and actual elements:");
205         int idx = 0;
206         for (Object actualObject : actual) {
207             assertEquals(expected[idx++], actualObject, "seen object differs");
208         }
209     }
210 
211     public List<Artifact> getActualArtifactGetRequests() {
212         return actualGet;
213     }
214 
215     public List<Metadata> getActualMetadataGetRequests() {
216         return actualGetMD;
217     }
218 
219     public List<Artifact> getActualArtifactPutRequests() {
220         return actualPut;
221     }
222 
223     public List<Metadata> getActualMetadataPutRequests() {
224         return actualPutMD;
225     }
226 
227     public void setExpectGet(Artifact... expectGet) {
228         this.expectGet = expectGet;
229     }
230 
231     public void setExpectPut(Artifact... expectPut) {
232         this.expectPut = expectPut;
233     }
234 
235     public void setExpectGet(Metadata... expectGetMD) {
236         this.expectGetMD = expectGetMD;
237     }
238 
239     public void setExpectPut(Metadata... expectPutMD) {
240         this.expectPutMD = expectPutMD;
241     }
242 
243     public void resetActual() {
244         this.actualGet = new ArrayList<>();
245         this.actualGetMD = new ArrayList<>();
246         this.actualPut = new ArrayList<>();
247         this.actualPutMD = new ArrayList<>();
248     }
249 }