/**
* 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.camel.component.mina;
import java.nio.charset.Charset;
import java.util.List;
import org.apache.camel.LoggingLevel;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;
import org.apache.camel.spi.UriPath;
import org.apache.mina.common.IoFilter;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
/**
* Mina configuration
*/
@UriParams
public class MinaConfiguration implements Cloneable {
@UriPath(enums = "tcp,udp,vm") @Metadata(required = "true")
private String protocol;
@UriPath @Metadata(required = "true")
private String host;
@UriPath @Metadata(required = "true")
private int port;
@UriParam(defaultValue = "true")
private boolean sync = true;
@UriParam(label = "codec")
private boolean textline;
@UriParam(label = "codec")
private TextLineDelimiter textlineDelimiter;
@UriParam(label = "codec")
private ProtocolCodecFactory codec;
@UriParam(label = "codec")
private String encoding;
@UriParam(defaultValue = "30000")
private long timeout = 30000;
@UriParam(label = "producer,advanced", defaultValue = "true")
private boolean lazySessionCreation = true;
@UriParam(label = "advanced")
private boolean transferExchange;
@UriParam
private boolean minaLogger;
@UriParam(label = "codec", defaultValue = "-1")
private int encoderMaxLineLength = -1;
@UriParam(label = "codec", defaultValue = "1024")
private int decoderMaxLineLength = 1024;
@UriParam(label = "codec")
private List<IoFilter> filters;
@UriParam(label = "codec", defaultValue = "true")
private boolean allowDefaultCodec = true;
@UriParam
private boolean disconnect;
@UriParam(label = "consumer,advanced", defaultValue = "true")
private boolean disconnectOnNoReply = true;
@UriParam(label = "consumer,advanced", defaultValue = "WARN")
private LoggingLevel noReplyLogLevel = LoggingLevel.WARN;
@UriParam(label = "consumer")
private boolean clientMode;
/**
* Returns a copy of this configuration
*/
public MinaConfiguration copy() {
try {
return (MinaConfiguration) clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeCamelException(e);
}
}
public String getCharsetName() {
if (encoding == null) {
return null;
}
if (!Charset.isSupported(encoding)) {
throw new IllegalArgumentException("The encoding: " + encoding + " is not supported");
}
return Charset.forName(encoding).name();
}
public String getProtocol() {
return protocol;
}
/**
* Protocol to use
*/
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getHost() {
return host;
}
/**
* Hostname to use. Use localhost or 0.0.0.0 for local server as consumer. For producer use the hostname or ip address of the remote server.
*/
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
/**
* Port number
*/
public void setPort(int port) {
this.port = port;
}
public boolean isSync() {
return sync;
}
/**
* Setting to set endpoint as one-way or request-response.
*/
public void setSync(boolean sync) {
this.sync = sync;
}
public boolean isTextline() {
return textline;
}
/**
* Only used for TCP. If no codec is specified, you can use this flag to indicate a text line based codec;
* if not specified or the value is false, then Object Serialization is assumed over TCP.
*/
public void setTextline(boolean textline) {
this.textline = textline;
}
public TextLineDelimiter getTextlineDelimiter() {
return textlineDelimiter;
}
/**
* Only used for TCP and if textline=true. Sets the text line delimiter to use.
* If none provided, Camel will use DEFAULT.
* This delimiter is used to mark the end of text.
*/
public void setTextlineDelimiter(TextLineDelimiter textlineDelimiter) {
this.textlineDelimiter = textlineDelimiter;
}
public ProtocolCodecFactory getCodec() {
return codec;
}
/**
* To use a custom minda codec implementation.
*/
public void setCodec(ProtocolCodecFactory codec) {
this.codec = codec;
}
public String getEncoding() {
return encoding;
}
/**
* You can configure the encoding (a charset name) to use for the TCP textline codec and the UDP protocol.
* If not provided, Camel will use the JVM default Charset
*/
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public long getTimeout() {
return timeout;
}
/**
* You can configure the timeout that specifies how long to wait for a response from a remote server.
* The timeout unit is in milliseconds, so 60000 is 60 seconds.
*/
public void setTimeout(long timeout) {
this.timeout = timeout;
}
public boolean isLazySessionCreation() {
return lazySessionCreation;
}
/**
* Sessions can be lazily created to avoid exceptions, if the remote server is not up and running when the Camel producer is started.
*/
public void setLazySessionCreation(boolean lazySessionCreation) {
this.lazySessionCreation = lazySessionCreation;
}
public boolean isTransferExchange() {
return transferExchange;
}
/**
* Only used for TCP. You can transfer the exchange over the wire instead of just the body.
* The following fields are transferred: In body, Out body, fault body, In headers, Out headers, fault headers, exchange properties, exchange exception.
* This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level.
*/
public void setTransferExchange(boolean transferExchange) {
this.transferExchange = transferExchange;
}
/**
* To set the textline protocol encoder max line length. By default the default value of Mina itself is used which are Integer.MAX_VALUE.
*/
public void setEncoderMaxLineLength(int encoderMaxLineLength) {
this.encoderMaxLineLength = encoderMaxLineLength;
}
public int getEncoderMaxLineLength() {
return encoderMaxLineLength;
}
/**
* To set the textline protocol decoder max line length. By default the default value of Mina itself is used which are 1024.
*/
public void setDecoderMaxLineLength(int decoderMaxLineLength) {
this.decoderMaxLineLength = decoderMaxLineLength;
}
public int getDecoderMaxLineLength() {
return decoderMaxLineLength;
}
public boolean isMinaLogger() {
return minaLogger;
}
/**
* You can enable the Apache MINA logging filter. Apache MINA uses slf4j logging at INFO level to log all input and output.
*/
public void setMinaLogger(boolean minaLogger) {
this.minaLogger = minaLogger;
}
public List<IoFilter> getFilters() {
return filters;
}
/**
* You can set a list of Mina IoFilters to use.
*/
public void setFilters(List<IoFilter> filters) {
this.filters = filters;
}
public boolean isDatagramProtocol() {
return protocol.equals("udp");
}
/**
* The mina component installs a default codec if both, codec is null and textline is false.
* Setting allowDefaultCodec to false prevents the mina component from installing a default codec as the first element in the filter chain.
* This is useful in scenarios where another filter must be the first in the filter chain, like the SSL filter.
*/
public void setAllowDefaultCodec(boolean allowDefaultCodec) {
this.allowDefaultCodec = allowDefaultCodec;
}
public boolean isAllowDefaultCodec() {
return allowDefaultCodec;
}
public boolean isDisconnect() {
return disconnect;
}
/**
* Whether or not to disconnect(close) from Mina session right after use. Can be used for both consumer and producer.
*/
public void setDisconnect(boolean disconnect) {
this.disconnect = disconnect;
}
public boolean isDisconnectOnNoReply() {
return disconnectOnNoReply;
}
/**
* If sync is enabled then this option dictates MinaConsumer if it should disconnect where there is no reply to send back.
*/
public void setDisconnectOnNoReply(boolean disconnectOnNoReply) {
this.disconnectOnNoReply = disconnectOnNoReply;
}
public LoggingLevel getNoReplyLogLevel() {
return noReplyLogLevel;
}
/**
* If sync is enabled this option dictates MinaConsumer which logging level to use when logging a there is no reply to send back.
*/
public void setNoReplyLogLevel(LoggingLevel noReplyLogLevel) {
this.noReplyLogLevel = noReplyLogLevel;
}
public boolean isClientMode() {
return clientMode;
}
/**
* If the clientMode is true, mina consumer will connect the address as a TCP client.
*/
public void setClientMode(boolean clientMode) {
this.clientMode = clientMode;
}
// here we just shows the option setting of host, port, protocol
public String getUriString() {
return "mina:" + getProtocol() + ":" + getHost() + ":" + getPort();
}
}