aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-jms/src/main/java/org/onap/policy/apex/plugins/event/protocol/jms/Apex2JMSObjectEventConverter.java
blob: 52c67840776ce0889ab7a92e41fd0d26b7122fc1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*-
 * ============LICENSE_START=======================================================
 *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
 * ================================================================================
 * 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.
 *
 * SPDX-License-Identifier: Apache-2.0
 * ============LICENSE_END=========================================================
 */

package org.onap.policy.apex.plugins.event.protocol.jms;

import java.util.ArrayList;
import java.util.List;

import javax.jms.ObjectMessage;

import org.onap.policy.apex.service.engine.event.ApexEvent;
import org.onap.policy.apex.service.engine.event.ApexEventException;
import org.onap.policy.apex.service.engine.event.ApexEventProtocolConverter;
import org.onap.policy.apex.service.engine.event.ApexEventRuntimeException;
import org.onap.policy.apex.service.parameters.eventprotocol.EventProtocolParameters;
import org.slf4j.ext.XLogger;
import org.slf4j.ext.XLoggerFactory;

/**
 * The Class Apex2JMSObjectEventConverter converts {@link ApexEvent} instances into string instances of
 * {@link javax.jms.ObjectMessage} message events for JMS.
 *
 * @author Liam Fallon (liam.fallon@ericsson.com)
 */
public final class Apex2JMSObjectEventConverter implements ApexEventProtocolConverter {
    private static final XLogger LOGGER = XLoggerFactory.getXLogger(Apex2JMSObjectEventConverter.class);

    // JMS event protocol parameters on the consumer (JMS->Apex) sides
    private JMSObjectEventProtocolParameters eventProtocolParameters = null;

    /**
     * Constructor to create the Apex to JMS Object converter.
     *
     * @throws ApexEventException the apex event exception
     */
    public Apex2JMSObjectEventConverter() throws ApexEventException {}

    @Override
    public void init(final EventProtocolParameters parameters) {
        // Check if properties have been set for JMS object event conversion as a consumer. They may not be set because
        // JMS may not be in use
        // on both sides of Apex
        if (!(parameters instanceof JMSObjectEventProtocolParameters)) {
            final String errormessage = "specified Event Protocol Parameters properties of type \""
                    + parameters.getClass().getCanonicalName() + "\" are not applicable to a "
                    + Apex2JMSObjectEventConverter.class.getName() + " converter";
            LOGGER.error(errormessage);
        } else {
            this.eventProtocolParameters = (JMSObjectEventProtocolParameters) parameters;
        }

    }

    /*
     * (non-Javadoc)
     *
     * @see org.onap.policy.apex.service.engine.event.ApexEventConverter#toApexEvent(java.lang.String, java.lang.Object)
     */
    @Override
    public List<ApexEvent> toApexEvent(final String eventName, final Object eventObject) throws ApexEventException {
        // Check if this is an ObjectMessage from JMS
        if (!(eventObject instanceof ObjectMessage)) {
            final String errorMessage = "message \"" + eventObject + "\" received from JMS is not an instance of \""
                    + ObjectMessage.class.getCanonicalName() + "\"";
            LOGGER.warn(errorMessage);
            throw new ApexEventRuntimeException(errorMessage);
        }

        // Get the object from the object message
        final ObjectMessage objectMessage = (ObjectMessage) eventObject;
        Object jmsIncomingObject;
        try {
            jmsIncomingObject = objectMessage.getObject();
        } catch (final Exception e) {
            final String errorMessage = "object contained in message \"" + eventObject
                    + "\" received from JMS could not be retrieved as a Java object";
            LOGGER.debug(errorMessage, e);
            throw new ApexEventRuntimeException(errorMessage, e);
        }

        // Check that the consumer parameters for JMS->Apex messaging have been set
        if (eventProtocolParameters == null) {
            final String errorMessage =
                    "consumer parameters for JMS events consumed by Apex are not set in the Apex configuration for this engine";
            LOGGER.debug(errorMessage);
            throw new ApexEventRuntimeException(errorMessage);
        }

        // Create the Apex event
        // @formatter:off
        final ApexEvent apexEvent = new ApexEvent(
                jmsIncomingObject.getClass().getSimpleName() + eventProtocolParameters.getIncomingEventSuffix(),
                eventProtocolParameters.getIncomingEventVersion(),
                jmsIncomingObject.toString().getClass().getPackage().getName(),
                eventProtocolParameters.getIncomingEventSource(),
                eventProtocolParameters.getIncomingEventTarget());
        // @formattter:on

        // Set the data on the apex event as the incoming object
        apexEvent.put(jmsIncomingObject.getClass().getSimpleName(), jmsIncomingObject);

        // Return the event in a single element
        final ArrayList<ApexEvent> eventList = new ArrayList<ApexEvent>();
        eventList.add(apexEvent);
        return eventList;
    }

    /*
     * (non-Javadoc)
     *
     * @see org.onap.policy.apex.service.engine.event.ApexEventConverter#fromApexEvent(org.onap.policy.apex.service.engine.event.ApexEvent)
     */
    @Override
    public Object fromApexEvent(final ApexEvent apexEvent) throws ApexEventException {
        // Check the Apex event
        if (apexEvent == null) {
            LOGGER.warn("event processing failed, Apex event is null");
            throw new ApexEventException("event processing failed, Apex event is null");
        }

        // Check that the Apex event has a single parameter
        if (apexEvent.size() != 1) {
            final String errorMessage = "event processing failed, Apex event must have one and only one parameter for JMS Object handling";
            LOGGER.warn(errorMessage);
            throw new ApexEventException(errorMessage);
        }

        // Return the single object from the Apex event message
        return apexEvent.values().iterator().next();
    }
}