ApplicationTemp Class — spring-boot Architecture
Architecture documentation for the ApplicationTemp class in ApplicationTemp.java from the spring-boot codebase.
Entity Profile
Source Code
core/spring-boot/src/main/java/org/springframework/boot/system/ApplicationTemp.java lines 48–179
public class ApplicationTemp {
private static final FileAttribute<?>[] NO_FILE_ATTRIBUTES = {};
private static final EnumSet<PosixFilePermission> DIRECTORY_PERMISSIONS = EnumSet.of(PosixFilePermission.OWNER_READ,
PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_EXECUTE);
private final @Nullable Class<?> sourceClass;
private final Lock pathLock = new ReentrantLock();
private volatile @Nullable Path path;
/**
* Create a new {@link ApplicationTemp} instance.
*/
public ApplicationTemp() {
this(null);
}
/**
* Create a new {@link ApplicationTemp} instance for the specified source class.
* @param sourceClass the source class or {@code null}
*/
public ApplicationTemp(@Nullable Class<?> sourceClass) {
this.sourceClass = sourceClass;
}
@Override
public String toString() {
return getDir().getAbsolutePath();
}
/**
* Return the directory to be used for application specific temp files.
* @return the application temp directory
*/
public File getDir() {
return getPath().toFile();
}
/**
* Return a subdirectory of the application temp.
* @param subDir the subdirectory name
* @return a subdirectory
*/
public File getDir(String subDir) {
return createDirectory(getPath().resolve(subDir)).toFile();
}
private Path getPath() {
if (this.path == null) {
this.pathLock.lock();
try {
if (this.path == null) {
String hash = HexFormat.of().withUpperCase().formatHex(generateHash(this.sourceClass));
this.path = createDirectory(getTempDirectory().resolve(hash));
}
}
finally {
this.pathLock.unlock();
}
}
Path path = this.path;
Assert.state(path != null, "'path' must not be null");
return path;
}
private Path createDirectory(Path path) {
try {
if (!Files.exists(path)) {
Files.createDirectory(path, getFileAttributes(path.getFileSystem(), DIRECTORY_PERMISSIONS));
}
return path;
}
catch (IOException ex) {
throw new IllegalStateException("Unable to create application temp directory " + path, ex);
}
}
private FileAttribute<?>[] getFileAttributes(FileSystem fileSystem, EnumSet<PosixFilePermission> ownerReadWrite) {
if (!fileSystem.supportedFileAttributeViews().contains("posix")) {
return NO_FILE_ATTRIBUTES;
}
return new FileAttribute<?>[] { PosixFilePermissions.asFileAttribute(ownerReadWrite) };
}
private Path getTempDirectory() {
String property = System.getProperty("java.io.tmpdir");
Assert.state(StringUtils.hasLength(property), "No 'java.io.tmpdir' property set");
Path tempDirectory = Paths.get(property);
Assert.state(Files.exists(tempDirectory), () -> "Temp directory '" + tempDirectory + "' does not exist");
Assert.state(Files.isDirectory(tempDirectory),
() -> "Temp location '" + tempDirectory + "' is not a directory");
return tempDirectory;
}
private byte[] generateHash(@Nullable Class<?> sourceClass) {
ApplicationHome home = new ApplicationHome(sourceClass);
MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA-1");
update(digest, home.getSource());
update(digest, home.getDir());
update(digest, System.getProperty("user.dir"));
if (!NativeDetector.inNativeImage()) {
update(digest, System.getProperty("java.home"));
}
update(digest, System.getProperty("java.class.path"));
update(digest, System.getProperty("sun.java.command"));
update(digest, System.getProperty("sun.boot.class.path"));
return digest.digest();
}
catch (Exception ex) {
throw new IllegalStateException(ex);
}
}
private void update(MessageDigest digest, @Nullable Object source) {
if (source != null) {
digest.update(getUpdateSourceBytes(source));
}
}
private byte[] getUpdateSourceBytes(Object source) {
if (source instanceof File file) {
return getUpdateSourceBytes(file.getAbsolutePath());
}
return source.toString().getBytes();
}
}
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free