package com.airbnb.epoxy; import android.support.annotation.NonNull; /** * Thrown if a model is changed after it is added to an {@link com.airbnb.epoxy.EpoxyController}. */ class ImmutableModelException extends RuntimeException { private static final String MODEL_CANNOT_BE_CHANGED_MESSAGE = "Epoxy attribute fields on a model cannot be changed once the model is added to a " + "controller. Check that these fields are not updated, or that the assigned objects " + "are not mutated, outside of the buildModels method. The only exception is if " + "the change is made inside an Interceptor callback. Consider using an interceptor" + " if you need to change a model after it is added to the controller and before it" + " is set on the adapter. If the model is already set on the adapter then you must" + " call `requestModelBuild` instead to recreate all models."; ImmutableModelException(EpoxyModel model, int modelPosition) { this(model, "", modelPosition); } ImmutableModelException(EpoxyModel model, String descriptionOfWhenChangeHappened, int modelPosition) { super(buildMessage(model, descriptionOfWhenChangeHappened, modelPosition)); } @NonNull private static String buildMessage(EpoxyModel model, String descriptionOfWhenChangeHappened, int modelPosition) { return new StringBuilder(descriptionOfWhenChangeHappened) .append(" Position: ") .append(modelPosition) .append(" Model: ") .append(model.toString()) .append("\n\n") .append(MODEL_CANNOT_BE_CHANGED_MESSAGE) .toString(); } }