package com.epam.cisen.skype;
import static org.apache.commons.io.IOUtils.closeQuietly;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
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.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 = "Skype messenger plugin", metatype = true, policy = ConfigurationPolicy.REQUIRE)
@Service(Messenger.class)
@Properties({ @Property(label = "Skype service host", value = "127.0.0.1", name = SkypeMessenger.SKYPE_HOST),
@Property(label = "Skype service port", intValue = 9000, name = SkypeMessenger.SKYPE_PORT) })
public class SkypeMessenger extends AbstractMessenger<SkypeConfigDTO> {
private static final Logger LOGGER = LoggerFactory.getLogger(SkypeMessenger.class);
static final String SKYPE_HOST = "skype.host";
static final String SKYPE_PORT = "skype.port";
private static class SkypeMessage {
private static String MESSAGE_PATTERN = "%s|%s|%s|%s";
private final String username;
private final String message;
private final String changeTopic;
private final String topic;
public SkypeMessage(String username, String message, boolean changeTopic, String topic) {
if (StringUtils.isEmpty(username)) {
throw new IllegalArgumentException("No Skype user name");
}
this.username = StringUtils.defaultString(username);
this.message = message;
this.changeTopic = String.valueOf(changeTopic);
this.topic = topic;
}
@Override
public String toString() {
return String.format(MESSAGE_PATTERN, username, message, changeTopic, topic);
}
}
Socket socket = null;
DataOutputStream out;
@Override
protected SkypeConfigDTO getPluginTemplateConfig() {
return new SkypeConfigDTO();
}
@Override
protected void activatePlugin(ComponentContext componentContext) {
LOGGER.info("Skype Messenger activate");
String host = PropertiesUtil.toString(componentContext.getProperties().get(SKYPE_HOST), "127.0.0.1");
int port = PropertiesUtil.toInteger(componentContext.getProperties().get(SKYPE_PORT), 9000);
try {
socket = new Socket(host, port);
if (socket.isConnected()) {
out = new DataOutputStream(socket.getOutputStream());
} else {
LOGGER.warn("Skype service in unavailable now. Unregister plugin. Please, start service.");
unregisterPlugin();
}
} catch (IOException ex) {
LOGGER.error("Create socket: ", ex);
}
}
@Override
protected void deactivatePlugin() {
closeQuietly(out);
closeQuietly(socket);
}
@Override
protected void send(SkypeConfigDTO configDTO, ToSend message) {
LOGGER.info("Try to send message via 'Skype' program");
try {
SkypeMessage telnetMessage = new SkypeMessage(configDTO.getRecipient(), message.getBody(),
configDTO.isUpdateChatName(), message.getSubject());
out.writeUTF(telnetMessage.toString());
out.flush();
} catch (Exception ex) {
LOGGER.error("Fail to send Skype message", ex);
}
}
}