Changes for checkstyle 8.32
[policy/apex-pdp.git] / plugins / plugins-event / plugins-event-carrier / plugins-event-carrier-jms / src / main / java / org / onap / policy / apex / plugins / event / carrier / jms / ApexJmsProducer.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2019-2020 Nordix Foundation.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.apex.plugins.event.carrier.jms;
23
24 import java.io.Serializable;
25 import java.util.EnumMap;
26 import java.util.Map;
27 import java.util.Properties;
28 import javax.jms.Connection;
29 import javax.jms.ConnectionFactory;
30 import javax.jms.Message;
31 import javax.jms.MessageProducer;
32 import javax.jms.Session;
33 import javax.jms.Topic;
34 import javax.naming.InitialContext;
35 import org.onap.policy.apex.service.engine.event.ApexEventException;
36 import org.onap.policy.apex.service.engine.event.ApexEventProducer;
37 import org.onap.policy.apex.service.engine.event.ApexEventRuntimeException;
38 import org.onap.policy.apex.service.engine.event.PeeredReference;
39 import org.onap.policy.apex.service.engine.event.SynchronousEventCache;
40 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters;
41 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMode;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44
45 /**
46  * Concrete implementation of an Apex event producer that sends events using JMS.
47  *
48  * @author Liam Fallon (liam.fallon@ericsson.com)
49  */
50 public class ApexJmsProducer implements ApexEventProducer {
51     // Get a reference to the logger
52     private static final Logger LOGGER = LoggerFactory.getLogger(ApexJmsProducer.class);
53
54     // Recurring string constants
55     private static final String COULD_NOT_SEND_PREFIX = "could not send event \"";
56     private static final String FOR_PRODUCER_TAG = "\" for producer (";
57     private static final String JMS_MESSAGE_PRODUCER_TAG = "\" on JMS message producer ";
58
59     // The JMS parameters read from the parameter service
60     private JmsCarrierTechnologyParameters jmsProducerProperties;
61
62     // The connection to the JMS server
63     private Connection connection;
64
65     // The JMS session on which we will send events
66     private Session jmsSession;
67
68     // The producer on which we will send events
69     private MessageProducer messageProducer;
70
71     // The name for this producer
72     private String name = null;
73
74     // The peer references for this event handler
75     private Map<EventHandlerPeeredMode, PeeredReference> peerReferenceMap = new EnumMap<>(EventHandlerPeeredMode.class);
76
77     /**
78      * {@inheritDoc}.
79      */
80     @Override
81     public void init(final String producerName, final EventHandlerParameters producerParameters)
82                     throws ApexEventException {
83         this.name = producerName;
84
85         // Check and get the JMS Properties
86         if (!(producerParameters.getCarrierTechnologyParameters() instanceof JmsCarrierTechnologyParameters)) {
87             final String errorMessage = "specified producer properties are not applicable to a JMS producer ("
88                             + this.name + ")";
89             throw new ApexEventException(errorMessage);
90         }
91         jmsProducerProperties = (JmsCarrierTechnologyParameters) producerParameters.getCarrierTechnologyParameters();
92
93         // Look up the JMS connection factory
94         InitialContext jmsContext = null;
95         ConnectionFactory connectionFactory = null;
96         try {
97             jmsContext = new InitialContext(jmsProducerProperties.getJmsProducerProperties());
98             connectionFactory = (ConnectionFactory) jmsContext.lookup(jmsProducerProperties.getConnectionFactory());
99
100             // Check if we actually got a connection factory
101             if (connectionFactory == null) {
102                 throw new IllegalArgumentException(
103                                 "JMS context lookup of \"" + jmsProducerProperties.getConnectionFactory()
104                                                 + "\" returned null for producer (" + this.name + ")");
105             }
106         } catch (final Exception e) {
107             final String errorMessage = "lookup of JMS connection factory  \""
108                             + jmsProducerProperties.getConnectionFactory() + "\" failed for JMS producer properties \""
109                             + jmsProducerProperties.getJmsConsumerProperties() + FOR_PRODUCER_TAG + this.name + ")";
110             throw new ApexEventException(errorMessage, e);
111         }
112
113         // Lookup the topic on which we will send events
114         Topic jmsOutgoingTopic;
115         try {
116             jmsOutgoingTopic = (Topic) jmsContext.lookup(jmsProducerProperties.getProducerTopic());
117
118             // Check if we actually got a topic
119             if (jmsOutgoingTopic == null) {
120                 throw new IllegalArgumentException("JMS context lookup of \"" + jmsProducerProperties.getProducerTopic()
121                                 + "\" returned null for producer (" + this.name + ")");
122             }
123         } catch (final Exception e) {
124             final String errorMessage = "lookup of JMS topic  \"" + jmsProducerProperties.getProducerTopic()
125                             + "\" failed for JMS producer properties \""
126                             + jmsProducerProperties.getJmsProducerProperties() + FOR_PRODUCER_TAG + this.name + ")";
127             throw new ApexEventException(errorMessage, e);
128         }
129
130         // Create and start a connection to the JMS server
131         try {
132             connection = connectionFactory.createConnection(jmsProducerProperties.getSecurityPrincipal(),
133                             jmsProducerProperties.getSecurityCredentials());
134             connection.start();
135         } catch (final Exception e) {
136             final String errorMessage = "connection to JMS server failed for JMS properties \""
137                             + jmsProducerProperties.getJmsConsumerProperties() + FOR_PRODUCER_TAG + this.name + ")";
138             throw new ApexEventException(errorMessage, e);
139         }
140
141         // Create a JMS session for sending events
142         try {
143             jmsSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
144         } catch (final Exception e) {
145             final String errorMessage = "creation of session to JMS server failed for JMS properties \""
146                             + jmsProducerProperties.getJmsConsumerProperties() + FOR_PRODUCER_TAG + this.name + ")";
147             throw new ApexEventException(errorMessage, e);
148         }
149
150         // Create a JMS message producer for sending events
151         try {
152             messageProducer = jmsSession.createProducer(jmsOutgoingTopic);
153         } catch (final Exception e) {
154             final String errorMessage = "creation of producer for sending events "
155                             + "to JMS server failed for JMS properties \""
156                             + jmsProducerProperties.getJmsConsumerProperties() + "\"";
157             throw new ApexEventException(errorMessage, e);
158         }
159     }
160
161     /**
162      * {@inheritDoc}.
163      */
164     @Override
165     public String getName() {
166         return name;
167     }
168
169     /**
170      * {@inheritDoc}.
171      */
172     @Override
173     public PeeredReference getPeeredReference(final EventHandlerPeeredMode peeredMode) {
174         return peerReferenceMap.get(peeredMode);
175     }
176
177     /**
178      * {@inheritDoc}.
179      */
180     @Override
181     public void setPeeredReference(final EventHandlerPeeredMode peeredMode, final PeeredReference peeredReference) {
182         peerReferenceMap.put(peeredMode, peeredReference);
183     }
184
185     /**
186      * {@inheritDoc}.
187      */
188     @Override
189     public void sendEvent(final long executionId, final Properties executionProperties, final String eventname,
190                     final Object eventObject) {
191         // Check if this is a synchronized event, if so we have received a reply
192         final SynchronousEventCache synchronousEventCache = (SynchronousEventCache) peerReferenceMap
193                         .get(EventHandlerPeeredMode.SYNCHRONOUS);
194         if (synchronousEventCache != null) {
195             synchronousEventCache.removeCachedEventToApexIfExists(executionId);
196         }
197
198         // Check if the object to be sent is serializable
199         if (!Serializable.class.isAssignableFrom(eventObject.getClass())) {
200             final String errorMessage = COULD_NOT_SEND_PREFIX + eventname + JMS_MESSAGE_PRODUCER_TAG + this.name
201                             + ", object of type \"" + eventObject.getClass().getName() + "\" is not serializable";
202             LOGGER.warn(errorMessage);
203             throw new ApexEventRuntimeException(errorMessage);
204         }
205
206         // The JMS message to send is constructed using the JMS session
207         Message jmsMessage = null;
208
209         // Check the type of JMS message to send
210         if (jmsProducerProperties.isObjectMessageSending()) {
211             // We should send a JMS Object Message
212             try {
213                 jmsMessage = jmsSession.createObjectMessage((Serializable) eventObject);
214             } catch (final Exception e) {
215                 final String errorMessage = COULD_NOT_SEND_PREFIX + eventname + JMS_MESSAGE_PRODUCER_TAG + this.name
216                                 + ", could not create JMS Object Message for object \"" + eventObject;
217                 LOGGER.warn(errorMessage, e);
218                 throw new ApexEventRuntimeException(errorMessage);
219             }
220         } else {
221             // We should send a JMS Text Message
222             try {
223                 jmsMessage = jmsSession.createTextMessage(eventObject.toString());
224             } catch (final Exception e) {
225                 final String errorMessage = COULD_NOT_SEND_PREFIX + eventname + JMS_MESSAGE_PRODUCER_TAG + this.name
226                                 + ", could not create JMS Text Message for object \"" + eventObject;
227                 LOGGER.warn(errorMessage, e);
228                 throw new ApexEventRuntimeException(errorMessage);
229             }
230         }
231
232         try {
233             messageProducer.send(jmsMessage);
234         } catch (final Exception e) {
235             final String errorMessage = COULD_NOT_SEND_PREFIX + eventname + JMS_MESSAGE_PRODUCER_TAG + this.name
236                             + ", send failed for object \"" + eventObject;
237             LOGGER.warn(errorMessage, e);
238             throw new ApexEventRuntimeException(errorMessage);
239         }
240     }
241
242     /**
243      * {@inheritDoc}.
244      */
245     @Override
246     public void stop() {
247         // Close the message producer
248         try {
249             messageProducer.close();
250         } catch (final Exception e) {
251             final String errorMessage = "failed to close JMS message producer " + this.name + " for sending messages";
252             LOGGER.warn(errorMessage, e);
253         }
254
255         // Close the session
256         try {
257             jmsSession.close();
258         } catch (final Exception e) {
259             final String errorMessage = "failed to close the JMS session for  " + this.name + " for sending messages";
260             LOGGER.warn(errorMessage, e);
261         }
262
263         // Close the connection to the JMS server
264         try {
265             connection.close();
266         } catch (final Exception e) {
267             final String errorMessage = "close of connection to the JMS server for  " + this.name + " failed";
268             LOGGER.warn(errorMessage, e);
269         }
270     }
271 }