|
40 | 40 | */ |
41 | 41 | package org.graalvm.buildtools.agent; |
42 | 42 |
|
43 | | -import java.io.File; |
44 | 43 | import java.io.IOException; |
45 | 44 | import java.io.InputStream; |
46 | 45 | import java.io.Serializable; |
47 | | -import java.nio.file.CopyOption; |
48 | | -import java.nio.file.Files; |
49 | | -import java.nio.file.Path; |
50 | | -import java.nio.file.StandardCopyOption; |
| 46 | +import java.nio.file.*; |
51 | 47 | import java.util.ArrayList; |
52 | 48 | import java.util.Collection; |
53 | 49 | import java.util.List; |
| 50 | +import java.util.logging.Logger; |
54 | 51 |
|
55 | 52 | public class AgentConfiguration implements Serializable { |
56 | 53 |
|
57 | | - private static final String DEFAULT_ACCESS_FILTER_FILE = "/access-filter.json"; |
| 54 | + private static final String ACCESS_FILTER_PREFIX = "access-filter"; |
| 55 | + private static final String ACCESS_FILTER_SUFFIX = ".json"; |
| 56 | + private static final String DEFAULT_ACCESS_FILTER_FILE_LOCATION = "/" + ACCESS_FILTER_PREFIX + ACCESS_FILTER_SUFFIX; |
| 57 | + |
| 58 | + private static final Logger logger = Logger.getGlobal(); |
| 59 | + |
58 | 60 | private final Collection<String> callerFilterFiles; |
59 | 61 | private final Collection<String> accessFilterFiles; |
60 | 62 | private final Boolean builtinCallerFilter; |
@@ -144,23 +146,36 @@ private void addDefaultAccessFilter() { |
144 | 146 |
|
145 | 147 | String tempDir = System.getProperty("java.io.tmpdir"); |
146 | 148 | Path agentDir = Path.of(tempDir).resolve("agent-config"); |
147 | | - Path accessFilterFile = agentDir.resolve("access-filter.json"); |
| 149 | + Path accessFilterFile = agentDir.resolve(ACCESS_FILTER_PREFIX + ACCESS_FILTER_SUFFIX); |
148 | 150 | if (Files.exists(accessFilterFile)) { |
149 | 151 | accessFilterFiles.add(accessFilterFile.toString()); |
150 | 152 | return; |
151 | 153 | } |
152 | 154 |
|
153 | | - try(InputStream accessFilter = AgentConfiguration.class.getResourceAsStream(DEFAULT_ACCESS_FILTER_FILE)) { |
154 | | - if (accessFilter != null) { |
155 | | - if (!Files.exists(agentDir)) { |
156 | | - Files.createDirectory(agentDir); |
157 | | - } |
| 155 | + try(InputStream accessFilterData = AgentConfiguration.class.getResourceAsStream(DEFAULT_ACCESS_FILTER_FILE_LOCATION)) { |
| 156 | + if (accessFilterData == null) { |
| 157 | + throw new IOException("Cannot find access-filter.json on default location: " + DEFAULT_ACCESS_FILTER_FILE_LOCATION); |
| 158 | + } |
| 159 | + |
| 160 | + try { |
| 161 | + Files.createDirectory(agentDir); |
| 162 | + } catch (FileAlreadyExistsException e) { |
| 163 | + logger.info("Ignore directory creation because " + agentDir + " directory is already created."); |
| 164 | + } |
| 165 | + |
| 166 | + long pid = ProcessHandle.current().pid(); |
| 167 | + long time = System.currentTimeMillis(); |
| 168 | + Path tmpAccessFilter = agentDir.resolve(ACCESS_FILTER_PREFIX + '_' + pid + '_' + time + '_' + ACCESS_FILTER_SUFFIX); |
| 169 | + Files.copy(accessFilterData, tmpAccessFilter); |
158 | 170 |
|
159 | | - Files.copy(accessFilter, accessFilterFile, StandardCopyOption.REPLACE_EXISTING); |
160 | | - accessFilterFiles.add(accessFilterFile.toString()); |
161 | | - } else { |
162 | | - throw new IOException("Cannot find access-filter.json on default location: " + DEFAULT_ACCESS_FILTER_FILE); |
| 171 | + try { |
| 172 | + Files.move(tmpAccessFilter, accessFilterFile, StandardCopyOption.ATOMIC_MOVE); |
| 173 | + } catch (FileAlreadyExistsException e) { |
| 174 | + Files.delete(tmpAccessFilter); |
| 175 | + logger.info("Access-filter file already exists. Delete the temporary one."); |
163 | 176 | } |
| 177 | + |
| 178 | + accessFilterFiles.add(accessFilterFile.toString()); |
164 | 179 | } catch (IOException e) { |
165 | 180 | throw new RuntimeException("Cannot add default access-filter.json" ,e); |
166 | 181 | } |
|
0 commit comments