docs: @Override
      public void init() throws ChannelException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "init");
          }
  
          // Prevent duplicate initialization.
          if (this.isInitialized) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
                  Tr.exit(tc, "init");
              }
              return;
          }
  
          // Extract the channel properties.
          try {
              Properties channelProps = getConfig().getProperties();
              // Handle a potentially null property map.
              if (channelProps != null) {
                  this.alias = channelProps.getProperty(SSLChannelData.ALIAS_KEY);
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      if (this.alias != null) {
                          Tr.debug(tc, "Found alias in SSL properties, " + this.alias);
                      } else {
                          Tr.debug(tc, "No alias found in SSL properties");
                      }
                  }
                  //PI52696 - Timeout value for which the SSL closing handshake loop will attempt to complete final handshake
                  //write before giving up.
                  String timeoutValueInSSLClosingHandshake = channelProps.getProperty(SSLChannelConstants.TIMEOUT_VALUE_IN_SSL_CLOSING_HANDSHAKE);
                  if (timeoutValueInSSLClosingHandshake != null) {
                      this.timeoutValueInSSLClosingHandshake = Integer.parseInt(timeoutValueInSSLClosingHandshake);
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Found timeoutValueInSSLClosingHandshake in SSL properties, " + this.timeoutValueInSSLClosingHandshake);
                      }
  
                  }
  
                  //Check for system property so all SSL Channels can have the property enabled
  
                  //APAR PI70332 - Add Java custom property to allow this property to be set on all inbound/outbound channels
                  //without need of SSL configuration.
  
                  String timeoutValueSystemProperty = AccessController.doPrivileged(new java.security.PrivilegedAction<String>() {
                      @Override
                      public String run() {
                          return (System.getProperty(SSLChannelConstants.TIMEOUT_VALUE_IN_SSL_CLOSING_HANDSHAKE));
                      }
                  });
  
                  if (timeoutValueSystemProperty != null) {
                      this.timeoutValueInSSLClosingHandshake = Integer.parseInt(timeoutValueSystemProperty);
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Found timeoutValueInSSLClosingHandshake in SSL system properties, " + this.timeoutValueInSSLClosingHandshake);
                      }
                  }
  
                  String protocolVersion = channelProps.getProperty(SSLChannelConstants.PROPNAME_PROTOCOL_VERSION);
                  if (protocolVersion != null) {
  
                      if (SSLChannelConstants.PROTOCOL_VERSION_11.equalsIgnoreCase(protocolVersion)) {
                          this.useH2ProtocolAttribute = Boolean.FALSE;
                      } else if (SSLChannelConstants.PROTOCOL_VERSION_2.equalsIgnoreCase(protocolVersion)) {
                          this.useH2ProtocolAttribute = Boolean.TRUE;
                      }
  
                      if ((TraceComponent.isAnyTracingEnabled()) && (tc.isEventEnabled()) && useH2ProtocolAttribute != null) {
                          Tr.event(tc, "SSL Channel Config: versionProtocolOption has been set to " + protocolVersion.toLowerCase(Locale.ENGLISH));
                      }
                  }
  
              }
          } catch (Exception e) {
              // no FFDC required
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "init received exception handling properties; " + e);
              }
              throw new ChannelException(e);
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "jsseProvider=" + this.jsseProvider);
          }
  
          // Indicate that initialization is complete.
          this.isInitialized = true;
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "init");
          }
      }