/*******************************************************************************
 * Copyright (c) 2012 - 2013 Eclipse Foundation
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SAP AG - initial implementation
 *******************************************************************************/

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

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
import org.eclipse.jdt.launching.JavaRuntime;
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.core.IServerBehaviour;
import org.eclipse.virgo.ide.runtime.core.IServerRuntimeProvider;
import org.eclipse.virgo.ide.runtime.core.ServerCorePlugin;
import org.eclipse.virgo.ide.runtime.core.ServerUtils;
import org.eclipse.virgo.ide.runtime.internal.core.DeploymentIdentity;
import org.eclipse.virgo.ide.runtime.internal.core.command.IServerCommand;
import org.eclipse.virgo.ide.runtime.internal.core.command.JmxServerDeployCommand;
import org.eclipse.virgo.kernel.osgi.provisioning.tools.DependencyLocatorVirgo;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.IRuntime;

/**
 * {@link IServerRuntimeProvider} for Virgo Server 3.5.x and 3.6.x.
 *
 * @author Borislav Kapukaranov
 * @author Miles Parker
 * @author Leo Dos Santos
 */
public class Virgo35Provider extends VirgoRuntimeProvider {

    // Assumes Stateless
    public static final VirgoRuntimeProvider INSTANCE = new Virgo35Provider();

    public static final String GEMINI_CONNECTOR_BUNDLE_NAME = "org.eclipse.virgo.ide.management.remote_3.5.0.201208291630.jar"; //$NON-NLS-1$

    protected Virgo35Provider() {
    }

    @Override
    public boolean isHandlerFor(IRuntime runtime) {
        IPath configPath = runtime.getLocation().append(getConfigurationDir());
        File configDir = configPath.toFile();
        if (!configDir.exists()) {
            return false;
        }
        return new File(configDir, getServerProfileName()).exists();
    }

    /**
     * {@inheritDoc}
     */
    public String getRuntimeClass() {
        return "org.eclipse.equinox.launcher.Main";
    }

    @Override
    public String getConfigurationDir() {
        return "configuration";
    }

    /**
     * @see org.eclipse.virgo.ide.runtime.internal.core.runtimes.VirgoRuntimeProvider#getProfileDir()
     */
    @Override
    String getProfileDir() {
        return getConfigurationDir();
    }

    /**
     * @see org.eclipse.virgo.ide.runtime.core.IServerRuntimeProvider#getRuntimeClasspath(org.eclipse.core.runtime.IPath)
     */
    @Override
    public List<IRuntimeClasspathEntry> getRuntimeClasspath(IPath installPath) {
        List<IRuntimeClasspathEntry> cp = super.getRuntimeClasspath(installPath);

        IPath pluginsPath = installPath.append("plugins");
        if (pluginsPath.toFile().exists()) {
            File pluginsFolder = pluginsPath.toFile();
            for (File library : pluginsFolder.listFiles(new FileFilter() {

                public boolean accept(File pathname) {
                    return pathname.isFile() && pathname.toString().endsWith(".jar") && pathname.toString().contains("org.eclipse.osgi_")
                        && pathname.toString().contains("org.eclipse.equinox.console.supportability_");
                }
            })) {
                IPath path = pluginsPath.append(library.getName());
                cp.add(JavaRuntime.newArchiveRuntimeClasspathEntry(path));
            }
        }

        return cp;
    }

