/* * Copyright 2015 the original author or authors. * * Licensed 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.springframework.cloud.stream.module.tcp; import org.springframework.beans.factory.config.AbstractFactoryBean; import org.springframework.cloud.stream.module.tcp.AbstractTcpConnectionFactoryProperties.Encoding; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.integration.ip.tcp.serializer.AbstractByteArraySerializer; import org.springframework.integration.ip.tcp.serializer.ByteArrayCrLfSerializer; import org.springframework.integration.ip.tcp.serializer.ByteArrayLengthHeaderSerializer; import org.springframework.integration.ip.tcp.serializer.ByteArrayLfSerializer; import org.springframework.integration.ip.tcp.serializer.ByteArrayRawSerializer; import org.springframework.integration.ip.tcp.serializer.ByteArraySingleTerminatorSerializer; import org.springframework.integration.ip.tcp.serializer.ByteArrayStxEtxSerializer; import org.springframework.util.Assert; /** * Factory bean for an encoder/decoder based on * {@link Encoding}. * * @author Gary Russell */ public class EncoderDecoderFactoryBean extends AbstractFactoryBean<AbstractByteArraySerializer> implements ApplicationEventPublisherAware { private final Encoding encoding; private ApplicationEventPublisher applicationEventPublisher; private Integer maxMessageSize; public EncoderDecoderFactoryBean(Encoding encoding) { Assert.notNull(encoding, "'encoding' cannot be null"); this.encoding = encoding; } @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; } /** * The maximum message size allowed when decoding. * @param maxMessageSize the maximum message size. */ public void setMaxMessageSize(int maxMessageSize) { this.maxMessageSize = maxMessageSize; } @Override protected AbstractByteArraySerializer createInstance() throws Exception { AbstractByteArraySerializer codec; switch (this.encoding) { case CRLF: codec = new ByteArrayCrLfSerializer(); break; case LF: codec = new ByteArrayLfSerializer(); break; case NULL: codec = new ByteArraySingleTerminatorSerializer((byte) 0); break; case STXETX: codec = new ByteArrayStxEtxSerializer(); break; case L1: codec = new ByteArrayLengthHeaderSerializer(1); break; case L2: codec = new ByteArrayLengthHeaderSerializer(2); break; case L4: codec = new ByteArrayLengthHeaderSerializer(4); break; case RAW: codec = new ByteArrayRawSerializer(); break; default: throw new IllegalArgumentException("Invalid encoding: " + this.encoding); } codec.setApplicationEventPublisher(this.applicationEventPublisher); if (this.maxMessageSize != null) { codec.setMaxMessageSize(this.maxMessageSize); } return codec; } @Override public Class<?> getObjectType() { return AbstractByteArraySerializer.class; } }