/*********************************************************************
 * Copyright (c) 2009, 2011 SpringSource, a division of VMware, Inc. and others and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
**********************************************************************/

package org.eclipse.virgo.ide.runtime.core;

import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
import org.eclipse.libra.framework.editor.core.model.IBundle;
import org.eclipse.virgo.ide.manifest.core.dependencies.IDependencyLocator;
import org.eclipse.virgo.ide.manifest.core.dependencies.IDependencyLocator.JavaVersion;
import org.eclipse.virgo.ide.runtime.internal.core.DeploymentIdentity;
import org.eclipse.virgo.ide.runtime.internal.core.command.IServerCommand;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.core.model.IModuleFile;

/**
 * Interface that encapsulates server settings such as for versions.
 *
 * @author Christian Dupuis
 * @author Kaloyan Raev
 * @author Miles Parker
 * @since 1.0.0
 */
public interface IServerRuntimeProvider {

    /**
     * Check if a certain dm server can serve a given module(type)
     */
    IStatus canAddModule(IModule module);

    /**
     * Returns the to-be excluded program arguments
     */
    String[] getExcludedRuntimeProgramArguments(boolean starting);

    /**
     * Returns the runtime base directory.
     */
    IPath getRuntimeBaseDirectory(org.eclipse.wst.server.core.IServer server);

    /**
     * Returns the runtime class
     */
    String getRuntimeClass();

    /**
     * Returns the runtime class path
     */
    List<IRuntimeClasspathEntry> getRuntimeClasspath(IPath installPath);

    /**
     * Returns the runtime program arguments
     */
    String[] getRuntimeProgramArguments(IServerBehaviour serverBehaviour);

    /**
     * Returns the runtime vm arguments
     */
    String[] getRuntimeVMArguments(IServerBehaviour serverBehaviour, IPath installPath, IPath configPath, IPath deployPath);

    /**
     * Verifies the installation directory
     */
    IStatus verifyInstallation(IRuntime runtime);

    /**
     * Returns the path to the server.config file
     */
    String getProfilePath(IRuntime runtime);

    /**
     * Returns the path to the ext directory in the bundle repository.
     */
    String getExtLevelBundleRepositoryPath(IRuntime runtime);

    /**
     * Returns the path to the user directory in the bundle repository.
     */
    String getUserLevelBundleRepositoryPath(IRuntime runtime);

    /**
     * Returns the path to the library repository.
     */
    String getUserLevelLibraryRepositoryPath(IRuntime runtime);

    /**
     * Returns the path to the server config.
     */
    String getConfigPath(IRuntime runtime);

    /**
     * Returns the name of the Deployer MBean.
     */
    String getDeployerMBeanName();

    /**
     * Returns the Recovery Monitor MBean.
     */
    String getRecoveryMonitorMBeanName();

    /**
     * Returns the Shutdown MBean.
     */
    String getShutdownMBeanName();

    /**
     * Returns the server ping command.
     */
    IServerCommand<Boolean> getServerPingCommand(IServerBehaviour serverBehaviour);

    /**
     * Returns the server shutdown command.
     */
    IServerCommand<Void> getServerShutdownCommand(IServerBehaviour serverBehaviour);

    /**
     * Returns the server deployer command.
     */
    IServerCommand<DeploymentIdentity> getServerDeployCommand(IServerBehaviour serverBehaviour, IModule module);

    /**
     * Returns the server re-deployer command.
     */
    IServerCommand<DeploymentIdentity> getServerRedeployCommand(IServerBehaviour serverBehaviour, IModule module);

    /**
     * Returns the server refresh command.
     */
    IServerCommand<Void> getServerRefreshCommand(IServerBehaviour serverBehaviour, IModule module, String bundleSymbolicName);

    /**
     * Returns the server update command.
     */
    IServerCommand<Void> getServerUpdateCommand(IServerBehaviour serverBehaviour, IModule module, IModuleFile moduleFile, DeploymentIdentity identity,
        String bundleSymbolicName, String targetPath);

    /**
     * Returns the server undeploy command.
     */
    IServerCommand<Void> getServerUndeployCommand(IServerBehaviour serverBehaviour, IModule module);

    /**
     * Returns the server deploy command.
     */
    IServerCommand<DeploymentIdentity> getServerDeployCommand(IServerBehaviour serverBehaviour);

    /**
     * Returns the server deploy command.
     */
    URI getConnectorBundleUri();

    /**
     * Returns the server bundle admin command.
     */
    IServerCommand<Map<Long, IBundle>> getServerBundleAdminCommand(IServerBehaviour serverBehaviour);

    /**
     * Returns the server bundle execute command.
     */
    IServerCommand<String> getServerBundleAdminExecuteCommand(IServerBehaviour serverBehaviour, String command);

    String[] getServerPropertiesDirectories();

    String[] getServerLogDirectories();

    /**
     * Callback method for version handlers to setup servers before the server starts
     */
    void preStartup(IServerBehaviour serverBehaviour);

    IDependencyLocator createDependencyLocator(IRuntime runtime, String serverHomePath, String[] additionalSearchPaths, String indexDirectoryPath,
        JavaVersion javaVersion) throws IOException;

}
