package com.epam.cisen.sms;
import java.io.IOException;
import java.util.Dictionary;
import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.ConfigurationPolicy;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.epam.cisen.core.api.AbstractMessenger;
import com.epam.cisen.core.api.Messenger;
import com.epam.cisen.core.api.dto.ToSend;
import com.epam.cisen.core.api.util.PropertiesUtil;
@Component(label = "Sms messenger", metatype = true, policy = ConfigurationPolicy.REQUIRE)
@Service(Messenger.class)
@Properties({
@Property(name = SmsMessenger.GATE, label = "Gate", description = "Use any service which send sms, for example (http://speedsms.com.ua)", value = "http://speedsms.com.ua/cgi-bin/api2.0.cgi"),
@Property(name = SmsMessenger.LOGIN, label = "Login"),
@Property(name = SmsMessenger.PASSWORD, label = "Password", passwordValue = ""),
@Property(name = SmsMessenger.TEMPLATE, label = "Template", value = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><package login=\"%s\" sig=\"%s\" classver='2.0'><messages><msg recipient=\"%s\" sender=\"SPEEDSMS\">%s</msg></messages></package>") })
public class SmsMessenger extends AbstractMessenger<SmsDto> {
private static final Logger LOGGER = LoggerFactory.getLogger(SmsMessenger.class);
static final String GATE = "sms.config.gate";
static final String LOGIN = "sms.config.login";
static final String PASSWORD = "sms.config.password";
static final String TEMPLATE = "sms.config.template";
private String template;
private String login;
private String signature;
private static HttpPost request;
private static CloseableHttpClient client = HttpClients.createDefault();
@Override
protected SmsDto getPluginTemplateConfig() {
SmsDto smsDto = new SmsDto();
smsDto.setRecipient("Hint: Put phone number in format 38XXXXXXXXXX");
return smsDto;
}
@Override
protected void activatePlugin(ComponentContext componentContext) {
final Dictionary properties = componentContext.getProperties();
String gate = PropertiesUtil.toString(properties.get(GATE), StringUtils.EMPTY);
String password = PropertiesUtil.toString(properties.get(PASSWORD), StringUtils.EMPTY);
login = PropertiesUtil.toString(properties.get(LOGIN), StringUtils.EMPTY);
template = PropertiesUtil.toString(properties.get(TEMPLATE), StringUtils.EMPTY);
signature = SignatureUtil.getSignature(login, password);
request = new HttpPost(gate);
request.setHeader("ContentType", "application/xml; charset=utf=8");
}
@Override
protected void send(SmsDto smsDTO, ToSend message) {
try {
request.setEntity(new StringEntity(String.format(template, login, signature, smsDTO.getRecipient(),
message.getBody()), ContentType.APPLICATION_XML));
client.execute(request);
} catch (IOException e) {
// TODO: add logging to file
LOGGER.error("Fail to end SMS", e);
}
}
}