blob: f164daf3eb064a33c809d2e65f7c03f7c190b7bb [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 java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;
/**
* A generic application for packaging.
*
* @apiNote All paths of startup configurations of application launchers
* returned by {@link #launchers()} call must be relative to the path
* returned by {@link #srcDir()} call.
*
* @see Package
*/
public interface Application extends BundleSpec {
/**
* Gets the name of this application.
*
* @return the name of this application
*/
String name();
/**
* Gets the description of this application.
*
* @return the description of this application
*/
String description();
/**
* Gets the version of this application.
*
* @return the version of this application
*/
String version();
/**
* Gets the vendor of this application.
*
* @return the vendor of this application
*/
String vendor();
/**
* Gets the copyright of this application.
*
* @return the copyright of this application
*/
String copyright();
/**
* Gets the source directory of this application if available or an empty
* {@link Optional} instance.
* <p>
* Source directory is a directory with the applications's classes and other
* resources.
*
* @return the source directory of this application
*/
Optional<Path> srcDir();
/**
* Gets the input content directories of this application.
* <p>
* Contents of the content directories will be copied as-is into the dedicated
* location of the application image.
*
* @see ApplicationLayout#contentDirectory
*
* @return the input content directories of this application
*/
List<Path> contentDirs();
/**
* Gets the unresolved app image layout of this application.
*
* @return the unresolved app image layout of this application
*/
AppImageLayout imageLayout();
/**
* Gets the unresolved app image layout of this application as
* {@link ApplicationLayout} type or an empty {@link Optional} instance if the
* return value of {@link #imageLayout()} call is not an instance of
* {@link ApplicationLayout} type.
* <p>
* Returns an empty {@link Optional} instance if {@link #isRuntime()} returns
* <code>true</code>.
*
* @see #isRuntime
*
* @return the unresolved app image layout of this application as
* {@link ApplicationLayout}
*/
default Optional<ApplicationLayout> asApplicationLayout() {
if (imageLayout() instanceof ApplicationLayout layout) {
return Optional.of(layout);
} else {
return Optional.empty();
}
}
/**
* Gets the runtime builder of this application if available or an empty
* {@link Optional} instance.
*
* @return the runtime builder of this application
*/
Optional<RuntimeBuilder> runtimeBuilder();
/**
* Gets the name of the root app image directory of this application.
*
* @return the name of the root app image directory of this application
*/
default Path appImageDirName() {
return Path.of(name());
}
/**
* Gets the application launchers of this application.
* <p>
* If the returned list is not empty, the first element in the list is the main
* launcher.
* <p>
* Returns an empty list if {@link #isRuntime()} returns <code>true</code>.
*
* @see #mainLauncher()
* @see #additionalLaunchers()
* @see #isRuntime()
*
* @return the application launchers of this application
*/
List<Launcher> launchers();
/**
* Returns the main application launcher of this application or an empty
* {@link Optional} instance if the application doesn't have launchers.
* <p>
* Returns an empty {@link Optional} instance if {@link #isRuntime()} returns
* <code>true</code>.
*
* @see #launchers()
* @see #additionalLaunchers()
* @see #isRuntime()
*
* @return the main application launcher of this application
*/
default Optional<Launcher> mainLauncher() {
return ApplicationLaunchers.fromList(launchers()).map(ApplicationLaunchers::mainLauncher);
}
/**
* Gets the additional application launchers of this application.
* <p>
* Returns an empty list if this application doesn't have additional launchers.
* <p>
* Returns an empty list if {@link #isRuntime()} returns <code>true</code>.
*
* @see #launchers()
* @see #mainLauncher()
* @see #isRuntime()
*
* @return the additional application launchers of this application
*/
default List<Launcher> additionalLaunchers() {
return ApplicationLaunchers.fromList(launchers()).map(ApplicationLaunchers::additionalLaunchers)
.orElseGet(Collections::emptyList);
}
/**
* Returns <code>true</code> if this application is Java runtime.
*
* @return <code>true</code> if this application is Java runtime
*/
default boolean isRuntime() {
return imageLayout() instanceof RuntimeLayout;
}
/**
* Returns <code>true</code> if any of application launchers of this application
* are configured as services.
*
* @see Launcher#isService
*
* @return <code>true</code> if any of application launchers of this application
* are configured as services
*/
default boolean isService() {
return Optional.ofNullable(launchers()).orElseGet(List::of).stream()
.filter(Launcher::isService).findAny().isPresent();
}
/**
* Gets the additional properties of this application for the application entry
* in the app image (".jpackage") file.
*
* @return the additional properties of this application for the application
* entry in ".jpackage" file
*/
Map<String, String> extraAppImageFileData();
/**
* Gets the file associations of all application launchers of this application.
*
* @return the file associations of all application launchers of this
* application
*
* @see Launcher#fileAssociations
*/
default Stream<FileAssociation> fileAssociations() {
return launchers().stream().map(Launcher::fileAssociations).flatMap(List::stream);
}
/**
* Default implementation of {@link Application} interface.
*/
record Stub(String name, String description, String version, String vendor, String copyright, Optional<Path> srcDir,
List<Path> contentDirs, AppImageLayout imageLayout, Optional<RuntimeBuilder> runtimeBuilder,
List<Launcher> launchers, Map<String, String> extraAppImageFileData) implements Application {
}
}