blob: 9c20d5432ee6ca68d630f9d9e08cc35abed15e3f [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.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import jdk.jpackage.internal.resources.ResourceLocator;
/**
* Application launcher.
*
* @see Application#launchers()
*/
public interface Launcher {
/**
* Gets the name of this launcher.
*
* @return the name of this launcher
*/
String name();
/**
* Gets the name of the executable file of this launcher without file extension.
*
* @return the name of the executable file of this launcher
*/
default String executableName() {
return name();
}
/**
* Gets extension of the executable file of this launcher if available or an
* empty {@link Optional} instance otherwise.
*
* @return the extension of the executable file of this launcher
*/
default Optional<String> executableSuffix() {
return Optional.empty();
}
/**
* Gets the full name of the executable file of this launcher. The full name
* consists of the name and the extension.
*
* @return the full name of the executable file of this launcher
*/
default String executableNameWithSuffix() {
return executableName() + executableSuffix().orElse("");
}
/**
* Gets the startup information of this launcher if available or an empty
* {@link Optional} instance otherwise.
*
* @apiNote Launchers from an external application image may not have startup
* information.
* @return the startup information of this launcher
*/
Optional<LauncherStartupInfo> startupInfo();
/**
* Gets the file associations of this launcher.
*
* @return the file associations of this launcher
*/
List<FileAssociation> fileAssociations();
/**
* Returns <code>true</code> if this launcher should be installed as a service.
*
* @return <code>true</code> if this launcher should be installed as a service
*/
boolean isService();
/**
* Gets the description of this launcher.
*
* @return the description of this launcher
*/
String description();
/**
* Opens a stream with the template executable file for this launcher. Caller is
* responsible for close the stream.
*
* @return a stream with the template executable file for this launcher
*/
default InputStream executableResource() {
return ResourceLocator.class.getResourceAsStream("jpackageapplauncher");
}
/**
* Gets the icon for this launcher or an empty {@link Optional} instance if the
* launcher is requested to have no icon.
*
* @return the icon for this launcher
* @see #hasIcon()
* @see #hasDefaultIcon()
* @see #hasCustomIcon()
*/
Optional<LauncherIcon> icon();
/**
* Returns <code>true</code> if this launcher is requested to have an icon.
*
* @return <code>true</code> if this launcher is requested to have an icon
* @see #icon()
* @see #hasDefaultIcon()
* @see #hasCustomIcon()
*/
default boolean hasIcon() {
return icon().isPresent();
}
/**
* Returns <code>true</code> if this launcher has a default icon.
*
* @return <code>true</code> if this launcher has a default icon
* @see DefaultLauncherIcon
* @see #icon()
* @see #hasIcon()
* @see #hasCustomIcon()
*/
default boolean hasDefaultIcon() {
return icon().flatMap(DefaultLauncherIcon::fromLauncherIcon).isPresent();
}
/**
* Returns <code>true</code> if this launcher has a custom icon.
*
* @return <code>true</code> if this launcher has a custom icon
* @see CustomLauncherIcon
* @see #icon()
* @see #hasDefaultIcon()
* @see #hasIcon()
*/
default boolean hasCustomIcon() {
return icon().flatMap(CustomLauncherIcon::fromLauncherIcon).isPresent();
}
/**
* Gets key in the resource bundle of {@link jdk.jpackage/} module referring to
* the default launcher icon.
*
* @return the key in the resource bundle referring to the default launcher icon
*/
String defaultIconResourceName();
/**
* Gets the additional properties for application launcher entries in the app
* image (".jpackage") file.
*
* @return the additional properties for application launcher entries in
* ".jpackage" file
*/
Map<String, String> extraAppImageFileData();
/**
* Default implementation of {@link Launcher} interface.
*/
record Stub(String name, Optional<LauncherStartupInfo> startupInfo, List<FileAssociation> fileAssociations,
boolean isService, String description, Optional<LauncherIcon> icon, String defaultIconResourceName,
Map<String, String> extraAppImageFileData) implements Launcher {
}
}