- /*
- * Copyright © 2017, Salesforce.com, Inc
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the <organization> nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- package com.salesforce.apt.graph.model.errors;
- import java.text.MessageFormat;
- import java.util.Collections;
- import java.util.List;
- import java.util.function.Function;
- import java.util.stream.Collectors;
- import com.salesforce.apt.graph.model.AbstractModel;
- public class ErrorModel {
- private final ErrorType message;
- private final List<AbstractModel> causes;
- private final List<AbstractModel> involved;
- public ErrorType getMessage() {
- return message;
- }
- public List<AbstractModel> getCauses() {
- return causes;
- }
- public List<AbstractModel> getInvolved() {
- return involved;
- }
- public boolean isCyclic() {
- return message.isCycle();
- }
- public String toString() {
- return message.name() + " on " + involved.toString() + " caused by " + causes;
- }
- /**
- * A non cyclic error.
- *
- * @param message {@link ErrorType} of this represents
- * @param causes models at fault.
- * @param involved models the error should be displayed on.
- */
- public ErrorModel(ErrorType message, List<? extends AbstractModel> causes, List<? extends AbstractModel> involved) {
- super();
- this.message = message;
- if (message.isCycle() && !causes.equals(involved)) {
- throw new IllegalArgumentException("Malformed ErrorModel");
- }
- this.causes = Collections.unmodifiableList(causes);
- this.involved = Collections.unmodifiableList(involved);
- }
- /**
- * Returns a contextualized error message for the error, from the model's perspective.
- *
- * @param on an AbstractModel that is "involved" in this error
- * @param converter presents an error message for this error model to be displayed on the AbstractModel, on,
- * that contributed to the error.
- * @return an error message from the context of the failed model member.
- */
- public String getMessageOn(AbstractModel on, Function<ErrorType, String> converter) {
- if (!isCyclic()) {
- if (getCauses().size() == 1) {
- return MessageFormat.format(converter.apply(getMessage()), getCauses().get(0));
- } else {
- return MessageFormat.format(converter.apply(getMessage()),
- getCauses().stream().filter(m -> !m.equals(on)).map(m -> m.toString()).collect(Collectors.joining(", ")));
- }
- }
- StringBuilder builder = new StringBuilder();
- int index = getInvolved().indexOf(on);
- if (index != -1) {
- for (int i = index; i < getInvolved().size(); i++) {
- builder.append(getInvolved().get(i).toString());
- if (i + 1 < getInvolved().size() || index != 0) {
- builder.append(" -> ");
- }
- }
- for (int i = 0; i < index; i++) {
- builder.append(getInvolved().get(i).toString());
- if (i + 1 < index) {
- builder.append(" -> ");
- }
- }
- }
- return MessageFormat.format(converter.apply(getMessage()), builder.toString());
- }
- }