package sync.ui;
import com.emc.ecs.sync.config.ConfigUtil;
import com.emc.ecs.sync.config.ConfigWrapper;
import com.emc.ecs.sync.config.SyncConfig;
import com.emc.ecs.sync.rest.*;
import org.springframework.http.HttpHeaders;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SyncHttpMessageConverter extends AbstractXmlHttpMessageConverter<Object> {
public static final Class<?>[] pluginClasses;
static {
List<Class<?>> classes = new ArrayList<>(Arrays.asList(
JobList.class, JobInfo.class, SyncConfig.class, SyncProgress.class,
JobControl.class, ErrorList.class, HostInfo.class, UiConfig.class,
SyncResult.class, ScheduledSync.class));
for (ConfigWrapper<?> wrapper : ConfigUtil.allStorageConfigWrappers()) {
classes.add(wrapper.getTargetClass());
}
for (ConfigWrapper<?> wrapper : ConfigUtil.allFilterConfigWrappers()) {
classes.add(wrapper.getTargetClass());
}
pluginClasses = classes.toArray(new Class<?>[classes.size()]);
}
private JAXBContext jaxbContext;
@Override
protected Object readFromSource(Class<?> clazz, HttpHeaders headers, Source source) throws IOException {
try {
return getJaxbContext().createUnmarshaller().unmarshal(source);
} catch (JAXBException e) {
throw new HttpMessageConversionException("Could not create JAXB context", e);
}
}
@Override
protected void writeToResult(Object o, HttpHeaders headers, Result result) throws IOException {
try {
getJaxbContext().createMarshaller().marshal(o, result);
} catch (JAXBException e) {
throw new HttpMessageConversionException("Could not create JAXB context", e);
}
}
@Override
protected boolean supports(Class<?> clazz) {
for (Class<?> pluginClass : pluginClasses) {
if (pluginClass.equals(clazz)) return true;
}
return false;
}
private synchronized JAXBContext getJaxbContext() throws JAXBException {
if (jaxbContext == null) {
jaxbContext = JAXBContext.newInstance(pluginClasses);
}
return jaxbContext;
}
}