/*
* 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.map;
import org.wso2.carbon.databridge.commons.Attribute;
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.MapOutputMapping;
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 org.wso2.siddhi.core.event.Event;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class MapOutputMapper implements OutputMapper {
EventPublisherConfiguration eventPublisherConfiguration = null;
Map<String, Integer> propertyPositionMap = null;
private int noOfMetaData = 0;
private int noOfCorrelationData = 0;
private int noOfPayloadData = 0;
private StreamDefinition streamDefinition;
public MapOutputMapper(EventPublisherConfiguration eventPublisherConfiguration,
Map<String, Integer> propertyPositionMap,
int tenantId, StreamDefinition streamDefinition) throws
EventPublisherConfigurationException {
this.eventPublisherConfiguration = eventPublisherConfiguration;
this.propertyPositionMap = propertyPositionMap;
if (!eventPublisherConfiguration.getOutputMapping().isCustomMappingEnabled()) {
this.streamDefinition = streamDefinition;
noOfMetaData = streamDefinition.getMetaData() != null ? streamDefinition.getMetaData().size() : 0;
noOfCorrelationData = streamDefinition.getCorrelationData() != null ? streamDefinition.getCorrelationData().size() : 0;
noOfPayloadData = streamDefinition.getPayloadData() != null ? streamDefinition.getPayloadData().size() : 0;
}
}
private void validateStreamDefinitionWithOutputProperties(Map<String, Object> arbitraryDataMap)
throws EventPublisherConfigurationException {
MapOutputMapping mapOutputMapping = (MapOutputMapping) eventPublisherConfiguration.getOutputMapping();
if(!mapOutputMapping.isCustomMappingEnabled()) {
return;
}
List<EventOutputProperty> outputPropertyConfiguration = mapOutputMapping.getOutputPropertyConfiguration();
Iterator<EventOutputProperty> outputPropertyConfigurationIterator = outputPropertyConfiguration.iterator();
for (; outputPropertyConfigurationIterator.hasNext(); ) {
EventOutputProperty outputProperty = outputPropertyConfigurationIterator.next();
String valueOf = outputProperty.getValueOf();
if (!propertyPositionMap.containsKey(valueOf) && (arbitraryDataMap == null || !arbitraryDataMap.containsKey(valueOf))) {
throw new EventPublisherStreamValidationException("Property " + valueOf + " is neither in the input stream attributes nor in runtime arbitrary data map of ", streamDefinition.getStreamId());
}
}
}
@Override
public Object convertToMappedInputEvent(Event event)
throws EventPublisherConfigurationException {
validateStreamDefinitionWithOutputProperties(event.getArbitraryDataMap());
Map<Object, Object> eventMapObject = new TreeMap<Object, Object>();
Object[] eventData = event.getData();
Map<String, Object> arbitraryDataMap = event.getArbitraryDataMap();
MapOutputMapping mapOutputMapping = (MapOutputMapping) eventPublisherConfiguration.getOutputMapping();
List<EventOutputProperty> outputPropertyConfiguration = mapOutputMapping.getOutputPropertyConfiguration();
if (outputPropertyConfiguration.size() != 0 && eventData.length > 0) {
for (EventOutputProperty eventOutputProperty : outputPropertyConfiguration) {
String valueOf = eventOutputProperty.getValueOf();
Integer position = propertyPositionMap.get(valueOf);
if(position != null) {
eventMapObject.put(eventOutputProperty.getName(), eventData[position]);
} else if (valueOf != null && arbitraryDataMap != null && arbitraryDataMap.containsKey(valueOf)) {
eventMapObject.put(eventOutputProperty.getName(), arbitraryDataMap.get(valueOf));
}
}
}
return eventMapObject;
}
@Override
public Object convertToTypedInputEvent(Event event) throws EventPublisherConfigurationException {
validateStreamDefinitionWithOutputProperties(event.getArbitraryDataMap());
Map<Object, Object> eventMapObject = new TreeMap<Object, Object>();
int counter = 0;
Object[] eventData = event.getData();
if (noOfMetaData > 0) {
for (Attribute metaData : streamDefinition.getMetaData()) {
eventMapObject.put(EventPublisherConstants.PROPERTY_META_PREFIX + metaData.getName(), eventData[counter]);
counter++;
}
}
if (noOfCorrelationData > 0) {
for (Attribute correlationData : streamDefinition.getCorrelationData()) {
eventMapObject.put(EventPublisherConstants.PROPERTY_CORRELATION_PREFIX + correlationData.getName(), eventData[counter]);
counter++;
}
}
if (noOfPayloadData > 0) {
for (Attribute payloadData : streamDefinition.getPayloadData()) {
eventMapObject.put(payloadData.getName(), eventData[counter]);
counter++;
}
}
Map<String, Object> arbitraryDataMap = event.getArbitraryDataMap();
if(arbitraryDataMap != null) {
for (Map.Entry<String, Object> entry : arbitraryDataMap.entrySet()) {
eventMapObject.put(entry.getKey(), entry.getValue());
}
}
return eventMapObject;
}
}