/**
* Copyright (c) 2013, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
* <p/>
* 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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.wso2.carbon.business.messaging.hl7.common.data.publisher;
import ca.uhn.hl7v2.HL7Exception;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.business.messaging.hl7.common.data.EventPublishConfigHolder;
import org.wso2.carbon.business.messaging.hl7.common.data.MessageData;
import org.wso2.carbon.business.messaging.hl7.common.data.conf.EventPublisherConfig;
import org.wso2.carbon.business.messaging.hl7.common.data.conf.ServerConfig;
import org.wso2.carbon.business.messaging.hl7.common.data.utils.EventConfigUtil;
import org.wso2.carbon.business.messaging.hl7.common.data.utils.StreamDefUtil;
import org.wso2.carbon.databridge.agent.DataPublisher;
import org.wso2.carbon.databridge.agent.exception.DataEndpointAgentConfigurationException;
import org.wso2.carbon.databridge.agent.exception.DataEndpointAuthenticationException;
import org.wso2.carbon.databridge.agent.exception.DataEndpointConfigurationException;
import org.wso2.carbon.databridge.agent.exception.DataEndpointException;
import org.wso2.carbon.databridge.agent.util.DataEndpointConstants;
import org.wso2.carbon.databridge.commons.StreamDefinition;
import org.wso2.carbon.databridge.commons.exception.MalformedStreamDefinitionException;
import org.wso2.carbon.databridge.commons.exception.TransportException;
import org.wso2.carbon.databridge.commons.utils.DataBridgeCommonsUtils;
import java.util.List;
import java.util.Map;
/**
* This class represents HL7 data publisher
*/
public class HL7EventPublisher {
public static final String UNDERSCORE = "_";
private static Log log = LogFactory.getLog(HL7EventPublisher.class);
private ServerConfig serverConfig;
public HL7EventPublisher(ServerConfig serverConfig) {
this.serverConfig = serverConfig;
}
public void publish(MessageData message) throws HL7Exception {
List<Object> correlationData = EventConfigUtil.getCorrelationData(message);
List<Object> metaData = EventConfigUtil.getMetaData(message);
List<Object> payLoadData = EventConfigUtil.getEventData(message);
Map<String, String> arbitraryDataMap = EventConfigUtil.getExtractedDataMap(message);
StreamDefinition streamDef = null;
try {
streamDef = StreamDefUtil.getStreamDefinition();
} catch (MalformedStreamDefinitionException e) {
log.error("Unable to create HL7 StreamDefinition : " + e.getMessage(), e);
}
if (streamDef != null) {
String key = serverConfig.getUrl() + UNDERSCORE + serverConfig.getUsername() + UNDERSCORE +
serverConfig.getPassword();
EventPublisherConfig eventPublisherConfig = EventPublishConfigHolder.getEventPublisherConfig(key);
if (serverConfig.isLoadBalancingConfig()) {
loadBalancerPublisher(eventPublisherConfig, streamDef, key, correlationData, metaData, payLoadData,
arbitraryDataMap);
} else {
if (log.isDebugEnabled()) {
log.debug("single node receiver mode working.");
}
if (eventPublisherConfig == null) {
if (log.isDebugEnabled()) {
log.debug("Newly creating publisher configuration.");
}
synchronized (HL7EventPublisher.class) {
eventPublisherConfig = new EventPublisherConfig();
DataPublisher asyncDataPublisher;
try {
if (serverConfig.getSecureUrl() != null) {
asyncDataPublisher = new DataPublisher(DataEndpointConstants.THRIFT_DATA_AGENT_TYPE,
serverConfig.getUrl(),
serverConfig.getSecureUrl(),
serverConfig.getUsername(),
serverConfig.getPassword());
} else {
asyncDataPublisher =
new DataPublisher(serverConfig.getUrl(), serverConfig.getUsername(),
serverConfig.getPassword());
}
} catch (DataEndpointAgentConfigurationException | DataEndpointException |
DataEndpointConfigurationException | DataEndpointAuthenticationException |
TransportException e) {
String errorMsg = "Error occurred while creating data publisher";
log.error(errorMsg);
throw new HL7Exception(errorMsg, e);
}
if (log.isDebugEnabled()) {
log.debug("Created stream definition.");
}
eventPublisherConfig.setAsyncDataPublisher(asyncDataPublisher);
if (log.isDebugEnabled()) {
log.debug("Adding config info to map.");
}
EventPublishConfigHolder.getEventPublisherConfigMap().put(key, eventPublisherConfig);
}
}
DataPublisher asyncDataPublisher = eventPublisherConfig.getAsyncDataPublisher();
asyncDataPublisher
.publish(DataBridgeCommonsUtils.generateStreamId(streamDef.getName(), streamDef.getVersion()),
getObjectArray(metaData), getObjectArray(correlationData), getObjectArray(payLoadData),
arbitraryDataMap);
if (log.isDebugEnabled()) {
log.debug("Successfully published data.");
}
}
}
}
private void loadBalancerPublisher(EventPublisherConfig eventPublisherConfig, StreamDefinition streamDef,
String key, List<Object> correlationData, List<Object> metaData,
List<Object> payLoadData, Map<String, String> arbitraryDataMap)
throws HL7Exception {
if (log.isDebugEnabled()) {
log.debug("Load balancing receiver mode working.");
}
if (eventPublisherConfig == null) {
if (log.isDebugEnabled()) {
log.debug("Newly creating publisher configuration.");
}
synchronized (HL7EventPublisher.class) {
eventPublisherConfig = new EventPublisherConfig();
DataPublisher loadBalancingDataPublisher;
try {
if (serverConfig.getSecureUrl() != null) {
loadBalancingDataPublisher = new DataPublisher(DataEndpointConstants.THRIFT_DATA_AGENT_TYPE,
serverConfig.getUrl(),
serverConfig.getSecureUrl(),
serverConfig.getUsername(),
serverConfig.getPassword());
} else {
loadBalancingDataPublisher =
new DataPublisher(serverConfig.getUrl(), serverConfig.getUsername(),
serverConfig.getPassword());
}
} catch (DataEndpointAgentConfigurationException | DataEndpointException
| DataEndpointConfigurationException | DataEndpointAuthenticationException
| TransportException e) {
String errorMsg = "Error occurred while creating data publisher";
log.error(errorMsg);
throw new HL7Exception(errorMsg, e);
}
if (log.isDebugEnabled()) {
log.debug("Created stream definition.");
}
eventPublisherConfig.setLoadBalancingDataPublisher(loadBalancingDataPublisher);
if (log.isDebugEnabled()) {
log.debug("Adding config info to map.");
}
EventPublishConfigHolder.getEventPublisherConfigMap().put(key, eventPublisherConfig);
}
}
DataPublisher loadBalancingDataPublisher = eventPublisherConfig.getLoadBalancingDataPublisher();
loadBalancingDataPublisher
.publish(DataBridgeCommonsUtils.generateStreamId(streamDef.getName(), streamDef.getVersion()),
getObjectArray(metaData), getObjectArray(correlationData), getObjectArray(payLoadData),
arbitraryDataMap);
if (log.isDebugEnabled()) {
log.debug("Successfully published data.");
}
}
private Object[] getObjectArray(List<Object> list) {
if (list.size() > 0) {
return list.toArray();
}
return null;
}
}