From 7d9b07a6cf8171e97eb5ce6ed4ccdcfadff8e741 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Tue, 11 Feb 2014 16:36:32 +0100 Subject: [PATCH] Modify config-api exceptions, bump config and netconf to 0.2.5-SNAPSHOT. Change ConflictingVersionException and ValidationException to be checked instead of runtime exceptions. Fix ConfigPusher's ConflictVersionException handling that was introduced when IOException was used to wrap RuntimeException. Small fixes in netconf, more refactoring of exception handling will be needed there. Maros Marsalek: Rebase commit + fix compliation issue in ShutdownTest Change-Id: Iab89de6ef6ced0de0a267470f860912ae3c56892 Signed-off-by: Tomas Olvecky Signed-off-by: Maros Marsalek --- opendaylight/commons/opendaylight/pom.xml | 4 +- opendaylight/config/config-api/pom.xml | 2 +- .../api/ConflictingVersionException.java | 2 +- .../config/api/ValidationException.java | 6 +- opendaylight/config/config-manager/pom.xml | 2 +- .../dynamicmbean/DynamicWritableWrapper.java | 5 +- .../osgi/BlankTransactionServiceTracker.java | 10 ++- .../test/SimpleConfigurationTest.java | 7 +- .../config/config-module-archetype/pom.xml | 2 +- .../config/config-persister-api/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../config-persister-file-adapter/pom.xml | 2 +- .../config-persister-file-xml-adapter/pom.xml | 2 +- .../config/config-plugin-parent/pom.xml | 3 +- opendaylight/config/config-util/pom.xml | 2 +- .../util/ConfigTransactionJMXClient.java | 28 ++++---- opendaylight/config/logback-config/pom.xml | 2 +- ...ackModuleWithInitialConfigurationTest.java | 47 +++++++------ .../LogbackWithXmlConfigModuleTest.java | 37 +++++------ opendaylight/config/netty-config-api/pom.xml | 2 +- .../netty-event-executor-config/pom.xml | 2 +- .../config/netty-threadgroup-config/pom.xml | 2 +- .../config/netty-timer-config/pom.xml | 2 +- opendaylight/config/pom.xml | 3 +- opendaylight/config/shutdown-api/pom.xml | 2 +- opendaylight/config/shutdown-impl/pom.xml | 2 +- .../yang/shutdown/impl/ShutdownTest.java | 4 +- .../config/threadpool-config-api/pom.xml | 2 +- .../config/threadpool-config-impl/pom.xml | 2 +- .../config/yang-jmx-generator-it/pom.xml | 2 +- .../config/yang-jmx-generator-plugin/pom.xml | 2 +- .../config/yang-jmx-generator/pom.xml | 2 +- opendaylight/config/yang-store-api/pom.xml | 2 +- opendaylight/config/yang-store-impl/pom.xml | 2 +- opendaylight/config/yang-test-plugin/pom.xml | 2 +- opendaylight/config/yang-test/pom.xml | 2 +- .../md-sal/sal-binding-broker/pom.xml | 2 +- .../md-sal/sal-binding-config/pom.xml | 4 +- opendaylight/md-sal/sal-dom-api/pom.xml | 2 +- opendaylight/md-sal/sal-dom-broker/pom.xml | 2 +- .../md-sal/sal-netconf-connector/pom.xml | 8 +-- .../netconf/config-netconf-connector/pom.xml | 2 +- .../operations/Commit.java | 18 +++-- .../operations/DiscardChanges.java | 8 ++- .../operations/Validate.java | 7 +- .../operations/editconfig/EditConfig.java | 13 ++-- .../transactions/TransactionProvider.java | 8 +-- .../NetconfMappingTest.java | 66 +++++++++---------- .../operations/editconfig/EditConfigTest.java | 3 +- .../netconf/config-persister-impl/pom.xml | 2 +- .../netconf/persist/impl/ConfigPusher.java | 58 +++++++++------- .../ietf-netconf-monitoring-extension/pom.xml | 2 +- .../netconf/ietf-netconf-monitoring/pom.xml | 2 +- opendaylight/netconf/netconf-api/pom.xml | 3 +- .../api/NetconfDocumentedException.java | 20 ++++++ opendaylight/netconf/netconf-client/pom.xml | 2 +- opendaylight/netconf/netconf-impl/pom.xml | 2 +- opendaylight/netconf/netconf-it/pom.xml | 2 +- .../netconf/netconf-mapping-api/pom.xml | 2 +- .../netconf/netconf-monitoring/pom.xml | 2 +- opendaylight/netconf/netconf-ssh/pom.xml | 2 +- opendaylight/netconf/netconf-util/pom.xml | 2 +- opendaylight/netconf/pom.xml | 4 +- 65 files changed, 253 insertions(+), 203 deletions(-) diff --git a/opendaylight/commons/opendaylight/pom.xml b/opendaylight/commons/opendaylight/pom.xml index 328dfafe3f..43b69e4d87 100644 --- a/opendaylight/commons/opendaylight/pom.xml +++ b/opendaylight/commons/opendaylight/pom.xml @@ -77,8 +77,8 @@ 0.5.2-SNAPSHOT 0.5.2-SNAPSHOT 0.5.2-SNAPSHOT - 0.2.4-SNAPSHOT - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT + 0.2.5-SNAPSHOT 1.1-SNAPSHOT 0.5.2-SNAPSHOT 0.5.2-SNAPSHOT diff --git a/opendaylight/config/config-api/pom.xml b/opendaylight/config/config-api/pom.xml index 425e4b4406..cab2e8c44e 100644 --- a/opendaylight/config/config-api/pom.xml +++ b/opendaylight/config/config-api/pom.xml @@ -5,7 +5,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT config-api diff --git a/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/ConflictingVersionException.java b/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/ConflictingVersionException.java index 9c25242c2d..2edf261499 100644 --- a/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/ConflictingVersionException.java +++ b/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/ConflictingVersionException.java @@ -14,7 +14,7 @@ package org.opendaylight.controller.config.api; * transaction was committed after creating this transaction. Clients can create * new transaction and merge the changes. */ -public class ConflictingVersionException extends RuntimeException { +public class ConflictingVersionException extends Exception { private static final long serialVersionUID = 1L; public ConflictingVersionException() { diff --git a/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/ValidationException.java b/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/ValidationException.java index f27d123995..68cd58d3a2 100644 --- a/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/ValidationException.java +++ b/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/ValidationException.java @@ -16,9 +16,11 @@ import java.util.Map.Entry; /** * This exception is not intended to be used while implementing modules, - * itaggregates validation exceptions and sends them back to the user. + * it aggregates validation exceptions and sends them back to the user. + * Use {@link org.opendaylight.controller.config.api.JmxAttributeValidationException} for + * validating modules instead. */ -public class ValidationException extends RuntimeException { +public class ValidationException extends Exception { private static final long serialVersionUID = -6072893219820274247L; private final Map> failedValidations; diff --git a/opendaylight/config/config-manager/pom.xml b/opendaylight/config/config-manager/pom.xml index 524cd1ff9e..4857f2a201 100644 --- a/opendaylight/config/config-manager/pom.xml +++ b/opendaylight/config/config-manager/pom.xml @@ -3,7 +3,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. config-manager diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/dynamicmbean/DynamicWritableWrapper.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/dynamicmbean/DynamicWritableWrapper.java index 2ab04e53e3..335acc81fe 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/dynamicmbean/DynamicWritableWrapper.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/dynamicmbean/DynamicWritableWrapper.java @@ -164,8 +164,9 @@ public class DynamicWritableWrapper extends AbstractDynamicWrapper { try { validate(); } catch (Exception e) { - throw ValidationException.createForSingleException( - moduleIdentifier, e); + + throw new MBeanException(ValidationException.createForSingleException( + moduleIdentifier, e)); } return Void.TYPE; } diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/BlankTransactionServiceTracker.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/BlankTransactionServiceTracker.java index b973b92721..720b7197ea 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/BlankTransactionServiceTracker.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/BlankTransactionServiceTracker.java @@ -8,6 +8,7 @@ package org.opendaylight.controller.config.manager.impl.osgi; import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.jmx.CommitStatus; import org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl; import org.opendaylight.controller.config.spi.ModuleFactory; @@ -41,7 +42,8 @@ public class BlankTransactionServiceTracker implements ServiceTrackerCustomizer< synchronized void blankTransaction() { // race condition check: config-persister might push new configuration while server is starting up. ConflictingVersionException lastException = null; - for (int i = 0; i < 10; i++) { + int maxAttempts = 10; + for (int i = 0; i < maxAttempts; i++) { try { // create transaction boolean blankTransaction = true; @@ -57,9 +59,13 @@ public class BlankTransactionServiceTracker implements ServiceTrackerCustomizer< Thread.currentThread().interrupt(); throw new IllegalStateException(interruptedException); } + } catch (ValidationException e) { + logger.error("Validation exception while running blank transaction indicates programming error", e); + throw new RuntimeException("Validation exception while running blank transaction indicates programming error", e); } } - throw lastException; + throw new RuntimeException("Maximal number of attempts reached and still cannot get optimistic lock from " + + "config manager",lastException); } @Override diff --git a/opendaylight/config/config-manager/src/test/java/org/opendaylight/controller/config/manager/testingservices/threadpool/test/SimpleConfigurationTest.java b/opendaylight/config/config-manager/src/test/java/org/opendaylight/controller/config/manager/testingservices/threadpool/test/SimpleConfigurationTest.java index 441de36db0..4e9ce009b4 100644 --- a/opendaylight/config/config-manager/src/test/java/org/opendaylight/controller/config/manager/testingservices/threadpool/test/SimpleConfigurationTest.java +++ b/opendaylight/config/config-manager/src/test/java/org/opendaylight/controller/config/manager/testingservices/threadpool/test/SimpleConfigurationTest.java @@ -30,7 +30,6 @@ import javax.management.InstanceNotFoundException; import javax.management.MBeanException; import javax.management.ObjectName; import javax.management.ReflectionException; -import javax.management.RuntimeMBeanException; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -135,7 +134,7 @@ public class SimpleConfigurationTest extends AbstractConfigTest { private void testValidation(ConfigTransactionClient transaction) throws InstanceAlreadyExistsException, ReflectionException, - InstanceNotFoundException, MBeanException { + InstanceNotFoundException, MBeanException, ConflictingVersionException { ObjectName fixed1names = transaction.createModule( TestingFixedThreadPoolModuleFactory.NAME, fixed1); // call validate on config bean @@ -143,8 +142,8 @@ public class SimpleConfigurationTest extends AbstractConfigTest { platformMBeanServer.invoke(fixed1names, "validate", new Object[0], new String[0]); fail(); - } catch (RuntimeMBeanException e) { - RuntimeException targetException = e.getTargetException(); + } catch (MBeanException e) { + Exception targetException = e.getTargetException(); assertNotNull(targetException); assertEquals(ValidationException.class, targetException.getClass()); } diff --git a/opendaylight/config/config-module-archetype/pom.xml b/opendaylight/config/config-module-archetype/pom.xml index 42c9105c05..7fb622460f 100644 --- a/opendaylight/config/config-module-archetype/pom.xml +++ b/opendaylight/config/config-module-archetype/pom.xml @@ -5,7 +5,7 @@ org.opendaylight.controller config-subsystem - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT config-module-archetype diff --git a/opendaylight/config/config-persister-api/pom.xml b/opendaylight/config/config-persister-api/pom.xml index 403ee82b8e..f800e36985 100644 --- a/opendaylight/config/config-persister-api/pom.xml +++ b/opendaylight/config/config-persister-api/pom.xml @@ -3,7 +3,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. config-persister-api diff --git a/opendaylight/config/config-persister-directory-adapter/pom.xml b/opendaylight/config/config-persister-directory-adapter/pom.xml index 919fd13fc2..86b8c4d947 100644 --- a/opendaylight/config/config-persister-directory-adapter/pom.xml +++ b/opendaylight/config/config-persister-directory-adapter/pom.xml @@ -4,7 +4,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. config-persister-directory-adapter diff --git a/opendaylight/config/config-persister-directory-autodetect-adapter/pom.xml b/opendaylight/config/config-persister-directory-autodetect-adapter/pom.xml index 92f7e27788..5e556c07a9 100644 --- a/opendaylight/config/config-persister-directory-autodetect-adapter/pom.xml +++ b/opendaylight/config/config-persister-directory-autodetect-adapter/pom.xml @@ -4,7 +4,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. config-persister-directory-autodetect-adapter diff --git a/opendaylight/config/config-persister-directory-xml-adapter/pom.xml b/opendaylight/config/config-persister-directory-xml-adapter/pom.xml index 2c5d2359a0..75188fe9b3 100644 --- a/opendaylight/config/config-persister-directory-xml-adapter/pom.xml +++ b/opendaylight/config/config-persister-directory-xml-adapter/pom.xml @@ -4,7 +4,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. config-persister-directory-xml-adapter diff --git a/opendaylight/config/config-persister-file-adapter/pom.xml b/opendaylight/config/config-persister-file-adapter/pom.xml index 4681b3b710..a8ea93e71b 100644 --- a/opendaylight/config/config-persister-file-adapter/pom.xml +++ b/opendaylight/config/config-persister-file-adapter/pom.xml @@ -4,7 +4,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. config-persister-file-adapter diff --git a/opendaylight/config/config-persister-file-xml-adapter/pom.xml b/opendaylight/config/config-persister-file-xml-adapter/pom.xml index 6fa496d92e..dd2079550e 100644 --- a/opendaylight/config/config-persister-file-xml-adapter/pom.xml +++ b/opendaylight/config/config-persister-file-xml-adapter/pom.xml @@ -4,7 +4,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. config-persister-file-xml-adapter diff --git a/opendaylight/config/config-plugin-parent/pom.xml b/opendaylight/config/config-plugin-parent/pom.xml index 0bc1ef6e76..e382c33871 100644 --- a/opendaylight/config/config-plugin-parent/pom.xml +++ b/opendaylight/config/config-plugin-parent/pom.xml @@ -4,7 +4,7 @@ org.opendaylight.controller config-subsystem - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT 4.0.0 config-plugin-parent @@ -16,7 +16,6 @@ ${project.build.directory}/generated-sources/config - 0.2.4-SNAPSHOT diff --git a/opendaylight/config/config-util/pom.xml b/opendaylight/config/config-util/pom.xml index 6a50ee843a..9b866efb13 100644 --- a/opendaylight/config/config-util/pom.xml +++ b/opendaylight/config/config-util/pom.xml @@ -3,7 +3,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. config-util diff --git a/opendaylight/config/config-util/src/main/java/org/opendaylight/controller/config/util/ConfigTransactionJMXClient.java b/opendaylight/config/config-util/src/main/java/org/opendaylight/controller/config/util/ConfigTransactionJMXClient.java index 3583dafd0d..4adc0d9364 100644 --- a/opendaylight/config/config-util/src/main/java/org/opendaylight/controller/config/util/ConfigTransactionJMXClient.java +++ b/opendaylight/config/config-util/src/main/java/org/opendaylight/controller/config/util/ConfigTransactionJMXClient.java @@ -7,24 +7,23 @@ */ package org.opendaylight.controller.config.util; -import java.util.Map; -import java.util.Set; +import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; +import org.opendaylight.controller.config.api.jmx.CommitStatus; +import org.opendaylight.controller.config.api.jmx.ConfigRegistryMXBean; +import org.opendaylight.controller.config.api.jmx.ConfigTransactionControllerMXBean; +import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; import javax.management.Attribute; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.JMException; import javax.management.JMX; +import javax.management.MBeanException; import javax.management.MBeanServer; import javax.management.ObjectName; -import javax.management.RuntimeMBeanException; - -import org.opendaylight.controller.config.api.ConflictingVersionException; -import org.opendaylight.controller.config.api.ValidationException; -import org.opendaylight.controller.config.api.jmx.CommitStatus; -import org.opendaylight.controller.config.api.jmx.ConfigRegistryMXBean; -import org.opendaylight.controller.config.api.jmx.ConfigTransactionControllerMXBean; -import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; +import java.util.Map; +import java.util.Set; public class ConfigTransactionJMXClient implements ConfigTransactionClient { private final ConfigRegistryMXBean configRegistryMXBeanProxy; @@ -234,10 +233,15 @@ public class ConfigTransactionJMXClient implements ConfigTransactionClient { throws ValidationException { try { configMBeanServer.invoke(configBeanON, "validate", null, null); + } catch (MBeanException e) { + Exception targetException = e.getTargetException(); + if (targetException instanceof ValidationException){ + throw (ValidationException) targetException; + } else { + throw new RuntimeException(e); + } } catch (JMException e) { throw new RuntimeException(e); - } catch (RuntimeMBeanException e) { - throw e.getTargetException(); } } diff --git a/opendaylight/config/logback-config/pom.xml b/opendaylight/config/logback-config/pom.xml index 4e0cfaada6..fbebda526a 100644 --- a/opendaylight/config/logback-config/pom.xml +++ b/opendaylight/config/logback-config/pom.xml @@ -5,7 +5,7 @@ org.opendaylight.controller config-plugin-parent - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent logback-config diff --git a/opendaylight/config/logback-config/src/test/java/org/opendaylight/controller/config/yang/logback/config/LogbackModuleWithInitialConfigurationTest.java b/opendaylight/config/logback-config/src/test/java/org/opendaylight/controller/config/yang/logback/config/LogbackModuleWithInitialConfigurationTest.java index eeb8289e86..e543f752e1 100644 --- a/opendaylight/config/logback-config/src/test/java/org/opendaylight/controller/config/yang/logback/config/LogbackModuleWithInitialConfigurationTest.java +++ b/opendaylight/config/logback-config/src/test/java/org/opendaylight/controller/config/yang/logback/config/LogbackModuleWithInitialConfigurationTest.java @@ -7,24 +7,19 @@ */ package org.opendaylight.controller.config.yang.logback.config; -import static org.junit.Assert.assertEquals; - -import java.io.File; -import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.management.InstanceAlreadyExistsException; -import javax.management.InstanceNotFoundException; -import javax.management.JMX; -import javax.management.MalformedObjectNameException; -import javax.management.ObjectName; - +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.encoder.PatternLayoutEncoder; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.joran.spi.JoranException; +import ch.qos.logback.core.rolling.FixedWindowRollingPolicy; +import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy; +import com.google.common.collect.Lists; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Test; +import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; import org.opendaylight.controller.config.manager.impl.AbstractConfigTest; import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver; @@ -32,15 +27,19 @@ import org.opendaylight.controller.config.util.ConfigTransactionClient; import org.opendaylight.controller.config.util.ConfigTransactionJMXClient; import org.slf4j.LoggerFactory; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.encoder.PatternLayoutEncoder; -import ch.qos.logback.classic.joran.JoranConfigurator; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.joran.spi.JoranException; -import ch.qos.logback.core.rolling.FixedWindowRollingPolicy; -import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy; +import javax.management.InstanceAlreadyExistsException; +import javax.management.InstanceNotFoundException; +import javax.management.JMX; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; +import java.io.File; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -import com.google.common.collect.Lists; +import static org.junit.Assert.assertEquals; public class LogbackModuleWithInitialConfigurationTest extends AbstractConfigTest { @@ -145,7 +144,7 @@ public class LogbackModuleWithInitialConfigurationTest extends AbstractConfigTes } public ObjectName createBeans() throws JoranException, InstanceAlreadyExistsException, IOException, - MalformedObjectNameException, InstanceNotFoundException { + MalformedObjectNameException, InstanceNotFoundException, ValidationException, ConflictingVersionException { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); diff --git a/opendaylight/config/logback-config/src/test/java/org/opendaylight/controller/config/yang/logback/config/LogbackWithXmlConfigModuleTest.java b/opendaylight/config/logback-config/src/test/java/org/opendaylight/controller/config/yang/logback/config/LogbackWithXmlConfigModuleTest.java index 8718f8a9ce..8149659812 100644 --- a/opendaylight/config/logback-config/src/test/java/org/opendaylight/controller/config/yang/logback/config/LogbackWithXmlConfigModuleTest.java +++ b/opendaylight/config/logback-config/src/test/java/org/opendaylight/controller/config/yang/logback/config/LogbackWithXmlConfigModuleTest.java @@ -7,32 +7,31 @@ */ package org.opendaylight.controller.config.yang.logback.config; -import static org.junit.Assert.assertEquals; - -import java.io.File; -import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.util.List; - -import javax.management.InstanceAlreadyExistsException; -import javax.management.InstanceNotFoundException; -import javax.management.JMX; -import javax.management.MalformedObjectNameException; -import javax.management.ObjectName; - +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.core.joran.spi.JoranException; +import com.google.common.collect.Lists; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Test; +import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.manager.impl.AbstractConfigTest; import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver; import org.opendaylight.controller.config.util.ConfigTransactionJMXClient; import org.slf4j.LoggerFactory; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.joran.JoranConfigurator; -import ch.qos.logback.core.joran.spi.JoranException; +import javax.management.InstanceAlreadyExistsException; +import javax.management.InstanceNotFoundException; +import javax.management.JMX; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; +import java.io.File; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.util.List; -import com.google.common.collect.Lists; +import static org.junit.Assert.assertEquals; public class LogbackWithXmlConfigModuleTest extends AbstractConfigTest { @@ -61,7 +60,7 @@ public class LogbackWithXmlConfigModuleTest extends AbstractConfigTest { * @throws MalformedObjectNameException */ @Test - public void test() throws InstanceAlreadyExistsException, InstanceNotFoundException, MalformedObjectNameException { + public void test() throws InstanceAlreadyExistsException, InstanceNotFoundException, MalformedObjectNameException, ValidationException, ConflictingVersionException { ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); ObjectName nameRetrieved = transaction.lookupConfigBean(factory.getImplementationName(), LogbackModuleFactory.INSTANCE_NAME); @@ -106,7 +105,7 @@ public class LogbackWithXmlConfigModuleTest extends AbstractConfigTest { */ @Test public void testAddNewLogger() throws InstanceAlreadyExistsException, InstanceNotFoundException, - MalformedObjectNameException { + MalformedObjectNameException, ValidationException, ConflictingVersionException { ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); ObjectName nameRetrieved = transaction.lookupConfigBean(factory.getImplementationName(), LogbackModuleFactory.INSTANCE_NAME); diff --git a/opendaylight/config/netty-config-api/pom.xml b/opendaylight/config/netty-config-api/pom.xml index fd099b3242..2a53e445f5 100644 --- a/opendaylight/config/netty-config-api/pom.xml +++ b/opendaylight/config/netty-config-api/pom.xml @@ -4,7 +4,7 @@ org.opendaylight.controller config-plugin-parent - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent 4.0.0 diff --git a/opendaylight/config/netty-event-executor-config/pom.xml b/opendaylight/config/netty-event-executor-config/pom.xml index 88afa13155..452c5ac715 100644 --- a/opendaylight/config/netty-event-executor-config/pom.xml +++ b/opendaylight/config/netty-event-executor-config/pom.xml @@ -4,7 +4,7 @@ org.opendaylight.controller config-plugin-parent - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent 4.0.0 diff --git a/opendaylight/config/netty-threadgroup-config/pom.xml b/opendaylight/config/netty-threadgroup-config/pom.xml index 172fe7f1fc..54143355f4 100644 --- a/opendaylight/config/netty-threadgroup-config/pom.xml +++ b/opendaylight/config/netty-threadgroup-config/pom.xml @@ -5,7 +5,7 @@ org.opendaylight.controller config-plugin-parent - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent diff --git a/opendaylight/config/netty-timer-config/pom.xml b/opendaylight/config/netty-timer-config/pom.xml index 9d3b5505ce..a056a1c126 100644 --- a/opendaylight/config/netty-timer-config/pom.xml +++ b/opendaylight/config/netty-timer-config/pom.xml @@ -4,7 +4,7 @@ org.opendaylight.controller config-plugin-parent - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent 4.0.0 diff --git a/opendaylight/config/pom.xml b/opendaylight/config/pom.xml index 3474740ca1..4ec7e2f64b 100644 --- a/opendaylight/config/pom.xml +++ b/opendaylight/config/pom.xml @@ -10,7 +10,7 @@ - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT config-subsystem pom ${project.artifactId} @@ -68,7 +68,6 @@ 0.6.2.201302030002 1.7.2 ${project.build.directory}/generated-sources/sal - 0.2.4-SNAPSHOT diff --git a/opendaylight/config/shutdown-api/pom.xml b/opendaylight/config/shutdown-api/pom.xml index 99a88fe209..1e14bc4961 100644 --- a/opendaylight/config/shutdown-api/pom.xml +++ b/opendaylight/config/shutdown-api/pom.xml @@ -3,7 +3,7 @@ config-plugin-parent org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent 4.0.0 diff --git a/opendaylight/config/shutdown-impl/pom.xml b/opendaylight/config/shutdown-impl/pom.xml index fa661b4ab8..8cf164d2a5 100644 --- a/opendaylight/config/shutdown-impl/pom.xml +++ b/opendaylight/config/shutdown-impl/pom.xml @@ -3,7 +3,7 @@ config-plugin-parent org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent 4.0.0 diff --git a/opendaylight/config/shutdown-impl/src/test/java/org/opendaylight/controller/config/yang/shutdown/impl/ShutdownTest.java b/opendaylight/config/shutdown-impl/src/test/java/org/opendaylight/controller/config/yang/shutdown/impl/ShutdownTest.java index d1abe08d52..d4a3160b89 100644 --- a/opendaylight/config/shutdown-impl/src/test/java/org/opendaylight/controller/config/yang/shutdown/impl/ShutdownTest.java +++ b/opendaylight/config/shutdown-impl/src/test/java/org/opendaylight/controller/config/yang/shutdown/impl/ShutdownTest.java @@ -11,6 +11,8 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; import org.opendaylight.controller.config.manager.impl.AbstractConfigTest; import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver; @@ -92,7 +94,7 @@ public class ShutdownTest extends AbstractConfigTest { shutdownViaRuntimeJMX(secret); } - private void setSecret(String secret) throws InstanceNotFoundException { + private void setSecret(String secret) throws InstanceNotFoundException, ValidationException, ConflictingVersionException { ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); ObjectName on = transaction.lookupConfigBean(NAME, NAME); ShutdownModuleMXBean proxy = transaction.newMXBeanProxy(on, ShutdownModuleMXBean.class); diff --git a/opendaylight/config/threadpool-config-api/pom.xml b/opendaylight/config/threadpool-config-api/pom.xml index 2f5e35c26d..7e45fa3c6b 100644 --- a/opendaylight/config/threadpool-config-api/pom.xml +++ b/opendaylight/config/threadpool-config-api/pom.xml @@ -4,7 +4,7 @@ org.opendaylight.controller config-plugin-parent - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent 4.0.0 diff --git a/opendaylight/config/threadpool-config-impl/pom.xml b/opendaylight/config/threadpool-config-impl/pom.xml index 08f1d554f6..fcedbd85f1 100644 --- a/opendaylight/config/threadpool-config-impl/pom.xml +++ b/opendaylight/config/threadpool-config-impl/pom.xml @@ -4,7 +4,7 @@ org.opendaylight.controller config-plugin-parent - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent 4.0.0 diff --git a/opendaylight/config/yang-jmx-generator-it/pom.xml b/opendaylight/config/yang-jmx-generator-it/pom.xml index a0ef5c2735..f081b7bd38 100644 --- a/opendaylight/config/yang-jmx-generator-it/pom.xml +++ b/opendaylight/config/yang-jmx-generator-it/pom.xml @@ -4,7 +4,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT yang-jmx-generator-it diff --git a/opendaylight/config/yang-jmx-generator-plugin/pom.xml b/opendaylight/config/yang-jmx-generator-plugin/pom.xml index f6d1c88c83..a8119b81ae 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/pom.xml +++ b/opendaylight/config/yang-jmx-generator-plugin/pom.xml @@ -3,7 +3,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. yang-jmx-generator-plugin diff --git a/opendaylight/config/yang-jmx-generator/pom.xml b/opendaylight/config/yang-jmx-generator/pom.xml index b6e89cb92e..92ce0feccd 100644 --- a/opendaylight/config/yang-jmx-generator/pom.xml +++ b/opendaylight/config/yang-jmx-generator/pom.xml @@ -4,7 +4,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT yang-jmx-generator diff --git a/opendaylight/config/yang-store-api/pom.xml b/opendaylight/config/yang-store-api/pom.xml index b071025c1a..dfd9adb23f 100644 --- a/opendaylight/config/yang-store-api/pom.xml +++ b/opendaylight/config/yang-store-api/pom.xml @@ -3,7 +3,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. yang-store-api diff --git a/opendaylight/config/yang-store-impl/pom.xml b/opendaylight/config/yang-store-impl/pom.xml index c4ac830591..8a88cd04f9 100644 --- a/opendaylight/config/yang-store-impl/pom.xml +++ b/opendaylight/config/yang-store-impl/pom.xml @@ -3,7 +3,7 @@ config-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT .. yang-store-impl diff --git a/opendaylight/config/yang-test-plugin/pom.xml b/opendaylight/config/yang-test-plugin/pom.xml index fe7358ee90..0b4fc8b1b5 100644 --- a/opendaylight/config/yang-test-plugin/pom.xml +++ b/opendaylight/config/yang-test-plugin/pom.xml @@ -3,7 +3,7 @@ org.opendaylight.controller config-plugin-parent - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent 4.0.0 diff --git a/opendaylight/config/yang-test/pom.xml b/opendaylight/config/yang-test/pom.xml index 9037ff0c0f..6caee4108a 100644 --- a/opendaylight/config/yang-test/pom.xml +++ b/opendaylight/config/yang-test/pom.xml @@ -5,7 +5,7 @@ org.opendaylight.controller config-plugin-parent - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../config-plugin-parent diff --git a/opendaylight/md-sal/sal-binding-broker/pom.xml b/opendaylight/md-sal/sal-binding-broker/pom.xml index 28ffff8b2d..4c8ca42be4 100644 --- a/opendaylight/md-sal/sal-binding-broker/pom.xml +++ b/opendaylight/md-sal/sal-binding-broker/pom.xml @@ -51,7 +51,7 @@ org.opendaylight.controller yang-jmx-generator-plugin - 0.2.4-SNAPSHOT + ${config.version} org.opendaylight.yangtools diff --git a/opendaylight/md-sal/sal-binding-config/pom.xml b/opendaylight/md-sal/sal-binding-config/pom.xml index cb71b4fd3a..ccb3ac6757 100644 --- a/opendaylight/md-sal/sal-binding-config/pom.xml +++ b/opendaylight/md-sal/sal-binding-config/pom.xml @@ -64,12 +64,12 @@ org.opendaylight.controller yang-jmx-generator-plugin - 0.2.4-SNAPSHOT + ${config.version} org.opendaylight.yangtools maven-sal-api-gen-plugin - ${yangtools.version} + ${yangtools.version} jar diff --git a/opendaylight/md-sal/sal-dom-api/pom.xml b/opendaylight/md-sal/sal-dom-api/pom.xml index 9c253eecb8..f57a8e31bc 100644 --- a/opendaylight/md-sal/sal-dom-api/pom.xml +++ b/opendaylight/md-sal/sal-dom-api/pom.xml @@ -54,7 +54,7 @@ org.opendaylight.controller yang-jmx-generator-plugin - 0.2.4-SNAPSHOT + ${config.version} org.opendaylight.yangtools diff --git a/opendaylight/md-sal/sal-dom-broker/pom.xml b/opendaylight/md-sal/sal-dom-broker/pom.xml index d22b54ee19..cdcaacbb82 100644 --- a/opendaylight/md-sal/sal-dom-broker/pom.xml +++ b/opendaylight/md-sal/sal-dom-broker/pom.xml @@ -95,7 +95,7 @@ org.opendaylight.controller yang-jmx-generator-plugin - 0.2.4-SNAPSHOT + ${config.version} org.opendaylight.yangtools diff --git a/opendaylight/md-sal/sal-netconf-connector/pom.xml b/opendaylight/md-sal/sal-netconf-connector/pom.xml index b060ca42d0..c196095726 100644 --- a/opendaylight/md-sal/sal-netconf-connector/pom.xml +++ b/opendaylight/md-sal/sal-netconf-connector/pom.xml @@ -5,9 +5,7 @@ sal-parent 1.1-SNAPSHOT - - 0.2.4-SNAPSHOT - + sal-netconf-connector scm:git:ssh://git.opendaylight.org:29418/controller.git @@ -234,12 +232,12 @@ org.opendaylight.controller yang-jmx-generator-plugin - 0.2.4-SNAPSHOT + ${config.version} org.opendaylight.yangtools maven-sal-api-gen-plugin - ${yangtools.version} + ${yangtools.version} jar diff --git a/opendaylight/netconf/config-netconf-connector/pom.xml b/opendaylight/netconf/config-netconf-connector/pom.xml index 6db7f3a56d..f8993a09e7 100644 --- a/opendaylight/netconf/config-netconf-connector/pom.xml +++ b/opendaylight/netconf/config-netconf-connector/pom.xml @@ -4,7 +4,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT config-netconf-connector ${project.artifactId} diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Commit.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Commit.java index 592d8e4f3b..6391a1edad 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Commit.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Commit.java @@ -8,9 +8,8 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations; -import java.util.HashMap; -import java.util.Map; - +import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.jmx.CommitStatus; import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; @@ -25,6 +24,9 @@ import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; +import java.util.HashMap; +import java.util.Map; + public class Commit extends AbstractConfigNetconfOperation { private static final Logger logger = LoggerFactory.getLogger(Commit.class); @@ -55,16 +57,18 @@ public class Commit extends AbstractConfigNetconfOperation { try { status = this.transactionProvider.commitTransaction(); } catch (final IllegalStateException e) { + // FIXME: when can IllegalStateException occur? logger.warn("Commit failed: ", e); final Map errorInfo = new HashMap<>(); errorInfo.put(ErrorTag.operation_failed.name(), "Operation failed. Use 'get-config' or 'edit-config' before triggering 'commit' operation"); throw new NetconfDocumentedException(e.getMessage(), e, ErrorType.application, ErrorTag.operation_failed, ErrorSeverity.error, errorInfo); - } catch (final NetconfDocumentedException e) { - throw new NetconfDocumentedException( - "Unable to retrieve config snapshot after commit for persister, details: " + e.getMessage(), - ErrorType.application, ErrorTag.operation_failed, ErrorSeverity.error, e.getErrorInfo()); + } catch (ValidationException e) { + throw NetconfDocumentedException.wrap(e); + } catch (ConflictingVersionException e) { + throw NetconfDocumentedException.wrap(e); + } logger.trace("Datastore {} committed successfully: {}", Datastore.candidate, status); diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/DiscardChanges.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/DiscardChanges.java index 3da02a8430..8965deb630 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/DiscardChanges.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/DiscardChanges.java @@ -8,9 +8,6 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations; -import java.util.HashMap; -import java.util.Map; - import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorSeverity; @@ -24,6 +21,9 @@ import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; +import java.util.HashMap; +import java.util.Map; + public class DiscardChanges extends AbstractConfigNetconfOperation { public static final String DISCARD = "discard-changes"; @@ -53,6 +53,7 @@ public class DiscardChanges extends AbstractConfigNetconfOperation { try { fromXml(xml); } catch (final IllegalArgumentException e) { + //FIXME where can IllegalStateException be thrown? logger.warn("Rpc error: {}", ErrorTag.bad_attribute, e); final Map errorInfo = new HashMap<>(); errorInfo.put(ErrorTag.bad_attribute.name(), e.getMessage()); @@ -63,6 +64,7 @@ public class DiscardChanges extends AbstractConfigNetconfOperation { try { this.transactionProvider.abortTransaction(); } catch (final IllegalStateException e) { + //FIXME where can IllegalStateException be thrown? logger.warn("Abort failed: ", e); final Map errorInfo = new HashMap<>(); errorInfo diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Validate.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Validate.java index 24611c26cd..017b5e6c39 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Validate.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/Validate.java @@ -66,12 +66,14 @@ public class Validate extends AbstractConfigNetconfOperation { try { checkXml(xml); } catch (IllegalStateException e) { + //FIXME where can IllegalStateException be thrown? I see precondition that guards for programming bugs.. logger.warn("Rpc error: {}", ErrorTag.missing_attribute, e); final Map errorInfo = new HashMap<>(); errorInfo.put(ErrorTag.missing_attribute.name(), "Missing value of datastore attribute"); throw new NetconfDocumentedException(e.getMessage(), e, ErrorType.rpc, ErrorTag.missing_attribute, ErrorSeverity.error, errorInfo); } catch (final IllegalArgumentException e) { + // FIXME use checked exception if it has domain meaning logger.warn("Rpc error: {}", ErrorTag.bad_attribute, e); final Map errorInfo = new HashMap<>(); errorInfo.put(ErrorTag.bad_attribute.name(), e.getMessage()); @@ -83,10 +85,7 @@ public class Validate extends AbstractConfigNetconfOperation { transactionProvider.validateTransaction(); } catch (ValidationException e) { logger.warn("Validation failed", e); - final Map errorInfo = new HashMap<>(); - errorInfo.put(ErrorTag.operation_failed.name(), "Validation failed"); - throw new NetconfDocumentedException(e.getMessage(), e, ErrorType.application, ErrorTag.operation_failed, - ErrorSeverity.error, errorInfo); + throw NetconfDocumentedException.wrap(e); } catch (IllegalStateException e) { logger.warn("Validation failed", e); final Map errorInfo = new HashMap<>(); diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java index 97535ba1e2..bd85f948f5 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java @@ -12,7 +12,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; -import org.opendaylight.controller.config.api.JmxAttributeValidationException; import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.config.util.ConfigTransactionClient; @@ -87,7 +86,11 @@ public class EditConfig extends AbstractConfigNetconfOperation { EditConfigXmlParser.EditConfigExecution editConfigExecution) throws NetconfDocumentedException { try { set(configRegistryClient, editConfigExecution); - } catch (IllegalStateException | JmxAttributeValidationException | ValidationException e) { + + } catch (IllegalStateException e) { + //FIXME: when can IllegalStateException be thrown? + // JmxAttributeValidationException is wrapped in DynamicWritableWrapper with ValidationException + // ValidationException is not thrown until validate or commit is issued logger.warn("Set phase for {} failed", EditConfigXmlParser.EDIT_CONFIG, e); final Map errorInfo = new HashMap<>(); errorInfo.put(ErrorTag.operation_failed.name(), e.getMessage()); @@ -101,7 +104,8 @@ public class EditConfig extends AbstractConfigNetconfOperation { EditConfigExecution editConfigExecution) throws NetconfDocumentedException { try { test(configRegistryClient, editConfigExecution, editConfigExecution.getDefaultStrategy()); - } catch (IllegalStateException | JmxAttributeValidationException | ValidationException e) { + } catch (IllegalStateException | ValidationException e) { + //FIXME: when can IllegalStateException be thrown? logger.warn("Test phase for {} failed", EditConfigXmlParser.EDIT_CONFIG, e); final Map errorInfo = new HashMap<>(); errorInfo.put(ErrorTag.operation_failed.name(), e.getMessage()); @@ -112,7 +116,7 @@ public class EditConfig extends AbstractConfigNetconfOperation { } private void test(ConfigRegistryClient configRegistryClient, EditConfigExecution execution, - EditStrategyType editStrategyType) { + EditStrategyType editStrategyType) throws ValidationException { ObjectName taON = transactionProvider.getTestTransaction(); try { @@ -237,6 +241,7 @@ public class EditConfig extends AbstractConfigNetconfOperation { return identityNameToSchemaNode.containsKey(idName); } + // FIXME method never used public IdentitySchemaNode getIdentitySchemaNode(String idName) { Preconditions.checkState(identityNameToSchemaNode.containsKey(idName), "No identity under name %s", idName); return identityNameToSchemaNode.get(idName); diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/transactions/TransactionProvider.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/transactions/TransactionProvider.java index cd3b44852c..d7cbf6680d 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/transactions/TransactionProvider.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/transactions/TransactionProvider.java @@ -10,11 +10,11 @@ package org.opendaylight.controller.netconf.confignetconfconnector.transactions; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import org.opendaylight.controller.config.api.ConflictingVersionException; import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.jmx.CommitStatus; import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.config.util.ConfigTransactionClient; -import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -94,7 +94,7 @@ public class TransactionProvider implements AutoCloseable { /** * Commit and notification send must be atomic */ - public synchronized CommitStatus commitTransaction() throws NetconfDocumentedException { + public synchronized CommitStatus commitTransaction() throws ValidationException, ConflictingVersionException { final Optional maybeTaON = getTransaction(); Preconditions.checkState(maybeTaON.isPresent(), "No transaction found for session " + netconfSessionIdForReporting); ObjectName taON = maybeTaON.get(); @@ -108,7 +108,7 @@ public class TransactionProvider implements AutoCloseable { // no clean up: user can reconfigure and recover this transaction logger.warn("Transaction {} failed on {}", taON, validationException.toString()); throw validationException; - } catch (Exception e) { + } catch (ConflictingVersionException e) { logger.error("Exception while commit of {}, aborting transaction", taON, e); // clean up abortTransaction(); @@ -142,7 +142,7 @@ public class TransactionProvider implements AutoCloseable { transactionClient.validateConfig(); } - public void validateTestTransaction(ObjectName taON) { + public void validateTestTransaction(ObjectName taON) throws ValidationException { ConfigTransactionClient transactionClient = configRegistryClient.getConfigTransactionClient(taON); transactionClient.validateConfig(); } diff --git a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java index 72d62efe84..0a4f82f057 100644 --- a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java +++ b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java @@ -8,33 +8,11 @@ package org.opendaylight.controller.netconf.confignetconfconnector; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.management.InstanceAlreadyExistsException; -import javax.management.InstanceNotFoundException; -import javax.management.ObjectName; -import javax.xml.parsers.ParserConfigurationException; - +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import org.apache.commons.lang3.StringUtils; import org.junit.Before; import org.junit.Ignore; @@ -42,6 +20,8 @@ import org.junit.Test; import org.junit.matchers.JUnitMatchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.annotations.AbstractServiceInterface; import org.opendaylight.controller.config.api.annotations.ServiceInterfaceAnnotation; import org.opendaylight.controller.config.manager.impl.AbstractConfigTest; @@ -92,11 +72,31 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; +import javax.management.InstanceAlreadyExistsException; +import javax.management.InstanceNotFoundException; +import javax.management.ObjectName; +import javax.xml.parsers.ParserConfigurationException; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigInteger; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; public class NetconfMappingTest extends AbstractConfigTest { @@ -130,7 +130,7 @@ public class NetconfMappingTest extends AbstractConfigTest { transactionProvider = new TransactionProvider(this.configRegistryClient, NETCONF_SESSION_ID); } - private ObjectName createModule(final String instanceName) throws InstanceAlreadyExistsException, InstanceNotFoundException, URISyntaxException { + private ObjectName createModule(final String instanceName) throws InstanceAlreadyExistsException, InstanceNotFoundException, URISyntaxException, ValidationException, ConflictingVersionException { final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction(); final ObjectName on = transaction.createModule(this.factory.getImplementationName(), instanceName); diff --git a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigTest.java b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigTest.java index 505a91c6ce..b70a66f5ef 100644 --- a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigTest.java +++ b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigTest.java @@ -17,6 +17,7 @@ import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.opendaylight.controller.config.api.ServiceReferenceReadableRegistry; +import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.config.util.ConfigTransactionClient; import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot; @@ -79,7 +80,7 @@ public class EditConfigTest { } @Test - public void test() throws NetconfDocumentedException { + public void test() throws NetconfDocumentedException, ValidationException { EditConfig edit = new EditConfig(yangStoreSnapshot, provider, configRegistry, ValidateTest.NETCONF_SESSION_ID_FOR_REPORTING); EditConfigStrategy editStrat = mock(EditConfigStrategy.class); diff --git a/opendaylight/netconf/config-persister-impl/pom.xml b/opendaylight/netconf/config-persister-impl/pom.xml index 590381038a..461f22ac2c 100644 --- a/opendaylight/netconf/config-persister-impl/pom.xml +++ b/opendaylight/netconf/config-persister-impl/pom.xml @@ -4,7 +4,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT config-persister-impl ${project.artifactId} diff --git a/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusher.java b/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusher.java index 460aec6ac6..99d122c3c4 100644 --- a/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusher.java +++ b/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/ConfigPusher.java @@ -8,20 +8,8 @@ package org.opendaylight.controller.netconf.persist.impl; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetSocketAddress; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import javax.annotation.concurrent.Immutable; - +import com.google.common.base.Preconditions; +import io.netty.channel.EventLoopGroup; import org.opendaylight.controller.config.api.ConflictingVersionException; import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder; import org.opendaylight.controller.netconf.api.NetconfMessage; @@ -38,12 +26,22 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; -import com.google.common.base.Preconditions; -import io.netty.channel.EventLoopGroup; +import javax.annotation.concurrent.Immutable; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetSocketAddress; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; @Immutable public class ConfigPusher { - private static final Logger logger = LoggerFactory.getLogger(ConfigPusher.class); + private static final Logger logger = LoggerFactory.getLogger(ConfigPersisterNotificationHandler.class); private static final int NETCONF_SEND_ATTEMPT_MS_DELAY = 1000; private static final int NETCONF_SEND_ATTEMPTS = 20; @@ -62,7 +60,7 @@ public class ConfigPusher { } public ConfigPusher(InetSocketAddress address, EventLoopGroup nettyThreadGroup, - long maxWaitForCapabilitiesMillis, long connectionTimeoutMillis) { + long maxWaitForCapabilitiesMillis, long connectionTimeoutMillis) { this.address = address; this.nettyThreadGroup = nettyThreadGroup; this.maxWaitForCapabilitiesMillis = maxWaitForCapabilitiesMillis; @@ -106,6 +104,7 @@ public class ConfigPusher { EditAndCommitResponse editAndCommitResponse = pushLastConfig(configSnapshotHolder, netconfClient); return new EditAndCommitResponseWithRetries(editAndCommitResponse, retryAttempt); } catch (ConflictingVersionException e) { + logger.debug("Conflicting version detected, will retry after timeout"); lastException = e; Thread.sleep(1000); } catch (RuntimeException e) { @@ -155,7 +154,10 @@ public class ConfigPusher { logger.trace("Session id received from netconf server: {}", netconfClient.getClientSession()); return netconfClient; } - logger.debug("Polling hello from netconf, attempt {}, capabilities {}", attempt, latestCapabilities); + Set allNotFound = computeNotFoundCapabilities(expectedCaps, latestCapabilities); + logger.debug("Netconf server did not provide required capabilities. Attempt {}. " + + "Expected but not found: {}, all expected {}, current {}", + attempt, allNotFound, expectedCaps, latestCapabilities); Util.closeClientAndDispatcher(netconfClient); Thread.sleep(delayMillis); } @@ -163,13 +165,18 @@ public class ConfigPusher { logger.error("Could not connect to the server in {} ms", maxWaitForCapabilitiesMillis); throw new RuntimeException("Could not connect to netconf server"); } - Set allNotFound = new HashSet<>(expectedCaps); - allNotFound.removeAll(latestCapabilities); + Set allNotFound = computeNotFoundCapabilities(expectedCaps, latestCapabilities); logger.error("Netconf server did not provide required capabilities. Expected but not found: {}, all expected {}, current {}", allNotFound, expectedCaps, latestCapabilities); throw new RuntimeException("Netconf server did not provide required capabilities. Expected but not found:" + allNotFound); } + private static Set computeNotFoundCapabilities(Set expectedCaps, Set latestCapabilities) { + Set allNotFound = new HashSet<>(expectedCaps); + allNotFound.removeAll(latestCapabilities); + return allNotFound; + } + /** * Sends two RPCs to the netconf server: edit-config and commit. @@ -222,17 +229,22 @@ public class ConfigPusher { } - private static NetconfMessage sendRequestGetResponseCheckIsOK(NetconfMessage request, NetconfClient netconfClient) throws IOException { + private static NetconfMessage sendRequestGetResponseCheckIsOK(NetconfMessage request, NetconfClient netconfClient) + throws ConflictingVersionException, IOException { try { NetconfMessage netconfMessage = netconfClient.sendMessage(request, NETCONF_SEND_ATTEMPTS, NETCONF_SEND_ATTEMPT_MS_DELAY); NetconfUtil.checkIsMessageOk(netconfMessage); return netconfMessage; - } catch (RuntimeException | ExecutionException | InterruptedException | TimeoutException e) { + }catch(ConflictingVersionException e) { + logger.trace("conflicting version detected: {}", e.toString()); + throw e; + } catch (RuntimeException | ExecutionException | InterruptedException | TimeoutException e) { // TODO: change NetconfClient#sendMessage to throw checked exceptions logger.debug("Error while executing netconf transaction {} to {}", request, netconfClient, e); throw new IOException("Failed to execute netconf transaction", e); } } + // load editConfig.xml template, populate /rpc/edit-config/config with parameter private static NetconfMessage createEditConfigMessage(Element dataElement) { String editConfigResourcePath = "/netconfOp/editConfig.xml"; diff --git a/opendaylight/netconf/ietf-netconf-monitoring-extension/pom.xml b/opendaylight/netconf/ietf-netconf-monitoring-extension/pom.xml index c6111ab395..7b872db9a6 100644 --- a/opendaylight/netconf/ietf-netconf-monitoring-extension/pom.xml +++ b/opendaylight/netconf/ietf-netconf-monitoring-extension/pom.xml @@ -2,7 +2,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT 4.0.0 ietf-netconf-monitoring-extension diff --git a/opendaylight/netconf/ietf-netconf-monitoring/pom.xml b/opendaylight/netconf/ietf-netconf-monitoring/pom.xml index e6a186c881..f1e5764ca6 100644 --- a/opendaylight/netconf/ietf-netconf-monitoring/pom.xml +++ b/opendaylight/netconf/ietf-netconf-monitoring/pom.xml @@ -3,7 +3,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT 4.0.0 ietf-netconf-monitoring diff --git a/opendaylight/netconf/netconf-api/pom.xml b/opendaylight/netconf/netconf-api/pom.xml index 971f4a7bb4..3b5ed82518 100644 --- a/opendaylight/netconf/netconf-api/pom.xml +++ b/opendaylight/netconf/netconf-api/pom.xml @@ -4,7 +4,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT 4.0.0 netconf-api @@ -50,6 +50,7 @@ javax.management, + org.opendaylight.controller.config.api, org.opendaylight.controller.config.api.jmx, org.opendaylight.protocol.framework, io.netty.channel, diff --git a/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/NetconfDocumentedException.java b/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/NetconfDocumentedException.java index 5a85e94257..ceeca51def 100644 --- a/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/NetconfDocumentedException.java +++ b/opendaylight/netconf/netconf-api/src/main/java/org/opendaylight/controller/netconf/api/NetconfDocumentedException.java @@ -8,7 +8,11 @@ package org.opendaylight.controller.netconf.api; +import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; + import java.util.Collections; +import java.util.HashMap; import java.util.Map; /** @@ -19,6 +23,8 @@ public class NetconfDocumentedException extends Exception { private static final long serialVersionUID = 1L; + + public enum ErrorType { transport, rpc, protocol, application; @@ -84,6 +90,20 @@ public class NetconfDocumentedException extends Exception { this.errorInfo = errorInfo; } + public static NetconfDocumentedException wrap(ValidationException e) throws NetconfDocumentedException { + final Map errorInfo = new HashMap<>(); + errorInfo.put(ErrorTag.operation_failed.name(), "Validation failed"); + throw new NetconfDocumentedException(e.getMessage(), e, ErrorType.application, ErrorTag.operation_failed, + ErrorSeverity.error, errorInfo); + } + + public static NetconfDocumentedException wrap(ConflictingVersionException e) throws NetconfDocumentedException { + final Map errorInfo = new HashMap<>(); + errorInfo.put(ErrorTag.operation_failed.name(), "Optimistic lock failed"); + throw new NetconfDocumentedException(e.getMessage(), e, ErrorType.application, ErrorTag.operation_failed, + ErrorSeverity.error, errorInfo); + } + public ErrorType getErrorType() { return this.errorType; } diff --git a/opendaylight/netconf/netconf-client/pom.xml b/opendaylight/netconf/netconf-client/pom.xml index e6cba9258e..b0f5f74810 100644 --- a/opendaylight/netconf/netconf-client/pom.xml +++ b/opendaylight/netconf/netconf-client/pom.xml @@ -4,7 +4,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT netconf-client ${project.artifactId} diff --git a/opendaylight/netconf/netconf-impl/pom.xml b/opendaylight/netconf/netconf-impl/pom.xml index f4fc1ff0d5..85fff89777 100644 --- a/opendaylight/netconf/netconf-impl/pom.xml +++ b/opendaylight/netconf/netconf-impl/pom.xml @@ -4,7 +4,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT 4.0.0 netconf-impl diff --git a/opendaylight/netconf/netconf-it/pom.xml b/opendaylight/netconf/netconf-it/pom.xml index 9b0c7ab08a..549d4074eb 100644 --- a/opendaylight/netconf/netconf-it/pom.xml +++ b/opendaylight/netconf/netconf-it/pom.xml @@ -5,7 +5,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT netconf-it diff --git a/opendaylight/netconf/netconf-mapping-api/pom.xml b/opendaylight/netconf/netconf-mapping-api/pom.xml index d9aa0ab64d..18c27238e9 100644 --- a/opendaylight/netconf/netconf-mapping-api/pom.xml +++ b/opendaylight/netconf/netconf-mapping-api/pom.xml @@ -4,7 +4,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT 4.0.0 netconf-mapping-api diff --git a/opendaylight/netconf/netconf-monitoring/pom.xml b/opendaylight/netconf/netconf-monitoring/pom.xml index d1fb6aabeb..568aca9063 100644 --- a/opendaylight/netconf/netconf-monitoring/pom.xml +++ b/opendaylight/netconf/netconf-monitoring/pom.xml @@ -3,7 +3,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT 4.0.0 netconf-monitoring diff --git a/opendaylight/netconf/netconf-ssh/pom.xml b/opendaylight/netconf/netconf-ssh/pom.xml index efad2148e9..73e0a467c0 100644 --- a/opendaylight/netconf/netconf-ssh/pom.xml +++ b/opendaylight/netconf/netconf-ssh/pom.xml @@ -2,7 +2,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT ../ 4.0.0 diff --git a/opendaylight/netconf/netconf-util/pom.xml b/opendaylight/netconf/netconf-util/pom.xml index e5bab5633b..5df329def0 100644 --- a/opendaylight/netconf/netconf-util/pom.xml +++ b/opendaylight/netconf/netconf-util/pom.xml @@ -4,7 +4,7 @@ netconf-subsystem org.opendaylight.controller - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT netconf-util ${project.artifactId} diff --git a/opendaylight/netconf/pom.xml b/opendaylight/netconf/pom.xml index 2c2ef3b507..ae75657e5a 100644 --- a/opendaylight/netconf/pom.xml +++ b/opendaylight/netconf/pom.xml @@ -8,7 +8,7 @@ ../commons/opendaylight - 0.2.4-SNAPSHOT + 0.2.5-SNAPSHOT netconf-subsystem pom ${project.artifactId} @@ -48,8 +48,6 @@ 2.4.0 1.7.2 4.0.10.Final - 0.2.4-SNAPSHOT - 0.2.4-SNAPSHOT ${project.build.directory}/generated-sources/sal -- 2.36.6