package org.opendaylight.openflowjava.tools;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import java.io.File;
import java.math.BigInteger;
import java.util.List;
/**
* @author Jozef Bacigal
* Date: 8.3.2016
*/
public class ConnectionToolConfigurationServiceImpl implements ConnectionToolConfigurationService {
private static final Logger LOG = LoggerFactory.getLogger(ConnectionToolConfigurationServiceImpl.class);
@Override
public void marshallData(ConnectionTestTool.Params params, String configurationName) throws JAXBException, SAXException {
File file = new File(XML_FILE_PATH_WITH_FILE_NAME);
LOG.info("Marshaling configuration data to: {}", XML_FILE_PATH_WITH_FILE_NAME);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File(XSD_SCHEMA_PATH_WITH_FILE_NAME));
LOG.info("with schema: {}", XSD_SCHEMA_PATH_WITH_FILE_NAME);
JAXBContext jaxbContext = JAXBContext.newInstance(Configurations.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, CONFIGURATION_XSD);
jaxbMarshaller.setSchema(schema);
Configurations configurations = new Configurations();
List<ConfigurationType> configurationTypes = configurations.getConfiguration();
for (ConfigurationType configurationType : this.getSavedConfigurations()) {
configurationTypes.add(configurationType);
}
ConfigurationType configurationType = new ConfigurationType();
configurationType.name = configurationName;
configurationType.controllerIp = params.controllerIP;
configurationType.devicesCount = BigInteger.valueOf(params.deviceCount);
configurationType.freeze = BigInteger.valueOf(params.freeze);
configurationType.port = BigInteger.valueOf(params.port);
configurationType.sleep = params.sleep;
configurationType.ssl = params.ssl;
configurationType.threads = BigInteger.valueOf(params.threads);
configurationType.timeout = BigInteger.valueOf(params.timeout);
configurationTypes.add(configurationType);
configurations.setConfiguration(configurationTypes);
jaxbMarshaller.marshal(configurations, file);
}
@Override
public ConnectionTestTool.Params unMarshallData(String configurationName) throws SAXException, JAXBException {
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File(XSD_SCHEMA_PATH_WITH_FILE_NAME));
LOG.debug("Loading schema from: {}", XSD_SCHEMA_PATH_WITH_FILE_NAME);
JAXBContext jc = JAXBContext.newInstance(Configurations.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setSchema(schema);
Configurations configurations = (Configurations) unmarshaller.unmarshal(new File(XML_FILE_PATH_WITH_FILE_NAME));
LOG.debug("Configurations ({}) are un-marshaled from {}", configurations.getConfiguration().size(), XML_FILE_PATH_WITH_FILE_NAME);
boolean foundConfiguration = false;
ConfigurationType configuration = null;
for (ConfigurationType configurationType : configurations.getConfiguration()) {
if (configurationType.getName().equals(configurationName)) {
configuration = configurationType;
foundConfiguration = true;
}
}
ConnectionTestTool.Params params = null;
if (foundConfiguration) {
LOG.info("Configuration {} found, loading parameters.", configurationName);
params = new ConnectionTestTool.Params();
params.controllerIP = configuration.getControllerIp();
params.deviceCount = configuration.getDevicesCount().intValue();
params.freeze = configuration.getFreeze().intValue();
params.port = configuration.getPort().intValue();
params.sleep = configuration.getSleep();
params.ssl = configuration.isSsl();
params.threads = configuration.getThreads().intValue();
params.timeout = configuration.getTimeout().intValue();
} else {
LOG.warn("Configuration {} not found. Using default parameters.", configurationName);
}
return params;
}
private List<ConfigurationType> getSavedConfigurations() throws SAXException, JAXBException{
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File(XSD_SCHEMA_PATH_WITH_FILE_NAME));
JAXBContext jc = JAXBContext.newInstance(Configurations.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setSchema(schema);
Configurations configurations = (Configurations) unmarshaller.unmarshal(new File(XML_FILE_PATH_WITH_FILE_NAME));
return configurations.getConfiguration();
}
}