/*
* Copyright (c) 2005 - 2014, WSO2 Inc. (http://www.wso2.org) 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.
*/
package org.wso2.carbon.event.publisher.core.internal.type.wso2event;
import org.wso2.carbon.databridge.commons.Event;
import org.wso2.carbon.databridge.commons.StreamDefinition;
import org.wso2.carbon.event.publisher.core.config.EventOutputProperty;
import org.wso2.carbon.event.publisher.core.config.EventPublisherConfiguration;
import org.wso2.carbon.event.publisher.core.config.EventPublisherConstants;
import org.wso2.carbon.event.publisher.core.config.mapping.WSO2EventOutputMapping;
import org.wso2.carbon.event.publisher.core.exception.EventPublisherConfigurationException;
import org.wso2.carbon.event.publisher.core.exception.EventPublisherStreamValidationException;
import org.wso2.carbon.event.publisher.core.internal.OutputMapper;
import java.util.*;
public class WSO2EventOutputMapper implements OutputMapper {
private WSO2EventOutputMapping wso2EventOutputMapping;
private EventPublisherConfiguration eventPublisherConfiguration = null;
private Map<String, Integer> propertyPositionMap = null;
private final int tenantId;
private final StreamDefinition inputStreamDefinition;
//private StreamDefinition outputStreamDefinition = null;
private int noOfMetaData = 0;
private int noOfCorrelationData = 0;
private int noOfPayloadData = 0;
/*public WSO2EventOutputMapper(EventPublisherConfiguration eventPublisherConfiguration,
Map<String, Integer> propertyPositionMap,
int tenantId, StreamDefinition inputStreamDefinition) throws
EventPublisherConfigurationException {
this.eventPublisherConfiguration = eventPublisherConfiguration;
this.propertyPositionMap = propertyPositionMap;
this.tenantId = tenantId;
this.inputStreamDefinition = inputStreamDefinition;
String outputStreamName = eventPublisherConfiguration.getToAdapterConfiguration().getStaticProperties().get(EventPublisherConstants.EF_ELE_PROPERTY_STREAM_NAME);
String outputStreamVersion = eventPublisherConfiguration.getToAdapterConfiguration().getStaticProperties().get(EventPublisherConstants.EF_ATTR_VERSION);
try {
wso2EventOutputMapping = (WSO2EventOutputMapping) eventPublisherConfiguration.getOutputMapping();
if (!wso2EventOutputMapping.isCustomMappingEnabled()) {
outputStreamDefinition = new StreamDefinition(outputStreamName, outputStreamVersion);
outputStreamDefinition.setMetaData(inputStreamDefinition.getMetaData());
outputStreamDefinition.setCorrelationData(inputStreamDefinition.getCorrelationData());
outputStreamDefinition.setPayloadData(inputStreamDefinition.getPayloadData());
noOfMetaData = outputStreamDefinition.getMetaData() != null ? outputStreamDefinition.getMetaData().size() : 0;
noOfCorrelationData = outputStreamDefinition.getCorrelationData() != null ? outputStreamDefinition.getCorrelationData().size() : 0;
noOfPayloadData = outputStreamDefinition.getPayloadData() != null ? outputStreamDefinition.getPayloadData().size() : 0;
} else {
validateStreamDefinitionWithOutputProperties();
outputStreamDefinition = new StreamDefinition(outputStreamName, outputStreamVersion);
addAttributeToStreamDefinition(outputStreamDefinition, wso2EventOutputMapping.getMetaWSO2EventOutputPropertyConfiguration(), "meta");
addAttributeToStreamDefinition(outputStreamDefinition, wso2EventOutputMapping.getCorrelationWSO2EventOutputPropertyConfiguration(), "correlation");
addAttributeToStreamDefinition(outputStreamDefinition, wso2EventOutputMapping.getPayloadWSO2EventOutputPropertyConfiguration(), "payload");
}
} catch (MalformedStreamDefinitionException e) {
throw new EventPublisherConfigurationException("Error while creating output stream definition : " + outputStreamName + ":" + outputStreamVersion, e);
}
}*/
public WSO2EventOutputMapper(EventPublisherConfiguration eventPublisherConfiguration,
Map<String, Integer> propertyPositionMap,
int tenantId, StreamDefinition inputStreamDefinition) throws
EventPublisherConfigurationException {
this.eventPublisherConfiguration = eventPublisherConfiguration;
this.propertyPositionMap = propertyPositionMap;
this.tenantId = tenantId;
this.inputStreamDefinition = inputStreamDefinition;
//try {
wso2EventOutputMapping = (WSO2EventOutputMapping) eventPublisherConfiguration.getOutputMapping();
if (wso2EventOutputMapping.getToEventName() == null || wso2EventOutputMapping.getToEventName().isEmpty() || wso2EventOutputMapping.getToEventVersion() == null || wso2EventOutputMapping.getToEventVersion().isEmpty()) {
wso2EventOutputMapping.setToEventName(inputStreamDefinition.getName());
wso2EventOutputMapping.setToEventVersion(inputStreamDefinition.getVersion());
}
if (!wso2EventOutputMapping.isCustomMappingEnabled()) {
//outputStreamDefinition = new StreamDefinition(outputStreamName, outputStreamVersion);
//outputStreamDefinition.setMetaData(inputStreamDefinition.getMetaData());
//outputStreamDefinition.setCorrelationData(inputStreamDefinition.getCorrelationData());
//outputStreamDefinition.setPayloadData(inputStreamDefinition.getPayloadData());
noOfMetaData = inputStreamDefinition.getMetaData() != null ? inputStreamDefinition.getMetaData().size() : 0;
noOfCorrelationData = inputStreamDefinition.getCorrelationData() != null ? inputStreamDefinition.getCorrelationData().size() : 0;
noOfPayloadData = inputStreamDefinition.getPayloadData() != null ? inputStreamDefinition.getPayloadData().size() : 0;
} else {
validateStreamDefinitionWithOutputProperties();
//outputStreamDefinition = new StreamDefinition(outputStreamName, outputStreamVersion);
//addAttributeToStreamDefinition(outputStreamDefinition, wso2EventOutputMapping.getMetaWSO2EventOutputPropertyConfiguration(), "meta");
//addAttributeToStreamDefinition(outputStreamDefinition, wso2EventOutputMapping.getCorrelationWSO2EventOutputPropertyConfiguration(), "correlation");
//addAttributeToStreamDefinition(outputStreamDefinition, wso2EventOutputMapping.getPayloadWSO2EventOutputPropertyConfiguration(), "payload");
}
/*} catch (MalformedStreamDefinitionException e) {
throw new EventPublisherConfigurationException("Error while creating output stream definition : " + outputStreamName + ":" + outputStreamVersion, e);
}*/
}
private void validateStreamDefinitionWithOutputProperties()
throws EventPublisherConfigurationException {
WSO2EventOutputMapping wso2EventOutputMapping = (WSO2EventOutputMapping) eventPublisherConfiguration.getOutputMapping();
List<EventOutputProperty> metaWSO2EventOutputPropertyConfiguration = wso2EventOutputMapping.getMetaWSO2EventOutputPropertyConfiguration();
List<EventOutputProperty> correlationWSO2EventOutputPropertyConfiguration = wso2EventOutputMapping.getCorrelationWSO2EventOutputPropertyConfiguration();
List<EventOutputProperty> payloadWSO2EventOutputPropertyConfiguration = wso2EventOutputMapping.getPayloadWSO2EventOutputPropertyConfiguration();
Iterator<EventOutputProperty> metaWSO2EventOutputPropertyConfigurationIterator = metaWSO2EventOutputPropertyConfiguration.iterator();
for (; metaWSO2EventOutputPropertyConfigurationIterator.hasNext(); ) {
EventOutputProperty wso2EventOutputProperty = metaWSO2EventOutputPropertyConfigurationIterator.next();
if (!propertyPositionMap.containsKey(wso2EventOutputProperty.getValueOf())) {
throw new EventPublisherStreamValidationException("Property " + wso2EventOutputProperty.getValueOf() + " is not in the input stream definition. ", inputStreamDefinition.getStreamId());
}
}
Iterator<EventOutputProperty> correlationWSO2EventOutputPropertyConfigurationIterator = correlationWSO2EventOutputPropertyConfiguration.iterator();
for (; correlationWSO2EventOutputPropertyConfigurationIterator.hasNext(); ) {
EventOutputProperty wso2EventOutputProperty = correlationWSO2EventOutputPropertyConfigurationIterator.next();
if (!propertyPositionMap.containsKey(wso2EventOutputProperty.getValueOf())) {
throw new EventPublisherStreamValidationException("Property " + wso2EventOutputProperty.getValueOf() + " is not in the input stream definition. ", inputStreamDefinition.getStreamId());
}
}
Iterator<EventOutputProperty> payloadWSO2EventOutputPropertyConfigurationIterator = payloadWSO2EventOutputPropertyConfiguration.iterator();
for (; payloadWSO2EventOutputPropertyConfigurationIterator.hasNext(); ) {
EventOutputProperty wso2EventOutputProperty = payloadWSO2EventOutputPropertyConfigurationIterator.next();
if (!propertyPositionMap.containsKey(wso2EventOutputProperty.getValueOf())) {
throw new EventPublisherStreamValidationException("Property " + wso2EventOutputProperty.getValueOf() + " is not in the input stream definition. ", inputStreamDefinition.getStreamId());
}
}
}
private void addAttributeToStreamDefinition(StreamDefinition streamDefinition,
List<EventOutputProperty> wso2EventOutputPropertyList,
String propertyType) {
if (propertyType.equals("meta")) {
for (EventOutputProperty wso2EventOutputProperty : wso2EventOutputPropertyList) {
streamDefinition.addMetaData(wso2EventOutputProperty.getName(), wso2EventOutputProperty.getType());
}
} else if (propertyType.equals("correlation")) {
for (EventOutputProperty wso2EventOutputProperty : wso2EventOutputPropertyList) {
streamDefinition.addCorrelationData(wso2EventOutputProperty.getName(), wso2EventOutputProperty.getType());
}
} else if (propertyType.equals("payload")) {
for (EventOutputProperty wso2EventOutputProperty : wso2EventOutputPropertyList) {
streamDefinition.addPayloadData(wso2EventOutputProperty.getName(), wso2EventOutputProperty.getType());
}
}
}
@Override
public Object convertToMappedInputEvent(org.wso2.siddhi.core.event.Event event)
throws EventPublisherConfigurationException {
Event eventObject = new Event();
eventObject.setTimeStamp(event.getTimestamp());
Object[] eventData = event.getData();
if (eventData.length > 0) {
eventObject.setStreamId(wso2EventOutputMapping.getToEventName() + EventPublisherConstants.STREAM_ID_SEPERATOR + wso2EventOutputMapping.getToEventVersion());
List<EventOutputProperty> metaWSO2EventOutputPropertyConfiguration = wso2EventOutputMapping.getMetaWSO2EventOutputPropertyConfiguration();
List<EventOutputProperty> correlationWSO2EventOutputPropertyConfiguration = wso2EventOutputMapping.getCorrelationWSO2EventOutputPropertyConfiguration();
List<EventOutputProperty> payloadWSO2EventOutputPropertyConfiguration = wso2EventOutputMapping.getPayloadWSO2EventOutputPropertyConfiguration();
if (metaWSO2EventOutputPropertyConfiguration.size() != 0) {
List<Object> metaData = new ArrayList<Object>();
for (EventOutputProperty eventOutputProperty : metaWSO2EventOutputPropertyConfiguration) {
int position = propertyPositionMap.get(eventOutputProperty.getValueOf());
metaData.add(eventData[position]);
}
eventObject.setMetaData(metaData.toArray());
}
if (correlationWSO2EventOutputPropertyConfiguration.size() != 0) {
List<Object> correlationData = new ArrayList<Object>();
for (EventOutputProperty eventOutputProperty : correlationWSO2EventOutputPropertyConfiguration) {
int position = propertyPositionMap.get(eventOutputProperty.getValueOf());
correlationData.add(eventData[position]);
}
eventObject.setCorrelationData(correlationData.toArray());
}
if (payloadWSO2EventOutputPropertyConfiguration.size() != 0) {
List<Object> payloadData = new ArrayList<Object>();
for (EventOutputProperty eventOutputProperty : payloadWSO2EventOutputPropertyConfiguration) {
int position = propertyPositionMap.get(eventOutputProperty.getValueOf());
payloadData.add(eventData[position]);
}
eventObject.setPayloadData(payloadData.toArray());
}
}
Map map = event.getArbitraryDataMap();
if(map != null) {
eventObject.setArbitraryDataMap(map);
}
return eventObject;
}
@Override
public Object convertToTypedInputEvent(org.wso2.siddhi.core.event.Event event) throws EventPublisherConfigurationException {
Event eventObject = new Event();
eventObject.setStreamId(wso2EventOutputMapping.getToEventName() + EventPublisherConstants.STREAM_ID_SEPERATOR + wso2EventOutputMapping.getToEventVersion());
eventObject.setTimeStamp(event.getTimestamp());
Object[] eventData = event.getData();
if (noOfMetaData > 0) {
List<Object> metaData = new ArrayList<Object>();
metaData.addAll(Arrays.asList(eventData).subList(0, noOfMetaData));
eventObject.setMetaData(metaData.toArray());
}
if (noOfCorrelationData > 0) {
List<Object> correlationData = new ArrayList<Object>();
correlationData.addAll(Arrays.asList(eventData).subList(noOfMetaData, noOfMetaData + noOfCorrelationData));
eventObject.setCorrelationData(correlationData.toArray());
}
if (noOfPayloadData > 0) {
List<Object> payloadData = new ArrayList<Object>();
payloadData.addAll(Arrays.asList(eventData).subList(noOfCorrelationData + noOfMetaData, noOfPayloadData + noOfCorrelationData + noOfMetaData));
eventObject.setPayloadData(payloadData.toArray());
}
Map map = event.getArbitraryDataMap();
if(map != null) {
eventObject.setArbitraryDataMap(map);
}
return eventObject;
}
}