/*
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you 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.siddhi.extension.output.mapper.text;
import org.wso2.siddhi.annotation.Example;
import org.wso2.siddhi.annotation.Extension;
import org.wso2.siddhi.core.event.Event;
import org.wso2.siddhi.core.exception.ConnectionUnavailableException;
import org.wso2.siddhi.core.stream.output.sink.SinkListener;
import org.wso2.siddhi.core.stream.output.sink.SinkMapper;
import org.wso2.siddhi.core.util.config.ConfigReader;
import org.wso2.siddhi.core.util.transport.DynamicOptions;
import org.wso2.siddhi.core.util.transport.OptionHolder;
import org.wso2.siddhi.core.util.transport.TemplateBuilder;
import org.wso2.siddhi.query.api.definition.StreamDefinition;
@Extension(
name = "text",
namespace = "sinkMapper",
description = "Event to Text output mapper.",
examples = @Example(description = "TBD", syntax = "TBD")
)
public class TextSinkMapper extends SinkMapper {
private StreamDefinition streamDefinition;
private TemplateBuilder payloadTemplateBuilder;
private static final String EVENT_ATTRIBUTE_SEPARATOR = ",";
private static final String EVENT_ATTRIBUTE_VALUE_SEPARATOR = ":";
@Override
public String[] getSupportedDynamicOptions() {
return new String[0];
}
/**
* Initialize the mapper and the mapping configurations
* @param streamDefinition The stream definition
* @param optionHolder Unmapped dynamic options
* @param payloadTemplateBuilder
* @param mapperConfigReader
*/
@Override
public void init(StreamDefinition streamDefinition, OptionHolder optionHolder, TemplateBuilder
payloadTemplateBuilder, ConfigReader mapperConfigReader) {
this.streamDefinition = streamDefinition;
this.payloadTemplateBuilder = payloadTemplateBuilder;
}
@Override
public void mapAndSend(Event[] events, OptionHolder optionHolder, TemplateBuilder payloadTemplateBuilder,
SinkListener sinkListener, DynamicOptions dynamicOptions)
throws ConnectionUnavailableException {
if (this.payloadTemplateBuilder != null) {
for (Event event : events) {
sinkListener.publish(payloadTemplateBuilder.build(event), dynamicOptions);
}
} else {
for (Event event : events) {
sinkListener.publish(constructDefaultMapping(event), dynamicOptions);
}
}
}
@Override
public void mapAndSend(Event event, OptionHolder optionHolder, TemplateBuilder payloadTemplateBuilder,
SinkListener sinkListener, DynamicOptions dynamicOptions)
throws ConnectionUnavailableException {
if (this.payloadTemplateBuilder != null) {
sinkListener.publish(payloadTemplateBuilder.build(event), dynamicOptions);
} else {
sinkListener.publish(constructDefaultMapping(event), dynamicOptions);
}
}
/**
* Convert the given {@link Event} to Text string
*
* @param event Event object
* @return the constructed TEXT string
*/
private Object constructDefaultMapping(Event event) {
StringBuilder eventText = new StringBuilder();
eventText.append("siddhiEventId").append(EVENT_ATTRIBUTE_VALUE_SEPARATOR).append(event.getId()).append("\n");
Object[] data = event.getData();
for (int i = 0; i < data.length; i++) {
Object attributeValue = data[i];
eventText.append(attributeValue.toString()).append(EVENT_ATTRIBUTE_SEPARATOR);
}
eventText.deleteCharAt(eventText.lastIndexOf(EVENT_ATTRIBUTE_SEPARATOR));
// // Get arbitrary data from event
// Map<String, Object> arbitraryDataMap = event.getArbitraryDataMap();
// if (arbitraryDataMap != null && !arbitraryDataMap.isEmpty()) {
// // Add arbitrary data key-value to the default template
// eventText.append(EVENT_ATTRIBUTE_SEPARATOR);
// for (Map.Entry<String, Object> entry : arbitraryDataMap.entrySet()) {
// eventText.append("\n" + entry.getKey() + EVENT_ATTRIBUTE_SEPARATOR + entry.getValue() +
// EVENT_ATTRIBUTE_SEPARATOR);
// }
// eventText.deleteCharAt(eventText.lastIndexOf(EVENT_ATTRIBUTE_SEPARATOR));
// eventText.deleteCharAt(eventText.lastIndexOf("\n"));
// }
return eventText.toString();
}
}