/*******************************************************************************
* Copyright (c) 2011, 2016 Red Hat and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.kura.camel.cloud;
import static org.eclipse.kura.camel.camelcloud.KuraCloudClientConstants.CAMEL_KURA_CLOUD_CONTROL;
import static org.eclipse.kura.camel.camelcloud.KuraCloudClientConstants.CAMEL_KURA_CLOUD_DEVICEID;
import static org.eclipse.kura.camel.camelcloud.KuraCloudClientConstants.CAMEL_KURA_CLOUD_PRIORITY;
import static org.eclipse.kura.camel.camelcloud.KuraCloudClientConstants.CAMEL_KURA_CLOUD_QOS;
import static org.eclipse.kura.camel.camelcloud.KuraCloudClientConstants.CAMEL_KURA_CLOUD_RETAIN;
import static org.eclipse.kura.camel.camelcloud.KuraCloudClientConstants.CAMEL_KURA_CLOUD_TOPIC;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.impl.DefaultProducer;
import org.eclipse.kura.cloud.CloudClient;
import org.eclipse.kura.message.KuraPayload;
/**
* Producer implementation for {@link KuraCloudComponent}
*/
public class KuraCloudProducer extends DefaultProducer {
// Visible for testing
CloudClient cloudClient;
public KuraCloudProducer(KuraCloudEndpoint endpoint, CloudClient cloudClient) {
super(endpoint);
this.cloudClient = cloudClient;
}
@Override
public void process(Exchange exchange) throws Exception {
Message in = exchange.getIn();
String topic = firstNotNull(in.getHeader(CAMEL_KURA_CLOUD_TOPIC, String.class), getEndpoint().getTopic());
int qos = firstNotNull(in.getHeader(CAMEL_KURA_CLOUD_QOS, Integer.class), getEndpoint().getQos());
int priority = firstNotNull(in.getHeader(CAMEL_KURA_CLOUD_PRIORITY, Integer.class),
getEndpoint().getPriority());
boolean retain = firstNotNull(in.getHeader(CAMEL_KURA_CLOUD_RETAIN, Boolean.class), getEndpoint().isRetain());
boolean control = firstNotNull(in.getHeader(CAMEL_KURA_CLOUD_CONTROL, Boolean.class),
getEndpoint().isControl());
String deviceId = firstNotNull(in.getHeader(CAMEL_KURA_CLOUD_DEVICEID, String.class),
getEndpoint().getDeviceId());
Object body = in.getBody();
if (body == null) {
throw new RuntimeException("Cannot produce null payload.");
}
if (!(body instanceof KuraPayload)) {
KuraPayload payload = new KuraPayload();
if (body instanceof byte[]) {
payload.setBody((byte[]) body);
} else {
byte[] payloadBytes = in.getBody(byte[].class);
if (payloadBytes != null) {
payload.setBody(in.getBody(byte[].class));
} else {
payload.setBody(in.getBody(String.class).getBytes());
}
}
body = payload;
}
if (control) {
if (deviceId != null) {
this.cloudClient.controlPublish(deviceId, topic, (KuraPayload) body, qos, retain, priority);
} else {
this.cloudClient.controlPublish(topic, (KuraPayload) body, qos, retain, priority);
}
} else {
this.cloudClient.publish(topic, (KuraPayload) body, qos, retain, priority);
}
}
// Getters
@Override
public KuraCloudEndpoint getEndpoint() {
return (KuraCloudEndpoint) super.getEndpoint();
}
// Helpers
private <T> T firstNotNull(T first, T second) {
return first != null ? first : second;
}
}