1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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
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 }