org.opendaylight.controller.config.api.ValidationException Maven / Gradle / Ivy
/*
* Copyright (c) 2013, 2017 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.controller.config.api;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* This exception is not intended to be used while implementing modules, 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 Exception {
private static final long serialVersionUID = -6072893219820274247L;
private final Map> failedValidations;
public ValidationException(
final Map> failedValidations) {
super(failedValidations.toString());
this.failedValidations = Collections.unmodifiableMap(failedValidations);
}
public static ValidationException createFromCollectedValidationExceptions(
final List collectedExceptions) {
Map> failedValidations = new HashMap<>();
for (ValidationException ve : collectedExceptions) {
for (Entry> outerEntry : ve.getFailedValidations()
.entrySet()) {
for (Entry innerEntry : outerEntry.getValue().entrySet()) {
String moduleName = outerEntry.getKey();
String instanceName = innerEntry.getKey();
ExceptionMessageWithStackTrace ex = innerEntry.getValue();
Map instanceToExMap = failedValidations
.computeIfAbsent(moduleName, k -> new HashMap<>());
if (instanceToExMap.containsKey(instanceName)) {
throw new IllegalArgumentException("Cannot merge with same module name " + moduleName
+ " and instance name " + instanceName);
}
instanceToExMap.put(instanceName, ex);
}
}
}
return new ValidationException(failedValidations);
}
public static ValidationException createForSingleException(final ModuleIdentifier moduleIdentifier,
final Exception exception) {
Map> failedValidations = new HashMap<>();
Map innerMap = new HashMap<>();
failedValidations.put(moduleIdentifier.getFactoryName(), innerMap);
innerMap.put(moduleIdentifier.getInstanceName(), new ExceptionMessageWithStackTrace(exception));
return new ValidationException(failedValidations);
}
public Map> getFailedValidations() {
return failedValidations;
}
public static class ExceptionMessageWithStackTrace {
private String message;
private String stackTrace;
public ExceptionMessageWithStackTrace() {
}
public ExceptionMessageWithStackTrace(final String message, final String stackTrace) {
this.message = message;
this.stackTrace = stackTrace;
}
public ExceptionMessageWithStackTrace(final Exception exception) {
this(exception.getMessage(), Arrays.toString(exception.getStackTrace()));
}
public String getMessage() {
return message;
}
public String getTrace() {
return stackTrace;
}
public void setMessage(final String message) {
this.message = message;
}
public void setStackTrace(final String trace) {
this.stackTrace = trace;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (message == null ? 0 : message.hashCode());
result = prime * result + (stackTrace == null ? 0 : stackTrace.hashCode());
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
ExceptionMessageWithStackTrace other = (ExceptionMessageWithStackTrace) obj;
if (message == null) {
if (other.message != null) {
return false;
}
} else if (!message.equals(other.message)) {
return false;
}
if (stackTrace == null) {
if (other.stackTrace != null) {
return false;
}
} else if (!stackTrace.equals(other.stackTrace)) {
return false;
}
return true;
}
@Override
public String toString() {
return message;
}
}
}