    /**
     * {@inheritDoc}
     */
    public String[] getRuntimeProgramArguments(IServerBehaviour behaviour) {
        List<String> list = new ArrayList<String>();
        list.add("-noExit");
        return list.toArray(new String[list.size()]);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String[] getRuntimeVMArguments(IServerBehaviour behaviour, IPath installPath, IPath configPath, IPath deployPath) {
        String[] commonArguments = super.getRuntimeVMArguments(behaviour, installPath, configPath, deployPath);
        String serverHome = ServerUtils.getServer(behaviour).getRuntimeBaseDirectory().toOSString();
        List<String> list = new ArrayList<String>();
        list.addAll(Arrays.asList(commonArguments));

        list.add("-Dorg.eclipse.virgo.kernel.config=" + serverHome + "/" + getConfigurationDir() + "," + serverHome + "/stage");
        list.add("-Dosgi.java.profile=file:" + serverHome + "/" + getConfigurationDir() + "/" + getServerProfileName());
        list.add("-Declipse.ignoreApp=true");
        list.add("-Dosgi.install.area=" + serverHome);
        list.add("-Dosgi.configuration.area=" + serverHome + "/work");
        list.add("-Dssh.server.keystore=" + serverHome + "/" + getConfigurationDir() + "/hostkey.ser");
        list.add("-Djava.endorsed.dirs=\"" + serverHome + "/lib/endorsed\"");

        if (isWindows10()) {
            // Work around for Equinox 3.9 not recognizing Windows 10 as win32, which results in failure of resolution
            // of native libraries see https://bugs.eclipse.org/bugs/show_bug.cgi?id=486353
            list.add("-Dos.name=win32");
        }

        String fwClassPath = createFWClassPath(serverHome);

        list.add("-Dosgi.frameworkClassPath=" + fwClassPath);

        return list.toArray(new String[list.size()]);
    }

    private boolean isWindows10() {
        return System.getProperty("os.name", "").toLowerCase().contains("windows") && System.getProperty("os.version", "").startsWith("1"); //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
    }

    private String createFWClassPath(String serverHome) {
        StringBuilder fwClassPath = new StringBuilder();
        File libDir = new File(serverHome + "/lib");
        if (libDir.exists()) {
            for (File file : libDir.listFiles()) {
                if (file.getName().endsWith(".jar")) {
                    fwClassPath.append("file:" + file.getAbsolutePath() + ",");
                }
            }
        }
        File plugins = new File(serverHome + "/plugins");
        if (plugins.exists()) {
            for (File file : plugins.listFiles()) {
                if (file.getName().contains("org.eclipse.osgi_")) {
                    fwClassPath.append("file:" + file.getAbsolutePath() + ",");
                }
                if (file.getName().contains("org.eclipse.equinox.console.supportability_")) {
                    fwClassPath.append("file:" + file.getAbsolutePath() + ",");
                }
            }
        }
        fwClassPath.deleteCharAt(fwClassPath.length() - 1);
        return fwClassPath.toString();
    }

    @Override
    public String getSupportedVersions() {
        return "3.5+";
    }

    /**
     * @see org.eclipse.virgo.ide.runtime.core.IServerRuntimeProvider#createDependencyLocator(org.eclipse.wst.server.core.IRuntime,
     *      java.lang.String, java.lang.String[], java.lang.String,
     *      org.eclipse.virgo.ide.manifest.core.dependencies.IDependencyLocator.JavaVersion)
     */
    public IDependencyLocator createDependencyLocator(IRuntime runtime, String serverHomePath, String[] additionalSearchPaths,
        String indexDirectoryPath, JavaVersion javaVersion) throws IOException {
        return new DependencyLocatorVirgo(serverHomePath, additionalSearchPaths, indexDirectoryPath, javaVersion);
    }

    /**
     * @see org.eclipse.virgo.ide.runtime.core.IServerRuntimeProvider#getConnectorBundleUri()
     */
    public URI getConnectorBundleUri() {
        return ServerCorePlugin.getDefault().getBundleUri(GEMINI_CONNECTOR_BUNDLE_NAME);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public IServerCommand<DeploymentIdentity> getServerDeployCommand(IServerBehaviour IServerBehaviour, IModule module) {
        return new JmxServerDeployCommand(IServerBehaviour, module, true);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public IServerCommand<DeploymentIdentity> getServerRedeployCommand(IServerBehaviour IServerBehaviour, IModule module) {
        return new JmxServerDeployCommand(IServerBehaviour, module, false);
    }
}
