WebClientBuilderParameters.java
/*
** Module : WebClientBuilderParameters.java
** Abstract : store the web client process parameters
**
** Copyright (c) 2014-2024, Golden Code Development Corporation.
**
** -#- -I- --Date-- -------------------------------Description------------------------------------
** 001 CA 20140206 Created initial version, extracted from ClientBuilderParameters.
** 002 GES 20150312 Store the web client type.
** 003 GES 20160203 Added trusted mode support and removed some dead code.
** 004 CA 20160428 Added command-line configuration options for web-clients.
** 005 GBB 20230825 Adding new fields logoutPage and ssoFwdUser.
** 006 GBB 20231113 Cleanup for web:referrer:url. Adding storageId to constructor.
** 007 GBB 20240709 Splitting web overrides to 4 fields to be merged in the right order after setting a
** project token. Web specific fields and methods moved here from other classes for stronger
** cohesion and better typization. Fields unmodifiable.
** 008 GBB 20240718 Moving base client builder configs to a field in the respective options class.
** 009 GBB 20240821 Replacing hard-coded proxy client option names with constants.
*/
/*
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU Affero General Public License as
** published by the Free Software Foundation, either version 3 of the
** License, or (at your option) any later version.
**
** This program 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 Affero General Public License for more details.
**
** You may find a copy of the GNU Affero GPL version 3 at the following
** location: https://www.gnu.org/licenses/agpl-3.0.en.html
**
** Additional terms under GNU Affero GPL version 3 section 7:
**
** Under Section 7 of the GNU Affero GPL version 3, the following additional
** terms apply to the works covered under the License. These additional terms
** are non-permissive additional terms allowed under Section 7 of the GNU
** Affero GPL version 3 and may not be removed by you.
**
** 0. Attribution Requirement.
**
** You must preserve all legal notices or author attributions in the covered
** work or Appropriate Legal Notices displayed by works containing the covered
** work. You may not remove from the covered work any author or developer
** credit already included within the covered work.
**
** 1. No License To Use Trademarks.
**
** This license does not grant any license or rights to use the trademarks
** Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
** of Golden Code Development Corporation. You are not authorized to use the
** name Golden Code, FWD, or the names of any author or contributor, for
** publicity purposes without written authorization.
**
** 2. No Misrepresentation of Affiliation.
**
** You may not represent yourself as Golden Code Development Corporation or FWD.
**
** You may not represent yourself for publicity purposes as associated with
** Golden Code Development Corporation, FWD, or any author or contributor to
** the covered work, without written authorization.
**
** 3. No Misrepresentation of Source or Origin.
**
** You may not represent the covered work as solely your work. All modified
** versions of the covered work must be marked in a reasonable way to make it
** clear that the modified work is not originating from Golden Code Development
** Corporation or FWD. All modified versions must contain the notices of
** attribution required in this license.
*/
package com.goldencode.p2j.main;
import com.goldencode.p2j.util.*;
import com.goldencode.p2j.util.logging.*;
import com.goldencode.p2j.web.*;
import java.util.*;
import java.util.logging.*;
/**
* This structure holds default parameters as well specific parameters used to create and spawn a
* process for a web client (either GUI or ChUI).
*/
public class WebClientBuilderParameters
extends ClientBuilderParameters
{
/** Logger. */
private static final CentralLogger LOG = CentralLogger.get(WebClientBuilderParameters.class);
/** The template for the transport part of the java debugger agent connection string */
private static final String DEBUGGER_TRANSPORT = "dt_socket,server=y,suspend=%s,address=%d";
/** Unmodifiable map of client config : default value pairs for the debug profile. */
private static final Map<ConfigItem, String> DEBUG_PROFILE =
Collections.unmodifiableMap(new HashMap<ConfigItem, String>() {
{
put(ConfigItem.WEB_SOCKET_TIMEOUT, String.valueOf(20 * 60 * 1000));
put(ConfigItem.WATCHDOG_TIMEOUT, String.valueOf(40 * 60 * 1000));
put(ConfigItem.MAX_IDLE_TIME, String.valueOf(20 * 60 * 1000));
put(ConfigItem.MAX_HTTP_IDLE_TIME, String.valueOf(WebConfigurationConstants.INFINITE_TIMEOUT));
put(ConfigItem.CONNECT_RETRY_DELAY,
String.valueOf(WebConfigurationConstants.DELAY_BETWEEN_CONNECT_TRIES));
put(ConfigItem.PING_PONG_INTERVAL, String.valueOf(20 * 60 * 1000));
put(ConfigItem.MAX_LOST_PINGS, String.valueOf(WebConfigurationConstants.MAX_LOST_PINGS));
put(ConfigItem.PING_DELAY, String.valueOf(WebConfigurationConstants.DELAY_BETWEEN_PING_TRIES));
put(ConfigItem.JS_DEBUG_LOGGING, String.valueOf(true));
}});
/** Enables trusted launch mode (no password is used and the OS account is forced). */
private final boolean trusted;
/** The bootstrap config overrides to be applied first. Lowest priority. Embedded startup procedure. */
private final List<String> firstWebOverrides;
/** The bootstrap config overrides coming from directory, i.e. webClient/cfgOverrides. */
private final List<String> dirWebOverrides;
/**
* The bootstrap config overrides compiled runtime: theme, webRoot, login/logout page url, forked
* session overrides.
*/
private final List<String> runtimeWebOverrides;
/**
* The bootstrap config overrides to be applied last. Highest priority. Web driver type: embedded or not.
*/
private final List<String> lastWebOverrides;
/** Default options from directory */
private final WebClientBuilderOptions dirOptions;
/** Fwd user for SSO authentication. */
private final String ssoFwdUser;
/** The unique id for the client storage. <code>null</code> if SSO not enabled. */
private final String storageId;
/**
* Constructor. Assign a unique UUID to this process.
*
* @param osUser
* The OS user name.
* @param osPass
* The OS user password.
* @param dirOptions
* The client builder options.
* @param securePort
* The server's secure port.
* @param serverAlias
* The alias of the server certificate.
* @param trusted
* If this instance will be used to launch clients in trusted mode.
* @param ssoFwdUser
* Fwd user for SSO authentication.
* @param storageId
* The unique id for the client storage.
* @param firstWebOverrides
* The bootstrap config overrides to be applied first. Lowest priority.
* @param dirWebOverrides
* The bootstrap config overrides coming from directory.
* @param runtimeWebOverrides
* The bootstrap config overrides compiled runtime.
* @param lastWebOverrides
* The bootstrap config overrides to be applied last. Highest priority.
*/
public WebClientBuilderParameters(String osUser,
String osPass,
WebClientBuilderOptions dirOptions,
int securePort,
String serverAlias,
boolean trusted,
String ssoFwdUser,
String storageId,
List<String> firstWebOverrides,
List<String> dirWebOverrides,
List<String> runtimeWebOverrides,
List<String> lastWebOverrides)
{
super(osUser, osPass, securePort, serverAlias);
this.ssoFwdUser = ssoFwdUser;
this.storageId = storageId;
this.dirOptions = dirOptions;
this.trusted = trusted;
this.firstWebOverrides = Collections.unmodifiableList(firstWebOverrides);
this.dirWebOverrides = Collections.unmodifiableList(dirWebOverrides);
this.runtimeWebOverrides = Collections.unmodifiableList(runtimeWebOverrides);
this.lastWebOverrides = Collections.unmodifiableList(lastWebOverrides);
dirOptions.reset();
}
/**
* Returns the directory values for the client as {@link WebClientBuilderOptions}.
*
* @return See above.
*/
@Override
public WebClientBuilderOptions getDirOptions()
{
return dirOptions;
}
/**
* Get the authentication mode for this spawner.
*
* @return {@code true} indicating that the user's password is required for authentication.
*/
@Override
public boolean isPasswordAuthentication()
{
return !trusted;
}
/**
* Get the flag that reports which web client type is in use.
*
* @return Client type (<code>true</code> for GUI, <code>false</code> for ChUI).
*/
public boolean isGui()
{
return getDirOptions().getDriverType().isGui();
}
/**
* Get the flag that reports is spawning should use trusted mode.
*
* @return Trusted mode flag.
*/
public boolean isTrusted()
{
return trusted;
}
/**
* Get the FWD user for SSO authentication.
*
* @return The FWD user for SSO authentication.
*/
public String getSsoFwdUser()
{
return ssoFwdUser;
}
/**
* Get the unique id for the client storage.
*
* @return The unique id for the client storage.
*/
public String getStorageId()
{
return storageId;
}
/**
* Getter for {@link #firstWebOverrides}.
*
* @return See above.
*/
public List<String> getFirstWebOverrides()
{
return firstWebOverrides;
}
/**
* Getter for {@link #dirWebOverrides}.
*
* @return See above.
*/
public List<String> getDirWebOverrides()
{
return dirWebOverrides;
}
/**
* Getter for {@link #runtimeWebOverrides}.
*
* @return See above.
*/
public List<String> getRuntimeWebOverrides()
{
return runtimeWebOverrides;
}
/**
* Getter for {@link #lastWebOverrides}.
*
* @return See above.
*/
public List<String> getLastWebOverrides()
{
return lastWebOverrides;
}
/**
* Update the command line parameters for the spawning process with the web client configuration.
*
* @param allocatedResources
* The web client allocated resources
*/
void updateOptions(WebAllocatedResources allocatedResources)
{
if (allocatedResources == null)
{
return;
}
// set jmx and java debugger command line options
if (allocatedResources.getJmxAgentPort() > 0)
{
dirOptions.getBaseOptions().updateJvmArgument("-Dcom.sun.management.jmxremote.port",
String.valueOf(allocatedResources.getJmxAgentPort()));
}
if (allocatedResources.getDebugAgentPort() > 0)
{
dirOptions.getBaseOptions().updateJvmArgument("-Xrunjdwp:transport",
String.format(DEBUGGER_TRANSPORT,
dirOptions.getBaseOptions().getSuspendOption(),
allocatedResources.getDebugAgentPort()));
for (Map.Entry<ConfigItem, String> debugConfig : DEBUG_PROFILE.entrySet())
{
String configName = debugConfig.getKey().name();
dirOptions.override(configName, debugConfig.getValue());
LOG.log(Level.WARNING, "DEBUG MODE: %s=%s", configName, debugConfig.getValue());
}
}
if (allocatedResources.getPort() > 0)
{
dirOptions.override(ConfigItem.PORT.name(), String.valueOf(allocatedResources.getPort()));
}
String forwardedHost = allocatedResources.getForwardedHost();
if (forwardedHost != null)
{
dirOptions.override(ConfigItem.PROXY_HOST.name(), forwardedHost);
dirOptions.override(ConfigItem.PROXY_PROTOCOL.name(), allocatedResources.getForwardedProto());
dirOptions.override(ConfigItem.WEB_ROOT.name(), allocatedResources.getWebRoot());
}
}
}