/*
 * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.enterprise.util;

import java.io.File;

import com.sun.enterprise.util.i18n.StringManager;

public class SystemPropertyConstants {

    /**
     * Field used by Monitoring to encode a forward slash and/or dot
     */
    public static final String SLASH = "___SLASH___";
    public static final String MONDOT = "___MONDOT___";

    /**
     * Field
     */
    public static final String UNIX_ASENV_FILENAME = "asenv.conf";

    /**
     * Field
     */
    public static final String WINDOWS_ASENV_FILENAME = "asenv.bat";

    /**
     * Field
     */
    public static final String WEB_SERVICES_LIB_PROPERTY = "com.sun.aas.webServicesLib";

    /**
     * Field
     */
    public static final String PERL_ROOT_PROPERTY = "com.sun.aas.perlRoot";

    /**
     * Field
     */
    public static final String IMQ_LIB_PROPERTY = "com.sun.aas.imqLib";

    /**
     * Field
     */
    public static final String IMQ_BIN_PROPERTY = "com.sun.aas.imqBin";

    /**
     * Field
     */
    public static final String CONFIG_ROOT_PROPERTY = "com.sun.aas.configRoot";

    /**
     * Field
     */
    public static final String INSTALL_ROOT_PROPERTY = "com.sun.aas.installRoot";

    /**
     * Field
     */
    public static final String PRODUCT_ROOT_PROPERTY = "com.sun.aas.productRoot";

    /**
     * Field
     */
    public static final String JAVA_ROOT_PROPERTY = "com.sun.aas.javaRoot";
    public static final String JAVA_ROOT_PROPERTY_ASENV = "com.sun.aas.javaRoot.asenv";

    /**
     * Field
     */
    public static final String ICU_LIB_PROPERTY = "com.sun.aas.icuLib";

    /**
     * Field
     */
    public static final String DEFAULT_LOCALE_PROPERTY = "com.sun.aas.defaultLocale";

    /**
     * Field
     */
    public static final String DOMAINS_ROOT_PROPERTY = "com.sun.aas.domainsRoot";

    /**
     * Field
     */
    public static final String INSTANCE_ROOT_PROPERTY = "com.sun.aas.instanceRoot";

    /**
     * Field
     */
    public static final String DEBUG_MODE_PROPERTY = "com.sun.aas.debugMode";

    /**
     * The certificate nick name specified in the System-Jmx-Conenctor of the DAS with which a Node Agent synchronizes
     */
    public static final String AGENT_CERT_NICKNAME = "com.sun.aas.agentCertNickname";

    public static final String AGENT_ROOT_PROPERTY = "com.sun.aas.agentRoot";

    public static final String AGENT_NAME_PROPERTY = "com.sun.aas.agentName";

    /**
     * Field
     */
    public static final String WEBCONSOLE_LIB_PROPERTY = "com.sun.aas.webconsoleLib";
    public static final String WEBCONSOLE_APP_PROPERTY = "com.sun.aas.webconsoleApp";

    public static final String JATO_ROOT_PROPERTY = "com.sun.aas.jatoRoot";

    public static final String ANT_ROOT_PROPERTY = "com.sun.aas.antRoot";

    public static final String ANT_LIB_PROPERTY = "com.sun.aas.antLib";

    public static final String JHELP_ROOT_PROPERTY = "com.sun.aas.jhelpRoot";

    /** name of the server instance key */
    public static final String SERVER_NAME = "com.sun.aas.instanceName";

    /** name of the server's cluster */
    public static final String CLUSTER_NAME = "com.sun.aas.clusterName";

    /** name of the HADB location property **/
    public static final String HADB_ROOT_PROPERTY = "com.sun.aas.hadbRoot";

    public static final String NSS_ROOT_PROPERTY = "com.sun.aas.nssRoot";

    public static final String NSS_BIN_PROPERTY = "com.sun.aas.nssBin";

    public static final String NATIVE_LAUNCHER = "com.sun.aas.nativeLauncher";
    public static final String NATIVE_LAUNCHER_LIB_PREFIX = "com.sun.aas.nativeLauncherLibPrefix";

    public static final String KEYSTORE_PROPERTY = "javax.net.ssl.keyStore";
    public static final String JKS_KEYSTORE = System.getProperty("file.separator") + "config" + System.getProperty("file.separator") + "keystore.jks";

    public static final String TRUSTSTORE_PROPERTY = "javax.net.ssl.trustStore";
    public static final String JKS_TRUSTSTORE = System.getProperty("file.separator") + "config" + System.getProperty("file.separator") + "cacerts.jks";

    public static final String ADMIN_REALM = "admin-realm";
    public static final String NSS_DB_PROPERTY = "com.sun.appserv.nss.db";

    public static final String NSS_DB_PASSWORD_PROPERTY = "com.sun.appserv.nss.db.password";

    public static final String CLIENT_TRUSTSTORE_PROPERTY = TRUSTSTORE_PROPERTY;
    // "com.sun.appserv.client.truststore";

    public static final String CLIENT_TRUSTSTORE_PASSWORD_PROPERTY = "javax.net.ssl.trustStorePassword";
    // "com.sun.appserv.client.truststore.password";

    public static final String PID_FILE = ".__com_sun_appserv_pid";
    public static final String REF_TS_FILE = "admsn";

    public static final String KILLSERV_SCRIPT = "killserv";

    public static final String KILL_SERV_UNIX = "killserv";
    public static final String KILL_SERV_WIN = "killserv.bat";
    public static final String KILL_SERV_OS = OS.isWindows() ? KILL_SERV_WIN : KILL_SERV_UNIX;

    @Deprecated
    public static final String DEFAULT_SERVER_INSTANCE_NAME = "server";

    public static final String DAS_SERVER_NAME = "server";
    public static final String DAS_SERVER_CONFIG = "server-config";

    public static final String JDMK_HOME_PROPERTY = "com.sun.aas.jdmkHome";

    public static final String DERBY_ROOT_PROPERTY = "com.sun.aas.derbyRoot";

    /** Java ES Monitoring Framework install directory */
    public static final String MFWK_HOME_PROPERTY = "com.sun.aas.mfwkHome";

    /*
     * An implementation note: This variable should be defined at one place. I have chosen this location because most of the
     * other modules depend on appserv-commons for compilation.
     */
    /** name of the domain key */
    public static final String DOMAIN_NAME = "domain.name";
    public static final String HOST_NAME_PROPERTY = "com.sun.aas.hostName";
    public static final String CONFIG_NAME_PROPERTY = "com.sun.aas.configName";
    public static final String DOCROOT_PROPERTY = "docroot";
    public static final String ACCESSLOG_PROPERTY = "accesslog";
    public static final String DEFAULT_SERVER_SOCKET_ADDRESS = "0.0.0.0";
    public static final String CLUSTER_AWARE_FEATURE_FACTORY_CLASS = "com.sun.enterprise.ee.server.pluggable.EEPluggableFeatureImpl";
    public static final String DROP_INTERRUPTED_COMMANDS = "org.glassfish.job-manager.drop-interrupted-commands";

    /** Name of the default config that determines the configuration for the instances */
    public static final String TEMPLATE_CONFIG_NAME = "default-config";
    public static final String DEFAULT_ADMIN_USER = "admin";
    public static final String DEFAULT_ADMIN_PASSWORD = "";

    private static final StringManager sm = StringManager.getManager(SystemPropertyConstants.class);

    public static final String OPEN = "${";
    public static final String CLOSE = "}";

    /**
     * A method that returns the passed String as a property that can be replaced at run time.
     *
     * @param name String that represents a property, e.g INSTANCE_ROOT_PROPERTY in this class. The String may not be null.
     * @return a String that represents the replaceable value of passed String. Generally speaking it will be decorated with
     * a pair of braces with $ in the front (e.g. "a" will be returned as "${a}").
     * @throws IllegalArgumentException if the passed String is null
     */
    public static final String getPropertyAsValue(final String name) {
        if (name == null) {
            throw new IllegalArgumentException(sm.getString("spc.null_name", "property"));
        }

        return new StringBuffer().append(OPEN)
                                 .append(name)
                                 .append(CLOSE)
                                 .toString();
    }

    /**
     * Returns the string removing the "system-property syntax" from it. If the given string is not in "system-property
     * syntax" the same string is returned. The "system-propery syntax" is "${...}" The given String may not be null. The
     * returned String may be an empty String, if it is of the form "${}" (rarely so).
     */
    public static final String unSystemProperty(final String sp) {
        if (sp == null) {
            throw new IllegalArgumentException("null_arg");
        }

        String ret = sp;
        if (isSystemPropertySyntax(sp)) {
            ret = sp.substring(2, sp.length() - 1);
        }

        return ret;
    }

    public static final boolean isSystemPropertySyntax(final String s) {
        if (s == null) {
            throw new IllegalArgumentException("null_arg");
        }

        boolean sp = false;
        if (s.startsWith(OPEN) && s.endsWith(CLOSE)) {
            sp = true;
        }

        return sp;
    }

    /**
     * Returns the default value (as would appear in the domain.xml on installation) of docroot of a virtual server, as a
     * String. Never returns a null. Returned String contains no backslashes. Note that it is <b> not <b> the absolute value
     * of the path on a file system.
     */
    public static final String getDocRootDefaultValue() {
        return new StringBuffer(getPropertyAsValue(INSTANCE_ROOT_PROPERTY)).append("/docroot").toString();
    }

    /**
     * Returns the default value (as would appear in the domain.xml on installation) of file where the acess log of a
     * virtual server is stored, as a String. Never returns a null. Returned String contains no backslashes. Note that it is
     * <b> not <b> the absolute value of the path on a file system.
     */
    public static final String getAccessLogDefaultValue() {
        return new StringBuffer(getPropertyAsValue(INSTANCE_ROOT_PROPERTY)).append("/logs/access").toString();
    }

    /**
     * Returns the system specific file.separator delimited path to the asadmin script. Any changes to file layout should
     *
     * be reflected here. The path will contain '/' as the separator character, regardless of operating platform. Never
     * returns a null. Assumes the the property "INSTALL_ROOT_PROPERTY" is set in the VM before calling this. As of now
     * (September 2005) all the server instances and asadmin VM itself has this property set. The method does not guarantee
     * that the script exists on the given system. It should only be used when caller wants to know the location of the
     * script. Caller should make sure it exists.
     *
     * @return String representing the Path to asadmin script. Might return a string beginning with "null", if the
     * INSTALL_ROOT_PROPERTY is not defined
     */
    public static final String getAsAdminScriptLocation() {
        return getAdminScriptLocation(System.getProperty(INSTALL_ROOT_PROPERTY));
    }

    public static final String getAsAdminScriptLocation(String installRoot) {
        return getAdminScriptLocation(installRoot);
    }

    public static final String getAdminScriptLocation(String installRoot) {
        StringBuilder sb = new StringBuilder();
        String ext = OS.isWindows() ? OS.WINDOWS_BATCH_FILE_EXTENSION : "";
        String ASADMIN = "nadmin";
        String suffix = new StringBuilder("lib").append(System.getProperty("file.separator")).append(ASADMIN).append(ext).toString();

        sb.append(installRoot);
        final String fs = System.getProperty("file.separator");
        if (!sb.toString().endsWith(fs)) {
            sb.append(fs);
        }
        sb.append(suffix);

        return sb.toString();
    }

    /**
     * Returns the component identifier associated with the INSTALL_ROOT. For example if INSTALL_ROOT is
     * /home/glassfish7/glassfish the component name will "glassfish".
     *
     * @return String representing the component identifier.
     */
    public static final String getComponentName() {
        return new File(System.getProperty(INSTALL_ROOT_PROPERTY)).getName();
    }
}
