package org.infosec.ismp.manager.agent;
import java.io.IOException;
import java.io.StringWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import org.apache.commons.lang.StringUtils;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.ValidationException;
import org.infosec.ismp.model.event.Event;
import org.infosec.ismp.model.event.Events;
import org.infosec.ismp.model.event.Log;
import org.infosec.ismp.util.ThreadCategory;
import org.springframework.stereotype.Component;
@Component
public class EventSender {
private DatagramSocket m_dgSocket;
private DatagramPacket m_pkt;
public EventSender() {
init();
}
public void init() {
try {
m_dgSocket = new DatagramSocket();
} catch (SocketException e) {
log().error("创建DatagramoSocket 出错" + e);
}
}
/**
* 将事件发送到指定的目的地址
* @param e
* @param addr
* @param port
* @return
*/
public boolean sendEvent(Event e, InetAddress addr, int port) {
Events events = new Events();
events.addEvent(e);
Log log = new Log();
log.setEvents(events);
StringWriter writer = new StringWriter();
try {
Marshaller.marshal(log, writer);
} catch (MarshalException e1) {
log().warn("marshall log error : " + e1, e1);
} catch (ValidationException e1) {
log().warn("marshall log error : " + e1, e1);
}
String dataXml = writer.toString();
if (StringUtils.trimToNull(dataXml) == null) {
log().error("event cannot marshall " + e);
return false;
}
byte[] data = dataXml.getBytes();
m_pkt = new DatagramPacket(data, data.length);
m_pkt.setAddress(addr);
m_pkt.setPort(port);
try {
m_dgSocket.send(m_pkt);
} catch (IOException e1) {
log().error("IO Exception ,couldn't send udp pakcet", e1);
return false;
}
return true;
}
private ThreadCategory log() {
return ThreadCategory.getInstance(EventSender.class);
}
}