package org.opendaylight.openflowjava.protocol.impl.clients; import com.google.common.base.Preconditions; import java.io.File; import java.io.IOException; import java.util.SortedMap; import java.util.TreeMap; import javax.xml.XMLConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.opendaylight.openflowjava.util.ByteBufUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; /** * @author Jozef Bacigal * Date: 9.3.2016 */ public class ScenarioServiceImpl implements ScenarioService { private static final Logger LOG = LoggerFactory.getLogger(ScenarioServiceImpl.class); private String XML_FILE_PATH_WITH_FILE_NAME = SIMPLE_CLIENT_SRC_MAIN_RESOURCES + SCENARIO_XML; public ScenarioServiceImpl(String scenarioFile){ if (null != scenarioFile && !scenarioFile.isEmpty()) { this.XML_FILE_PATH_WITH_FILE_NAME = scenarioFile; } } @Override public Scenario unMarshallData(String scenarioName) 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(Scenarios.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); unmarshaller.setSchema(schema); Scenarios scenarios = (Scenarios) unmarshaller.unmarshal(new File(XML_FILE_PATH_WITH_FILE_NAME)); LOG.debug("Scenarios ({}) are un-marshaled from {}", scenarios.getScenario().size(), XML_FILE_PATH_WITH_FILE_NAME); boolean foundConfiguration = false; Scenario scenarioType = null; for (Scenario scenario : scenarios.getScenario()) { if (scenario.getName().equals(scenarioName)) { scenarioType = scenario; foundConfiguration = true; } } if (!foundConfiguration) { LOG.warn("Scenario {} not found.", scenarioName); } else { LOG.info("Scenario {} found with {} steps.", scenarioName, scenarioType.getStep().size()); } return scenarioType; } @Override public SortedMap<Integer, ClientEvent> getEventsFromScenario(Scenario scenario) throws IOException { Preconditions.checkNotNull(scenario, "Scenario name not found. Check XML file, scenario name or directories."); SortedMap<Integer, ClientEvent> events = new TreeMap<>(); Integer counter = 0; for (Step step : scenario.getStep()) { LOG.debug("Step {}: {}, type {}, bytes {}", step.getOrder(), step.getName(), step.getEvent().value(), step.getBytes().toArray()); switch (step.getEvent()) { case SLEEP_EVENT: events.put(counter++, new SleepEvent(1000)); break; case SEND_EVENT: events.put(counter++, new SendEvent(ByteBufUtils.serializeList(step.getBytes()))); break; case WAIT_FOR_MESSAGE_EVENT: events.put(counter++, new WaitForMessageEvent(ByteBufUtils.serializeList(step.getBytes()))); break; } } return events; } }