/* * Copyright 2002-2017 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.integration.jpa.outbound; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.integration.jpa.core.JpaExecutor; import org.springframework.integration.jpa.support.OutboundGatewayType; import org.springframework.messaging.Message; import org.springframework.util.Assert; /** * The Jpa Outbound Gateway will allow you to make outbound operations to either: * * <ul> * <li>submit (insert, delete) data to a database using JPA</li> * <li>retrieve (select) data from a database</li> * </ul> * * Depending on the selected {@link OutboundGatewayType}, the outbound gateway * will use either the {@link JpaExecutor}'s poll method or its * executeOutboundJpaOperation method. * * In order to initialize the adapter, you must provide a {@link JpaExecutor} as * constructor. * * @author Gunnar Hillert * @author Amol Nayak * @author Artem Bilan * * @since 2.2 * */ public class JpaOutboundGateway extends AbstractReplyProducingMessageHandler { private final JpaExecutor jpaExecutor; private OutboundGatewayType gatewayType = OutboundGatewayType.UPDATING; private boolean producesReply = true; //false for outbound-channel-adapter, true for outbound-gateway /** * Constructor taking an {@link JpaExecutor} that wraps all JPA Operations. * @param jpaExecutor Must not be null */ public JpaOutboundGateway(JpaExecutor jpaExecutor) { Assert.notNull(jpaExecutor, "jpaExecutor must not be null."); this.jpaExecutor = jpaExecutor; } @Override public String getComponentType() { return "jpa:outbound-gateway"; } @Override protected void doInit() { this.jpaExecutor.setBeanFactory(this.getBeanFactory()); } @Override protected Object handleRequestMessage(Message<?> requestMessage) { final Object result; if (OutboundGatewayType.RETRIEVING.equals(this.gatewayType)) { result = this.jpaExecutor.poll(requestMessage); } else if (OutboundGatewayType.UPDATING.equals(this.gatewayType)) { result = this.jpaExecutor.executeOutboundJpaOperation(requestMessage); } else { throw new IllegalArgumentException(String.format("GatewayType '%s' is not supported.", this.gatewayType)); } if (result == null || !this.producesReply) { return null; } return result; } /** * Specify the {@link JpaOutboundGateway} mode. * @param gatewayType The gateway type. */ public void setGatewayType(OutboundGatewayType gatewayType) { Assert.notNull(gatewayType, "gatewayType must not be null."); this.gatewayType = gatewayType; } /** * If set to 'false', this component will act as an Outbound Channel Adapter. * If not explicitly set this property will default to 'true'. * @param producesReply Defaults to 'true'. */ public void setProducesReply(boolean producesReply) { this.producesReply = producesReply; } }