blob: f0a8156835a4ec460cd0142c609dee0b641ba9af [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache license, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the license for the specific language governing permissions and
* limitations under the license.
*/
package org.apache.logging.log4j.core.net;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.plugins.util.Builder;
import java.net.Socket;
import java.net.SocketException;
/**
* Holds all socket options settable via {@link Socket} methods.
*/
@Plugin(name = "SocketOptions", category = Core.CATEGORY_NAME, printObject = true)
public class SocketOptions implements Builder<SocketOptions>, Cloneable {
@PluginFactory
public static SocketOptions newBuilder() {
return new SocketOptions();
}
@PluginBuilderAttribute
private Boolean keepAlive;
@PluginBuilderAttribute
private Boolean oobInline;
@PluginElement("PerformancePreferences")
private SocketPerformancePreferences performancePreferences;
@PluginBuilderAttribute
private Integer receiveBufferSize;
@PluginBuilderAttribute
private Boolean reuseAddress;
@PluginBuilderAttribute
private Rfc1349TrafficClass rfc1349TrafficClass;
@PluginBuilderAttribute
private Integer sendBufferSize;
@PluginBuilderAttribute
private Integer soLinger;
@PluginBuilderAttribute
private Integer soTimeout;
@PluginBuilderAttribute
private Boolean tcpNoDelay;
@PluginBuilderAttribute
private Integer trafficClass;
public void apply(final Socket socket) throws SocketException {
if (keepAlive != null) {
socket.setKeepAlive(keepAlive.booleanValue());
}
if (oobInline != null) {
socket.setOOBInline(oobInline.booleanValue());
}
if (reuseAddress != null) {
socket.setReuseAddress(reuseAddress.booleanValue());
}
if (performancePreferences != null) {
performancePreferences.apply(socket);
}
if (receiveBufferSize != null) {
socket.setReceiveBufferSize(receiveBufferSize.intValue());
}
if (soLinger != null) {
socket.setSoLinger(true, soLinger.intValue());
}
if (soTimeout != null) {
socket.setSoTimeout(soTimeout.intValue());
}
if (tcpNoDelay != null) {
socket.setTcpNoDelay(tcpNoDelay.booleanValue());
}
final Integer actualTrafficClass = getActualTrafficClass();
if (actualTrafficClass != null) {
socket.setTrafficClass(actualTrafficClass);
}
}
@Override
public SocketOptions build() {
try {
return (SocketOptions) clone();
} catch (final CloneNotSupportedException e) {
throw new IllegalStateException(e);
}
}
public Integer getActualTrafficClass() {
if (trafficClass != null && rfc1349TrafficClass != null) {
throw new IllegalStateException("You MUST not set both customTrafficClass and trafficClass.");
}
if (trafficClass != null) {
return trafficClass;
}
if (rfc1349TrafficClass != null) {
return Integer.valueOf(rfc1349TrafficClass.value());
}
return null;
}
public SocketPerformancePreferences getPerformancePreferences() {
return performancePreferences;
}
public Integer getReceiveBufferSize() {
return receiveBufferSize;
}
public Rfc1349TrafficClass getRfc1349TrafficClass() {
return rfc1349TrafficClass;
}
public Integer getSendBufferSize() {
return sendBufferSize;
}
public Integer getSoLinger() {
return soLinger;
}
public Integer getSoTimeout() {
return soTimeout;
}
public Integer getTrafficClass() {
return trafficClass;
}
public Boolean isKeepAlive() {
return keepAlive;
}
public Boolean isOobInline() {
return oobInline;
}
public Boolean isReuseAddress() {
return reuseAddress;
}
public Boolean isTcpNoDelay() {
return tcpNoDelay;
}
public SocketOptions setKeepAlive(final boolean keepAlive) {
this.keepAlive = Boolean.valueOf(keepAlive);
return this;
}
public SocketOptions setOobInline(final boolean oobInline) {
this.oobInline = Boolean.valueOf(oobInline);
return this;
}
public SocketOptions setPerformancePreferences(final SocketPerformancePreferences performancePreferences) {
this.performancePreferences = performancePreferences;
return this;
}
public SocketOptions setReceiveBufferSize(final int receiveBufferSize) {
this.receiveBufferSize = receiveBufferSize;
return this;
}
public SocketOptions setReuseAddress(final boolean reuseAddress) {
this.reuseAddress = Boolean.valueOf(reuseAddress);
return this;
}
public SocketOptions setRfc1349TrafficClass(final Rfc1349TrafficClass trafficClass) {
this.rfc1349TrafficClass = trafficClass;
return this;
}
public SocketOptions setSendBufferSize(final int sendBufferSize) {
this.sendBufferSize = sendBufferSize;
return this;
}
public SocketOptions setSoLinger(final int soLinger) {
this.soLinger = soLinger;
return this;
}
public SocketOptions setSoTimeout(final int soTimeout) {
this.soTimeout = soTimeout;
return this;
}
public SocketOptions setTcpNoDelay(final boolean tcpNoDelay) {
this.tcpNoDelay = Boolean.valueOf(tcpNoDelay);
return this;
}
public SocketOptions setTrafficClass(final int trafficClass) {
this.trafficClass = trafficClass;
return this;
}
@Override
public String toString() {
return "SocketOptions [keepAlive=" + keepAlive + ", oobInline=" + oobInline + ", performancePreferences="
+ performancePreferences + ", receiveBufferSize=" + receiveBufferSize + ", reuseAddress=" + reuseAddress
+ ", rfc1349TrafficClass=" + rfc1349TrafficClass + ", sendBufferSize=" + sendBufferSize + ", soLinger="
+ soLinger + ", soTimeout=" + soTimeout + ", tcpNoDelay=" + tcpNoDelay + ", trafficClass="
+ trafficClass + "]";
}
}