1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.aether.transport.file;
20
21 import javax.inject.Named;
22
23 import java.io.IOException;
24 import java.io.UncheckedIOException;
25 import java.net.URI;
26 import java.nio.file.FileSystem;
27 import java.nio.file.FileSystemNotFoundException;
28 import java.nio.file.FileSystems;
29 import java.nio.file.Path;
30 import java.nio.file.Paths;
31 import java.util.HashMap;
32 import java.util.Map;
33
34 import org.eclipse.aether.RepositorySystemSession;
35 import org.eclipse.aether.repository.RemoteRepository;
36 import org.eclipse.aether.repository.RepositoryUriUtils;
37 import org.eclipse.aether.spi.connector.transport.Transporter;
38 import org.eclipse.aether.spi.connector.transport.TransporterFactory;
39 import org.eclipse.aether.transfer.NoTransporterException;
40
41 import static java.util.Objects.requireNonNull;
42
43
44
45
46 @Named(FileTransporterFactory.NAME)
47 public final class FileTransporterFactory implements TransporterFactory {
48 public static final String NAME = "file";
49
50 private float priority;
51
52 @Override
53 public float getPriority() {
54 return priority;
55 }
56
57
58
59
60
61
62
63 public FileTransporterFactory setPriority(float priority) {
64 this.priority = priority;
65 return this;
66 }
67
68
69
70
71
72
73
74 @Override
75 public Transporter newInstance(RepositorySystemSession session, RemoteRepository repository)
76 throws NoTransporterException {
77 requireNonNull(session, "session cannot be null");
78 requireNonNull(repository, "repository cannot be null");
79
80 String repositoryUrl = repository.getUrl();
81 if (repositoryUrl.startsWith("bundle:")) {
82 try {
83 repositoryUrl = repositoryUrl.substring("bundle:".length());
84 URI bundlePath = URI.create("jar:"
85 + Paths.get(RepositoryUriUtils.toUri(repositoryUrl))
86 .toAbsolutePath()
87 .toUri()
88 .toASCIIString());
89 Map<String, String> env = new HashMap<>();
90 FileSystem fileSystem = FileSystems.newFileSystem(bundlePath, env);
91 return new FileTransporter(
92 fileSystem,
93 true,
94 false,
95 fileSystem.getPath(fileSystem.getSeparator()),
96 FileTransporter.WriteOp.COPY);
97 } catch (IOException e) {
98 throw new UncheckedIOException(e);
99 }
100 } else {
101
102
103 FileTransporter.WriteOp writeOp = FileTransporter.WriteOp.COPY;
104 if (repositoryUrl.startsWith("symlink+")) {
105 writeOp = FileTransporter.WriteOp.SYMLINK;
106 repositoryUrl = repositoryUrl.substring("symlink+".length());
107 } else if (repositoryUrl.startsWith("hardlink+")) {
108 writeOp = FileTransporter.WriteOp.HARDLINK;
109 repositoryUrl = repositoryUrl.substring("hardlink+".length());
110 }
111 try {
112 Path basePath =
113 Paths.get(RepositoryUriUtils.toUri(repositoryUrl)).toAbsolutePath();
114 return new FileTransporter(
115 basePath.getFileSystem(),
116 false,
117 !basePath.getFileSystem().isReadOnly(),
118 basePath,
119 writeOp);
120 } catch (FileSystemNotFoundException | IllegalArgumentException e) {
121 throw new NoTransporterException(repository, e);
122 }
123 }
124 }
125 }