/* * Copyright (c) 2013 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<String/* module name */, Map<String/* instance name */, ExceptionMessageWithStackTrace>> failedValidations; public ValidationException( final Map<String /* module name */, Map<String /* instance name */, ExceptionMessageWithStackTrace>> failedValidations) { super(failedValidations.toString()); this.failedValidations = Collections.unmodifiableMap(failedValidations); } public static ValidationException createFromCollectedValidationExceptions( final List<ValidationException> collectedExceptions) { Map<String, Map<String, ExceptionMessageWithStackTrace>> failedValidations = new HashMap<>(); for (ValidationException ve : collectedExceptions) { for (Entry<String, Map<String, ExceptionMessageWithStackTrace>> outerEntry : ve .getFailedValidations().entrySet()) { for (Entry<String, ExceptionMessageWithStackTrace> innerEntry : outerEntry .getValue().entrySet()) { String moduleName = outerEntry.getKey(); String instanceName = innerEntry.getKey(); ExceptionMessageWithStackTrace ex = innerEntry.getValue(); Map<String, ExceptionMessageWithStackTrace> instanceToExMap = failedValidations .get(moduleName); if (instanceToExMap == null) { instanceToExMap = new HashMap<>(); failedValidations.put(moduleName, instanceToExMap); } 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 e) { Map<String, Map<String, ExceptionMessageWithStackTrace>> failedValidations = new HashMap<>(); Map<String, ExceptionMessageWithStackTrace> innerMap = new HashMap<>(); failedValidations.put(moduleIdentifier.getFactoryName(), innerMap); innerMap.put(moduleIdentifier.getInstanceName(), new ExceptionMessageWithStackTrace(e)); return new ValidationException(failedValidations); } public Map<String/* module name */, Map<String/* instance name */, ExceptionMessageWithStackTrace>> getFailedValidations() { return failedValidations; } public static class ExceptionMessageWithStackTrace { private String message, stackTrace; public ExceptionMessageWithStackTrace() { } public ExceptionMessageWithStackTrace(final String message, final String stackTrace) { this.message = message; this.stackTrace = stackTrace; } public ExceptionMessageWithStackTrace(final Exception e) { this(e.getMessage(), Arrays.toString(e.getStackTrace())); } public String getMessage() { return message; } public String getTrace() { return stackTrace; } public void setMessage(final String message) { this.message = message; } public void setTrace(final String stackTrace) { this.stackTrace = stackTrace; } @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; } } }