clean up and organize
This commit is contained in:
parent
b88a4e3c62
commit
e3dc8f10c4
@ -1,6 +1,7 @@
|
|||||||
package p.studio;
|
package p.studio;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import p.packer.Packer;
|
||||||
import p.studio.events.StudioEventBus;
|
import p.studio.events.StudioEventBus;
|
||||||
import p.studio.events.StudioPackerEventAdapter;
|
import p.studio.events.StudioPackerEventAdapter;
|
||||||
import p.studio.utilities.ThemeService;
|
import p.studio.utilities.ThemeService;
|
||||||
@ -16,7 +17,7 @@ public final class AppContainer implements Container {
|
|||||||
private final ThemeService themeService;
|
private final ThemeService themeService;
|
||||||
private final StudioEventBus studioEventBus;
|
private final StudioEventBus studioEventBus;
|
||||||
private final ObjectMapper mapper;
|
private final ObjectMapper mapper;
|
||||||
private final Packer packer;
|
private final EmbeddedPacker embeddedPacker;
|
||||||
private final StudioBackgroundTasks backgroundTasks;
|
private final StudioBackgroundTasks backgroundTasks;
|
||||||
|
|
||||||
public AppContainer() {
|
public AppContainer() {
|
||||||
@ -26,8 +27,8 @@ public final class AppContainer implements Container {
|
|||||||
this.mapper = new ObjectMapper();
|
this.mapper = new ObjectMapper();
|
||||||
final ExecutorService backgroundExecutor = Executors.newFixedThreadPool(2, new StudioWorkerThreadFactory());
|
final ExecutorService backgroundExecutor = Executors.newFixedThreadPool(2, new StudioWorkerThreadFactory());
|
||||||
this.backgroundTasks = new StudioBackgroundTasks(backgroundExecutor);
|
this.backgroundTasks = new StudioBackgroundTasks(backgroundExecutor);
|
||||||
final p.packer.Packer embeddedPacker = p.packer.Packer.bootstrap(new StudioPackerEventAdapter(studioEventBus));
|
final Packer packer = Packer.bootstrap(Container.mapper(), new StudioPackerEventAdapter(studioEventBus));
|
||||||
this.packer = new Packer(embeddedPacker.workspaceService(), embeddedPacker::close);
|
this.embeddedPacker = new EmbeddedPacker(packer.workspaceService(), packer::close);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -51,8 +52,8 @@ public final class AppContainer implements Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Packer getPacker() {
|
public EmbeddedPacker getPacker() {
|
||||||
return packer;
|
return embeddedPacker;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -62,7 +63,7 @@ public final class AppContainer implements Container {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void shutdownContainer() {
|
public void shutdownContainer() {
|
||||||
packer.shutdown();
|
embeddedPacker.shutdown();
|
||||||
backgroundTasks.shutdown();
|
backgroundTasks.shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package p.packer;
|
package p.packer;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import p.packer.events.PackerEventSink;
|
import p.packer.events.PackerEventSink;
|
||||||
import p.packer.services.*;
|
import p.packer.services.*;
|
||||||
|
|
||||||
@ -12,29 +13,29 @@ public final class Packer implements Closeable {
|
|||||||
private final PackerProjectWriteCoordinator writeCoordinator;
|
private final PackerProjectWriteCoordinator writeCoordinator;
|
||||||
|
|
||||||
private Packer(
|
private Packer(
|
||||||
PackerWorkspaceService workspaceService,
|
final PackerWorkspaceService workspaceService,
|
||||||
PackerRuntimeRegistry runtimeRegistry,
|
final PackerRuntimeRegistry runtimeRegistry,
|
||||||
PackerProjectWriteCoordinator writeCoordinator) {
|
final PackerProjectWriteCoordinator writeCoordinator) {
|
||||||
this.workspaceService = Objects.requireNonNull(workspaceService, "workspaceService");
|
this.workspaceService = Objects.requireNonNull(workspaceService, "workspaceService");
|
||||||
this.runtimeRegistry = Objects.requireNonNull(runtimeRegistry, "runtimeRegistry");
|
this.runtimeRegistry = Objects.requireNonNull(runtimeRegistry, "runtimeRegistry");
|
||||||
this.writeCoordinator = Objects.requireNonNull(writeCoordinator, "writeCoordinator");
|
this.writeCoordinator = Objects.requireNonNull(writeCoordinator, "writeCoordinator");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Packer bootstrap(PackerEventSink eventSink) {
|
public static Packer bootstrap(final ObjectMapper mapper, final PackerEventSink eventSink) {
|
||||||
final PackerEventSink resolvedEventSink = Objects.requireNonNull(eventSink, "eventSink");
|
final var resolvedEventSink = Objects.requireNonNull(eventSink, "eventSink");
|
||||||
final PackerWorkspaceFoundation workspaceFoundation = new PackerWorkspaceFoundation();
|
final var workspaceFoundation = new PackerWorkspaceFoundation();
|
||||||
final PackerAssetDeclarationParser declarationParser = new PackerAssetDeclarationParser();
|
final var declarationParser = new PackerAssetDeclarationParser(mapper);
|
||||||
final PackerRuntimeRegistry runtimeRegistry = new PackerRuntimeRegistry(
|
final var runtimeRegistry = new PackerRuntimeRegistry(new PackerRuntimeLoader(workspaceFoundation, declarationParser));
|
||||||
new PackerRuntimeLoader(workspaceFoundation, declarationParser));
|
final var assetReferenceResolver = new PackerAssetReferenceResolver(workspaceFoundation.lookup());
|
||||||
final PackerAssetReferenceResolver assetReferenceResolver = new PackerAssetReferenceResolver(workspaceFoundation.lookup());
|
final var assetDetailsService = new PackerAssetDetailsService(runtimeRegistry, assetReferenceResolver);
|
||||||
final PackerAssetDetailsService assetDetailsService = new PackerAssetDetailsService(runtimeRegistry, assetReferenceResolver);
|
final var assetActionReadService = new PackerAssetActionReadService(
|
||||||
final PackerAssetActionReadService assetActionReadService = new PackerAssetActionReadService(
|
|
||||||
runtimeRegistry,
|
runtimeRegistry,
|
||||||
assetReferenceResolver,
|
assetReferenceResolver,
|
||||||
workspaceFoundation.lookup());
|
workspaceFoundation.lookup());
|
||||||
final PackerRuntimePatchService runtimePatchService = new PackerRuntimePatchService(declarationParser);
|
final var runtimePatchService = new PackerRuntimePatchService(declarationParser);
|
||||||
final PackerProjectWriteCoordinator writeCoordinator = new PackerProjectWriteCoordinator();
|
final var writeCoordinator = new PackerProjectWriteCoordinator();
|
||||||
return new Packer(new FileSystemPackerWorkspaceService(
|
return new Packer(new FileSystemPackerWorkspaceService(
|
||||||
|
mapper,
|
||||||
workspaceFoundation,
|
workspaceFoundation,
|
||||||
assetDetailsService,
|
assetDetailsService,
|
||||||
assetActionReadService,
|
assetActionReadService,
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package p.packer.services;
|
|||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import p.packer.exceptions.PackerRegistryException;
|
||||||
import p.packer.messages.PackerProjectContext;
|
import p.packer.messages.PackerProjectContext;
|
||||||
import p.packer.models.PackerRegistryEntry;
|
import p.packer.models.PackerRegistryEntry;
|
||||||
import p.packer.models.PackerRegistryState;
|
import p.packer.models.PackerRegistryState;
|
||||||
@ -82,31 +83,31 @@ public final class FileSystemPackerRegistryRepository implements PackerRegistryR
|
|||||||
return new PackerRegistryState(REGISTRY_SCHEMA_VERSION, 1, List.of());
|
return new PackerRegistryState(REGISTRY_SCHEMA_VERSION, 1, List.of());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateEntries(List<PackerRegistryEntry> entries) {
|
private void validateEntries(List<PackerRegistryEntry> entries) throws PackerRegistryException {
|
||||||
final Set<Integer> assetIds = new HashSet<>();
|
final Set<Integer> assetIds = new HashSet<>();
|
||||||
final Set<String> assetUuids = new HashSet<>();
|
final Set<String> assetUuids = new HashSet<>();
|
||||||
final Set<String> roots = new HashSet<>();
|
final Set<String> roots = new HashSet<>();
|
||||||
for (PackerRegistryEntry entry : entries) {
|
for (PackerRegistryEntry entry : entries) {
|
||||||
if (!assetIds.add(entry.assetId())) {
|
if (!assetIds.add(entry.assetId())) {
|
||||||
throw new p.packer.exceptions.PackerRegistryException("Duplicate asset_id in registry: " + entry.assetId());
|
throw new PackerRegistryException("Duplicate asset_id in registry: " + entry.assetId());
|
||||||
}
|
}
|
||||||
if (!assetUuids.add(entry.assetUuid())) {
|
if (!assetUuids.add(entry.assetUuid())) {
|
||||||
throw new p.packer.exceptions.PackerRegistryException("Duplicate asset_uuid in registry: " + entry.assetUuid());
|
throw new PackerRegistryException("Duplicate asset_uuid in registry: " + entry.assetUuid());
|
||||||
}
|
}
|
||||||
if (!roots.add(entry.root())) {
|
if (!roots.add(entry.root())) {
|
||||||
throw new p.packer.exceptions.PackerRegistryException("Duplicate asset root in registry: " + entry.root());
|
throw new PackerRegistryException("Duplicate asset root in registry: " + entry.root());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String normalizeRoot(String root) {
|
private String normalizeRoot(String root) {
|
||||||
if (root == null || root.isBlank()) {
|
if (root == null || root.isBlank()) {
|
||||||
throw new p.packer.exceptions.PackerRegistryException("Registry asset root must not be blank");
|
throw new PackerRegistryException("Registry asset root must not be blank");
|
||||||
}
|
}
|
||||||
final String normalized = root.trim().replace('\\', '/');
|
final String normalized = root.trim().replace('\\', '/');
|
||||||
final Path normalizedPath = Path.of(normalized).normalize();
|
final Path normalizedPath = Path.of(normalized).normalize();
|
||||||
if (normalizedPath.isAbsolute() || normalizedPath.startsWith("..")) {
|
if (normalizedPath.isAbsolute() || normalizedPath.startsWith("..")) {
|
||||||
throw new p.packer.exceptions.PackerRegistryException("Registry asset root is outside the trusted assets boundary: " + normalized);
|
throw new PackerRegistryException("Registry asset root is outside the trusted assets boundary: " + normalized);
|
||||||
}
|
}
|
||||||
return normalized;
|
return normalized;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,7 @@ import java.util.*;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public final class FileSystemPackerWorkspaceService implements PackerWorkspaceService {
|
public final class FileSystemPackerWorkspaceService implements PackerWorkspaceService {
|
||||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
private final ObjectMapper mapper;
|
||||||
private final PackerWorkspaceFoundation workspaceFoundation;
|
private final PackerWorkspaceFoundation workspaceFoundation;
|
||||||
private final PackerAssetDetailsService detailsService;
|
private final PackerAssetDetailsService detailsService;
|
||||||
private final PackerAssetActionReadService actionReadService;
|
private final PackerAssetActionReadService actionReadService;
|
||||||
@ -30,6 +30,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
|
|||||||
private final PackerEventSink eventSink;
|
private final PackerEventSink eventSink;
|
||||||
|
|
||||||
public FileSystemPackerWorkspaceService(
|
public FileSystemPackerWorkspaceService(
|
||||||
|
ObjectMapper mapper,
|
||||||
PackerWorkspaceFoundation workspaceFoundation,
|
PackerWorkspaceFoundation workspaceFoundation,
|
||||||
PackerAssetDetailsService detailsService,
|
PackerAssetDetailsService detailsService,
|
||||||
PackerAssetActionReadService actionReadService,
|
PackerAssetActionReadService actionReadService,
|
||||||
@ -37,6 +38,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
|
|||||||
PackerRuntimeRegistry runtimeRegistry,
|
PackerRuntimeRegistry runtimeRegistry,
|
||||||
PackerProjectWriteCoordinator writeCoordinator,
|
PackerProjectWriteCoordinator writeCoordinator,
|
||||||
PackerEventSink eventSink) {
|
PackerEventSink eventSink) {
|
||||||
|
this.mapper = Objects.requireNonNull(mapper, "mapper");
|
||||||
this.workspaceFoundation = Objects.requireNonNull(workspaceFoundation, "workspaceFoundation");
|
this.workspaceFoundation = Objects.requireNonNull(workspaceFoundation, "workspaceFoundation");
|
||||||
this.detailsService = Objects.requireNonNull(detailsService, "detailsService");
|
this.detailsService = Objects.requireNonNull(detailsService, "detailsService");
|
||||||
this.actionReadService = Objects.requireNonNull(actionReadService, "actionReadService");
|
this.actionReadService = Objects.requireNonNull(actionReadService, "actionReadService");
|
||||||
@ -471,7 +473,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
|
|||||||
"format", request.outputFormat().manifestValue(),
|
"format", request.outputFormat().manifestValue(),
|
||||||
"codec", request.outputCodec().manifestValue()));
|
"codec", request.outputCodec().manifestValue()));
|
||||||
manifest.put("preload", Map.of("enabled", request.preloadEnabled()));
|
manifest.put("preload", Map.of("enabled", request.preloadEnabled()));
|
||||||
MAPPER.writerWithDefaultPrettyPrinter().writeValue(manifestPath.toFile(), manifest);
|
mapper.writerWithDefaultPrettyPrinter().writeValue(manifestPath.toFile(), manifest);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String normalizeRelativeAssetRoot(String candidate) {
|
private String normalizeRelativeAssetRoot(String candidate) {
|
||||||
@ -604,7 +606,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
|
|||||||
|
|
||||||
final ObjectNode manifest;
|
final ObjectNode manifest;
|
||||||
try {
|
try {
|
||||||
final JsonNode rawManifest = MAPPER.readTree(manifestPath.toFile());
|
final JsonNode rawManifest = mapper.readTree(manifestPath.toFile());
|
||||||
if (!(rawManifest instanceof ObjectNode objectNode)) {
|
if (!(rawManifest instanceof ObjectNode objectNode)) {
|
||||||
return new UpdateAssetContractResponse(false, "asset.json must contain a JSON object at the root.");
|
return new UpdateAssetContractResponse(false, "asset.json must contain a JSON object at the root.");
|
||||||
}
|
}
|
||||||
@ -623,7 +625,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
patchManifestContract(manifest, request);
|
patchManifestContract(manifest, request);
|
||||||
MAPPER.writerWithDefaultPrettyPrinter().writeValue(manifestPath.toFile(), manifest);
|
mapper.writerWithDefaultPrettyPrinter().writeValue(manifestPath.toFile(), manifest);
|
||||||
runtimeRegistry.update(project, (currentSnapshot, generation) -> runtimePatchService.afterUpdateAssetContract(
|
runtimeRegistry.update(project, (currentSnapshot, generation) -> runtimePatchService.afterUpdateAssetContract(
|
||||||
currentSnapshot,
|
currentSnapshot,
|
||||||
generation,
|
generation,
|
||||||
@ -677,7 +679,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
|
|||||||
if (current instanceof ObjectNode objectNode) {
|
if (current instanceof ObjectNode objectNode) {
|
||||||
return objectNode;
|
return objectNode;
|
||||||
}
|
}
|
||||||
final ObjectNode created = MAPPER.createObjectNode();
|
final ObjectNode created = mapper.createObjectNode();
|
||||||
parent.set(fieldName, created);
|
parent.set(fieldName, created);
|
||||||
return created;
|
return created;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,15 +16,20 @@ import java.nio.file.Path;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public final class PackerAssetDeclarationParser {
|
public final class PackerAssetDeclarationParser {
|
||||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
|
||||||
private static final int SUPPORTED_SCHEMA_VERSION = 1;
|
private static final int SUPPORTED_SCHEMA_VERSION = 1;
|
||||||
|
|
||||||
public PackerAssetDeclarationParseResult parse(Path assetManifestPath) {
|
private final ObjectMapper mapper;
|
||||||
final Path manifestPath = Objects.requireNonNull(assetManifestPath, "assetManifestPath").toAbsolutePath().normalize();
|
|
||||||
|
public PackerAssetDeclarationParser(ObjectMapper mapper) {
|
||||||
|
this.mapper = Objects.requireNonNull(mapper, "mapper");
|
||||||
|
}
|
||||||
|
|
||||||
|
public PackerAssetDeclarationParseResult parse(final Path assetManifestPath) {
|
||||||
|
final var manifestPath = Objects.requireNonNull(assetManifestPath, "assetManifestPath").toAbsolutePath().normalize();
|
||||||
final List<PackerDiagnostic> diagnostics = new ArrayList<>();
|
final List<PackerDiagnostic> diagnostics = new ArrayList<>();
|
||||||
final JsonNode root;
|
final JsonNode root;
|
||||||
try {
|
try {
|
||||||
root = MAPPER.readTree(manifestPath.toFile());
|
root = mapper.readTree(manifestPath.toFile());
|
||||||
} catch (IOException exception) {
|
} catch (IOException exception) {
|
||||||
diagnostics.add(new PackerDiagnostic(
|
diagnostics.add(new PackerDiagnostic(
|
||||||
PackerDiagnosticSeverity.ERROR,
|
PackerDiagnosticSeverity.ERROR,
|
||||||
|
|||||||
@ -60,9 +60,10 @@ public final class PackerAssetDetailsService {
|
|||||||
declaration.name(),
|
declaration.name(),
|
||||||
resolved.assetRoot()),
|
resolved.assetRoot()),
|
||||||
state,
|
state,
|
||||||
resolved.registryEntry().map(entry -> entry.includedInBuild()
|
resolved.registryEntry()
|
||||||
? PackerBuildParticipation.INCLUDED
|
.filter(PackerRegistryEntry::includedInBuild)
|
||||||
: PackerBuildParticipation.EXCLUDED).orElse(PackerBuildParticipation.EXCLUDED),
|
.map(entry -> PackerBuildParticipation.INCLUDED)
|
||||||
|
.orElse(PackerBuildParticipation.EXCLUDED),
|
||||||
declaration.assetFamily(),
|
declaration.assetFamily(),
|
||||||
declaration.preloadEnabled(),
|
declaration.preloadEnabled(),
|
||||||
!diagnostics.isEmpty());
|
!diagnostics.isEmpty());
|
||||||
@ -97,9 +98,10 @@ public final class PackerAssetDetailsService {
|
|||||||
resolved.assetRoot().getFileName().toString(),
|
resolved.assetRoot().getFileName().toString(),
|
||||||
resolved.assetRoot()),
|
resolved.assetRoot()),
|
||||||
state,
|
state,
|
||||||
resolved.registryEntry().map(entry -> entry.includedInBuild()
|
resolved.registryEntry()
|
||||||
? PackerBuildParticipation.INCLUDED
|
.filter(PackerRegistryEntry::includedInBuild)
|
||||||
: PackerBuildParticipation.EXCLUDED).orElse(PackerBuildParticipation.EXCLUDED),
|
.map(entry -> PackerBuildParticipation.INCLUDED)
|
||||||
|
.orElse(PackerBuildParticipation.EXCLUDED),
|
||||||
AssetFamilyCatalog.UNKNOWN,
|
AssetFamilyCatalog.UNKNOWN,
|
||||||
false,
|
false,
|
||||||
true);
|
true);
|
||||||
@ -145,13 +147,12 @@ public final class PackerAssetDetailsService {
|
|||||||
PackerProjectContext project,
|
PackerProjectContext project,
|
||||||
Path assetRoot,
|
Path assetRoot,
|
||||||
Optional<PackerRegistryEntry> registryEntry) {
|
Optional<PackerRegistryEntry> registryEntry) {
|
||||||
if (registryEntry.isPresent()) {
|
return registryEntry
|
||||||
return AssetReference.forAssetId(registryEntry.get().assetId());
|
.map(packerRegistryEntry -> AssetReference.forAssetId(packerRegistryEntry.assetId()))
|
||||||
}
|
.orElseGet(() -> AssetReference.forRelativeAssetRoot(PackerWorkspacePaths.assetsRoot(project)
|
||||||
return AssetReference.forRelativeAssetRoot(PackerWorkspacePaths.assetsRoot(project)
|
.relativize(assetRoot.toAbsolutePath().normalize())
|
||||||
.relativize(assetRoot.toAbsolutePath().normalize())
|
.toString()
|
||||||
.toString()
|
.replace('\\', '/')));
|
||||||
.replace('\\', '/'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private AssetReference canonicalReferenceOrRequested(
|
private AssetReference canonicalReferenceOrRequested(
|
||||||
|
|||||||
@ -10,9 +10,9 @@ import p.packer.models.PackerRuntimeSnapshot;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public final class PackerRuntimeLoader implements PackerRuntimeSnapshotLoader {
|
public final class PackerRuntimeLoader implements PackerRuntimeSnapshotLoader {
|
||||||
private final PackerWorkspaceFoundation workspaceFoundation;
|
private final PackerWorkspaceFoundation workspaceFoundation;
|
||||||
@ -25,6 +25,10 @@ public final class PackerRuntimeLoader implements PackerRuntimeSnapshotLoader {
|
|||||||
this.parser = Objects.requireNonNull(parser, "parser");
|
this.parser = Objects.requireNonNull(parser, "parser");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isAssetJson(Path path, BasicFileAttributes attrs) {
|
||||||
|
return attrs.isRegularFile() && path.getFileName().toString().equals("asset.json");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PackerRuntimeSnapshot load(PackerProjectContext project, long generation) {
|
public PackerRuntimeSnapshot load(PackerProjectContext project, long generation) {
|
||||||
final PackerProjectContext safeProject = Objects.requireNonNull(project, "project");
|
final PackerProjectContext safeProject = Objects.requireNonNull(project, "project");
|
||||||
@ -37,17 +41,16 @@ public final class PackerRuntimeLoader implements PackerRuntimeSnapshotLoader {
|
|||||||
entry -> entry));
|
entry -> entry));
|
||||||
|
|
||||||
final List<PackerRuntimeAsset> assets = new ArrayList<>();
|
final List<PackerRuntimeAsset> assets = new ArrayList<>();
|
||||||
final Path assetsRoot = PackerWorkspacePaths.assetsRoot(safeProject);
|
final var assetsRoot = PackerWorkspacePaths.assetsRoot(safeProject);
|
||||||
if (Files.isDirectory(assetsRoot)) {
|
if (Files.isDirectory(assetsRoot)) {
|
||||||
try (Stream<Path> paths = Files.find(assetsRoot, Integer.MAX_VALUE, (path, attrs) ->
|
try (final var paths = Files.find(assetsRoot, Integer.MAX_VALUE, this::isAssetJson)) {
|
||||||
attrs.isRegularFile() && path.getFileName().toString().equals("asset.json"))) {
|
final var manifests = paths
|
||||||
final List<Path> manifests = paths
|
|
||||||
.map(path -> path.toAbsolutePath().normalize())
|
.map(path -> path.toAbsolutePath().normalize())
|
||||||
.sorted(Comparator.naturalOrder())
|
.sorted(Comparator.naturalOrder())
|
||||||
.toList();
|
.toList();
|
||||||
for (Path manifestPath : manifests) {
|
for (final var manifestPath : manifests) {
|
||||||
final Path assetRoot = manifestPath.getParent();
|
final var assetRoot = manifestPath.getParent();
|
||||||
final Optional<PackerRegistryEntry> registryEntry = Optional.ofNullable(registryByRoot.get(assetRoot));
|
final var registryEntry = Optional.ofNullable(registryByRoot.get(assetRoot));
|
||||||
assets.add(new PackerRuntimeAsset(
|
assets.add(new PackerRuntimeAsset(
|
||||||
assetRoot,
|
assetRoot,
|
||||||
manifestPath,
|
manifestPath,
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import p.packer.models.PackerRegistryEntry;
|
|||||||
import p.packer.models.PackerRegistryState;
|
import p.packer.models.PackerRegistryState;
|
||||||
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@ -21,20 +22,20 @@ public final class PackerWorkspaceFoundation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public PackerWorkspaceFoundation(
|
public PackerWorkspaceFoundation(
|
||||||
FileSystemPackerRegistryRepository registryRepository,
|
final FileSystemPackerRegistryRepository registryRepository,
|
||||||
PackerIdentityAllocator identityAllocator,
|
final PackerIdentityAllocator identityAllocator,
|
||||||
PackerRegistryLookup registryLookup) {
|
final PackerRegistryLookup registryLookup) {
|
||||||
this.registryRepository = Objects.requireNonNull(registryRepository, "registryRepository");
|
this.registryRepository = Objects.requireNonNull(registryRepository, "registryRepository");
|
||||||
this.identityAllocator = Objects.requireNonNull(identityAllocator, "identityAllocator");
|
this.identityAllocator = Objects.requireNonNull(identityAllocator, "identityAllocator");
|
||||||
this.registryLookup = Objects.requireNonNull(registryLookup, "registryLookup");
|
this.registryLookup = Objects.requireNonNull(registryLookup, "registryLookup");
|
||||||
}
|
}
|
||||||
|
|
||||||
public InitWorkspaceResult initWorkspace(InitWorkspaceRequest request) {
|
public InitWorkspaceResult initWorkspace(final InitWorkspaceRequest request) {
|
||||||
final PackerProjectContext project = Objects.requireNonNull(request, "request").project();
|
final PackerProjectContext project = Objects.requireNonNull(request, "request").project();
|
||||||
try {
|
try {
|
||||||
Files.createDirectories(PackerWorkspacePaths.assetsRoot(project));
|
Files.createDirectories(PackerWorkspacePaths.assetsRoot(project));
|
||||||
Files.createDirectories(PackerWorkspacePaths.registryDirectory(project));
|
Files.createDirectories(PackerWorkspacePaths.registryDirectory(project));
|
||||||
final PackerRegistryState registryState = registryRepository.load(project);
|
final var registryState = registryRepository.load(project);
|
||||||
registryRepository.save(project, registryState);
|
registryRepository.save(project, registryState);
|
||||||
return new InitWorkspaceResult(
|
return new InitWorkspaceResult(
|
||||||
PackerOperationStatus.SUCCESS,
|
PackerOperationStatus.SUCCESS,
|
||||||
@ -46,27 +47,34 @@ public final class PackerWorkspaceFoundation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public PackerRegistryState loadRegistry(PackerProjectContext project) {
|
public PackerRegistryState loadRegistry(final PackerProjectContext project) {
|
||||||
return registryRepository.load(project);
|
return registryRepository.load(project);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveRegistry(PackerProjectContext project, PackerRegistryState state) {
|
public void saveRegistry(
|
||||||
|
final PackerProjectContext project,
|
||||||
|
final PackerRegistryState state) {
|
||||||
registryRepository.save(project, state);
|
registryRepository.save(project, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PackerRegistryEntry allocateIdentity(PackerProjectContext project, PackerRegistryState state, java.nio.file.Path assetRoot) {
|
public PackerRegistryEntry allocateIdentity(
|
||||||
|
final PackerProjectContext project,
|
||||||
|
final PackerRegistryState state,
|
||||||
|
final Path assetRoot) {
|
||||||
return identityAllocator.allocate(project, state, assetRoot);
|
return identityAllocator.allocate(project, state, assetRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PackerRegistryEntry registerExistingAsset(
|
public PackerRegistryEntry registerExistingAsset(
|
||||||
PackerProjectContext project,
|
final PackerProjectContext project,
|
||||||
PackerRegistryState state,
|
final PackerRegistryState state,
|
||||||
java.nio.file.Path assetRoot,
|
final Path assetRoot,
|
||||||
String assetUuid) {
|
final String assetUuid) {
|
||||||
return identityAllocator.registerExisting(project, state, assetRoot, assetUuid);
|
return identityAllocator.registerExisting(project, state, assetRoot, assetUuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PackerRegistryState appendAllocatedEntry(PackerRegistryState state, PackerRegistryEntry entry) {
|
public PackerRegistryState appendAllocatedEntry(
|
||||||
|
final PackerRegistryState state,
|
||||||
|
final PackerRegistryEntry entry) {
|
||||||
return identityAllocator.append(state, entry);
|
return identityAllocator.append(state, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -666,7 +666,7 @@ final class FileSystemPackerWorkspaceServiceTest {
|
|||||||
p.packer.events.PackerEventSink eventSink,
|
p.packer.events.PackerEventSink eventSink,
|
||||||
PackerRuntimeSnapshotLoader loader) {
|
PackerRuntimeSnapshotLoader loader) {
|
||||||
final var foundation = new p.packer.services.PackerWorkspaceFoundation();
|
final var foundation = new p.packer.services.PackerWorkspaceFoundation();
|
||||||
final var parser = new p.packer.services.PackerAssetDeclarationParser();
|
final var parser = new p.packer.services.PackerAssetDeclarationParser(new ObjectMapper());
|
||||||
final var runtimeRegistry = new p.packer.services.PackerRuntimeRegistry(loader);
|
final var runtimeRegistry = new p.packer.services.PackerRuntimeRegistry(loader);
|
||||||
final var resolver = new p.packer.services.PackerAssetReferenceResolver(foundation.lookup());
|
final var resolver = new p.packer.services.PackerAssetReferenceResolver(foundation.lookup());
|
||||||
final var detailsService = new p.packer.services.PackerAssetDetailsService(runtimeRegistry, resolver);
|
final var detailsService = new p.packer.services.PackerAssetDetailsService(runtimeRegistry, resolver);
|
||||||
@ -674,6 +674,7 @@ final class FileSystemPackerWorkspaceServiceTest {
|
|||||||
final var runtimePatchService = new p.packer.services.PackerRuntimePatchService(parser);
|
final var runtimePatchService = new p.packer.services.PackerRuntimePatchService(parser);
|
||||||
final var writeCoordinator = new p.packer.services.PackerProjectWriteCoordinator();
|
final var writeCoordinator = new p.packer.services.PackerProjectWriteCoordinator();
|
||||||
return new FileSystemPackerWorkspaceService(
|
return new FileSystemPackerWorkspaceService(
|
||||||
|
new ObjectMapper(),
|
||||||
foundation,
|
foundation,
|
||||||
detailsService,
|
detailsService,
|
||||||
actionReadService,
|
actionReadService,
|
||||||
@ -685,7 +686,7 @@ final class FileSystemPackerWorkspaceServiceTest {
|
|||||||
|
|
||||||
private CountingLoader countingLoader() {
|
private CountingLoader countingLoader() {
|
||||||
final var foundation = new p.packer.services.PackerWorkspaceFoundation();
|
final var foundation = new p.packer.services.PackerWorkspaceFoundation();
|
||||||
final var parser = new p.packer.services.PackerAssetDeclarationParser();
|
final var parser = new p.packer.services.PackerAssetDeclarationParser(new ObjectMapper());
|
||||||
return new CountingLoader(new p.packer.services.PackerRuntimeLoader(foundation, parser));
|
return new CountingLoader(new p.packer.services.PackerRuntimeLoader(foundation, parser));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package p.packer.services;
|
package p.packer.services;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.io.TempDir;
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
import p.packer.messages.assets.AssetFamilyCatalog;
|
import p.packer.messages.assets.AssetFamilyCatalog;
|
||||||
@ -13,7 +14,7 @@ import java.nio.file.Path;
|
|||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
final class PackerAssetDeclarationParserTest {
|
final class PackerAssetDeclarationParserTest {
|
||||||
private final PackerAssetDeclarationParser parser = new PackerAssetDeclarationParser();
|
private final PackerAssetDeclarationParser parser = new PackerAssetDeclarationParser(new ObjectMapper());
|
||||||
|
|
||||||
@TempDir
|
@TempDir
|
||||||
Path tempDir;
|
Path tempDir;
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package p.packer.services;
|
package p.packer.services;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.io.TempDir;
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
import p.packer.messages.AssetReference;
|
import p.packer.messages.AssetReference;
|
||||||
@ -87,7 +88,7 @@ final class PackerAssetDetailsServiceTest {
|
|||||||
|
|
||||||
private PackerAssetDetailsService service() {
|
private PackerAssetDetailsService service() {
|
||||||
final var foundation = new p.packer.services.PackerWorkspaceFoundation();
|
final var foundation = new p.packer.services.PackerWorkspaceFoundation();
|
||||||
final var parser = new PackerAssetDeclarationParser();
|
final var parser = new PackerAssetDeclarationParser(new ObjectMapper());
|
||||||
final var runtimeRegistry = new PackerRuntimeRegistry(new PackerRuntimeLoader(foundation, parser));
|
final var runtimeRegistry = new PackerRuntimeRegistry(new PackerRuntimeLoader(foundation, parser));
|
||||||
final var resolver = new PackerAssetReferenceResolver(foundation.lookup());
|
final var resolver = new PackerAssetReferenceResolver(foundation.lookup());
|
||||||
return new PackerAssetDetailsService(runtimeRegistry, resolver);
|
return new PackerAssetDetailsService(runtimeRegistry, resolver);
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package p.packer.services;
|
package p.packer.services;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.io.TempDir;
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
import p.packer.messages.PackerProjectContext;
|
import p.packer.messages.PackerProjectContext;
|
||||||
@ -78,7 +79,7 @@ final class PackerRuntimeRegistryTest {
|
|||||||
|
|
||||||
private PackerRuntimeRegistry runtimeRegistry() {
|
private PackerRuntimeRegistry runtimeRegistry() {
|
||||||
final var foundation = new PackerWorkspaceFoundation();
|
final var foundation = new PackerWorkspaceFoundation();
|
||||||
final var parser = new PackerAssetDeclarationParser();
|
final var parser = new PackerAssetDeclarationParser(new ObjectMapper());
|
||||||
return new PackerRuntimeRegistry(new PackerRuntimeLoader(foundation, parser));
|
return new PackerRuntimeRegistry(new PackerRuntimeLoader(foundation, parser));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@ public interface Container {
|
|||||||
|
|
||||||
ObjectMapper getMapper();
|
ObjectMapper getMapper();
|
||||||
|
|
||||||
Packer getPacker();
|
EmbeddedPacker getPacker();
|
||||||
|
|
||||||
StudioBackgroundTasks getBackgroundTasks();
|
StudioBackgroundTasks getBackgroundTasks();
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ public interface Container {
|
|||||||
return current().getMapper();
|
return current().getMapper();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Packer packer() {
|
static EmbeddedPacker packer() {
|
||||||
return current().getPacker();
|
return current().getPacker();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,11 +75,11 @@ public interface Container {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
record Packer(
|
record EmbeddedPacker(
|
||||||
p.packer.PackerWorkspaceService workspaceService,
|
p.packer.PackerWorkspaceService workspaceService,
|
||||||
Runnable shutdownAction) {
|
Runnable shutdownAction) {
|
||||||
|
|
||||||
public Packer {
|
public EmbeddedPacker {
|
||||||
Objects.requireNonNull(workspaceService, "workspaceService");
|
Objects.requireNonNull(workspaceService, "workspaceService");
|
||||||
Objects.requireNonNull(shutdownAction, "shutdownAction");
|
Objects.requireNonNull(shutdownAction, "shutdownAction");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
final class StudioPackerEventAdapterTest {
|
final class StudioEmbeddedPackerEventAdapterTest {
|
||||||
@Test
|
@Test
|
||||||
void forwardsScanEventsIntoStudioOperationEvents() {
|
void forwardsScanEventsIntoStudioOperationEvents() {
|
||||||
final StudioEventBus globalBus = new StudioEventBus();
|
final StudioEventBus globalBus = new StudioEventBus();
|
||||||
Loading…
x
Reference in New Issue
Block a user