@Override public synchronized void loadScenario(String scenarioName) { Scenario scenario = null; for (Scenario scen : this.scenarios) { if (scenarioName.equals(scen.getName())) { scenario = scen; break; } } if (scenario != null) loadScenario(scenario); }
private synchronized void loadScenario(Scenario scenario) { if (this.simulation.getState() != EngineState.STOPPED && this.simulation.getState() != EngineState.CRASHED) return; boolean found = false; for (Scenario scen : this.scenarios) { if (scenario.equals(scen)) { found = true; break; } } if (!found) throw new RuntimeException("Scenario " + scenario.getName() + " does not exist"); if (this.context != null) { this.context.close(); } try { this.graph.clear(); } catch (Exception err) { logger.error("Error clearing graph", err); } String[] configs = {SCENARIO_FOLDER + "/" + scenario.getName()}; this.context = new ClassPathXmlApplicationContext(configs, this.applicationContext); if (!this.currentScenario.equals(found) || this.scenarioParameters.isEmpty()) { this.scenarioParameters.clear(); String[] names = this.context.getBeanNamesForType(Object.class); for (String beanName : names) { Object bean = this.context.getBean(beanName); ArrayList<java.lang.reflect.Field> fields = new ArrayList<java.lang.reflect.Field>(); Class<?> clazz = bean.getClass(); do { for (java.lang.reflect.Field field : clazz.getDeclaredFields()) { fields.add(field); } clazz = clazz.getSuperclass(); } while (clazz != null); clazz = bean.getClass(); for (java.lang.reflect.Field field : fields) { String name = field.getName(); SimulationParameter annotation = field.getAnnotation(SimulationParameter.class); if (annotation != null) { Object value = null; try { Method getter; Class<?> fieldType = field.getType(); if (fieldType.equals(Boolean.class) || fieldType.equals(boolean.class)) { getter = bean.getClass().getMethod("is" + this.capitalize(name)); } else { getter = bean.getClass().getMethod("get" + this.capitalize(name)); } value = getter.invoke(bean); } catch (Exception e) { throw new RuntimeException(e); } ConfigurableObject cfgObj = this.scenarioParameters.get(beanName); if (cfgObj == null) { cfgObj = new ConfigurableObject(beanName, clazz.getName()); this.scenarioParameters.put(beanName, cfgObj); } ScenarioParameter parameter = new ScenarioParameter(name, value, annotation.label()); if (!Double.isNaN(annotation.from()) && !Double.isNaN(annotation.to())) { parameter.setFrom(annotation.from()); parameter.setTo(annotation.to()); } if (!Double.isNaN(annotation.step())) { parameter.setStep(annotation.step()); } cfgObj.addParameter(parameter); } } } } this.currentScenario = scenario; this.scenarioLoaded = true; }