/*
* Copyright (c) 2012 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.api.service.impl.resource.utils;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.model.Event;
/**
* An XML event marshaler based on JAXB API
*/
public class XMLEventMarshaller implements EventMarshaller {
final private Logger _logger = LoggerFactory.getLogger(XMLEventMarshaller.class);
final static private Logger _staticLogger = LoggerFactory.getLogger(XMLEventMarshaller.class);
private static JAXBContext _context = null;
static {
try {
_context = JAXBContext.newInstance(Event.class);
} catch (JAXBException e) {
_staticLogger.error("XML Marshaller Creation Error", e);
}
}
private final ThreadLocal<Marshaller> marshallers = new ThreadLocal<Marshaller>() {
protected Marshaller initialValue() {
Marshaller m = null;
try {
m = _context.createMarshaller();
m.setProperty(Marshaller.JAXB_FRAGMENT, true);
} catch (JAXBException e) {
_logger.error("XML marshaller creation failed", e);
}
return m;
}
};
private Marshaller getMarshaller() {
return marshallers.get();
}
@Override
public void header(Writer writer) throws MarshallingExcetion {
BufferedWriter ow = ((BufferedWriter) writer);
try {
ow.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
writer.write("<events>");
} catch (IOException e) {
throw new MarshallingExcetion("XML head Streaming failed", e);
}
}
@Override
public void marshal(Event event, Writer writer) throws MarshallingExcetion {
BufferedWriter ow = ((BufferedWriter) writer);
try {
if (event == null) {
_logger.warn("null event dropped");
} else {
Marshaller marshaller = getMarshaller();
if (marshaller == null) {
_logger.error("Unable to create XML marshaller");
} else {
StringWriter sw = new StringWriter();
marshaller.marshal(event, sw);
ow.write(sw.toString());
}
}
} catch (JAXBException e) {
throw new MarshallingExcetion("XML Marshalling Error" + event.getEventId(), e);
} catch (IOException e) {
throw new MarshallingExcetion("XML Streaming Error" + event.getEventId(), e);
}
}
@Override
public void tailer(Writer writer) throws MarshallingExcetion {
BufferedWriter ow = ((BufferedWriter) writer);
try {
ow.write("</events>");
} catch (IOException e) {
throw new MarshallingExcetion("XML tail Streaming failed", e);
}
}
}