/** * 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(); } }