blob: b8b2eda4437825e218ae30c9431e1c1c620de311 [file]
/*
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.jpackage.internal.model;
import static jdk.jpackage.internal.util.PathUtils.resolveNullablePath;
import java.nio.file.Path;
import java.util.Objects;
import jdk.jpackage.internal.util.CompositeProxy;
/**
* Application app image layout.
* <p>
* Application is comprised from application files and Java runtime.
* <p>
* Use {@link #build()} or {@link #buildFrom(ApplicationLayout)} methods to
* configure and construct instances of this interface.
*/
public interface ApplicationLayout extends AppImageLayout, ApplicationLayoutMixin {
@Override
default ApplicationLayout resolveAt(Path root) {
return buildFrom(this).resolveAt(root).create();
}
/**
* Creates an object implementing {@link ApplicationLayout} interface from
* {@link AppImageLayout} and {@link ApplicationLayoutMixin} instances.
*
* @param appImage app image layout object
* @param mixin application layout mixin for the app image layout
* @return new object implementing {@link ApplicationLayout} interface
*/
static ApplicationLayout create(AppImageLayout appImage, ApplicationLayoutMixin mixin) {
return CompositeProxy.create(ApplicationLayout.class, appImage, mixin);
}
public static Builder build() {
return new Builder();
}
public static Builder buildFrom(ApplicationLayout appLayout) {
return new Builder(appLayout);
}
/**
* Builds {@link ApplicationLayout} instances.
*/
final class Builder {
private Builder() {
}
private Builder(ApplicationLayout appLayout) {
rootDirectory = appLayout.rootDirectory();
launchersDirectory = appLayout.launchersDirectory();
appDirectory = appLayout.appDirectory();
runtimeDirectory = appLayout.runtimeDirectory();
appModsDirectory = appLayout.appModsDirectory();
desktopIntegrationDirectory = appLayout.desktopIntegrationDirectory();
contentDirectory = appLayout.contentDirectory();
}
public ApplicationLayout create() {
Objects.requireNonNull(rootDirectory);
Objects.requireNonNull(runtimeDirectory);
Objects.requireNonNull(launchersDirectory);
Objects.requireNonNull(appDirectory);
Objects.requireNonNull(appModsDirectory);
Objects.requireNonNull(desktopIntegrationDirectory);
Objects.requireNonNull(contentDirectory);
return ApplicationLayout.create(new AppImageLayout.Stub(
rootDirectory, runtimeDirectory), new ApplicationLayoutMixin.Stub(
launchersDirectory, appDirectory, appModsDirectory,
desktopIntegrationDirectory, contentDirectory));
}
public Builder setAll(String path) {
return setAll(Path.of(path));
}
public Builder setAll(Path path) {
rootDirectory(path);
launchersDirectory(path);
appDirectory(path);
runtimeDirectory(path);
appModsDirectory(path);
desktopIntegrationDirectory(path);
contentDirectory(path);
return this;
}
public Builder resolveAt(Path base) {
rootDirectory(resolveNullablePath(base, rootDirectory));
launchersDirectory(resolveNullablePath(base, launchersDirectory));
appDirectory(resolveNullablePath(base, appDirectory));
runtimeDirectory(resolveNullablePath(base, runtimeDirectory));
appModsDirectory(resolveNullablePath(base, appModsDirectory));
desktopIntegrationDirectory(resolveNullablePath(base, desktopIntegrationDirectory));
contentDirectory(resolveNullablePath(base, contentDirectory));
return this;
}
public Builder rootDirectory(String v) {
return rootDirectory(Path.of(v));
}
public Builder rootDirectory(Path v) {
rootDirectory = v;
return this;
}
public Builder launchersDirectory(String v) {
return launchersDirectory(Path.of(v));
}
public Builder launchersDirectory(Path v) {
launchersDirectory = v;
return this;
}
public Builder appDirectory(String v) {
return appDirectory(Path.of(v));
}
public Builder appDirectory(Path v) {
appDirectory = v;
return this;
}
public Builder runtimeDirectory(String v) {
return runtimeDirectory(Path.of(v));
}
public Builder runtimeDirectory(Path v) {
runtimeDirectory = v;
return this;
}
public Builder appModsDirectory(String v) {
return appModsDirectory(Path.of(v));
}
public Builder appModsDirectory(Path v) {
appModsDirectory = v;
return this;
}
public Builder desktopIntegrationDirectory(String v) {
return desktopIntegrationDirectory(Path.of(v));
}
public Builder desktopIntegrationDirectory(Path v) {
desktopIntegrationDirectory = v;
return this;
}
public Builder contentDirectory(String v) {
return contentDirectory(Path.of(v));
}
public Builder contentDirectory(Path v) {
contentDirectory = v;
return this;
}
private Path rootDirectory = Path.of("");
private Path launchersDirectory;
private Path appDirectory;
private Path runtimeDirectory;
private Path appModsDirectory;
private Path desktopIntegrationDirectory;
private Path contentDirectory;
}
}